You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2021/09/08 18:16:16 UTC
[groovy] branch master updated: GROOVY-10166: "Type -> Type"
has arg for T; "T -> Type" does not
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new 9a988c4 GROOVY-10166: "Type<X> -> Type<T>" has arg for T; "T -> Type" does not
9a988c4 is described below
commit 9a988c4f9b9946872f5912cc9c4de3fa2df983ca
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Wed Sep 8 13:16:04 2021 -0500
GROOVY-10166: "Type<X> -> Type<T>" has arg for T; "T -> Type" does not
---
.../codehaus/groovy/ast/tools/GenericsUtils.java | 40 ++++++----------------
.../groovy/transform/stc/GenericsSTCTest.groovy | 22 +++++++++++-
2 files changed, 32 insertions(+), 30 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java b/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
index 5ec2c18..4768066 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/GenericsUtils.java
@@ -848,38 +848,20 @@ public class GenericsUtils {
}
private static Tuple2<Map<GenericsType, GenericsType>, ClassNode> doMakeDeclaringAndActualGenericsTypeMap(final ClassNode declaringClass, final ClassNode actualReceiver, final boolean tryToFindExactType) {
+ Map<GenericsType, GenericsType> map = Collections.emptyMap();
ClassNode parameterizedType = findParameterizedTypeFromCache(declaringClass, actualReceiver, tryToFindExactType);
- if (parameterizedType == null) {
- return tuple(Collections.emptyMap(), parameterizedType);
- }
-
- Map<GenericsType, GenericsType> result = new LinkedHashMap<>();
- result.putAll(makePlaceholderAndParameterizedTypeMap(declaringClass));
- result.putAll(makePlaceholderAndParameterizedTypeMap(parameterizedType));
-
- result = connectGenericsTypes(result);
-
- return tuple(result, parameterizedType);
- }
-
- private static Map<GenericsType, GenericsType> makePlaceholderAndParameterizedTypeMap(final ClassNode declaringClass) {
- if (null == declaringClass) {
- return Collections.emptyMap();
- }
-
- Map<GenericsType, GenericsType> result = new LinkedHashMap<>();
-
- ClassNode redirectDeclaringClass = declaringClass.redirect();
- GenericsType[] declaringGenericsTypes = declaringClass.getGenericsTypes();
- GenericsType[] redirectDeclaringGenericsTypes = redirectDeclaringClass.getGenericsTypes();
-
- if (null != declaringGenericsTypes && null != redirectDeclaringGenericsTypes) {
- for (int i = 0, n = declaringGenericsTypes.length; i < n; i++) {
- result.put(redirectDeclaringGenericsTypes[i], declaringGenericsTypes[i]);
+ if (parameterizedType != null && parameterizedType.isRedirectNode() && !parameterizedType.isGenericsPlaceHolder()) { // GROOVY-10166
+ // declaringClass may be "List<T> -> List<E>" and parameterizedType may be "List<String> -> List<E>" or "List<> -> List<E>"
+ GenericsType[] sourceGenericsTypes = parameterizedType.getGenericsTypes();
+ GenericsType[] targetGenericsTypes = parameterizedType.redirect().getGenericsTypes();
+ if (sourceGenericsTypes != null && targetGenericsTypes != null) {
+ map = new LinkedHashMap<>();
+ for (int i = 0, m = sourceGenericsTypes.length, n = targetGenericsTypes.length; i < n; i += 1) {
+ map.put(targetGenericsTypes[i], i < m ? sourceGenericsTypes[i] : targetGenericsTypes[i]);
+ }
}
}
-
- return result;
+ return tuple(map, parameterizedType);
}
private static Map<GenericsType, GenericsType> connectGenericsTypes(final Map<GenericsType, GenericsType> genericsTypeMap) {
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 443d030..8b77ec2 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -2522,8 +2522,28 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
'''
}
+ // GROOVY-10166
+ void testShouldFindMethodEvenWithRepeatNames1() {
+ assertScript '''
+ abstract class A<T extends C> {
+ T getC() {
+ }
+ Map toMap() {
+ c.getMap(this)
+ }
+ }
+
+ class C<T extends A> {
+ Map getMap(T a) {
+ }
+ }
+
+ new C()
+ '''
+ }
+
// GROOVY-10196
- void testShouldFindMethodEvenWithRepeatNames() {
+ void testShouldFindMethodEvenWithRepeatNames2() {
assertScript '''
interface M<K,V> {
}