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:47:31 UTC
[groovy] branch GROOVY_4_0_X 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 GROOVY_4_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push:
new 952a92e777 GROOVY-10637: SC: parameterized return type for getter method
952a92e777 is described below
commit 952a92e7774ac978dcafa6075107a669279dd657
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 6dd1a9333d..9287892202 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -667,6 +667,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;
}
}