Skip to content

Commit df1d8f9

Browse files
committed
GROOVY-10698
1 parent fcc22a7 commit df1d8f9

File tree

4 files changed

+46
-3
lines changed

4 files changed

+46
-3
lines changed

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java

+22
Original file line numberDiff line numberDiff line change
@@ -6022,6 +6022,28 @@ public void testTypeChecked10673() {
60226022
runConformTest(sources, "1");
60236023
}
60246024

6025+
@Test
6026+
public void testTypeChecked10698() {
6027+
//@formatter:off
6028+
String[] sources = {
6029+
"Main.groovy",
6030+
"class A<T> {\n" +
6031+
" A(T t, B<T> b_of_t) {\n" +
6032+
" }\n" +
6033+
"}\n" +
6034+
"class B<U> {\n" +
6035+
"}\n" +
6036+
"@groovy.transform.TypeChecked\n" +
6037+
"void test() {\n" +
6038+
" new A<>('string', new B<>())\n" +
6039+
"}\n" +
6040+
"test()\n",
6041+
};
6042+
//@formatter:on
6043+
6044+
runConformTest(sources);
6045+
}
6046+
60256047
@Test
60266048
public void testTypeChecked10699() {
60276049
for (String type : new String[] {"java.util.function.Function<T,T>", "java.util.function.UnaryOperator<T>"}) {

base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -2788,11 +2788,18 @@ && findMethod(receiver, "<init>", init(argumentTypes)).size() == 1) {
27882788
&& parameters.length == argumentTypes.length - 1) {
27892789
ctor = typeCheckMapConstructor(call, receiver, arguments);
27902790
} else {
2791+
/* GRECLIPSE edit -- GROOVY-10698
27912792
if (parameters.length > 0 && asBoolean(receiver.getGenericsTypes())) { // GROOVY-10283, GROOVY-10316, GROOVY-10482, GROOVY-10624, et al.
27922793
Map<GenericsTypeName, GenericsType> context = extractPlaceHolders(null, receiver, ctor.getDeclaringClass());
27932794
parameters = parameters.clone(); for (int i = 0; i < parameters.length; i += 1)
27942795
parameters[i] = new Parameter(applyGenericsContext(context, parameters[i].getType()), parameters[i].getName());
27952796
}
2797+
*/
2798+
GenericsType[] typeParameters = ctor.getDeclaringClass().getGenericsTypes(); if (typeParameters != null && typeParameters.length > 0) {
2799+
Map<GenericsTypeName, GenericsType> context = extractGenericsConnectionsFromArguments(typeParameters, parameters, argumentList, receiver.getGenericsTypes());
2800+
if (!context.isEmpty()) parameters = Arrays.stream(parameters).map(p -> new Parameter(applyGenericsContext(context, p.getType()), p.getName())).toArray(Parameter[]::new);
2801+
}
2802+
// GRECLIPSE end
27962803
resolvePlaceholdersFromImplicitTypeHints(argumentTypes, argumentList, parameters);
27972804
typeCheckMethodsWithGenericsOrFail(receiver, argumentTypes, ctor, call);
27982805
visitMethodCallArguments(receiver, argumentList, true, ctor);
@@ -6203,7 +6210,7 @@ protected ClassNode inferReturnTypeGenerics(final ClassNode receiver, final Meth
62036210
private Map<GenericsTypeName, GenericsType> extractGenericsConnectionsFromArguments(final GenericsType[] methodGenericTypes, final Parameter[] parameters, final Expression arguments, final GenericsType[] explicitTypeHints) {
62046211
Map<GenericsTypeName, GenericsType> resolvedPlaceholders = new HashMap<>();
62056212

6206-
if (explicitTypeHints != null) { // resolve type parameters from type arguments
6213+
if (asBoolean(explicitTypeHints)) { // resolve type parameters from type arguments
62076214
int n = methodGenericTypes.length;
62086215
if (n == explicitTypeHints.length) {
62096216
for (int i = 0; i < n; i += 1) {

base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -2615,10 +2615,17 @@ && findMethod(receiver, "<init>", init(argumentTypes)).size() == 1) {
26152615
&& parameters.length == argumentTypes.length - 1) {
26162616
ctor = typeCheckMapConstructor(call, receiver, arguments);
26172617
} else {
2618+
/* GRECLIPSE edit -- GROOVY-10698
26182619
if (asBoolean(receiver.getGenericsTypes())) { // GROOVY-10283, GROOVY-10316, GROOVY-10482, GROOVY-10624, et al.
26192620
Map<GenericsTypeName, GenericsType> context = extractPlaceHolders(null, receiver, ctor.getDeclaringClass());
26202621
parameters = Arrays.stream(parameters).map(p -> new Parameter(applyGenericsContext(context, p.getType()), p.getName())).toArray(Parameter[]::new);
26212622
}
2623+
*/
2624+
GenericsType[] typeParameters = ctor.getDeclaringClass().getGenericsTypes(); if (typeParameters != null && typeParameters.length > 0) {
2625+
Map<GenericsTypeName, GenericsType> context = extractGenericsConnectionsFromArguments(typeParameters, parameters, argumentList, receiver.getGenericsTypes());
2626+
if (!context.isEmpty()) parameters = Arrays.stream(parameters).map(p -> new Parameter(applyGenericsContext(context, p.getType()), p.getName())).toArray(Parameter[]::new);
2627+
}
2628+
// GRECLIPSE end
26222629
resolvePlaceholdersFromImplicitTypeHints(argumentTypes, argumentList, parameters);
26232630
typeCheckMethodsWithGenericsOrFail(receiver, argumentTypes, ctor, call);
26242631
visitMethodCallArguments(receiver, argumentList, true, ctor);
@@ -5891,7 +5898,7 @@ protected ClassNode inferReturnTypeGenerics(final ClassNode receiver, final Meth
58915898
private Map<GenericsTypeName, GenericsType> extractGenericsConnectionsFromArguments(final GenericsType[] methodGenericTypes, final Parameter[] parameters, final Expression arguments, final GenericsType[] explicitTypeHints) {
58925899
Map<GenericsTypeName, GenericsType> resolvedPlaceholders = new HashMap<>();
58935900

5894-
if (explicitTypeHints != null) { // resolve type parameters from type arguments
5901+
if (asBoolean(explicitTypeHints)) { // resolve type parameters from type arguments
58955902
int n = methodGenericTypes.length;
58965903
if (n == explicitTypeHints.length) {
58975904
for (int i = 0; i < n; i += 1) {

base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -2314,10 +2314,17 @@ && findMethod(receiver, "<init>", init(argumentTypes)).size() == 1) {
23142314
&& parameters.length == argumentTypes.length - 1) {
23152315
ctor = typeCheckMapConstructor(call, receiver, arguments);
23162316
} else {
2317+
/* GRECLIPSE edit -- GROOVY-10698
23172318
if (asBoolean(receiver.getGenericsTypes())) { // GROOVY-10283, GROOVY-10316, GROOVY-10482, GROOVY-10624
23182319
Map<GenericsTypeName, GenericsType> context = extractPlaceHolders(receiver, ctor.getDeclaringClass());
23192320
parameters = Arrays.stream(parameters).map(p -> new Parameter(applyGenericsContext(context, p.getType()), p.getName())).toArray(Parameter[]::new);
23202321
}
2322+
*/
2323+
GenericsType[] typeParameters = ctor.getDeclaringClass().getGenericsTypes(); if (typeParameters != null && typeParameters.length > 0) {
2324+
Map<GenericsTypeName, GenericsType> context = extractGenericsConnectionsFromArguments(typeParameters, parameters, argumentList, receiver.getGenericsTypes());
2325+
if (!context.isEmpty()) parameters = Arrays.stream(parameters).map(p -> new Parameter(applyGenericsContext(context, p.getType()), p.getName())).toArray(Parameter[]::new);
2326+
}
2327+
// GRECLIPSE end
23212328
resolvePlaceholdersFromImplicitTypeHints(argumentTypes, argumentList, parameters);
23222329
typeCheckMethodsWithGenericsOrFail(receiver, argumentTypes, ctor, call);
23232330
visitMethodCallArguments(receiver, argumentList, true, ctor);
@@ -5384,7 +5391,7 @@ protected ClassNode inferReturnTypeGenerics(final ClassNode receiver, final Meth
53845391
private Map<GenericsTypeName, GenericsType> extractGenericsConnectionsFromArguments(final GenericsType[] methodGenericTypes, final Parameter[] parameters, final Expression arguments, final GenericsType[] explicitTypeHints) {
53855392
Map<GenericsTypeName, GenericsType> resolvedPlaceholders = new HashMap<>();
53865393

5387-
if (explicitTypeHints != null) { // resolve type parameters from type arguments
5394+
if (asBoolean(explicitTypeHints)) { // resolve type parameters from type arguments
53885395
int n = methodGenericTypes.length;
53895396
if (n == explicitTypeHints.length) {
53905397
for (int i = 0; i < n; i += 1) {

0 commit comments

Comments
 (0)