This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY_3_0_X by this push:
     new 7bcf3cdca0 GROOVY-10628: STC: fix inference for elvis assignment with 
setter target
7bcf3cdca0 is described below

commit 7bcf3cdca031b7e9bc42f3e2d51d641c2a2ef69c
Author: Eric Milles <[email protected]>
AuthorDate: Thu May 19 14:57:46 2022 -0500

    GROOVY-10628: STC: fix inference for elvis assignment with setter target
    
    3_0_X backport
---
 .../transform/stc/StaticTypeCheckingVisitor.java   | 13 +++++++----
 .../groovy/transform/stc/STCAssignmentTest.groovy  | 25 ++++++++++++++++------
 2 files changed, 28 insertions(+), 10 deletions(-)

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 76f4c35b17..ba83a7144e 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -986,9 +986,14 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
                 valueExpression = binX(leftExpression, op, rightExpression);
             }
         }
-        MethodCallExpression call = callX(ve, setterInfo.name, 
valueExpression);
-        call.setImplicitThis(false);
-        visitMethodCallExpression(call);
+        MethodCallExpression call = new MethodCallExpression(ve, 
setterInfo.name, valueExpression);
+        typeCheckingContext.pushEnclosingBinaryExpression(null); // 
GROOVY-10628: LHS re-purposed
+        try {
+            call.setImplicitThis(false);
+            visitMethodCallExpression(call);
+        } finally {
+            typeCheckingContext.popEnclosingBinaryExpression();
+        }
         MethodNode directSetterCandidate = 
call.getNodeMetaData(DIRECT_METHOD_CALL_TARGET);
         if (directSetterCandidate == null) {
             // this may happen if there's a setter of type 
boolean/String/Class, and that we are using the property
@@ -996,7 +1001,7 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
             for (MethodNode setter : setterInfo.setters) {
                 ClassNode type = 
getWrapper(setter.getParameters()[0].getOriginType());
                 if (Boolean_TYPE.equals(type) || STRING_TYPE.equals(type) || 
CLASS_Type.equals(type)) {
-                    call = callX(ve, setterInfo.name, castX(type, 
valueExpression));
+                    call = new MethodCallExpression(ve, setterInfo.name, 
castX(type, valueExpression));
                     call.setImplicitThis(false);
                     visitMethodCallExpression(call);
                     directSetterCandidate = 
call.getNodeMetaData(DIRECT_METHOD_CALL_TARGET);
diff --git a/src/test/groovy/transform/stc/STCAssignmentTest.groovy 
b/src/test/groovy/transform/stc/STCAssignmentTest.groovy
index 13fb4347af..b852eff171 100644
--- a/src/test/groovy/transform/stc/STCAssignmentTest.groovy
+++ b/src/test/groovy/transform/stc/STCAssignmentTest.groovy
@@ -1114,7 +1114,7 @@ class STCAssignmentTest extends 
StaticTypeCheckingTestCase {
     }
 
     // GROOVY-10419
-    void testElvisAssignmentAndSetter() {
+    void testElvisAssignmentAndSetter1() {
         assertScript '''
             class C {
                 def p
@@ -1122,13 +1122,26 @@ class STCAssignmentTest extends 
StaticTypeCheckingTestCase {
                     this.p = p
                 }
             }
-            @groovy.transform.TypeChecked
-            void test(C c) {
-                c.p ?= 'x'
-            }
             def c = new C()
-            test(c)
+            c.p ?= 'x'
+            assert c.p == 'x'
+            c.with {
+                p ?= 'y'
+            }
             assert c.p == 'x'
         '''
     }
+
+    // GROOVY-10628
+    void testElvisAssignmentAndSetter2() {
+        assertScript '''
+            class C {
+                String getFoo() {
+                }
+                void setFoo(String foo) {
+                }
+            }
+            new C().foo ?= 'bar'
+        '''
+    }
 }

Reply via email to