close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 15 years ago

Closed 15 years ago

#780 closed defect (fixed)

Classes and homonymes methods

Reported by: pgea@… Owned by: Víctor de Buen Remiro
Priority: highest Milestone: OOP Implementation
Component: OOP Version: 2.0.1
Severity: blocker Keywords:
Cc:

Description (last modified by Víctor de Buen Remiro)

Ocurren cosas inesperadas cuando hay llamadas entre clases anidadas.
Parece ser que algunas llamadas (las más últimas) pueden tomar como suyos métodos de otras anteriores.

Creo que el ejemplo es bastante ilustrativo.

He encontrado otros errores (que aún no he aislado) que pueden
que tengan mucho que ver con esto. Ocurren al concatenar métodos
de clases anidadas. Por ejemplo, si en lugar de crear un método que me diera el nombre de un elemento de la clase, hago una llamada del tipo:

GetElement(?)::GetName(?)

Attachments (1)

ticket_14.HomonymMethods.tol (1019 bytes) - added by pgea@… 15 years ago.

Download all attachments as: .zip

Change History (7)

Changed 15 years ago by pgea@…

comment:1 Changed 15 years ago by Víctor de Buen Remiro

Status: newaccepted

comment:2 Changed 15 years ago by Víctor de Buen Remiro

Description: modified (diff)

El error del tipo

GetElement(?)::GetName(?)

no tiene nada que ver con los errores anteriores, ni siquiera tiene que ver con las clases. Es una limitación que existe desde siempre en el parser y que se debe al orden de precedencia del operador ::. He aquí un ejemplo para reproducirlo sin uasr clases

Set NameAge(Text name, Real age)
{[[
   Text name_ = name,
   Real age_ = age
]]};
//Esto funciona perfectamente
Set str = NameAge("Victor",40);
Text str::name_;
//Esto da un warning y no hace nada
Text (NameAge("Victor",40))::name_;

comment:3 Changed 15 years ago by pgea@…

Es curioso que si la concatenación de las llamadas empieza desde un NameBlock esto no pasa:

NameBlock ea = [[ NameAge ]];
Text ea::NameAge("Victor",40)::name_;
// Funciona correctamente

No sé si esta "limitación" se puede considerar un error y no sé si ya hay subido un ticket al respecto.
Pero creo que sería muy conveniente solucionarlo.
Pues en algunos casos puede ser bastante práctico.

comment:4 Changed 15 years ago by pgea@…

Cuando este Warning de concatenar llamadas con :: ocurre dentro de clases
(cosa que no siempre ocurre) puede solucionarse anteponiendo el _this.
Sin embargo en el ámbito global no hay algo parecido al _this ése.

comment:5 Changed 15 years ago by Víctor de Buen Remiro

De acuerdo en que puede ser conveniente arreglarlo, pero eso no impide que sea muy complicado hacerlo. Ya lo he intentado otras veces sin éxito.
Por otra parte es trivial vadear el problema, se interpone una variable auxiliar y ya está. Por este motivo ese problema tiene la mínima prioridad.
La parte primera del problema aún la estoy investigando pero desde luego tiene mucha más importancia.

comment:6 Changed 15 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: acceptedclosed

(In [1686]) Fixed #780

Note: See TracTickets for help on using tickets.