0

I가 ASTTransformation를 구현하고 특정 주석으로 표시된 모든 필드에 대한 getter와 setter 메소드 생성이 클래스 다음 테스트 클래스그루비 AST 의미 분석 중복 클래스 정의

class Main { 
    @Accessors 
    int counter = 5 

    public static void main(String[] args) { 
      println getCounter() 
    } 
} 
실행

@GroovyASTTransformation(phase=CompilePhase.SEMANTIC_ANALYSIS) 
public class Rewriter implements ASTTransformation { 
public void visit(ASTNode[] nodes, SourceUnit source) { 
    List fields = nodes.findAll { it instanceof FieldNode } 
    fields.each { 
     MethodNode get = createGetter(it) 
     MethodNode set = createSetter(it) 
     source.getAST().addMethod(get) 
     source.getAST().addMethod(set) 
    } 
} 

private MethodNode createGetter(FieldNode f) { 
    Parameter[] parameters = [] 
    ClassNode[] exceptions = [] 
    Statement state = new AstBuilder().buildFromString("return ${f.name}").get(0) 
    return new MethodNode("get" + f.name.capitalize(), Opcodes.ACC_PUBLIC, ClassHelper.make(f.getType().name), parameters, exceptions, state) 
} 

private MethodNode createSetter(FieldNode f) { 
    Parameter[] parameters = [ 
     new Parameter(ClassHelper.make(f.getType().name), f.name) 
    ] 
    ClassNode[] exceptions = [] 
    Statement state = new AstBuilder().buildFromString("this.${f.name} = ${f.name}").get(0) 
    return new MethodNode("set" + f.name.capitalize(), Opcodes.ACC_PUBLIC, ClassHelper.VOID_TYPE, parameters, exceptions, state) 
    } 
} 

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: 
User\groovy\meta\src\Main.groovy: -1: Invalid duplicate class definition of class Main : The source User\groovy\meta\src\Main.groovy contains at least two definitions of the class Main. 
One of the classes is an explicit generated class using the class statement, the other is a class generated from the script body based on the file name. Solutions are to change the file name or to change the class name. 
@ line -1, column -1. 
1 error 

무엇이 발생합니다

다음과 같은 오류를 얻을 수 ? 메서드를 만들고 소스의 AST 벌금에 추가하는 것 같습니다. 그루비 이클립스를 사용하고 있습니다.

답변

1

AST 변환 작업에 매우 가깝습니다. 보고 관찰하고 코드를 테스트 한 몇 가지 관찰을 들려줍니다. visit 방법에서

  • source.getAST().addMethod(...) 
    

    MultipleCompilationErrorsException 당신이보고있는의 원천이 될 것으로 보인다. Main 클래스에서, 당신은 static main 방법으로 인스턴스를 작성해야합니다, 또한

    it.declaringClass.addMethod(...) 
    
  • 로 교체 : println new Main().getCounter()이 트릭을해야한다.

  • get 및 set 메소드는 groovy에서 제공하는 기본 get 및 set 메소드와 동일합니다. 나중에 이것을 변경하기 원한다고해도, 현재 사용하고있는 AST 변환인지 또는 groovy가 제공하는 메소드인지 여부를 알 수있는 방법이 없으므로 지금 테스트하기가 어렵습니다. 따라서 최소한 비헤이비어를 "비표준"으로 변경하거나 메서드 이름을 변경해야합니다. getter의 반환 값에 "+1"을 삽입하여 코드를 테스트했습니다.

  • 맛의 문제 일 수있는 마지막 메모 : 주석과 AST 변환에 "일치하는"이름이 있으면 훨씬 더 명확하다고 생각합니다. 나는. RewriterAccessorsASTTransformation으로 바꿉니다.