【发布时间】:2019-08-16 11:30:28
【问题描述】:
我正在编写一个普通的 Java 应用程序,并想提取输入项目的所有 ICompilationUnit(这不是必需的 由 Eclipse 开发)。由于我不是在开发 Eclipse 插件,因此无法使用以下代码提取 ICompilationUnit:
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IPath path = Path.fromOSString(source.getAbsolutePath());
IFile file = workspace.getRoot().getFileForLocation(path);
ICompilationUnit compilationUnit = (ICompilationUnit) JavaCore.create(file);
目前,我正在使用下面的代码来解析输入的 Java 文件。 (str包含输入java文件的源代码)
ASTParser parser = ASTParser.newParser(AST.JLS12);
parser.setSource(str.toCharArray());
parser.setKind(ASTParser.K_COMPILATION_UNIT);
CompilationUnit cu = (CompilationUnit) parser.createAST(null);
但是,下面的代码返回 null,因为它不是从 Java 元素创建的。
ICompilationUnit icu = (ICompilationUnit)compilationUnit.getJavaElement();
问题:有没有办法在普通的 Java 应用程序中提取 ICompilationUnits?
【问题讨论】:
-
"extract ICompilationUnits" 是什么意思?使用
CompilationUnit,您可以使用cu.accept(new ASTVisitor(true) { ... })来查找特定元素。 -
我想使用 SearchEngine(ICompilationUnit[] workingCopies),因此我需要提取 ICompilationUnit。
-
我明白了。
getJavaElement返回null,因为parser.setSource(str.toCharArray());而不是parser.setSource(IClassFile)。我想使用ASTVisitor而不是创建IClassFile并使用SearchEngine来查找特定元素会更容易。你在找什么? -
我想查找对项目中定义的方法和字段的所有调用。如果我正在编写一个 Eclipse 插件,有一个简单的方法。但是,由于我正在编写一个独立的应用程序 [ResourcesPlugin.getWorkspace();] 不起作用,我无法编写其余的说明。如果您知道使用 JDT 在独立 Java 应用程序中查找对方法和字段的引用的示例代码,请告诉我。
-
如果在代码中添加
parser.setEnvironment(...),则可以使用cu.accept(new ASTVisitor(true) { ... })访问AST 节点。在ASTVisitor中,至少为QualifiedName和SimpleName覆盖visit方法。使用IBinding binding = node.resolveBinding();,当且仅当binding instanceof IMethodBinding为真并且对于字段访问,以下条件为真时,您才有方法调用或引用:binding instanceof IVariableBinding和((IVariableBinding)binding).isField()。
标签: java eclipse eclipse-jdt compilationunit