Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[question] method call hierarchy #2014

Closed
bilak opened this issue May 30, 2018 · 109 comments · Fixed by #2021
Closed

[question] method call hierarchy #2014

bilak opened this issue May 30, 2018 · 109 comments · Fixed by #2021

Comments

@bilak
Copy link

bilak commented May 30, 2018

Hello,
I'm new to spoon and I'm wondering if following is possible to do with spoon.

I have method externalServiceCall(...) which is called from many places in my application. Can I have call hierarchy to this method?
What I want to achieve is that I will generate mappings of my @RestController to externalServiceCall(...).

this is what I'm thinking about:

  • get all calls of method externalServiceCall(...)
  • from all methods extracted from previous step extract first parameter which is some enumeration implementing Service interface (with this I can extract the name of service)
  • continue with call hierarchy of externalServiceCall(...) and go upper until I find some annotation on method. In this case I'm searching for spring's @RequestMapping

So in final I can have something like:

  • EXTERNAL_SERVICE1:
    • GET /endpoint1
    • POST /endpoint1/{id}
  • EXTERNAL_SERVICE2:
    • DELETE: /endpoint1
    • DELETE: /endpoint2

this is example of how the externalService call looks like externalServiceCall(ProductServiceEnum.GET_DETAIL, request)

...

@ashutosh1598
Copy link
Contributor

This can be done. You can parse through all the CtInvocations. For a particular CtInvocation, let's call it element: you can get the function name by element.getExecutable(), which returns a CtExecutableReference. You can get list of arguments by element.getArguments(). Just check whether function name is equal to "externalServiceCall". I didn't quite get your third point.

@bilak
Copy link
Author

bilak commented May 30, 2018

Third point is meant like if externalServiceCall(..) is the last method in the invacation chain of methods I'd like to find the first method(s) in chain and if it is annotated with @RequestMapping process it somehow. I will look at this tomorrow and ask more questions if needed.

@bilak
Copy link
Author

bilak commented May 31, 2018

Now I have something like this:

    @Test
    public void testIt() {
        Launcher launcher =new Launcher();
        launcher.getEnvironment().setNoClasspath(true);
        launcher.addInputResource("/projects/be");
        launcher.buildModel();
        CtModel model = launcher.getModel();

        List<CtMethod> allMethods = model.getElements(new TypeFilter<>(CtMethod.class));
        for (CtMethod<?> myMethod : allMethods) {
            CtExecutableReference execRef = myMethod.getReference();
            List<CtInvocation<?>> invocations = model.getElements(new InvocationFilter(execRef));
            System.out.println("test");
        }
    }

and getting following issue:

org.eclipse.jdt.internal.compiler.problem.AbortCompilation: Pb(324) The type org.springframework.http.MediaType cannot be resolved. It is indirectly referenced from required .class files

	at org.eclipse.jdt.internal.compiler.problem.ProblemHandler.handle(ProblemHandler.java:159)
	at org.eclipse.jdt.internal.compiler.problem.ProblemHandler.handle(ProblemHandler.java:226)
	at org.eclipse.jdt.internal.compiler.problem.ProblemReporter.handle(ProblemReporter.java:2432)
	at org.eclipse.jdt.internal.compiler.problem.ProblemReporter.isClassPathCorrect(ProblemReporter.java:4887)
	at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.getTypeFromCompoundName(LookupEnvironment.java:1682)
	at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.getTypeFromConstantPoolName(LookupEnvironment.java:1712)
	at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.getTypeFromConstantPoolName(LookupEnvironment.java:1720)
	at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.getTypeFromSignature(LookupEnvironment.java:1790)
	at org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.createMethod(BinaryTypeBinding.java:738)
	at org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.createMethods(BinaryTypeBinding.java:921)
	at org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.cachePartsFrom(BinaryTypeBinding.java:529)
	at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.createBinaryTypeFrom(LookupEnvironment.java:1022)
	at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.createBinaryTypeFrom(LookupEnvironment.java:1003)
	at org.eclipse.jdt.internal.compiler.Compiler.accept(Compiler.java:303)
	at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.askForType(LookupEnvironment.java:249)
	at org.eclipse.jdt.internal.compiler.lookup.UnresolvedReferenceBinding.resolve(UnresolvedReferenceBinding.java:105)
	at org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.resolveType(BinaryTypeBinding.java:215)
	at org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.resolveTypesFor(BinaryTypeBinding.java:1507)
	at org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.getMethods(BinaryTypeBinding.java:1244)
	at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.findStaticMethod(CompilationUnitScope.java:633)
	at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.findSingleStaticImport(CompilationUnitScope.java:611)
	at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.findSingleImport(CompilationUnitScope.java:585)
	at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.faultInImports(CompilationUnitScope.java:435)
	at org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope.faultInTypes(CompilationUnitScope.java:501)
	at spoon.support.compiler.jdt.TreeBuilderCompiler.buildUnits(TreeBuilderCompiler.java:60)
	at spoon.support.compiler.jdt.JDTBatchCompiler.getUnits(JDTBatchCompiler.java:168)
	at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildUnits(JDTBasedSpoonCompiler.java:397)
	at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildUnitsAndModel(JDTBasedSpoonCompiler.java:359)
	at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildSources(JDTBasedSpoonCompiler.java:335)
	at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.build(JDTBasedSpoonCompiler.java:116)
	at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.build(JDTBasedSpoonCompiler.java:99)
	at spoon.Launcher.buildModel(Launcher.java:720)
	at com.github.bilakpoc.spoonresttobackendmappinganalyzer.QuickTest.testIt(QuickTest.java:26)

