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 2022/05/26 20:33:48 UTC

[groovy] branch master updated: GROOVY-10637: SC: parameterized return type for getter method

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 9eb74c2ee9 GROOVY-10637: SC: parameterized return type for getter method
9eb74c2ee9 is described below

commit 9eb74c2ee938204030bae1bb8ab7eaae77687ab0
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Thu May 26 15:17:52 2022 -0500

    GROOVY-10637: SC: parameterized return type for getter method
---
 .../sc/transformers/VariableExpressionTransformer.java  |  3 +++
 .../groovy/transform/stc/ConstructorsSTCTest.groovy     | 10 +++++-----
 src/test/groovy/transform/stc/GenericsSTCTest.groovy    | 17 +++++++++++++++++
 src/test/groovy/transform/stc/MyBean.java               | 13 +++++++------
 4 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/transform/sc/transformers/VariableExpressionTransformer.java b/src/main/java/org/codehaus/groovy/transform/sc/transformers/VariableExpressionTransformer.java
index d1c3fd7c39..f15915513b 100644
--- a/src/main/java/org/codehaus/groovy/transform/sc/transformers/VariableExpressionTransformer.java
+++ b/src/main/java/org/codehaus/groovy/transform/sc/transformers/VariableExpressionTransformer.java
@@ -105,6 +105,9 @@ class VariableExpressionTransformer {
         MethodCallExpression mce = callThisX(dmct.getName());
         mce.getMethod().setSourcePosition(ve);
         mce.setMethodTarget(dmct);
+        // GROOVY-10637: return type might be parameterized
+        mce.putNodeMetaData(StaticTypesMarker.INFERRED_TYPE,
+         ve.getNodeMetaData(StaticTypesMarker.INFERRED_TYPE));
         return mce;
     }
 }
diff --git a/src/test/groovy/transform/stc/ConstructorsSTCTest.groovy b/src/test/groovy/transform/stc/ConstructorsSTCTest.groovy
index ac74f4f7c8..a6897a8983 100644
--- a/src/test/groovy/transform/stc/ConstructorsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/ConstructorsSTCTest.groovy
@@ -374,17 +374,17 @@ class ConstructorsSTCTest extends StaticTypeCheckingTestCase {
     void testConstructJavaBeanFromMap() {
         assertScript '''import groovy.transform.stc.MyBean
 
-        MyBean bean = new MyBean(name:'Cedric')
-        assert bean.name == 'Cedric'
+        MyBean bean = new MyBean<String>(value:'Cedric')
+        assert bean.value == 'Cedric'
         '''
     }
     void testConstructJavaBeanFromMapAndSubclass() {
         assertScript '''import groovy.transform.stc.MyBean
-        class MyBean2 extends MyBean {
+        class MyBean2 extends MyBean<String> {
             int age
         }
-        MyBean2 bean = new MyBean2(name:'Cedric', age:33)
-        assert bean.name == 'Cedric'
+        MyBean2 bean = new MyBean2(value:'Cedric', age:33)
+        assert bean.value == 'Cedric'
         assert bean.age == 33
         '''
     }
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 7c579b4751..c6554d5dd7 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -695,6 +695,23 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
         '''
     }
 
+    // GROOVY-10637
+    void testReturnTypeInferenceWithMethodGenerics27() {
+        assertScript '''
+            class Outer extends groovy.transform.stc.MyBean<Inner> {
+                static class Inner {
+                    String string
+                }
+                def bar() {
+                    { -> value.string }.call()
+                }
+            }
+
+            def foo = new Outer(value: new Outer.Inner(string:'hello world'))
+            assert foo.bar() == 'hello world'
+        '''
+    }
+
     void testDiamondInferrenceFromConstructor1() {
         assertScript '''
             class Foo<U> {
diff --git a/src/test/groovy/transform/stc/MyBean.java b/src/test/groovy/transform/stc/MyBean.java
index c50c8e2b65..7471e5b4e2 100644
--- a/src/test/groovy/transform/stc/MyBean.java
+++ b/src/test/groovy/transform/stc/MyBean.java
@@ -21,14 +21,15 @@ package groovy.transform.stc;
 /**
  * A simple Java bean, used by unit test for GROOVY-5578
  */
-public class MyBean {
-    private String name;
+public class MyBean<T> {
 
-    public String getName() {
-        return name;
+    private T value;
+
+    public T getValue() {
+        return value;
     }
 
-    public void setName(final String name) {
-        this.name = name;
+    public void setValue(final T value) {
+        this.value = value;
     }
 }