2017-01-27 3 views
0

Wenn jemand SPOON API verwendet, können Sie mir einen Hinweis geben, wie Call-Graph erstellen und was ich tun muss?Wie Erstellen von Call-Graph mit SPOON API

Ich denke, dass ich einige Prozessor wie diese erstellen müssen: für Lauf analysieren

public void getCallers(){ 

    final Launcher launcher = new Launcher(); 
    launcher.setArgs("-i D:\\IntelliJ_projects\\ComprehensionTool\\ -p comprehensionTool.analyse.processor.InvocationProcessor".split(" ")); 
    launcher.run(); 
} 

public class InvocationProcessor extends AbstractProcessor<CtInvocation> { 
    @Override 
    public void process(CtInvocation element) { 
     System.out.println(element.getActualTypeArguments()); 
    } 
} 

und verwenden Sie dann Launcher, aber ich bin nicht sicher, es ... und ich möchte zu fragen, brauche ich einige spezielle Abhängigkeiten für die Verwendung von Launcher?

Ich gehe davon aus, dass ich falsch bin, denn wenn ich es diesen Fehler Wurf ausgeführt:

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) 

Antwort

2

Sie eine Abhängigkeit benötigen JDT zu verdunkeln, verwenden wir dieses:

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

So wie du Starten Sie Spoon scheint gut, aber Ihr Prozessor wird das gesamte Modell durchqueren und Aufrufarten drucken: Es folgt nicht den Aufrufen. Das Erstellen eines Call-Graphs ist nicht so einfach: Sie müssen zuerst den Startpunkt (zum Beispiel eine Methode) ermitteln und dann dem Aufruf folgen.

Der Startpunkt ist einfach: Schauen Sie sich Spoon documentation an, aber dann müssen Sie das Call-Graph manuell durchlaufen, um es zu bauen. So

1

habe ich Abhängigkeiten (Maven-Projekt):

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

und ich versuchte, Löffel Launcher zu starten und alle Beschwörungen erhalten:

 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()); 
         } 
        } 
       } 
      } 
     } 

ich immer noch die gleichen Fehler auf spoon.run erhalten () Leitung:

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) 

so denke ich, dass es ein Problem mit Launcher ist nicht mit InvocationProcessor. Ich folgte diesem Link: http://spoon.gforge.inria.fr/faq.html und Problem namens: Wie programmgesteuert ein Spoon-Modell zu bekommen ?, so verstehe ich nicht, wo das Problem ist. Ich habe IntelliJ IDE und ich arbeite unter Windows 8.1.

+0

Ok, aber hast du die Abhängigkeit für jdt-core hinzugefügt? Nebenfrage: Gibt es einen Grund für Sie, die Version 5.6.0 von Spoon zu verwenden? Ich empfehle Ihnen, die neueste Version zu verwenden: 5.5.0. –

+0

Ja, ich habe es hinzugefügt, aber es gab ein anderes Problem mit Abhängigkeiten ... Jetzt funktioniert es gut. Vielen Dank. – Ondrej11

Verwandte Themen