Am I doing something wrong? It is multimodule maven project so I don't know if I should us MavenLauncher instead of Launcher

@monperrus
Copy link
Collaborator

monperrus commented May 31, 2018 via email

@bilak
Copy link
Author

bilak commented May 31, 2018

it's the second line in unit test and it doesn't work

@monperrus
Copy link
Collaborator

monperrus commented Jun 1, 2018 via email

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 1, 2018

I'm pretty sure it is the same thing as this: #1975

@bilak
Copy link
Author

bilak commented Jun 1, 2018

Hi,
@monperrus if I switch to MavenLauncher I get simillar error but this time with javax.annotation.Nonnull

@tdurieux yes that looks like the same problem

@bilak
Copy link
Author

bilak commented Jun 1, 2018

could this be helpful?

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 1, 2018

thanks for the link it will be useful.

Can you try again with this dependency in your project

<dependency>
    <groupId>org.eclipse.jdt</groupId>
    <artifactId>org.eclipse.jdt.annotation</artifactId>
    <version>2.0.0</version>
</dependency>

@bilak
Copy link
Author

bilak commented Jun 1, 2018

yes I've tried that in meantime but unfortunatelly it doesn't work. I also found this issue where they are configuring jdt. I don't know if that could help.

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 1, 2018

I pushed a solution in #1975!
We have this issue for years, I'm happy that I found a solution.

@bilak
Copy link
Author

bilak commented Jun 1, 2018

That solved this problem but now I get spoon.compiler.ModelBuildingException: The type Xyz is already defined

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 1, 2018

did you provide the path the source folder or to root of your project?

@bilak
Copy link
Author

bilak commented Jun 1, 2018

To be clear. I have multimodule maven project (huge one).
So currently I've used MavenLauncher and error spoon.compiler.ModelBuildingException: The type Xyz is already defined was due to fact that I had setup MavenLauncher launcher =new MavenLauncher("/projects/be", MavenLauncher.SOURCE_TYPE.ALL_SOURCE); with MavenLauncher.SOURCE_TYPE.ALL_SOURCE.
When I switched to MavenLauncher.SOURCE_TYPE.APP_SOURCE I'm getting nullpointer:

