You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2020/06/13 13:34:22 UTC
[groovy] 02/02: GROOVY-7701: SC: replace field/property reference
with dynamic variable
This is an automated email from the ASF dual-hosted git repository.
sunlan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 9c110618ad1fef0ddbec49c4d0592b872a3e5ebd
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Fri Jun 5 10:00:18 2020 -0500
GROOVY-7701: SC: replace field/property reference with dynamic variable
- VariableScopeVisitor lacks closure delegation information
---
.../transform/stc/StaticTypeCheckingVisitor.java | 6 +++++
.../groovy/transform/stc/ClosuresSTCTest.groovy | 30 ++++++++++++++++++++++
2 files changed, 36 insertions(+)
diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index da55cbf..be84a4c 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -664,6 +664,12 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
vexp.removeNodeMetaData(INFERRED_TYPE);
ClassNode type = pexp.getNodeMetaData(INFERRED_TYPE);
storeType(vexp, Optional.ofNullable(type).orElseGet(pexp::getType));
+
+ String receiver = vexp.getNodeMetaData(IMPLICIT_RECEIVER);
+ // GROOVY-7701: correct false assumption made by VariableScopeVisitor
+ if (receiver != null && !receiver.endsWith("owner") && !(vexp.getAccessedVariable() instanceof DynamicVariable)) {
+ vexp.setAccessedVariable(new DynamicVariable(dynName, false));
+ }
return true;
}
return false;
diff --git a/src/test/groovy/transform/stc/ClosuresSTCTest.groovy b/src/test/groovy/transform/stc/ClosuresSTCTest.groovy
index 80bd2bc..17b7a33 100644
--- a/src/test/groovy/transform/stc/ClosuresSTCTest.groovy
+++ b/src/test/groovy/transform/stc/ClosuresSTCTest.groovy
@@ -127,6 +127,36 @@ class ClosuresSTCTest extends StaticTypeCheckingTestCase {
'''
}
+ // GROOVY-7701
+ void testWithDelegateVsOwnerField() {
+ assertScript '''
+ class Foo {
+ List type
+ }
+
+ class Bar {
+ int type = 10
+
+ @Lazy
+ List<Foo> something = { ->
+ List<Foo> tmp = []
+ def foo = new Foo()
+ foo.with {
+ type = ['String']
+ // ^^^^ should be Foo.type, not Bar.type
+ }
+ tmp.add(foo)
+ tmp
+ }()
+ }
+
+ def bar = new Bar()
+ assert bar.type == 10
+ assert bar.something*.type == [['String']]
+ assert bar.type == 10
+ '''
+ }
+
void testClosureShouldNotChangeInferredType() {
assertScript '''
def x = '123';