#1104 closed defect (fixed)
Error typing returned instances with the class name
Reported by: | Pedro Gea | Owned by: | Víctor de Buen Remiro |
---|---|---|---|
Priority: | normal | Milestone: | OOP Implementation |
Component: | OOP | Version: | |
Severity: | major | Keywords: | |
Cc: |
Description
Se encuentra un error al intentar tipar la instancia que devuelve una función con el nombre de la clase:
Class @ClaseA { Real valueA }; NameBlock nb = [[ Set instance. = [[ @ClaseA instance = [[ Real valueA = 1 ]] ]]; @ClaseA GetInstance(Real void) { instance.[1] } ]]; //@ClassA nb::GetInstance(?); //<- esto falla NameBlock nb::GetInstance(?); //<- esto no falla
Change History (12)
comment:1 Changed 14 years ago by
Resolution: | → invalid |
---|---|
Status: | new → closed |
comment:2 Changed 14 years ago by
Resolution: | invalid |
---|---|
Status: | closed → reopened |
Ciertamente no estuve nada fino explicando el error. Lo corrijo.
El error ocurre sólo cuando la clase fue declarada dentro de un nameblock:
NameBlock Modulo = [[ Class @ClaseA { Real valueA } ]]; NameBlock nb = [[ Set instance. = [[ Modulo::@ClaseA instance = [[ Real valueA = 1 ]] ]]; Modulo::@ClaseA GetInstance(Real void) { instance.[1] } ]]; // Modulo::@ClaseA nb::GetInstance(?); //<- esto falla NameBlock nb::GetInstance(?); //<- esto no falla
comment:3 Changed 14 years ago by
De acuerdo. En realidad se trata de un error del parser ya conocido que tiene que ver con los tickets #843 y #959. Llevo ya tiempo detrás de este error pero es bastante duro como todas las cosas que tienen que ver con el parser.
Por si te vale de algo mientras tanto sugiero usar esto otro que también va y es más claro que tipar con NameBlock
Modulo::@ClaseA b = nb::GetInstance(?);
comment:5 Changed 14 years ago by
Resolution: | → fixed |
---|---|
Status: | reopened → closed |
comment:6 Changed 14 years ago by
Resolution: | fixed |
---|---|
Status: | closed → reopened |
El error descrito:
NameBlock Modulo = [[ Class @ClaseA { Real valueA } ]]; NameBlock nb = [[ Set instance. = [[ Modulo::@ClaseA instance = [[ Real valueA = 1 ]] ]]; Modulo::@ClaseA GetInstance(Real void) { instance.[1] } ]]; Modulo::@ClaseA nb::GetInstance(?); //<- esto falla
sigue ocurriendo.
Nótese que la advertencia:
Warning: [] La función :: ha fallado en : Modulo::@ClaseA nb::GetInstance(?)
parece indicar que no existe el método GetInstance
de nb
. Supongo que es algún problema al buscar un método que se llame GetInstance
y que devuelva una instancia de Modulo::@ClaseA
.
comment:7 Changed 14 years ago by
Resolution: | → fixed |
---|---|
Status: | reopened → closed |
comment:8 Changed 14 years ago by
Ha sido duro pero al final creo que lo he conseguido retorciendo una vez más el parser ([3276#file0]), que estaba diseñado en origen para una sintaxis mucho más sencilla, en la que los operadores monarios, como lo es un nombre de clase usado como tipo de datos, no podían ser resultado de una expresión binaria como el ::.
La función BParser::ParseDelayed detecta las situaciones del tipo
- <Container>::...::<@Tipo> <Container>::...::<Method>(<arguments>)
- <Container>::...::<@Tipo> <Container>::...::<Member>
y rebaja artificialmente la precedencia del segundo sintagma (argumento compuesto de la operación) para que quede supeditado al primero (operador monario compuesto) en el árbol sintáctico.
Por otra parte una vez construido el árbol correctamente también ha habido que retocar la función de evaluación del operador "::" ([3276#file2]) que no preveía tampoco esta situación.
Por último había otro problema en la evaluación de bloques de sentencias, tanto globales como locales, en los que el tipo esperado sólo puede cambiarse mediante el tipado explícito el cual se reconocía sólo a primer nivel del árbol, es decir, mirando si el primer token es un nombre de tipo. Ese tipo de reconocimiento ahora sunpondría una revisión del árbol mucho más compleja por lo que se ha optado por relajar la condición de tipado haciéndola opcional en las funciones de evaluación.
Para ello ha habido que añadir un argumento opcional bool forceType
con valor por defecto true
a la las funciones de evaluación genérica ([3276#file3]), de tal forma que si se le pasa false
no se hace la comprobación de tipo del resultado.
comment:10 Changed 14 years ago by
Resolution: | fixed |
---|---|
Status: | closed → reopened |
Ahora el siguiente código da error
NameBlock NB = [[ Class @A { Real a }; Class @A.Null : @A { Static @A.Null New(Real void) { @A.Null null = [[ Real a= 0 ]]; null } } ]]; NB::@A A = [[ Real a = 1 ]]; NB::@A A := NB::@A.Null::New(?); NB::@A A1 = NB::@A.Null::New(?);
comment:11 Changed 14 years ago by
Resolution: | → fixed |
---|---|
Status: | reopened → closed |
Esto falla porque no existe
@ClassA
sino @ClaseA}}}