2017-01-27 4 views
0

Если кто-то использовал 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) 

ответ

2

Вам нужна зависимость затмить JDT, мы используем это одно:

<dependency> 
    <groupId>org.eclipse.tycho</groupId> 
    <artifactId>org.eclipse.jdt.core</artifactId> 
    <version>3.12.0.v20160516-2131</version> 
</dependency> 

так, как вы запуск Spoon кажется хорошим, однако ваш процессор будет пересекать всю модель и печатать типы вызова: он не следует за вызовами. Создание графика вызовов не так просто: сначала вы должны получить начальную точку (например, метод), а затем следовать за вызовом.

Получение начальной точки легко: взгляните на Spoon documentation, но тогда вам нужно вручную перевести вызов-граф, чтобы построить его.

1

Так что я использовал зависимостей (проект Maven):

<dependency> 
    <groupId>fr.inria.gforge.spoon</groupId> 
    <artifactId>spoon-core</artifactId> 
    <version>5.6.0-SNAPSHOT</version> 
</dependency> 

, и я попытался запустить Ложка Launcher и получить все вызовы:

 Launcher spoon = new Launcher(); 
     spoon.addInputResource("D:\\IntelliJ_projects\\JRoaster"); 
     spoon.run(); 
     Factory factory = spoon.getFactory(); 
     for (CtType<?> type : 
       factory.Class().getAll()) { 
      CtClass clazz = (CtClass) type; 
      Set<CtMethod> methodSet = clazz.getAllMethods(); 
      for (CtMethod method : 
        methodSet) { 
       System.out.println(method.getSimpleName()); 
       CtBlock body = method.getBody(); 
       if (body != null) { 
        Iterator statementList = body.iterator(); 
        if (statementList != null) { 
         while (statementList.hasNext()) { 
          CtInvocation invocation = (CtInvocation) statementList.next(); 
          System.out.println(invocation.getTarget().getType().getSimpleName() + " - " 
            + invocation.getExecutable().getActualMethod().getName()); 
         } 
        } 
       } 
      } 
     } 

Я все еще получаю ту же ошибку на spoon.run ():

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:351) 
    at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.createBatchCompiler(JDTBasedSpoonCompiler.java:355) 
    at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildUnits(JDTBasedSpoonCompiler.java:387) 
    at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildUnitsAndModel(JDTBasedSpoonCompiler.java:371) 
    at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildSources(JDTBasedSpoonCompiler.java:347) 
    at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.build(JDTBasedSpoonCompiler.java:118) 
    at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.build(JDTBasedSpoonCompiler.java:101) 
    at spoon.Launcher.buildModel(Launcher.java:699) 
    at spoon.Launcher.run(Launcher.java:650) 
    at comprehensionTool.analyse.processors.ProcessorController.getCallers(ProcessorController.java:42) 
    at comprehensionTool.ComprehensionTool.startAnalyse(ComprehensionTool.java:80) 
    at comprehensionTool.ComprehensionTool.main(ComprehensionTool.java:48) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

поэтому, я думаю, что это проблема с пусковой установкой no с InvocationProcessor. Я перешел по этой ссылке: http://spoon.gforge.inria.fr/faq.html и Issue named: Как получить модель Spoon программно ?, поэтому я не понимаю, где проблема. Я использовал IntelliJ IDE, и я работаю над Windows 8.1.

+0

Хорошо, но вы добавили зависимость для jdt-core? Вспомогательный вопрос: есть ли у вас причина использовать версию Spoon версии 5.6.0? Я предлагаю вам использовать последнюю версию: 5.5.0. –

+0

Да, я добавил его, но возникла другая проблема с зависимостями ... Теперь она работает нормально. Спасибо. – Ondrej11