Как удалить / переопределить объявление между типами в AspectJ? - PullRequest
0 голосов
/ 08 июня 2011

Я использую генератор синтаксических анализаторов, который генерирует классы 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 ()?

1 Ответ

0 голосов
/ 08 июня 2011

Что, если вы попытаетесь использовать следующие изменения во втором классе:

class A {
  public T a1;
  public U a2;
  public V a3;
  ...
}

И второй аспект:

aspect Accessors2 {
  public V A.getV() {return a3;} // new accessor for new field
  public U A.getU() {return a2;} // modification of old accessor
}
...