2012-07-14 1 views
1

이것은 Groovy의 '속성'스타일 액세스와 일치하는 방식으로 수행되는 것보다는 주어진 클래스의 필드에 대한 모든 액세스를 가로 채기위한 제 질문과 관련이 있습니다. 여기에서 볼 수 있습니다 : intercepting LOCAL property access in groovy.Groovy에서 AST 트리를 철저히 다루기

한 가지 방법은 확실하게 내 문제를 해결할 것입니다. 컴파일 타임에 AST를 사용하여 속성 액세스가있는 모든 비 속성 액세스를 다시 작성해야합니다. 예를 들어,이 클래스는 다음과 같습니다 경우 :

class Foo { 
    def x = 1 
    def getter() { 
    x 
    } 
    def getProperty(String name) { 
    this."$name" ++ 
    } 
} 

foo = new Foo() 
assert foo.getter() == 1 
assert foo.x == 2 

이러한 getter 메소드 액세스가 직접 X 및 foo.x가 getProperty에 통해 반환하기 전에 X를 증가 ("X")를 진행하기 때문에 문 밖으로 작동합니다 주장한다.

일부 시행 착오 끝에 AST 변환을 사용하여 'getter'메서드의 'x'표현식이 로컬 필드가 아닌 속성으로 실제로 액세스되도록 코드의 동작을 변경할 수 있습니다. 여태까지는 그런대로 잘됐다!

이제 특정 클래스의 로컬 필드에 대한 모든 액세스 권한을 얻으려면 어떻게해야합니까? 나는 어떤 종류의 대서양 표준시 트리 워커 도우미를 찾고있는 인터넷을 빗어 봤지만 하나도 찾지 못했습니다. 여기에 표현식 워커를 구현해야합니까? http://groovy.codehaus.org/api/org/codehaus/groovy/ast/expr/package-summary.html과 18 개의 모든 명령문 유형은 여기 http://groovy.codehaus.org/api/org/codehaus/groovy/ast/stmt/package-summary.html입니까? 누군가가 이미 작성 했어야 만하는 것처럼 보입니다. (처음부터 AST 트리를 만드는 것이 필수적이기 때문에) 그러나 나는 그것을 찾을 수없는 것 같습니다.

답변

1

글렌

당신은 일종의 방문자를 찾고 있습니다. 그루비 (Groovy)에는 사용할 수있는 몇 가지 (약하게 문서화 된) 방문자가 정의되어 있습니다. 나는 당신의 문제에 대한 정확한 답변을 가지고 있지 않지만 몇 가지 지시 사항을 제공 할 수 있습니다. 아래

코드 조각은 클래스와 인쇄의 모든 메소드 이름의 AST 횡단하는 방법을 보여줍니다

class TypeSystemUsageVisitor extends ClassCodeVisitorSupport { 

@Override 
public void visitExpression(MethodNode node) { 
    super.visitMethod(node) 
    println node.name 
} 

@Override 
protected SourceUnit getSourceUnit() { 
    // I don't know ho I should implement this, but it makes no difference 
    return null; 
} 
} 

을 그리고 이것은 내가 알아서

def visitor = new TypeSystemUsageVisitor() 
def sourceFile = new File("path/to/Class.groovy") 
def ast = new AstBuilder().buildFromString(CompilePhase.CONVERSION, false, sourceFile.text).find { it.class == ClassNode.class } 
ast.visitContents(visitor) 

방문자 전술의 방문자를 사용하고 어떻게 너를 위해 나무를 횡단하는 것. 그들에게는 당신이 그들과 함께 무엇이든 재정의하고 할 수있는 방문 * 방법이 있습니다. 귀하의 문제에 대한 적절한 방문자는 CodeVisitorSupport이며 visitVariableExpression 메서드가 있다고 생각합니다.

그루비 AST 방문자를 사용하는 방법에 대한 자세한 예제는 groovyConsole과 함께 제공되는 code of the AST Browser을 읽어 보는 것이 좋습니다. 또한 CodeVisitorSupport에 대한 api doc을 살펴보십시오.