Я использую генератор синтаксических анализаторов, который генерирует классы Java, представляющие синтаксические узлы языка программирования, и аспекты AspectJ для добавления семантики к этим классам.Я расширил / изменил грамматику языка и хочу повторно использовать аспекты старой грамматики и модифицировать / расширять их, чтобы справиться с изменениями классов узлов.
Например, старый класс узла и его аспект:
class A {
public T a1;
public U a2;
...
}
aspect Accessors1 {
public T A.getT() {return a1;}
public U A.getU() {return a2;}
}
При изменении грамматики класс A изменяется следующим образом:
class A {
public T a1;
public V a2;
public U a3;
...
}
Я хотел бы повторно использовать аспект Accessors1 и добавить еще один:
aspect Accessors2 {
public V A.getV() {return a2;} // new accessor for new field
public U A.getU() {return a3;} // modification of old accessor
}
Я попробовал это:
declare precedence: *2, *1;
Но я все еще получаю эту ошибку: Type mismatch: cannot convert from V to U
с первого аспекта.Хотя Accessors1.getU () не используется, он по-прежнему проверяется на тип, что приводит к сбою компиляции.
Почему это так?Как я могу переопределить исходный getU()
новым?Есть ли способ сказать AspectJ игнорировать / отбрасывать Accessors1.getU ()?