如何在Eclipse之外的项目中使用java Eclipse Abstract Syntax Tree? (即不是eclipse插件)

如何在Eclipse之外的项目中使用java Eclipse Abstract Syntax Tree? (即不是eclipse插件)

我见过的所有Eclipse AST示例都是针对eclipse插件的。 有没有一种方法(即一个例子)项目使用eclipse AST进行非日食项目。

下面是给定Java 1.5文件时我用来执行此操作的代码。 我对此非常陌生,今天花了很多时间浏览,并尝试将代码放在下面。

public void processJavaFile(File file) { String source = FileUtils.readFileToString(file); Document document = new Document(source); ASTParser parser = ASTParser.newParser(AST.JLS3); parser.setSource(document.get().toCharArray()); CompilationUnit unit = (CompilationUnit)parser.createAST(null); unit.recordModifications(); // to get the imports from the file List imports = unit.imports(); for (ImportDeclaration i : imports) { System.out.println(i.getName().getFullyQualifiedName()); } // to create a new import AST ast = unit.getAST(); ImportDeclaration id = ast.newImportDeclaration(); String classToImport = "path.to.some.class"; id.setName(ast.newName(classToImport.split("\\."))); unit.imports().add(id); // add import declaration at end // to save the changed file TextEdit edits = unit.rewrite(document, null); edits.apply(document); FileUtils.writeStringToFile(file, document.get()); // to iterate through methods List types = unit.types(); for (AbstractTypeDeclaration type : types) { if (type.getNodeType() == ASTNode.TYPE_DECLARATION) { // Class def found List bodies = type.bodyDeclarations(); for (BodyDeclaration body : bodies) { if (body.getNodeType() == ASTNode.METHOD_DECLARATION) { MethodDeclaration method = (MethodDeclaration)body; System.out.println("name: " + method.getName().getFullyQualifiedName()); } } } } } 

这需要以下库:

 commons-io-1.4.jar org.eclipse.jdt.core_xxxx.jar org.eclipse.core.resources_xxxx.jar org.eclipse.core.jobs_xxxx.jar org.eclipse.core.runtime_xxxx.jar org.eclipse.core.contenttype_xxxx.jar org.eclipse.equinox.common_xxxx.jar org.eclipse.equinox.preferences_xxxx.jar org.eclipse.osgi_xxxx.jar org.eclipse.text_xxxx.jar 

根据这篇旧文章 ,你应该能够独立于你的应用程序上下文调用AST解析器(eclipse插件与否)。

 ASTParser parser = ASTParser.newParser(AST.JLS2); parser.setSource("".toCharArray()); CompilationUnit unit = (CompilationUnit) parser.createAST(null); unit.recordModifications(); AST ast = unit.getAST(); 

替代文字http://sofzh.miximages.com/java/astexplorer.gif


从这个错误条目 :

3.0中的ASTParser可用于另一个独立程序,无需实际运行Eclipse即可创建Eclipse AST。 正如文件所说:

  char[] source = ...; ASTParser parser = ASTParser.newParser(AST.JLS2); // handles JLS2 (J2SE 1.4) parser.setSource(source); CompilationUnit result = (CompilationUnit) parser.createAST(null); 

因此, 这个线程试图解析一个非常短的java源:

 import org.eclipse.jdt.core.dom.*; import org.eclipse.jface.text.Document; import org.eclipse.text.edits.TextEdit; public class Test{ public static void main(String[] args){ Test t= new Test(); t.runtest(); } void runtest(){ Document doc = new Document("import java.util.List;\nclass X {}\n"); ASTParser parser = ASTParser.newParser(AST.JLS3); parser.setResolveBindings(true); parser.setSource(doc.get().toCharArray()); CompilationUnit cu = (CompilationUnit) parser.createAST(null); cu.recordModifications(); AST ast = cu.getAST(); ImportDeclaration id = ast.newImportDeclaration(); id.setName(ast.newName(new String[] {"java", "util", "Set"})); cu.imports().add(id); // add import declaration at end TextEdit edits = cu.rewrite(doc, null); } }