2012-08-11 1 views
0

저는 AST와 함께 꽤 오랫동안 놀았으며 이클립스에서이 플러그인으로 파싱 된 주어진 노드와 관련된 줄과 열 정보를 얻으려고했습니다. 문서화 된 api here에 따르면 getStartPosition() 메서드는 파싱 된 파일의 문자에 대한 위치를 알려줄 수 있지만 이것이 내가 원하는 것만은 아니라는 사실을 발견했습니다.모든 노드에서 Eclipse JDT Parser에서 파싱 된 자바 소스로부터 라인 및/또는 컬럼을 얻는 방법?

CompilationUnit class api documentation 나는 getLineNumber(int position)getColumnNumber(int position)을 알아 냈는데, 그 중 하나가 트릭을 할 수 있습니다. position 매개 변수는 node.getStartPosition()을 수행하여 getStartPosition() 메서드가 반환하는 것 이상입니다.

이제, 문제는 소스 파일에 라인과 열을 얻는 두 가지 방법입니다하지 않습니다 모든 노드에 사용할 것으로 보인다. 예를 들어, method declaration nodes에는 이러한 기능이 없습니다.

모든 트리에서 어떻게 정보를 얻을 수 있습니까? ast 노드마다 줄과 열이있는 다른 언어의 파서를 사용할 수 있었기 때문에 불가능하지 않다는 것을 알고 있습니다. 사실, 나는 클래스에 행과 열에 대한 속성이 포함되어 있기 때문에 javaparser이 자바에 대한 것 중 하나라고 생각한다. 이클립스를 본 JDT는 나에게 훨씬 더 강건 해 보였고 꽤 오랫동안 거기에 있었기 때문에 이러한 정보를 얻을 수 없다는 사실에 놀라곤했다.

편집 :

<type 'org.eclipse.jdt.core.dom.CompilationUnit'> 1 <type 'org.eclipse.jdt.core.dom.TypeDeclaration'> <type 'org.eclipse.jdt.core.dom.Javadoc'> <type 'org.eclipse.jdt.core.dom.TagElement'> <type 'org.eclipse.jdt.core.dom.TextElement'> <type 'org.eclipse.jdt.core.dom.TextElement'> <type 'org.eclipse.jdt.core.dom.TextElement'> <type 'org.eclipse.jdt.core.dom.TextElement'> <type 'org.eclipse.jdt.core.dom.TextElement'> <type 'org.eclipse.jdt.core.dom.TextElement'> 

감사합니다 : 다시, 문제는 루트에 표시되는 컴파일 단위의 여러 가지의 줄 번호를 얻을 수있다
.

답변

2

, 나는 내가 JDT 코어-dev에 메일 링리스트에 게시 된 답을 다시 게시하고 있습니다.

안녕 카를로스,

당신은 CompilationUnit.getLineNumber (int) 메소드에 대한 올바른있어 (내 대답은 위 라이언의 제안에서 매우 다르지 않다). 당신이 붙어있어 어디

int lineNumber = compilationUnit.getLineNumber(node.getStartPosition()) - 1;

그러나, 이해가 안 : 다음과 같이 사용하십시오. MethodDeclaration에 대해 정의 된 getLineNumber (..)가 필요한 이유는 무엇입니까? 메소드 선언 노드를 찾은 다음 아래 코드를 사용하여 해당 CompilationUnit을 찾은 다음 위 코드 행을 사용하여 행 번호를 찾습니다. 내가 여기서 뭔가를 놓치고 있니?

ASTParser parser = ASTParser.newParser(AST.JLS3); // or JLS_4 for java 7 and above 

parser.setKind(ASTParser.K_COMPILATION_UNIT); 
parser.setSource(source); // give your java source here as char array 
parser.setResolveBindings(true); 

CompilationUnit compilationUnit = parser.createAST(null); 

건배! Ayush

+0

CU가 주어진 java 파일과 연관되어 있다는 사실을 알지 못해서 그 파일과 관련된 ast의 노드에 대한 줄 위치 정보를 얻는 것이 합리적 일 것입니다. 나는 각 노드가 관련된 행과 열을 가질 정신 모형에 더 익숙했습니다. 그 행과 열은 내가 본 유일한 모델 이었기 때문에 속한 것입니다. 그것은 모두 클래스의 책임을 설정하는 방법으로 귀결되며,이 새로운 것은 의미가 없습니다. 이제 모든 것이 실행되고 작동합니다. 나는 당신의 대답에서 그것을 깨닫기 위해 왔기 때문에 투표를하고 당신의 대답을 대답으로 설정했습니다. –

1

내가 내 앞에 실행중인 프로그램이 있지만, 위 이클립스에서 소스 코드에 링크 된 문서를 기반으로하지 않는, 당신이 getRoot()를 호출 캐스팅하여 ASTNode에 대한 CompilationUnit를 얻을 수 표시 CompilationUnit. 또는, ASTParser.createAST(IProgressMonitor) 거의 항상 파싱 소스를 나타내는 CompilationUnit를 반환, 에서 ASTParserjavadoc 및 예에서 나타납니다. 당신이 CompilationUnit 이름 root이 후

, 당신은 다음 root.getLineNumber(node.getStartPosition())root.getColumnNumber(node.getStartPosition()) 방법을 사용할 수 있어야합니다. 후손을 위해

final ASTParser p = ASTParser.newParser(AST.JLS3); 
p.setSource(source); 
final CompilationUnit root = (CompilationUnit) p.createAST(null); 
// stuff happens 
final ASTNode node = //get a node 

final int line = root.getLineNumber(node.getStartPosition()); 
final int column = root.getColumnNumber(node.getStartPosition()); 
System.out.println("Node started at (" + line + ", " + column + ")"; 
+0

고맙다. 나는 또한 그 일관성이 있기 때문에 대답에 투표했다. 상대방을 최종 답변으로 뽑았 기 때문에 문제에 접근하는 방법에 대한 내 정신 모델의 차이를 알 수있었습니다. 다른 답변의 코멘트에 주목. –