diff --git a/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilder.java b/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilder.java index d22a89d8f5f..103517e79d3 100644 --- a/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilder.java +++ b/src/main/java/spoon/support/compiler/jdt/JDTTreeBuilder.java @@ -858,7 +858,8 @@ public boolean visit(ArrayReference arrayReference, BlockScope scope) { @Override public boolean visit(ArrayTypeReference arrayTypeReference, BlockScope scope) { - final CtTypeAccess typeAccess = factory.Code().createTypeAccess(references.buildTypeReference(arrayTypeReference, scope)); + CtTypeReference objectCtTypeReference = references.buildTypeReference(arrayTypeReference, scope); + final CtTypeAccess typeAccess = factory.Code().createTypeAccess(objectCtTypeReference); if (typeAccess.getAccessedType() instanceof CtArrayTypeReference) { ((CtArrayTypeReference) typeAccess.getAccessedType()).getArrayType().setAnnotations(this.references.buildTypeReference(arrayTypeReference, scope).getAnnotations()); } diff --git a/src/main/java/spoon/support/compiler/jdt/ReferenceBuilder.java b/src/main/java/spoon/support/compiler/jdt/ReferenceBuilder.java index b1641afa723..a42d8f38a23 100644 --- a/src/main/java/spoon/support/compiler/jdt/ReferenceBuilder.java +++ b/src/main/java/spoon/support/compiler/jdt/ReferenceBuilder.java @@ -625,7 +625,13 @@ private CtTypeReference getTypeReference(String name) { } } } else if (Character.isUpperCase(name.charAt(0))) { - main = this.jdtTreeBuilder.getFactory().Core().createTypeReference(); + if (name.endsWith("[]")) { + main = this.jdtTreeBuilder.getFactory().Core().createArrayTypeReference(); + name = name.substring(0, name.length() - 2); + ((CtArrayTypeReference) main).setComponentType(this.getTypeReference(name)); + } else { + main = this.jdtTreeBuilder.getFactory().Core().createTypeReference(); + } main.setSimpleName(name); final CtReference declaring = this.getDeclaringReferenceFromImports(name.toCharArray()); setPackageOrDeclaringType(main, declaring); diff --git a/src/test/java/spoon/test/prettyprinter/DefaultPrettyPrinterTest.java b/src/test/java/spoon/test/prettyprinter/DefaultPrettyPrinterTest.java index 84dc883b98a..2f3176ea211 100644 --- a/src/test/java/spoon/test/prettyprinter/DefaultPrettyPrinterTest.java +++ b/src/test/java/spoon/test/prettyprinter/DefaultPrettyPrinterTest.java @@ -7,16 +7,21 @@ import spoon.compiler.Environment; import spoon.compiler.SpoonResource; import spoon.compiler.SpoonResourceHelper; +import spoon.reflect.CtModel; import spoon.reflect.code.CtCodeSnippetStatement; import spoon.reflect.code.CtConstructorCall; import spoon.reflect.code.CtInvocation; import spoon.reflect.code.CtStatement; import spoon.reflect.declaration.CtClass; +import spoon.reflect.declaration.CtMethod; +import spoon.reflect.declaration.CtParameter; import spoon.reflect.declaration.CtType; import spoon.reflect.factory.Factory; +import spoon.reflect.reference.CtArrayTypeReference; import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.DefaultJavaPrettyPrinter; import spoon.reflect.visitor.Query; +import spoon.reflect.visitor.filter.NamedElementFilter; import spoon.reflect.visitor.filter.TypeFilter; import spoon.support.JavaOutputProcessor; import spoon.test.prettyprinter.testclasses.AClass; @@ -28,6 +33,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static spoon.testing.utils.ModelUtils.build; @@ -303,4 +309,28 @@ public void testIssue1501() { assertFalse(launcher.getModel().getAllTypes().isEmpty()); } + @Test + public void testIssue2130() { + // contract: varargs parameters should always be CtArrayTypeReference + + Launcher launcher = new Launcher(); + launcher.getEnvironment().setNoClasspath(true); + launcher.addInputResource("./src/test/resources/noclasspath/LogService.java"); + launcher.setSourceOutputDirectory("./target/issue2130"); + launcher.getEnvironment().setComplianceLevel(8); + CtModel model = launcher.buildModel(); + + CtMethod machin = model.getElements(new NamedElementFilter(CtMethod.class, "machin")).get(0); + assertEquals("machin", machin.getSimpleName()); + + List> parameters = machin.getParameters(); + assertEquals(1, parameters.size()); + + CtParameter ctParameter = parameters.get(0); + assertTrue(ctParameter.isVarArgs()); + assertTrue(ctParameter.getType() instanceof CtArrayTypeReference); + + launcher.prettyprint(); + } + } diff --git a/src/test/resources/noclasspath/LogService.java b/src/test/resources/noclasspath/LogService.java new file mode 100644 index 00000000000..bc7b3f54f37 --- /dev/null +++ b/src/test/resources/noclasspath/LogService.java @@ -0,0 +1,15 @@ +package spoon.test.prettyprinter.testclasses; + +public class LogService { + + public void main() { + new ArrayList2().forEach(x -> { + new Machin() { + + public Void machin(Void... voids) { + return null; + } + }.machin(null); + }); + } +}