2013-01-17 97 views
1

假設我有這個Java源代碼。我如何獲得startPosition和「extractedMethod(amount)」調用的長度?使用JDT獲取startPosition和方法調用的長度

package smcho; 

public class Extract { 
String _name = ""; 

public int extractedMethod(int amount) 
{ 
    .... 
} 

public int getValue(int amount) { 
    if (amount > 10) { 
    int z = extractedMethod(amount); 
    return z; 
    } 
    .... 
} 

enter image description here

我可以用六觀衆找到起始位置是0x1FA,長度爲LEN(「提取(法)」)== 17,但我想以編程方式做到這一點使用JDT。

一旦我可以得到CompilationUnit,但我需要知道如何獲得該CompilationUnit中的調用引用。

IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); 
IProject orig = root.getProject(this.projectName); 
orig.open(pm); 
javaProject = JavaCore.create(orig); 
IType type = this.javaProject.findType(this.className); 
ICompilationUnit unit = type.getCompilationUnit(); 
ASTParser parser = ASTParser.newParser(AST.JLS3); 
parser.setSource(unit); 
parser.setResolveBindings(true); 
CompilationUnit cunit = (CompilationUnit) parser.createAST(null); 

ASTNode root = parser.createAST(null); 

root.accept(new ASTVisitor() { 
    public bool visit(...) 
}); 

回答

0

這是適合我的代碼。 - How can I store values inside JDT/ASTVisitor()?

public void setPositionFinder(String methodName) throws JavaModelException 
{ 
    //findMethod(methodName); 
    IType type = this.javaProject.findType(this.className); 
    ICompilationUnit unit = type.getCompilationUnit(); 
    ASTParser parser = ASTParser.newParser(AST.JLS3); 
    parser.setSource(unit); 
    parser.setResolveBindings(true); 
    CompilationUnit cunit = (CompilationUnit) parser.createAST(null); 
    //ASTNode root = parser.createAST(null); 

    final String name = this.newMethodName; 

    cunit.accept(new ASTVisitor() { 
     public boolean visit(MethodInvocation methodInvocation) 
     { 
      String methodName = methodInvocation.getName().toString(); 
      System.out.println(methodName); 
      if (methodName.equals(name)) 
      { 
       startPosition = methodInvocation.getStartPosition(); 
       length = methodInvocation.getLength(); 
       System.out.printf("startPosition %d - Length %d", startPosition, length);  
      } 
      return false; 
     } 
    }); 
} 
+0

這個答案是錯誤的,因爲get length方法返回一個字符大小,所以開始位置是true,但結束行是錯誤的@prosseek –

1

你可以得到一個ASTNode的起始行數量和長度如下

int startLineNumber = compilationUnit.getLineNumber(node.getStartPosition()) - 1; 
int nodeLength = node.getLength(); 
int endLineNumber = compilationUnit.getLineNumber(node.getStartPosition() + nodeLength) - 1; 

見文章下方以獲取更多信息

+0

這適用於我的代碼。謝謝。 –

+0

這個答案是錯誤的,因爲get length方法返回一個字符大小,所以開始位置是true,但結束行是錯的 –

相關問題