2012-08-25 3 views
10

스칼라 2.10 AST에서 요소를 재귀 적으로 검색하는 가장 좋은 방법은 무엇입니까?스칼라 검색 2.10 AST

나무는 power.trees(code) 또는 mirror.mkToolBox().parseExpr(code) 편집의 결과 일 수 있습니다. 2.10.0-RC1에서 parseExprparse으로 이름이 바뀌 었습니다.

구체적인 사용 사례는 주어진 클래스/개체 코드에서 메서드 이름으로 메서드 코드를 추출하는 것입니다. 그러나 더 일반적인 방법으로 공식화하면 질문은 다른 것들과 더 관련이 있다고 생각합니다 .

답변

5

은 아마 당신은 특히 클래스 Traverser, 변압기 및 교체의 방법 (Tree.substituteSymbols, Tree.substituteTypes 또는 Tree.substituteThis)에서, https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606에보고해야한다. 트리에서 메소드를 추출하려면 Traverser을 사용하고 traverse 메소드를 대체하십시오. traverse 메소드에서 노드가 원하는 메소드와 일치하는지 여부를 점검합니다. 그렇다면 완료되었습니다. 그렇지 않은 경우 super.traverse으로 전화하십시오.

+1

링크 된 코드는 트렁크와 비교하여 상당히 쓸모가 없습니다. 올바른 링크는 다음과 같습니다. 1) 트리 AST 클래스 : https://github.com/scala/scala/blob/2.10.x/src/library/scala/reflect/base/Trees.scala, 2) 트랜스 포머 및 트래 버스 : https://github.com/scala/scala/blob/2.10.x/src/reflect/scala/reflect/api/Trees.scala#L606 –

+0

죄송합니다. –

+1

다음은 트랜스 포머의 예입니다 : https ://github.com/scala/scala/blob/46d57d47e81c8794a9a3594e080576788cc92324/src/compiler/scala/reflect/reify/phases/Reshape.scala (코드는 확실히 정리를 사용하지만 무시해도 좋은 예제는 아닙니다.) 'super.transform'과'copyAttrs' 부분을 주목하십시오. –