Как использовать "javax.lang.model.element.ElementVisitor"? - PullRequest
4 голосов
/ 14 декабря 2009

Я экспериментирую с процессорами аннотаций Java и пытаюсь понять использование классов в "javax.lang.model". Из того, что я прочитал, я думаю, что ElementVisitor должен стать основным способом работы с моделью. Но я не понимаю, как правильно его использовать.

Я знал схему посетителей. До сих пор я использовал его, чтобы избежать итерации дочерних элементов (и дочерних элементов дочерних элементов ...) и избежать уродливых тестов "instanceof". Но этот посетитель кажется другим. Если я называю «принять» на элементе модели, он не посещает дочерние элементы, а только сам элемент.

Может ли кто-нибудь оказать помощь в использовании API?

Я нашел следующую ссылку: http://www.cs.bgu.ac.il/~gwiener/programming/visitors-galore/#more-113. Но использование одного посетителя внутри другого внутри другого ... просто чувствую, что не прав!?

Редактировать : Чтобы было легче понять вопрос, я скопировал код по ссылке выше. Следующий код не кажется «правильным». Я не могу поверить, что официальный Java-API разработан таким образом. Но как правильно использовать ElementVisitor?

tElem.accept(new SimpleElementVisitor6<Void, ...>() {
  public Void visitType(TypeElement e, ...) {
    for (Element tSubElem : e.getEnclosedElements()) {
      tSubElem.accept(new SimpleElementVisitor6<AssocEndSpec, ...>() {
        public AssocEndSpec visitExecutable(ExecutableElement ex, ...) {
          TypeMirror tRetTypeMirror = ex.getReturnType();
          tRetTypeMirror.accept(new SimpleTypeVisitor6<TypeElement, TypeElement>() {
            public TypeElement visitDeclared(DeclaredType t, TypeElement enclose) {
              for (TypeMirror tTypeArgMirror : t.getTypeArguments()) {
                tTypeArgMirror.accept(new SimpleTypeVisitor6<TypeElement, ...>() {
                  public TypeElement visitDeclared(DeclaredType t, TypeElement self) {
                    TypeElement tArgTypeElem = (TypeElement) t.asElement();
                    if (!self.equals(tArgTypeElem)) {
                      // found the little bugger!
                    }
                  }
                }, ...);
              }
            }
          }, ...);
        }
    }, ...);
  }
}, ...);

1 Ответ

4 голосов
/ 14 декабря 2009

Этот код является бредом.

Взгляните на javax.lang.model.util.ElementKindVisitor6 или javax.lang.model.util.ElementScanner6, они могут сделать что. В любом случае вы должны иметь возможность взять их источники и адаптировать их к вашим потребностям.

NB: сказанное, да, я бы тоже сказал, что ElementVisitor - довольно странная реализация посетителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...