java—当输入项目文件位于内存中而不是作为文件保存在磁盘中时,使用spoon构建ast模型

o2gm4chl  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(436)

我正在和spoon inria一起解析和分析java应用程序。目前,我正在使用下面的代码创建输入项目模型。当项目文件保存在磁盘中时,此代码起作用。

Launcher spoonAPI = new Launcher();
spoonAPI.addInputResource(projectDirectory);  //The path to the project root directory
spoonAPI.buildModel();
CtModel ctModel = spoonAPI.getModel();

但是,目前我在内存中有java文件(类)的内容,我不想将它们写入磁盘,因为这需要很长时间。我想知道是否有一种方法可以使用spoon将文件内容传递给解析器。例如,下面的代码。

//Key is name of class and value is its content
Map<String, String> JavafileContents= new HashMap<String, String>();

for (String filePath : JavafileContents.keySet()) {
  spoonAPI.parse(JavafileContents.get(filePath ));
}
CtModel ctModel = spoonAPI.getModel(); //The extracted model should contains all parsed files.

类似于jdt中提供的类似解决方案。

ASTParser parser = ASTParser.newParser(AST.JLS14);
parser.setSource(javaFileContents.get(filePath).toCharArray());
CompilationUnit compilationUnit = (CompilationUnit)parser.createAST(null);
erhoui1w

erhoui1w1#

我也在寻找的功能,我发现下面的代码可能满足您的要求。

import spoon.support.compiler.VirtualFile;
    ...
    public static CtClass<?> parseClass(String code) {
       Launcher launcher = new Launcher();
       launcher.addInputResource(new VirtualFile(code));
       launcher.getEnvironment().setNoClasspath(true);
       launcher.getEnvironment().setAutoImports(true);
    ...

来源是https://github.com/inria/spoon/blob/spoon-core-8.2.0/src/main/java/spoon/launcher.java#l856.
或者,可以使用类似 createCodeSnippetStatement ```
Factory factory = new Launcher().createFactory();
CtStatement tmpStmt = factory.Code().createCodeSnippetStatement(code);

选择api的方式取决于代码段的类型(例如,表达式或语句)。

相关问题