如何使用 SPOON API 创建调用图
How create call-graph using SPOON API
如果有人使用 SPOON API 你能告诉我一些如何创建调用图的线索以及我需要做什么吗?
我想我需要像这样创建一些处理器:
public class InvocationProcessor extends AbstractProcessor<CtInvocation> {
@Override
public void process(CtInvocation element) {
System.out.println(element.getActualTypeArguments());
}
}
然后使用 Launcher 进行 运行 分析
public void getCallers(){
final Launcher launcher = new Launcher();
launcher.setArgs("-i D:\IntelliJ_projects\ComprehensionTool\ -p comprehensionTool.analyse.processor.InvocationProcessor".split(" "));
launcher.run();
}
但我不确定...我想问一下,使用 Launcher 是否需要一些特殊的依赖项?
我认为我错了,因为当我执行它时抛出这个错误:
Exception in thread "main" java.lang.NoSuchMethodError: org.eclipse.jdt.internal.compiler.batch.Main.<init>(Ljava/io/PrintWriter;Ljava/io/PrintWriter;ZLjava/util/Map;Lorg/eclipse/jdt/core/compiler/CompilationProgress;)V
at spoon.support.compiler.jdt.JDTBatchCompiler.<init>(JDTBatchCompiler.java:58)
at spoon.support.compiler.jdt.JDTBatchCompiler.<init>(JDTBatchCompiler.java:54)
at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.createBatchCompiler(JDTBasedSpoonCompiler.java:352)
at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.createBatchCompiler(JDTBasedSpoonCompiler.java:356)
at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildUnits(JDTBasedSpoonCompiler.java:388)
at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildUnitsAndModel(JDTBasedSpoonCompiler.java:372)
at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildSources(JDTBasedSpoonCompiler.java:348)
at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.build(JDTBasedSpoonCompiler.java:119)
at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.build(JDTBasedSpoonCompiler.java:102)
at spoon.Launcher.buildModel(Launcher.java:700)
at spoon.Launcher.run(Launcher.java:651)
你需要一个依赖来 eclipse JDT,我们正在使用这个:
<dependency>
<groupId>org.eclipse.tycho</groupId>
<artifactId>org.eclipse.jdt.core</artifactId>
<version>3.12.0.v20160516-2131</version>
</dependency>
您启动 Spoon 的方式似乎不错,但是您的处理器将遍历整个模型并打印调用类型:它不遵循调用。
创建一个 call-graph 并不是那么容易:您必须首先获得起点(例如一个方法)然后跟随调用。
获取起点很容易:看一下Spoon documentation,但是您需要手动遍历call-graph来构建它。
我使用递归并从 CtInvocation 开始。
- 查找封闭的 CtMethod。
- 找到 CtMethod 的 N 个 CtInvocations。
- 对于 N 中的每个 CtInvocation 递归到步骤 1。
无论好坏,我在循环中使用 GetParent() 来查找 CtInvocation 的 CtMethod,似乎它会找到 CtBody,然后是 CtMethod,但我认为你需要这个用于CtInvocation 在其他块(if 语句)、while 循环等中
如果有人使用 SPOON API 你能告诉我一些如何创建调用图的线索以及我需要做什么吗?
我想我需要像这样创建一些处理器:
public class InvocationProcessor extends AbstractProcessor<CtInvocation> {
@Override
public void process(CtInvocation element) {
System.out.println(element.getActualTypeArguments());
}
}
然后使用 Launcher 进行 运行 分析
public void getCallers(){
final Launcher launcher = new Launcher();
launcher.setArgs("-i D:\IntelliJ_projects\ComprehensionTool\ -p comprehensionTool.analyse.processor.InvocationProcessor".split(" "));
launcher.run();
}
但我不确定...我想问一下,使用 Launcher 是否需要一些特殊的依赖项?
我认为我错了,因为当我执行它时抛出这个错误:
Exception in thread "main" java.lang.NoSuchMethodError: org.eclipse.jdt.internal.compiler.batch.Main.<init>(Ljava/io/PrintWriter;Ljava/io/PrintWriter;ZLjava/util/Map;Lorg/eclipse/jdt/core/compiler/CompilationProgress;)V
at spoon.support.compiler.jdt.JDTBatchCompiler.<init>(JDTBatchCompiler.java:58)
at spoon.support.compiler.jdt.JDTBatchCompiler.<init>(JDTBatchCompiler.java:54)
at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.createBatchCompiler(JDTBasedSpoonCompiler.java:352)
at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.createBatchCompiler(JDTBasedSpoonCompiler.java:356)
at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildUnits(JDTBasedSpoonCompiler.java:388)
at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildUnitsAndModel(JDTBasedSpoonCompiler.java:372)
at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildSources(JDTBasedSpoonCompiler.java:348)
at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.build(JDTBasedSpoonCompiler.java:119)
at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.build(JDTBasedSpoonCompiler.java:102)
at spoon.Launcher.buildModel(Launcher.java:700)
at spoon.Launcher.run(Launcher.java:651)
你需要一个依赖来 eclipse JDT,我们正在使用这个:
<dependency>
<groupId>org.eclipse.tycho</groupId>
<artifactId>org.eclipse.jdt.core</artifactId>
<version>3.12.0.v20160516-2131</version>
</dependency>
您启动 Spoon 的方式似乎不错,但是您的处理器将遍历整个模型并打印调用类型:它不遵循调用。 创建一个 call-graph 并不是那么容易:您必须首先获得起点(例如一个方法)然后跟随调用。
获取起点很容易:看一下Spoon documentation,但是您需要手动遍历call-graph来构建它。
我使用递归并从 CtInvocation 开始。
- 查找封闭的 CtMethod。
- 找到 CtMethod 的 N 个 CtInvocations。
- 对于 N 中的每个 CtInvocation 递归到步骤 1。
无论好坏,我在循环中使用 GetParent() 来查找 CtInvocation 的 CtMethod,似乎它会找到 CtBody,然后是 CtMethod,但我认为你需要这个用于CtInvocation 在其他块(if 语句)、while 循环等中