Не удается получить пример Groovy AST для работы - PullRequest
5 голосов
/ 24 марта 2009

Я пытаюсь научиться использовать (и расширять) groovy, и я следую примеру этой страницы . В основном, это показывает, как определить аннотацию для Groovy кода, который позволяет вам подключиться к процессу компилятора. Пример вращается вокруг написания и аннотаций, которые приводят к печати строк до и после вызовов метода.

Мой код выглядит следующим образом; Сначала необходимый импорт:

package foo

import org.codehaus.groovy.transform.*
import java.lang.annotation.*
import org.codehaus.groovy.ast.*
import org.codehaus.groovy.control.*
import org.codehaus.groovy.ast.stmt.*
import org.codehaus.groovy.ast.expr.*

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

@Retention(RetentionPolicy.SOURCE)
@Target([ElementType.METHOD])
@GroovyASTTransformationClass(["foo.LoggingASTTransformation"])
public @interface WithLogging {
}

Тогда само преобразование:

@GroovyASTTransformation(phase=CompilePhase.SEMANTIC_ANALYSIS)
public class LoggingASTTransformation implements ASTTransformation {

  public void visit(ASTNode[] nodes, SourceUnit sourceUnit) {
      println("visiting astnodes")
      List methods = sourceUnit.getAST()?.getMethods()
      // find all methods annotated with @WithLogging
      methods.findAll { MethodNode method ->
          method.getAnnotations(new ClassNode(WithLogging))
      }.each { MethodNode method ->
          Statement startMessage = createPrintlnAst("Starting $method.name")
          Statement endMessage = createPrintlnAst("Ending $method.name")

          List existingStatements = method.getCode().getStatements()
          existingStatements.add(0, startMessage)
          existingStatements.add(endMessage)
      }
  }

  private Statement createPrintlnAst(String message) {
      return new ExpressionStatement(
          new MethodCallExpression(
              new VariableExpression("this"),
              new ConstantExpression("println"),
              new ArgumentListExpression(
                  new ConstantExpression(message)
              )
          )
      )
  }
}

Наконец, мой код, который должен использовать это преобразование:

public class Foo {
   @WithLogging
   def f() { println "hello from f" }
}

f = new Foo()
f.f()

Теперь, это должно напечатать Начиная f \ n hello с f \ n Конец f , но все, что он печатает, это hello с f (и в этом заключается моя проблема). Как вы можете видеть из кода, я также поместил сообщение посещая астноузлы в самом преобразовании, чтобы надеяться увидеть, попадет ли оно когда-нибудь, но, увы, этого не происходит (или так кажется).

groovy -version отпечатков Groovy Version: 1.6.0 JVM: 1.6.0_11

Может кто-нибудь попробовать этот код и посмотреть, работает ли он в их системе, или дать мне несколько советов относительно того, что может быть не так?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2013

Я нашел здесь рабочий пример на github

0 голосов
/ 27 марта 2009

Попробуйте изменить код, который предполагает использование преобразования

public class Foo
{
   @foo.WithLogging
   def f() { println "hello from f"}
....

Я попробовал тот же пример и поделился своим опытом здесь http://kartik -shah.blogspot.com / 2009/03 / groovy-16-ast -formation-example_5323.html

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