J'utilise un générateur d'analyseur, qui génère des classes Java représentant des nœuds de syntaxe d'un langage de programmation, et des aspects AspectJ pour ajouter de la sémantique à ces classes. J'ai étendu/changé la grammaire de la langue et je veux réutiliser des aspects de l'ancienne grammaire et les modifier/étendre pour faire face aux changements de classes de nœuds.Comment déposer/redéfinir une déclaration inter-type dans AspectJ?
Par exemple, une ancienne classe de nœud et son aspect:
class A {
public T a1;
public U a2;
...
}
aspect Accessors1 {
public T A.getT() {return a1;}
public U A.getU() {return a2;}
}
Avec la modification de la grammaire, la classe A est le changement followingly:
class A {
public T a1;
public V a2;
public U a3;
...
}
je voudrais réutiliser l'aspect Accessors1 et ajouter un autre:
aspect Accessors2 {
public V A.getV() {return a2;} // new accessor for new field
public U A.getU() {return a3;} // modification of old accessor
}
J'ai essayé ceci:
declare precedence: *2, *1;
Mais je reçois toujours cette erreur: Type mismatch: cannot convert from V to U
du premier aspect. Même si Accessors1.getU() n'est pas utilisé, il est toujours vérifié par type, ce qui entraîne l'échec de la compilation.
Pourquoi est-ce le cas? Comment puis-je remplacer le getU()
d'origine par le nouveau? Est-il possible de dire à AspectJ d'ignorer/supprimer Accessors1.getU()?
êtes-vous PARAMETRAGE la classe ou sont T, V, vraies classes U? –