1

我有一个现有的 Java 应用程序,其中包含我想以编程方式修改的源文件。我需要能够对源文件进行分析,并基于该分析执行源转换。我还需要能够理解不同源文件之间的关系。我还想将此进程创建为独立的 Java 应用程序。

做了一些研究,我发现了以下工具:代码模型和 Eclipse JDT。我确定还有其他人。我已经排除了代码模型,因为它(据我所知)只允许生成新代码并且不能与现有代码一起使用。

Eclipse JDT 库似乎满足了我的所有需求。我能够轻松解析源文件。我可以配置绑定,以便保留跨类型的信息。我现在遇到的问题是让 ASTRewrite 功能正常工作。似乎(从我读过的示例和文档中)它只能在 eclipse 插件中工作。当我尝试使用重写器时,出现以下错误:

java.lang.IllegalArgumentException:只有当 AST 是从编译单元或类文件创建时,才能使用此 API 

那么我可以从独立应用程序中使用 ASTRewrite 功能,还是需要开始寻找不同的工具?

4

2 回答 2

6

由于您没有提供任何代码,我无法给您一个明确的答案,但 ASTRewrite 确实有效,即使它在Eclipse “生态系统”之外使用。很可能您使用了错误的方法来应用 AST 上的更改。为了使其工作,请执行以下操作

将整个 java 文件读入一个字符串并从中创建一个org.eclipse.jface.text.Document

final String source = FileUtils.readFileToString(javaSRC);
org.eclipse.jface.text.Document document = new org.eclipse.jface.text.Document(source);

现在您可以创建ASTParserASTRewriter的实例,并将解析器的源设置为您刚刚创建的文档。

ASTParser parser = ASTParser.newParser(AST.JLS4);
parser.setSource(document.get().toCharArray());
parser.setKind(ASTParser.K_COMPILATION_UNIT);

final CompilationUnit cu = (CompilationUnit) parser.createAST(null);
ASTRewrite rewriter = ASTRewrite.create(cu.getAST());   

cu.recordModifications();

完成所有修改后,调用正确的重写方法:public TextEdit rewriteAST(IDocument document,Map options)

在此之后,您可以应用更改并(如果您愿意)也可以将更改写回文件。

TextEdit edits = rewriter.rewriteAST(document,null);
edits.apply(document);
FileUtils.write(javaSRC, document.get());

顺便说一句:我已经用以下 jar 测试了这段代码:

org.eclipse.osgi_3.8.2.v20130124-134944.jar

org.eclipse.jdt.core_3.8.3.v20130121-145325.jar

org.eclipse.equinox.preferences_3.5.1.v20121031-182809.jar

org.eclipse.equinox.common_3.6.100.v20120522-1841.jar

org.eclipse.core.runtime_3.8.0.v20120912-155025.jar

org.eclipse.core.resources_3.8.1.v20121114-124432.jar

org.eclipse.core.jobs_3.5.300.v20120912-155018.jar

org.eclipse.core.contenttype_3.4.200.v20120523-2004.jar

于 2014-01-04T07:50:40.517 回答
3

我没有完成这个项目,但我整理了一个概念验证工具,它使用了:

  1. 类依赖的TattleTale
  2. JavaParser用于分析代码。

我对它印象特别深刻,JavaParserTattleTale做了我需要做的事情。JavaParser当然能够即时更改代码。

显然,您将需要 jars 和源代码,因为它们TattleTale适用于 jars 并JavaParser与源代码一起使用。

于 2013-10-15T16:29:57.643 回答