Skip to content

Commit

Permalink
Fix bugs in ImportScannerImpl
Browse files Browse the repository at this point in the history
  • Loading branch information
leventov committed Apr 19, 2016
1 parent 17d6188 commit 538a705
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 5 deletions.
15 changes: 10 additions & 5 deletions src/main/java/spoon/reflect/visitor/ImportScannerImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,19 +72,16 @@ public <T> void visitCtFieldWrite(CtFieldWrite<T> fieldWrite) {
public <T> void visitCtFieldReference(CtFieldReference<T> reference) {
enter(reference);
scan(reference.getDeclaringType());
// scan(reference.getType());
exit(reference);
}

@Override
public <T> void visitCtExecutableReference(
CtExecutableReference<T> 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);
}
Expand All @@ -95,6 +92,7 @@ public <T> void visitCtInvocation(CtInvocation<T> invocation) {
scan(invocation.getAnnotations());
scan(invocation.getTypeCasts());
scan(invocation.getTarget());
scan(invocation.getExecutable());
scan(invocation.getArguments());
exit(invocation);
}
Expand All @@ -112,6 +110,13 @@ public <T> void visitCtTypeReference(CtTypeReference<T> reference) {

}

@Override
public void scan(CtElement element) {
if (element != null && !element.isImplicit()) {
element.accept(this);
}
}

@Override
public <A extends Annotation> void visitCtAnnotationType(
CtAnnotationType<A> annotationType) {
Expand Down
23 changes: 23 additions & 0 deletions src/test/java/spoon/test/imports/ImportTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<CtTypeReference<?>> imports =
importContext.computeImports(factory.Class().get(NotImportExecutableType.class));

assertEquals(2, imports.size());
Set<String> expectedImports = new HashSet<>(
Arrays.asList("spoon.test.imports.testclasses.internal3.Foo", "java.io.File"));
Set<String> actualImports = imports.stream().map(CtTypeReference::toString).collect(Collectors.toSet());
assertEquals(expectedImports, actualImports);
}

@Test
public void testImportOfInvocationOfStaticMethod() throws Exception {
final Factory factory = getFactory(
Expand Down
Original file line number Diff line number Diff line change
@@ -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.<File>bar();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package spoon.test.imports.testclasses.internal3;

public class Bar {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package spoon.test.imports.testclasses.internal3;

public class Foo {
public <T> Bar bar() {
return null;
}
}

0 comments on commit 538a705

Please sign in to comment.