diff --git a/base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java b/base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java index 957c4aa6be..d1f4a44f84 100644 --- a/base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java +++ b/base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java @@ -5645,4 +5645,25 @@ public void testTypeChecked10592() { runConformTest(sources, "works", "groovy.lang.MissingPropertyException: No such property: value for class: Face"); } + + @Test + public void testTypeChecked10624() { + //@formatter:off + String[] sources = { + "Main.groovy", + "class A {\n" + + "}\n" + + "class B {\n" + + " B(A a) { }\n" + + "}\n" + + "@groovy.transform.TypeChecked\n" + + "void test() {\n" + + " B x = new B<>(new A<>())\n" + // Cannot assign B to B + "}\n" + + "test()\n", + }; + //@formatter:on + + runConformTest(sources); + } } diff --git a/base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java index 6744552119..3ccb496899 100644 --- a/base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java +++ b/base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java @@ -2806,7 +2806,7 @@ && findMethod(receiver, "", init(argumentTypes)).size() == 1) { && parameters.length == argumentTypes.length - 1) { ctor = typeCheckMapConstructor(call, receiver, arguments); } else { - if (parameters.length > 0 && receiver.getGenericsTypes() != null) { // GROOVY-8961, GROOVY-9734, GROOVY-9915, GROOVY-10482, et al. + if (parameters.length > 0 && asBoolean(receiver.getGenericsTypes())) { // GROOVY-10283, GROOVY-10316, GROOVY-10482, GROOVY-10624, et al. Map context = extractPlaceHolders(null, receiver, ctor.getDeclaringClass()); parameters = parameters.clone(); for (int i = 0; i < parameters.length; i += 1) parameters[i] = new Parameter(applyGenericsContext(context, parameters[i].getType()), parameters[i].getName()); diff --git a/base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java index 208b77b9c8..d5ac75a956 100644 --- a/base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java +++ b/base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java @@ -212,6 +212,7 @@ import static org.codehaus.groovy.ast.tools.WideningCategories.isNumberCategory; import static org.codehaus.groovy.ast.tools.WideningCategories.lowestUpperBound; import static org.codehaus.groovy.classgen.AsmClassGenerator.MINIMUM_BYTECODE_VERSION; +import static org.codehaus.groovy.runtime.DefaultGroovyMethods.asBoolean; import static org.codehaus.groovy.runtime.DefaultGroovyMethods.init; import static org.codehaus.groovy.runtime.DefaultGroovyMethods.last; import static org.codehaus.groovy.syntax.Types.ASSIGN; @@ -2636,7 +2637,7 @@ && findMethod(receiver, "", init(argumentTypes)).size() == 1) { && parameters.length == argumentTypes.length - 1) { ctor = typeCheckMapConstructor(call, receiver, arguments); } else { - if (receiver.getGenericsTypes() != null) { // GROOVY-8961, GROOVY-9734, GROOVY-9915, GROOVY-10482, et al. + if (asBoolean(receiver.getGenericsTypes())) { // GROOVY-10283, GROOVY-10316, GROOVY-10482, GROOVY-10624, et al. Map context = extractPlaceHolders(null, receiver, ctor.getDeclaringClass()); parameters = Arrays.stream(parameters).map(p -> new Parameter(applyGenericsContext(context, p.getType()), p.getName())).toArray(Parameter[]::new); } diff --git a/base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java index 414c8f2bde..f0dab850a9 100644 --- a/base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java +++ b/base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java @@ -231,6 +231,7 @@ import static org.codehaus.groovy.ast.tools.WideningCategories.isLongCategory; import static org.codehaus.groovy.ast.tools.WideningCategories.isNumberCategory; import static org.codehaus.groovy.ast.tools.WideningCategories.lowestUpperBound; +import static org.codehaus.groovy.runtime.DefaultGroovyMethods.asBoolean; import static org.codehaus.groovy.runtime.DefaultGroovyMethods.init; import static org.codehaus.groovy.runtime.DefaultGroovyMethods.last; import static org.codehaus.groovy.syntax.Types.ASSIGN; @@ -2319,7 +2320,7 @@ && findMethod(receiver, "", init(argumentTypes)).size() == 1) { && parameters.length == argumentTypes.length - 1) { ctor = typeCheckMapConstructor(call, receiver, arguments); } else { - if (receiver.getGenericsTypes() != null) { // GROOVY-8909, GROOVY-9734, GROOVY-9844, GROOVY-9915, GROOVY-10482, et al. + if (asBoolean(receiver.getGenericsTypes())) { // GROOVY-10283, GROOVY-10316, GROOVY-10482, GROOVY-10624, et al. Map context = extractPlaceHoldersVisibleToDeclaration(receiver, ctor, argumentList); parameters = Arrays.stream(parameters).map(p -> new Parameter(applyGenericsContext(context, p.getType()), p.getName())).toArray(Parameter[]::new); }