TreeScanner

TreeScanner (소스 트리 순회 방문자)

소스 코드 추상 구문 트리의 모든 자식 노드를 방문하는 TreeVisitor 구현 클래스입니다. 특정 종류의 트리 노드를 순회하면서 처리하고 싶을 때 이 클래스를 상속받아 필요한 visitXYZ 메서드만 오버라이드하면 돼요.

출처: Java API Reference

본문

TreeVisitor<R,P>를 구현하는 기본 제공 방문자로, 소스 코드를 구성하는 거의 모든 종류의 노드에 대한 visitXYZ 메서드를 갖추고 있습니다. 특정 타입의 노드를 방문하고 싶으면 해당 메서드를 오버라이드하고, 그 안에서 super.visitXYZ를 호출하면 자식 노드들까지 이어서 방문해요.

기본 결과 결정 규칙은 이러합니다. 자식이 없는 노드는 null, 자식이 하나면 그 자식을 scan한 결과, 자식이 여럿이면 각 자식을 차례로 scan한 뒤 reduce(R, R)로 누적 결합합니다. reduce의 기본 동작은 마지막 자식의 결과를 반환하는 방식이에요.

예를 들어 트리 안의 식별자 노드 개수를 세는 방문자는 이렇게 만들 수 있어요.

class CountIdentifiers extends TreeScanner<Integer,Void> {
    @Override
    public Integer visitIdentifier(IdentifierTree node, Void p) {
        return 1;
    }
    @Override
    public Integer reduce(Integer r1, Integer r2) {
        return (r1 == null ? 0 : r1) + (r2 == null ? 0 : r2);
    }
}

주요 메서드

  • scan(Tree tree, P p) — 단일 노드를 스캔합니다.

  • scan(Iterable<? extends Tree> nodes, P p) — 노드들의 연속을 스캔하고, 각 방문 결과를 reduce로 결합한 값을 반환합니다.

  • reduce(R r1, R r2) — 두 결과를 하나로 결합합니다. 기본 구현은 첫 번째 인자를 반환해요.

  • visitXXX(Tree node, P p) — 각 노드 타입별 방문 메서드입니다. 클래스(visitClass), 메서드(visitMethod), 변수(visitVariable), 반복문(visitForLoop/visitWhileLoop/visitDoWhileLoop), 조건문(visitIf/visitSwitch), 메서드 호출(visitMethodInvocation), 람다(visitLambdaExpression), 연산(visitBinary/visitUnary/visitAssignment) 등 소스 코드의 구조 전반에 대응하는 메서드가 준비되어 있어요.

  • visitOther(Tree node, P p) — 알 수 없는 종류의 노드를 방문합니다. 언어가 진화하면서 Tree 계층에 새 노드 종류가 추가될 때 발생할 수 있어요.

참고로 이 클래스는 AnyPatternTree 같은 프리뷰 API를 참조하므로, 프리뷰 기능이 활성화된 상태에서만 사용할 수 있습니다. 이 클래스를 확장한 것이 경로 추적 기능을 더한 TreePathScanner예요.

더 알아보기

Java 공식 API