java.lang.NullPointerException
	at spoon.support.compiler.jdt.ReferenceBuilder.getTypeReference(ReferenceBuilder.java:541)
	at spoon.support.compiler.jdt.ReferenceBuilder.getTypeReference(ReferenceBuilder.java:480)
	at spoon.support.compiler.jdt.ReferenceBuilder.getExecutableReference(ReferenceBuilder.java:418)
	at spoon.support.compiler.jdt.JDTTreeBuilder.visit(JDTTreeBuilder.java:785)
	at org.eclipse.jdt.internal.compiler.ast.QualifiedAllocationExpression.traverse(QualifiedAllocationExpression.java:659)
	at org.eclipse.jdt.internal.compiler.ast.FieldDeclaration.traverse(FieldDeclaration.java:341)
	at org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.traverse(TypeDeclaration.java:1358)
	at org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.traverse(CompilationUnitDeclaration.java:778)
	at org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.traverse(CompilationUnitDeclaration.java:739)
	at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildModel(JDTBasedSpoonCompiler.java:473)
	at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildUnitsAndModel(JDTBasedSpoonCompiler.java:390)
	at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.buildSources(JDTBasedSpoonCompiler.java:339)
	at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.build(JDTBasedSpoonCompiler.java:130)
	at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.build(JDTBasedSpoonCompiler.java:113)
	at spoon.Launcher.buildModel(Launcher.java:708)
	at com.github.bilakpoc.spoonresttobackendmappinganalyzer.QuickTest.testIt(QuickTest.java:25

line 25 is last line in following code:

        MavenLauncher launcher =new MavenLauncher("/projects/be", MavenLauncher.SOURCE_TYPE.APP_SOURCE);
        launcher.getEnvironment().setNoClasspath(true);
        launcher.buildModel();

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 1, 2018

is Xyz a generated file? I should fix this in MavenLauncher.

I create a pr #2020 for the NPE

@bilak
Copy link
Author

bilak commented Jun 1, 2018

small steps, but we are moving somwhere :D

Just to mention Xyz was regular class, but I'm using lombok in my project. Could that be issue for some operations?

java.lang.NullPointerException
	at spoon.support.reflect.reference.CtExecutableReferenceImpl.getExecutableDeclaration(CtExecutableReferenceImpl.java:169)
	at spoon.support.reflect.reference.CtExecutableReferenceImpl.isOverriding(CtExecutableReferenceImpl.java:259)
	at spoon.reflect.visitor.filter.InvocationFilter.matches(InvocationFilter.java:54)
	at spoon.reflect.visitor.filter.InvocationFilter.matches(InvocationFilter.java:28)
	at spoon.reflect.visitor.chain.CtQueryImpl$3.apply(CtQueryImpl.java:185)
	at spoon.reflect.visitor.chain.CtQueryImpl$3.apply(CtQueryImpl.java:182)
	at spoon.reflect.visitor.chain.CtQueryImpl$FunctionWrapper._accept(CtQueryImpl.java:526)
	at spoon.reflect.visitor.chain.CtQueryImpl$AbstractStep.accept(CtQueryImpl.java:319)
	at spoon.reflect.visitor.filter.CtScannerFunction$Scanner.onElement(CtScannerFunction.java:87)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:148)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.CtScanner.visitCtField(CtScanner.java:417)
	at spoon.support.reflect.declaration.CtFieldImpl.accept(CtFieldImpl.java:67)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtClass(CtScanner.java:339)
	at spoon.support.reflect.declaration.CtClassImpl.accept(CtClassImpl.java:68)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:650)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.CtScanner.visitCtModule(CtScanner.java:925)
	at spoon.reflect.factory.ModuleFactory$CtUnnamedModule.accept(ModuleFactory.java:105)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.filter.CtScannerFunction.apply(CtScannerFunction.java:66)
	at spoon.reflect.visitor.filter.CtScannerFunction.apply(CtScannerFunction.java:36)
	at spoon.reflect.visitor.chain.CtQueryImpl$LazyFunctionWrapper._accept(CtQueryImpl.java:505)
	at spoon.reflect.visitor.chain.CtQueryImpl$AbstractStep.accept(CtQueryImpl.java:319)
	at spoon.reflect.visitor.chain.CtQueryImpl.forEach(CtQueryImpl.java:105)
	at spoon.reflect.visitor.chain.CtQueryImpl.list(CtQueryImpl.java:118)
	at spoon.reflect.visitor.chain.CtQueryImpl.list(CtQueryImpl.java:112)
	at spoon.reflect.CtModelImpl.getElements(CtModelImpl.java:138)
	at com.github.bilakpoc.spoonresttobackendmappinganalyzer.QuickTest.testIt(QuickTest.java:31)

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 1, 2018

I created a new pr #2021 for this NPE, you will help us to remove all npe from spoon.
Thanks

but I'm using lombok in my project

lombok probably generates the class in target/generated-class and I include this folder with MavenLauncher thus the class is duplicated. I don't know what is the good strategy

@bilak
Copy link
Author

bilak commented Jun 1, 2018

hmm now weird one...I have querydsl-core on classpath

