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 4919914  GROOVY-10330: STC: given type parameter `T`, LUB(`T`,`T`) is 
`T`
4919914 is described below

commit 49199147eedf9c459c358ae354c771c7df0af5f7
Author: Eric Milles <[email protected]>
AuthorDate: Sat Oct 30 10:51:57 2021 -0500

    GROOVY-10330: STC: given type parameter `T`, LUB(`T`,`T`) is `T`
---
 .../groovy/ast/tools/WideningCategories.java       |  8 ++-
 .../groovy/transform/stc/GenericsSTCTest.groovy    | 70 +++++++++++-----------
 .../transform/stc/TernaryOperatorSTCTest.groovy    | 22 +++++++
 3 files changed, 62 insertions(+), 38 deletions(-)

diff --git 
a/src/main/java/org/codehaus/groovy/ast/tools/WideningCategories.java 
b/src/main/java/org/codehaus/groovy/ast/tools/WideningCategories.java
index bdd232f..dfb4f99 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/WideningCategories.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/WideningCategories.java
@@ -213,10 +213,12 @@ public class WideningCategories {
      */
     public static ClassNode lowestUpperBound(final ClassNode a, final 
ClassNode b) {
         ClassNode lub = lowestUpperBound(a, b, null, null);
-        if (lub==null || !lub.isUsingGenerics()) return lub;
-        // types may be parameterized. If so, we must ensure that generic type 
arguments
+        if (lub == null || !lub.isUsingGenerics()
+                || lub.isGenericsPlaceHolder()) { // GROOVY-10330
+            return lub;
+        }
+        // types may be parameterized; if so, ensure that generic type 
arguments
         // are made compatible
-
         if (lub instanceof LowestUpperBoundClassNode) {
             // no parent super class representing both types could be found
             // or both class nodes implement common interfaces which may have
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy 
b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 6146b98..e20c656 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -1866,49 +1866,49 @@ class GenericsSTCTest extends 
StaticTypeCheckingTestCase {
     // GROOVY-5594
     void testMapEntryUsingPropertyNotation() {
         assertScript '''
-        Map.Entry<Date, Integer> entry = null
+            Map.Entry<Date, Integer> entry = null
 
-        @ASTTest(phase=INSTRUCTION_SELECTION, value={
-            assert node.getNodeMetaData(INFERRED_TYPE) == make(Date)
-        })
-        def k = entry?.key
+            @ASTTest(phase=INSTRUCTION_SELECTION, value={
+                assert node.getNodeMetaData(INFERRED_TYPE) == make(Date)
+            })
+            def k = entry?.key
 
-        @ASTTest(phase=INSTRUCTION_SELECTION, value={
-            assert node.getNodeMetaData(INFERRED_TYPE) == Integer_TYPE
-        })
-        def v = entry?.value
+            @ASTTest(phase=INSTRUCTION_SELECTION, value={
+                assert node.getNodeMetaData(INFERRED_TYPE) == Integer_TYPE
+            })
+            def v = entry?.value
         '''
     }
 
     void testInferenceFromMap() {
         assertScript '''
-        Map<Date, Integer> map = [:]
+            Map<Date, Integer> map = [:]
 
-        @ASTTest(phase=INSTRUCTION_SELECTION, value={
-            def infType = node.getNodeMetaData(INFERRED_TYPE)
-            assert infType == make(Set)
-            def entryInfType = infType.genericsTypes[0].type
-            assert entryInfType == make(Map.Entry)
-            assert entryInfType.genericsTypes[0].type == make(Date)
-            assert entryInfType.genericsTypes[1].type == Integer_TYPE
-        })
-        def entries = map?.entrySet()
+            @ASTTest(phase=INSTRUCTION_SELECTION, value={
+                def infType = node.getNodeMetaData(INFERRED_TYPE)
+                assert infType == make(Set)
+                def entryInfType = infType.genericsTypes[0].type
+                assert entryInfType == make(Map.Entry)
+                assert entryInfType.genericsTypes[0].type == make(Date)
+                assert entryInfType.genericsTypes[1].type == Integer_TYPE
+            })
+            def entries = map?.entrySet()
         '''
     }
 
     void testInferenceFromListOfMaps() {
         assertScript '''
-        List<Map<Date, Integer>> maps = []
+            List<Map<Date, Integer>> maps = []
 
-        @ASTTest(phase=INSTRUCTION_SELECTION, value={
-            def listType = node.getNodeMetaData(INFERRED_TYPE)
-            assert listType == Iterator_TYPE
-            def infType = listType.genericsTypes[0].type
-            assert infType == make(Map)
-            assert infType.genericsTypes[0].type == make(Date)
-            assert infType.genericsTypes[1].type == Integer_TYPE
-        })
-        def iter = maps?.iterator()
+            @ASTTest(phase=INSTRUCTION_SELECTION, value={
+                def listType = node.getNodeMetaData(INFERRED_TYPE)
+                assert listType == Iterator_TYPE
+                def infType = listType.genericsTypes[0].type
+                assert infType == make(Map)
+                assert infType.genericsTypes[0].type == make(Date)
+                assert infType.genericsTypes[1].type == Integer_TYPE
+            })
+            def iter = maps?.iterator()
         '''
     }
 
@@ -3215,7 +3215,7 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
     }
 
     void testHiddenGenerics() {
-        // Groovy-6237
+        // GROOVY-6237
         assertScript '''
             class MyList extends LinkedList<Object> {}
             List<Object> o = new MyList()
@@ -3227,18 +3227,18 @@ class GenericsSTCTest extends 
StaticTypeCheckingTestCase {
             List<Blah> o = new MyList()
         ''','Incompatible generic argument types. Cannot assign MyList to: 
java.util.List<Blah>'
 
-        // Groovy-5873
-        assertScript """
+        // GROOVY-5873
+        assertScript '''
             abstract class Parent<T> {
                 public T value
             }
             class Impl extends Parent<Integer> {}
             Impl impl = new Impl()
             Integer i = impl.value
-        """
+        '''
 
         // GROOVY-5920
-        assertScript """
+        assertScript '''
             class Data<T> {
               T value
             }
@@ -3258,7 +3258,7 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
               }
             }
             Runner.main(null);
-        """
+        '''
     }
 
     void testReturnTypeInferenceRemovalWithGenerics() {
diff --git a/src/test/groovy/transform/stc/TernaryOperatorSTCTest.groovy 
b/src/test/groovy/transform/stc/TernaryOperatorSTCTest.groovy
index a55f158..1b009d5 100644
--- a/src/test/groovy/transform/stc/TernaryOperatorSTCTest.groovy
+++ b/src/test/groovy/transform/stc/TernaryOperatorSTCTest.groovy
@@ -131,6 +131,28 @@ class TernaryOperatorSTCTest extends 
StaticTypeCheckingTestCase {
         '''
     }
 
+    // GROOVY-10330
+    void testTypeParameterTypeParameter() {
+        assertScript '''
+            class C<T> {
+                T y
+                void m(T x, java.util.function.Function<T, T> f) {
+                    assert f.apply(x) == 'foo'
+                }
+                void test(T x, java.util.function.Function<T, T> f) {
+                    @ASTTest(phase=INSTRUCTION_SELECTION, value={
+                        def type = node.getNodeMetaData(INFERRED_TYPE)
+                        assert type.isGenericsPlaceHolder()
+                        assert type.unresolvedName == 'T'
+                    })
+                    def z = true ? x : y
+                    m(z, f)
+                }
+            }
+            new C<String>().test('FOO', { it.toLowerCase() })
+        '''
+    }
+
     // GROOVY-5523
     void testNull1() {
         assertScript '''

Reply via email to