From e56b7946dc197a959153946ef9e5eb12ef6dbc4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Lars=C3=A9n?= Date: Sun, 19 Apr 2020 13:41:37 +0200 Subject: [PATCH 1/3] Add failing test case --- .../test/reference/TypeReferenceTest.java | 29 +++++++++++++++++++ .../noclasspath/QualifiedArrayType.java | 6 ++++ 2 files changed, 35 insertions(+) create mode 100644 src/test/resources/noclasspath/QualifiedArrayType.java diff --git a/src/test/java/spoon/test/reference/TypeReferenceTest.java b/src/test/java/spoon/test/reference/TypeReferenceTest.java index 5f05d52413e..3202821f1b3 100644 --- a/src/test/java/spoon/test/reference/TypeReferenceTest.java +++ b/src/test/java/spoon/test/reference/TypeReferenceTest.java @@ -39,9 +39,11 @@ import spoon.reflect.declaration.CtType; import spoon.reflect.declaration.CtTypeParameter; import spoon.reflect.factory.Factory; +import spoon.reflect.reference.CtArrayTypeReference; import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.reference.CtFieldReference; import spoon.reflect.reference.CtParameterReference; +import spoon.reflect.reference.CtReference; import spoon.reflect.reference.CtTypeParameterReference; import spoon.reflect.reference.CtTypeReference; import spoon.reflect.reference.CtWildcardReference; @@ -702,4 +704,31 @@ public void testIsInTheSamePackageNoClasspath() { CtTypeReference tr2 = fields.get(0).getType(); assertTrue(vars.get(0).getReference().getType().canAccess(tr2)); } + + @Test + public void testQualifiedArrayTypeReferenceNoClasspath() { + // contract: component type of explicitly qualified array type reference should have explicit package reference + final Launcher launcher = new Launcher(); + launcher.addInputResource("./src/test/resources/noclasspath/QualifiedArrayType.java"); + launcher.getEnvironment().setNoClasspath(true); + CtModel model = launcher.buildModel(); + List> refs = model.getElements(e -> true); + + int loopIterations = 0; // for meta assert + for (CtArrayTypeReference arrayTypeRef : refs) { + CtTypeReference compType = getDeepestComponentType(arrayTypeRef); + assertFalse(compType.getPackage().isImplicit()); + loopIterations++; + } + + assertTrue("Test loop did not execute", loopIterations > 0); + } + + private static CtTypeReference getDeepestComponentType(CtArrayTypeReference arrayTypeRef) { + CtReference ref = arrayTypeRef; + while (ref instanceof CtArrayTypeReference) { + ref = ((CtArrayTypeReference) ref).getComponentType(); + } + return (CtTypeReference) ref; + } } diff --git a/src/test/resources/noclasspath/QualifiedArrayType.java b/src/test/resources/noclasspath/QualifiedArrayType.java new file mode 100644 index 00000000000..fb23183b740 --- /dev/null +++ b/src/test/resources/noclasspath/QualifiedArrayType.java @@ -0,0 +1,6 @@ +import java.util.*; + +public class QualifiedArrayType { + java.lang.Object[] builtinTypeArray; + java.util.Collection[] importedTypeArray; +} \ No newline at end of file From edf97004a4a1b8e138efa16bb3cb6ca91db310ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Lars=C3=A9n?= Date: Wed, 6 May 2020 11:26:45 +0200 Subject: [PATCH 2/3] Remove seting of reference implicitness --- src/main/java/spoon/support/compiler/jdt/ReferenceBuilder.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/spoon/support/compiler/jdt/ReferenceBuilder.java b/src/main/java/spoon/support/compiler/jdt/ReferenceBuilder.java index 881c7158c32..a02bb01bc81 100644 --- a/src/main/java/spoon/support/compiler/jdt/ReferenceBuilder.java +++ b/src/main/java/spoon/support/compiler/jdt/ReferenceBuilder.java @@ -775,7 +775,6 @@ CtTypeReference getTypeReference(TypeBinding binding, boolean resolveGene ref.setDeclaringType(getTypeReference(binding.enclosingType())); } else { CtPackageReference packageReference = getPackageReference(binding.getPackage()); - packageReference.setImplicit(true); ref.setPackage(packageReference); } ref.setSimpleName(new String(binding.sourceName())); From 8acb899393702bd6d8574f1dbaac7eb1a885ad1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Lars=C3=A9n?= Date: Wed, 6 May 2020 11:27:14 +0200 Subject: [PATCH 3/3] Update the expected result of testGeneratedSpoonifyCode --- src/test/java/spoon/test/spoonifier/SpoonifierTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/spoon/test/spoonifier/SpoonifierTest.java b/src/test/java/spoon/test/spoonifier/SpoonifierTest.java index c96694a6ced..a6dd6a53e6b 100644 --- a/src/test/java/spoon/test/spoonifier/SpoonifierTest.java +++ b/src/test/java/spoon/test/spoonifier/SpoonifierTest.java @@ -230,8 +230,8 @@ public void testGeneratedSpoonifyCode() { "\t\t\t\t\tCtExecutableReference ctExecutableReference0 = factory.createExecutableReference();\n" + "\t\t\t\t\tctExecutableReference0.setSimpleName(\"\");\n" + "\t\t\t\t\tctInvocation0.setValueByRole(CtRole.EXECUTABLE_REF, ctExecutableReference0);\n" + - "\t\t\t\t\t\tctExecutableReference0.setValueByRole(CtRole.DECLARING_TYPE, factory.Type().createSimplyQualifiedReference(\"java.lang.Object\"));\n" + - "\t\t\t\t\t\tctExecutableReference0.setValueByRole(CtRole.TYPE, factory.Type().createSimplyQualifiedReference(\"java.lang.Object\"));\n" + + "\t\t\t\t\t\tctExecutableReference0.setValueByRole(CtRole.DECLARING_TYPE, factory.Type().createReference(\"java.lang.Object\"));\n" + + "\t\t\t\t\t\tctExecutableReference0.setValueByRole(CtRole.TYPE, factory.Type().createReference(\"java.lang.Object\"));\n" + "\t\t\tctBlock0.setValueByRole(CtRole.STATEMENT, ctBlock0Statements);\n" + "\t\tCtField ctField0 = factory.createField();\n" + "\t\tctField0.setSimpleName(\"i\");\n" + @@ -273,7 +273,7 @@ public void testGeneratedSpoonifyCode() { "\t\t\t\t\t\tCtParameterReference ctParameterReference0 = factory.createParameterReference();\n" + "\t\t\t\t\t\tctParameterReference0.setSimpleName(\"toto\");\n" + "\t\t\t\t\t\tctVariableRead0.setValueByRole(CtRole.VARIABLE, ctParameterReference0);\n" + - "\t\t\t\t\t\t\tctParameterReference0.setValueByRole(CtRole.TYPE, factory.Type().createSimplyQualifiedReference(\"java.lang.String\"));\n" + + "\t\t\t\t\t\t\tctParameterReference0.setValueByRole(CtRole.TYPE, factory.Type().createReference(\"java.lang.String\"));\n" + "\t\t\tctBlock1.setValueByRole(CtRole.STATEMENT, ctBlock1Statements);\n" + "\t\tctMethod0.setValueByRole(CtRole.PARAMETER, ctMethod0Parameters);\n" + "\tctClass0.setValueByRole(CtRole.TYPE_MEMBER, ctClass0TypeMembers);\n";