2011-03-17 56 views
0

我使用Eclipse AST解析器解析java源代碼,併成功地將局部變量定位爲VariableDeclarationStatement。問題是我需要變量作爲重構的使用ILocalVariable。在這種情況下,getJavaElement()不起作用,因爲Java模型中的局部變量不是。任何想法如何從那裏得到它?從解析VariableDeclarationStatement獲取ILocalVariable

回答

0

請注意,我沒有嘗試這樣做自己,但看源代碼,以下提到的步驟應該工作:

  1. 確保ASTParser使用setResolveBindings(true)
  2. 獲取所有的創造通過致電VariableDeclarationStatement.fragments()致電VariableDeclarationFragments
  3. 對於您感興趣的每個片段,請致電resolveBinding()
  4. 對於每個綁定,您應該可以調用getJavaElement()
+0

已經試過這種方式,但不幸的是'getJavaElement()'返回null爲局部變量 – JIV 2011-03-18 20:06:56

0

這是另一種選擇。自己創建ILocalVariable對象。 org.eclipse.jdt.internal.core.LocalVariable是內部API(構造函數在3.6和3.7之間變化)。

構造(在Eclipse 3.6)採用下列參數:

public LocalVariable(
     JavaElement parent, 
     String name, 
     int declarationSourceStart, 
     int declarationSourceEnd, 
     int nameStart, 
     int nameEnd, 
     String typeSignature, 
     org.eclipse.jdt.internal.compiler.ast.Annotation[] astAnnotations) 

大部分參數應該從VariableDeclarationStatement是相當簡單的和可用直接。請注意,typeSignature不是完全限定的名稱,而是從org.eclipse.jdt.core.Signature生成的類型簽名。

0
IVariableBinding binding = variable.resolveBinding(); 
if (!binding.isField() && !binding.isEnumConstant() && !binding.isParameter()) 
{ 
    ILocalVariable local = (ILocalVariable) binding.getJavaElement(); 
} 
1

你可以嘗試以下方法:
VariableDeclarationStatement variable
已經編程您可以按代碼:

IVariableBinding binding = variable.resolveBinding(); 
ILocalVariable local = (ILocalVariable) binding.getJavaElement(); 
0

我遇到同樣的問題,但上面的工作沒有任何的解決方案給我。經過一番研究,我發現了一個解決方案,這對我的作品:

// reconcile corresponding compilation unit 
compilationUnit.reconcile(ICompilationUnit.NO_AST, false, null, null); 

// parse code and get the elements 
IJavaElement[] elements = 
    ((ICodeAssist) compilationUnit).codeSelect(startPos + length, 0); 

// if there is an element and its an instance of ILocalVariable. 
if (anElements.length > 0 && anElements[0] instanceof ILocalVariable) { 
    return (ILocalVariable) anElements[0]; 
} 

所以在最後:你需要的起始位置和變量的長度。 (startPos + length)。還有編輯部門,我已經有了。