This is an automated email from the ASF dual-hosted git repository. emilles pushed a commit to branch GROOVY_2_5_X in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 370c4e9639c4c9507438060cd3c0f851850de9b9 Author: Eric Milles <[email protected]> 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 f8bff91f7a..5cc8228017 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 @@ -108,6 +108,9 @@ public 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 734fd48177..950fa79957 100644 --- a/src/test/groovy/transform/stc/ConstructorsSTCTest.groovy +++ b/src/test/groovy/transform/stc/ConstructorsSTCTest.groovy @@ -338,17 +338,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 064807fe4c..c9fe57dd82 100644 --- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy +++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy @@ -377,6 +377,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' + ''' + } + // GROOVY-10749 void testReturnTypeInferenceWithMethodGenerics29() { if (!GroovyAssert.isAtLeastJdk('1.8')) return 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; } }