spoon.support.SpoonClassNotFoundException: cannot load class: com.mysema.query.types.path.PathBuilder

	at spoon.support.reflect.reference.CtTypeReferenceImpl.findClass(CtTypeReferenceImpl.java:162)
	at spoon.support.reflect.reference.CtTypeReferenceImpl.getActualClass(CtTypeReferenceImpl.java:144)
	at spoon.support.reflect.reference.CtTypeReferenceImpl.getTypeDeclaration(CtTypeReferenceImpl.java:188)
	at spoon.support.reflect.reference.CtExecutableReferenceImpl.getExecutableDeclaration(CtExecutableReferenceImpl.java:173)
	at spoon.support.reflect.reference.CtExecutableReferenceImpl.isOverriding(CtExecutableReferenceImpl.java:263)
	at spoon.reflect.visitor.filter.InvocationFilter.matches(InvocationFilter.java:54)
	at spoon.reflect.visitor.filter.InvocationFilter.matches(InvocationFilter.java:28)
	at spoon.reflect.visitor.chain.CtQueryImpl$3.apply(CtQueryImpl.java:185)
	at spoon.reflect.visitor.chain.CtQueryImpl$3.apply(CtQueryImpl.java:182)
	at spoon.reflect.visitor.chain.CtQueryImpl$FunctionWrapper._accept(CtQueryImpl.java:526)
	at spoon.reflect.visitor.chain.CtQueryImpl$AbstractStep.accept(CtQueryImpl.java:319)
	at spoon.reflect.visitor.filter.CtScannerFunction$Scanner.onElement(CtScannerFunction.java:87)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:148)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.CtScanner.visitCtField(CtScanner.java:417)
	at spoon.support.reflect.declaration.CtFieldImpl.accept(CtFieldImpl.java:67)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtClass(CtScanner.java:339)
	at spoon.support.reflect.declaration.CtClassImpl.accept(CtClassImpl.java:68)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:650)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.CtScanner.visitCtModule(CtScanner.java:925)
	at spoon.reflect.factory.ModuleFactory$CtUnnamedModule.accept(ModuleFactory.java:105)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.filter.CtScannerFunction.apply(CtScannerFunction.java:66)
	at spoon.reflect.visitor.filter.CtScannerFunction.apply(CtScannerFunction.java:36)
	at spoon.reflect.visitor.chain.CtQueryImpl$LazyFunctionWrapper._accept(CtQueryImpl.java:505)
	at spoon.reflect.visitor.chain.CtQueryImpl$AbstractStep.accept(CtQueryImpl.java:319)
	at spoon.reflect.visitor.chain.CtQueryImpl.forEach(CtQueryImpl.java:105)
	at spoon.reflect.visitor.chain.CtQueryImpl.list(CtQueryImpl.java:118)
	at spoon.reflect.visitor.chain.CtQueryImpl.list(CtQueryImpl.java:112)
	at spoon.reflect.CtModelImpl.getElements(CtModelImpl.java:138)
	at com.github.bilakpoc.spoonresttobackendmappinganalyzer.QuickTest.testIt(QuickTest.java:31)
	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:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.lang.ClassNotFoundException: com.mysema.query.types.path.PathBuilder
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at spoon.support.reflect.reference.CtTypeReferenceImpl.findClass(CtTypeReferenceImpl.java:160)
	... 112 more

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 1, 2018

Can you check that the jar is present in launcher.getModelBuilder().getSourceClasspath()?

@bilak
Copy link
Author

bilak commented Jun 1, 2018

actually it's not present there. It is transitive dependency

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 1, 2018

does the parent dependency is present in the classpath?
Normally, maven launcher supports transitive dependency, that was the goal of this launcher.

@bilak
Copy link
Author

bilak commented Jun 1, 2018

No the parent dependency is not present tehre. To be clear I don't see any of my or parent jars.
This project has parent project from where I'm loading "parent dependencies" with dependency management. Currently I see only 48 dependencies what is quiet silly because there is more than 100 I guess.

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 1, 2018

and I suppose that the project you are working on is not publicly available

@bilak
Copy link
Author

bilak commented Jun 1, 2018

