Skip to content

Commit

Permalink
fix: fix wrong import on annotated parameter #3320 (#3341)
Browse files Browse the repository at this point in the history
  • Loading branch information
gibahjoe committed Apr 24, 2020
1 parent c5dd862 commit 02beef2
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -1865,7 +1865,10 @@ private void visitCtTypeReference(CtTypeReference<?> ref, boolean withGenerics)
printer.writeSeparator(CtPackage.PACKAGE_SEPARATOR);
}
}
elementPrinterHelper.writeAnnotations(ref);
// You don't want to include annotations in import of an annotated object
if (ref.isParentInitialized() && !(ref.getParent() instanceof CtImport)) {
elementPrinterHelper.writeAnnotations(ref);
}
printer.writeIdentifier(ref.getSimpleName());
}
if (withGenerics && !context.ignoreGenerics()) {
Expand Down
19 changes: 19 additions & 0 deletions src/test/java/spoon/test/imports/ImportTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
import spoon.test.imports.testclasses.SubClass;
import spoon.test.imports.testclasses.Tacos;
import spoon.test.imports.testclasses.ToBeModified;
import spoon.test.imports.testclasses.badimportissue3320.source.TestSource;
import spoon.testing.utils.ModelUtils;

import java.io.BufferedReader;
Expand Down Expand Up @@ -1777,4 +1778,22 @@ public void testImportByJavaDoc() throws Exception {
}
}

@Test
public void testImportsForElementsAnnotatedWithTypeUseAnnotations() {
// contract: correct import generated for method parameters annotated with TYPE_USE annotations
final Launcher launcher = new Launcher();
Environment environment = launcher.getEnvironment();

environment.setNoClasspath(true);
environment.setAutoImports(true);
launcher.addInputResource("src/test/java/spoon/test/imports/testclasses/badimportissue3320/source/TestSource.java");
launcher.run();

CtType<TestSource> objectCtType = launcher.getFactory().Type().get(TestSource.class);
CompilationUnit compilationUnit = launcher.getFactory().CompilationUnit().getOrCreate(objectCtType);

assertEquals(1, compilationUnit.getImports().stream()
.filter(ctImport -> ctImport.prettyprint().equals("import spoon.test.imports.testclasses.badimportissue3320.source.other.SomeObjectDto;"))
.count());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package spoon.test.imports.testclasses.badimportissue3320.source;

import spoon.test.imports.testclasses.badimportissue3320.source.other.SomeObjectDto;
import spoon.test.imports.testclasses.badimportissue3320.source.other.TestAnnotation;

public class TestSource {
private String firstName;
private String lastName;

public String getFirstName() {
return firstName;
}

public TestSource setObject(@TestAnnotation SomeObjectDto someObjectDto) {

return this;
}

public TestSource setFirstName(@TestAnnotation String firstName) {
this.firstName = firstName;
return this;
}

public String getLastName() {
return lastName;
}

public TestSource setLastName(String lastName) {
this.lastName = lastName;
return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package spoon.test.imports.testclasses.badimportissue3320.source.other;

public class SomeObjectDto {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package spoon.test.imports.testclasses.badimportissue3320.source.other;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Target({ METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface TestAnnotation {
}

0 comments on commit 02beef2

Please sign in to comment.