From 538a705e10e2f7b393d523ae6891c743eae0ed30 Mon Sep 17 00:00:00 2001 From: leventov Date: Tue, 19 Apr 2016 15:12:32 +0100 Subject: [PATCH] Fix bugs in ImportScannerImpl --- .../reflect/visitor/ImportScannerImpl.java | 15 ++++++++---- .../java/spoon/test/imports/ImportTest.java | 23 +++++++++++++++++++ .../testclasses/NotImportExecutableType.java | 13 +++++++++++ .../imports/testclasses/internal3/Bar.java | 4 ++++ .../imports/testclasses/internal3/Foo.java | 7 ++++++ 5 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 src/test/java/spoon/test/imports/testclasses/NotImportExecutableType.java create mode 100644 src/test/java/spoon/test/imports/testclasses/internal3/Bar.java create mode 100644 src/test/java/spoon/test/imports/testclasses/internal3/Foo.java diff --git a/src/main/java/spoon/reflect/visitor/ImportScannerImpl.java b/src/main/java/spoon/reflect/visitor/ImportScannerImpl.java index e6aa8f19c3e..470ad5500c2 100644 --- a/src/main/java/spoon/reflect/visitor/ImportScannerImpl.java +++ b/src/main/java/spoon/reflect/visitor/ImportScannerImpl.java @@ -72,7 +72,6 @@ public void visitCtFieldWrite(CtFieldWrite fieldWrite) { public void visitCtFieldReference(CtFieldReference reference) { enter(reference); scan(reference.getDeclaringType()); - // scan(reference.getType()); exit(reference); } @@ -80,11 +79,9 @@ public void visitCtFieldReference(CtFieldReference reference) { public void visitCtExecutableReference( CtExecutableReference reference) { enter(reference); - if (reference.getDeclaringType() != null - && reference.getDeclaringType().getDeclaringType() == null) { - addImport(reference.getDeclaringType()); + if (reference.isConstructor()) { + scan(reference.getDeclaringType()); } - scan(reference.getType()); scan(reference.getActualTypeArguments()); exit(reference); } @@ -95,6 +92,7 @@ public void visitCtInvocation(CtInvocation invocation) { scan(invocation.getAnnotations()); scan(invocation.getTypeCasts()); scan(invocation.getTarget()); + scan(invocation.getExecutable()); scan(invocation.getArguments()); exit(invocation); } @@ -112,6 +110,13 @@ public void visitCtTypeReference(CtTypeReference reference) { } + @Override + public void scan(CtElement element) { + if (element != null && !element.isImplicit()) { + element.accept(this); + } + } + @Override public void visitCtAnnotationType( CtAnnotationType annotationType) { diff --git a/src/test/java/spoon/test/imports/ImportTest.java b/src/test/java/spoon/test/imports/ImportTest.java index 72366bef401..6a72ead02cb 100644 --- a/src/test/java/spoon/test/imports/ImportTest.java +++ b/src/test/java/spoon/test/imports/ImportTest.java @@ -21,12 +21,17 @@ import spoon.test.imports.testclasses.ClassWithInvocation; import spoon.test.imports.testclasses.ClientClass; import spoon.test.imports.testclasses.Mole; +import spoon.test.imports.testclasses.NotImportExecutableType; import spoon.test.imports.testclasses.Pozole; import spoon.test.imports.testclasses.SubClass; import spoon.test.imports.testclasses.internal.ChildClass; +import java.util.Arrays; import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -224,6 +229,24 @@ public void testImportOfInvocationOfPrivateClass() throws Exception { assertEquals("spoon.test.imports.testclasses.internal2.Chimichanga", imports.toArray()[0].toString()); } + @Test + public void testNotImportExecutableType() throws Exception { + final Factory factory = getFactory( + "./src/test/java/spoon/test/imports/testclasses/internal3/Foo.java", + "./src/test/java/spoon/test/imports/testclasses/internal3/Bar.java", + "./src/test/java/spoon/test/imports/testclasses/NotImportExecutableType.java"); + + ImportScanner importContext = new ImportScannerImpl(); + Collection> imports = + importContext.computeImports(factory.Class().get(NotImportExecutableType.class)); + + assertEquals(2, imports.size()); + Set expectedImports = new HashSet<>( + Arrays.asList("spoon.test.imports.testclasses.internal3.Foo", "java.io.File")); + Set actualImports = imports.stream().map(CtTypeReference::toString).collect(Collectors.toSet()); + assertEquals(expectedImports, actualImports); + } + @Test public void testImportOfInvocationOfStaticMethod() throws Exception { final Factory factory = getFactory( diff --git a/src/test/java/spoon/test/imports/testclasses/NotImportExecutableType.java b/src/test/java/spoon/test/imports/testclasses/NotImportExecutableType.java new file mode 100644 index 00000000000..bf619c48991 --- /dev/null +++ b/src/test/java/spoon/test/imports/testclasses/NotImportExecutableType.java @@ -0,0 +1,13 @@ +package spoon.test.imports.testclasses; + +import spoon.test.imports.testclasses.internal3.Foo; + +import java.io.File; + +public class NotImportExecutableType { + + void m() { + Foo foo = new Foo(); + Object o = foo.bar(); + } +} diff --git a/src/test/java/spoon/test/imports/testclasses/internal3/Bar.java b/src/test/java/spoon/test/imports/testclasses/internal3/Bar.java new file mode 100644 index 00000000000..afc0930c332 --- /dev/null +++ b/src/test/java/spoon/test/imports/testclasses/internal3/Bar.java @@ -0,0 +1,4 @@ +package spoon.test.imports.testclasses.internal3; + +public class Bar { +} diff --git a/src/test/java/spoon/test/imports/testclasses/internal3/Foo.java b/src/test/java/spoon/test/imports/testclasses/internal3/Foo.java new file mode 100644 index 00000000000..f3fa066337a --- /dev/null +++ b/src/test/java/spoon/test/imports/testclasses/internal3/Foo.java @@ -0,0 +1,7 @@ +package spoon.test.imports.testclasses.internal3; + +public class Foo { + public Bar bar() { + return null; + } +}