you are totally right :( but let me try something.

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 1, 2018

Do you use range version in this project?

@bilak
Copy link
Author

bilak commented Jun 1, 2018

what is range version? I tried the setup on this project and it also fails on simillar issue.

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 1, 2018

in maven you can say to use one version between 1.12 and 1.15 or any version above something

@bilak
Copy link
Author

bilak commented Jun 6, 2018

Nullpointer here

java.lang.NullPointerException
	at spoon.support.reflect.reference.CtExecutableReferenceImpl.isOverriding(CtExecutableReferenceImpl.java:271)
	at spoon.reflect.visitor.filter.InvocationFilter.matches(InvocationFilter.java:54)
	at spoon.reflect.visitor.filter.InvocationFilter.matches(InvocationFilter.java:28)
	at spoon.reflect.visitor.chain.CtQueryImpl$3.apply(CtQueryImpl.java:185)
	at spoon.reflect.visitor.chain.CtQueryImpl$3.apply(CtQueryImpl.java:182)
	at spoon.reflect.visitor.chain.CtQueryImpl$FunctionWrapper._accept(CtQueryImpl.java:526)
	at spoon.reflect.visitor.chain.CtQueryImpl$AbstractStep.accept(CtQueryImpl.java:319)
	at spoon.reflect.visitor.filter.CtScannerFunction$Scanner.onElement(CtScannerFunction.java:87)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:148)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.CtScanner.visitCtReturn(CtScanner.java:679)
	at spoon.support.reflect.code.CtReturnImpl.accept(CtReturnImpl.java:37)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtBlock(CtScanner.java:303)
	at spoon.support.reflect.code.CtBlockImpl.accept(CtBlockImpl.java:67)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.CtScanner.visitCtMethod(CtScanner.java:560)
	at spoon.support.reflect.declaration.CtMethodImpl.accept(CtMethodImpl.java:73)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtClass(CtScanner.java:339)
	at spoon.support.reflect.declaration.CtClassImpl.accept(CtClassImpl.java:68)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:650)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:90)
	at spoon.reflect.visitor.CtScanner.visitCtPackage(CtScanner.java:649)
	at spoon.support.reflect.declaration.CtPackageImpl.accept(CtPackageImpl.java:102)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.CtScanner.scan(CtScanner.java:174)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:113)
	at spoon.reflect.visitor.CtScanner.visitCtModule(CtScanner.java:925)
	at spoon.reflect.factory.ModuleFactory$CtUnnamedModule.accept(ModuleFactory.java:105)
	at spoon.reflect.visitor.EarlyTerminatingScanner.doScan(EarlyTerminatingScanner.java:152)
	at spoon.reflect.visitor.EarlyTerminatingScanner.scan(EarlyTerminatingScanner.java:128)
	at spoon.reflect.visitor.filter.CtScannerFunction.apply(CtScannerFunction.java:66)
	at spoon.reflect.visitor.filter.CtScannerFunction.apply(CtScannerFunction.java:36)
	at spoon.reflect.visitor.chain.CtQueryImpl$LazyFunctionWrapper._accept(CtQueryImpl.java:505)
	at spoon.reflect.visitor.chain.CtQueryImpl$AbstractStep.accept(CtQueryImpl.java:319)
	at spoon.reflect.visitor.chain.CtQueryImpl.forEach(CtQueryImpl.java:105)
	at spoon.reflect.visitor.chain.CtQueryImpl.list(CtQueryImpl.java:118)
	at spoon.reflect.visitor.chain.CtQueryImpl.list(CtQueryImpl.java:112)
	at spoon.reflect.CtModelImpl.getElements(CtModelImpl.java:138)

I'm on your branch...don't know if need something else to merge

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 6, 2018

you should merge maven launcher pr.

@bilak
Copy link
Author

bilak commented Jun 6, 2018

On project (core) which I was referencing now it seems to be working. I will prepare some kind of application and ask you if you can help me to manage how to solve my original question.
Hovewer when I run this against other project which extends from first one (core-extension which is really big one and actually I need all analysis here) then it takes long time on List<CtInvocation<?>> invocations = model.getElements(new InvocationFilter(execRef)); And I didn't seen the test output in logs even after 5 minutes. Do you have experiences on such big project? How long could it take to analyze such project?

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 6, 2018

The request that you launched is browse several time the AST which is really not efficient

Something like this will be more efficient.

