SourcePositions

SourcePositions (트리 위치 제공)

컴파일 단위 안에서 어떤 Tree가 어디에 위치하는지 알아내는 메서드를 제공하는 인터페이스입니다. 소스 코드 트리 노드의 시작·끝 위치를 문자 오프셋으로 알 수 있어요.

출처: Java API Reference

본문

위치는 컴파일 단위(CompilationUnit)의 시작점에서 잰 단순한 문자 오프셋으로 정의됩니다. 첫 번째 문자가 오프셋 0이므로, 파일 전체에서 해당 트리가 몇 번째 문자에 시작하고 끝나는지를 정수로 돌려받는 방식이에요. 이런 위치 정보는 소스 코드를 단순히 읽는 것 이상으로, 특정 노드가 소스의 어디에 대응하는지 정확히 알아야 하는 도구들에서 유용하게 쓰입니다.

이 인터페이스를 확장해 javadoc 주석 안의 위치까지 다루는 것이 DocSourcePositions예요.

메서드

  • getStartPosition(CompilationUnitTree file, Tree tree) — 파일 안에서 트리가 시작하는 위치를 반환해요. 트리를 찾지 못했거나 시작 위치를 계산할 수 없으면 Diagnostic.NOPOS를 돌려줍니다. 반환된 위치는 이 트리의 시작점이어야 하므로, 하위 트리가 있다면 시작 위치가 항상 하위 트리의 시작 위치보다 작거나 같아야 해요(NOPOS인 경우 제외).

  • getEndPosition(CompilationUnitTree file, Tree tree) — 파일 안에서 트리가 끝나는 위치를 반환합니다. 못 찾거나 계산할 수 없으면 Diagnostic.NOPOS예요. 종료 위치는 하위 트리의 종료 위치보다 크거나 같아야 하고, 같은 트리에 대해 시작 위치가 종료 위치보다 작거나 같아야 한다는 제약도 성립해야 합니다.

이 두 메서드가 주는 위치 값을 조합하면 트리가 차지하는 소스 범위를 정확히 알아낼 수 있어요. 예를 들어 특정 구문의 시작과 끝 오프셋을 얻어 그 구간의 원본 텍스트를 잘라내거나, 진단 메시지에 줄·컬럼 정보를 표시하는 데 활용할 수 있습니다.

주의할 점은 NOPOS 반환값인데, 트리를 찾지 못했거나 위치를 계산할 수 없을 때 돌아옵니다. 위치 계산은 구현에 따라 가능 여부가 달라질 수 있으므로, NOPOS인 경우를 반드시 대비해서 처리해야 해요.

더 알아보기

Java 공식 API