List<CtExecutableReference> allMethods = launcher.getModel()
				.getElements(new TypeFilter<>(CtMethod.class))
				.stream().map(m -> m.getReference()).collect(Collectors.toList());

		launcher.getModel().getRootPackage().accept(new CtScanner() {
			@Override
			public <T> void visitCtInvocation(CtInvocation<T> invocation) {
				if (invocation.getExecutable().isConstructor()) {
					return;
				}
				for (CtExecutableReference<?> executable : allMethods) {
					if (invocation.getExecutable().getSimpleName().equals(executable.getSimpleName())
							&& invocation.getExecutable().isOverriding(executable)) {
						System.out.println(executable + "=>" + invocation);
					}
				}
			}
		});

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 6, 2018

I rebase my PR about maven-launcher, can you try again this branch?

Thanks

@bilak
Copy link
Author

bilak commented Jun 6, 2018

if this is the branch you are referencing, then there is nullpointer.

java.lang.NullPointerException
	at spoon.support.reflect.reference.CtExecutableReferenceImpl.isOverriding(CtExecutableReferenceImpl.java:271)
	at spoon.reflect.visitor.filter.InvocationFilter.matches(InvocationFilter.java:54)
	at spoon.reflect.visitor.filter.InvocationFilter.matches(InvocationFilter.java:28)

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 6, 2018

no this one: #2024

@bilak
Copy link
Author

bilak commented Jun 6, 2018

That seems to be working

@bilak
Copy link
Author

bilak commented Jun 6, 2018

Btw I've updated the sample project with some sources which are simplified something that I need to analyze in my application. this method is that one which calls all external services. I need all it's parent invocations where I can find first parameter (so this and this) and then from there I need to search for all calling methods and find methods which are annotated with @ResuestMapping which are calling this method (this and this)

Can you help me with that please? I can't get my head over that.

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 6, 2018

Finally!

Thank you for all the time you took to reproduce and report the issues!

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 6, 2018

Can you help me with that please? I can't get my head over that.

If I correctly understand you have

AbstractIntegrationCaller.callExternalService(...) which is the method that you want to find the usage

You want to find all the methods that call AbstractIntegrationCaller.callExternalService(...) (our child class) and have the annotation @ResuestMapping, is it right?

@bilak
Copy link
Author

bilak commented Jun 6, 2018

Yes that's correct, but I want one extra thing and that is. method directly invoking AbstractIntegrationCaller.callExternalService(...) in which I can see the first parameter of method in which I'm interested - the name and version of service. So in the end I will get some map like:

external service rest controller
booleanService_V1
/negations
..many more
dateService_V1
/dates
..many more

Don't bother with retrieval of annotation values (like /negations), I can use it from spring utilities.

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 6, 2018

this should work

CtClass<?> aClass = factory.Class().get("com.github.bilakpoc.spoon.integration.AbstractIntegrationCaller");
		CtMethod<?> ctMethod = aClass.getMethodsByName("callExternalService").get(0);

		List<CtMethod> callers = ctModel.getElements(new TypeFilter<CtInvocation>(CtInvocation.class) {
			@Override
			public boolean matches(CtInvocation element) {
				CtExecutableReference executable = element.getExecutable();
				if (executable.getSimpleName().equals(ctMethod.getSimpleName())
						&& executable.isOverriding(ctMethod.getReference())) {
					return true;
				}
				return false;
			}
		}).stream().map(i -> {
			CtMethod parent = i.getParent(CtMethod.class);
			parent.putMetadata("ExternalService", i.getArguments().get(0).toString());
			return parent;
		}).collect(Collectors.toList());

		CtTypeReference<? extends Annotation> requestAnnotation = factory.Type().createReference("org.springframework.web.bind.annotation.RequestMapping");

		ctModel.getRootPackage().accept(new CtScanner() {
			@Override
			public <T> void visitCtInvocation(CtInvocation<T> invocation) {
				CtExecutableReference<T> executable = invocation.getExecutable();
				for (int i = 0; i < callers.size(); i++) {
					CtMethod method = callers.get(i);
					if (method.getSignature().equals(executable.getSignature())) {
						CtMethod parent = invocation.getParent(CtMethod.class);
						CtAnnotation<? extends Annotation> annotation = parent.getAnnotation(requestAnnotation);
						if (annotation != null) {

							System.out.println(method.getMetadata("ExternalService") + " -> " + annotation.getValue("value").toString());
						}
					}
				}
				super.visitCtInvocation(invocation);
			}
		});

@bilak
Copy link
Author

bilak commented Jun 7, 2018

Hi @tdurieux that works.
I have additional questions:

  • at this place can I somehow access instance of ExternalService? That menas if I know that there's call INTEGRATION.callExternalService(BooleanServiceEnum.V1, value); can I somehow get BooleanServiceEnum.V1 and call method getNameWithVersion()?
  • here can I access java.lang.reflect.Method and also class java.lang.Class in which the method is? I will need to perform more analysis, but I need to work with method and it's class.
  • do you have plan when all changes could be published to maven central? I'd like to add some test like this to project, so it would be nice to download spoon from central repository.

I'm still working only on this sample project to understand what should I do, then I will try on that big project and will let you know if there is everything ok.

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 7, 2018

Spoon is a static analysis tool, it has not been designed for interaction with the running state:/

But there the method Class CtTypeReference.getActualClass() and Object CtClass.newInstance() that should help you.
We don't have any direct way to directly retrieve the Method.

A snapshot of spoon is pushed everyday on maven central, I need to finish my PR maven-launcher

@monperrus
Copy link
Collaborator

We have CtMethod#getActualMethod

@bilak
Copy link
Author

bilak commented Jun 7, 2018

@monperrus in which version is it? I don't see it here

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 7, 2018

It is on CtExecutableReference.getActualMethod()
Thus CtMethod.getReference().getActualMethod()

@bilak
Copy link
Author

bilak commented Jun 7, 2018

I've updated the project and I think for test project I'm satisfied. I will work on private project maybe next week.

Just that last question. When will be this changes available in maven central? Do you have any release plan?

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 7, 2018

the releases are every 3/4 months depending of the content but the snapshot is deployed every night thus once the pr is merged the next day you have the features in maven central.

@surli
Copy link
Collaborator

surli commented Jun 7, 2018

When will be this changes available in maven central?

In fact there should be a release coming before the end of the month. So if the changes are already in master, stay tuned the release is coming :)

@bilak
Copy link
Author

bilak commented Jun 8, 2018

Hi I'm playing with code. I don't understand one thing. When I run test project everything seems to be ok. Even if I add another controller with deeper strucutre eg controller -> service -> service -> service -> service -> AbstractIntegrationCaller#callExternalService. But when I invoke this code on my project where that strucutre is more nested I don't get the result. Is this function recursive? I mean if I invoke it on AbstractIntegrationCaller#callExternalService callers do I allways get to top caller even if it is 15th call in hierarchy?

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 8, 2018

No you will only get the method that directly call AbstractIntegrationCaller#callExternalService.
To support this: controller -> service -> service -> service -> service -> AbstractIntegrationCaller#callExternalService it is not that easy because you have to create the call graph of your project then to find all the method that are calling
AbstractIntegrationCaller#callExternalService

@bilak
Copy link
Author

bilak commented Jun 8, 2018

And what is the simplest way to create that call graph. I was thinking about moving this function to separate method (processing) and call it recursivelly -> check if extracted method has annotaiton if no get callers of currently processing method and call procesing method again. But I don't know if this is correct aproach.

@bilak
Copy link
Author

bilak commented Jun 8, 2018

btw I've updated the project. And you can see that I've added another controller which has more than one nested "service" and the result is ok. So why in this case it's working?

@tdurieux
Copy link
Collaborator

tdurieux commented Jun 8, 2018

And what is the simplest way to create that call graph. I was thinking about moving this function to separate method (processing)

It should work, but the performance costs of this function is high I don't know if it is ok for you

btw I've updated the project. And you can see that I've added another controller which has more than one nested "service" and the result is ok. So why in this case it's working?

Because the signature of the method did not change.

@bilak
Copy link
Author

bilak commented Jun 8, 2018

Because the signature of the method did not change.

I see that this is that problem which I didn't recognized before. So could you please suggest some mechanizm how to create the call graph?

@bilak
Copy link
Author

bilak commented Jun 11, 2018

@tdurieux can you please explain to me what is the way to search for parent invocations if there is change in method signature? e.g. if I have calls to callExternalService() like:

public Restult processIntegration1(String param1, String param2){
  Object integrationResult = xyz.callExternalService();
 ...
}

I want to traverse from callExternalService invocations to top where is some kind of RequestMapping. I don't uderstand which elements/methods should I use for that.

thanks

@tdurieux
Copy link
Collaborator

with CtInvlocation.getExecutable().getExecutableDeclaration() you will get the declaration of the invocation

@bilak bilak closed this as completed Jun 11, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants