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 6cf95da361 GROOVY-8049, GROOVY-9386, GROOVY-11641: SC: dynamic 
resolution
6cf95da361 is described below

commit 6cf95da361196f678dfae5b5ff842189b60896fc
Author: Eric Milles <[email protected]>
AuthorDate: Tue May 6 13:07:27 2025 -0500

    GROOVY-8049, GROOVY-9386, GROOVY-11641: SC: dynamic resolution
    
    - don't transform property with `DYNAMIC_RESOLUTION` to a method call
---
 .../PropertyExpressionTransformer.java             |  4 ++
 .../transform/trait/TraitReceiverTransformer.java  |  2 +-
 .../traitx/TraitASTTransformationTest.groovy       | 46 ++++++++++++++++++----
 3 files changed, 43 insertions(+), 9 deletions(-)

diff --git 
a/src/main/java/org/codehaus/groovy/transform/sc/transformers/PropertyExpressionTransformer.java
 
b/src/main/java/org/codehaus/groovy/transform/sc/transformers/PropertyExpressionTransformer.java
index f4811f5779..a01a4ee22e 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/sc/transformers/PropertyExpressionTransformer.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/sc/transformers/PropertyExpressionTransformer.java
@@ -40,6 +40,10 @@ class PropertyExpressionTransformer {
     }
 
     Expression transformPropertyExpression(final PropertyExpression pe) {
+        if (pe.getNodeMetaData(StaticTypesMarker.DYNAMIC_RESOLUTION) != null) {
+            return pe.transformExpression(scTransformer); // GROOVY-11641, etc.
+        }
+
         MethodNode dmct = 
pe.getNodeMetaData(StaticTypesMarker.DIRECT_METHOD_CALL_TARGET);
         // NOTE: BinaryExpressionTransformer handles the setter
         if (dmct != null && dmct.getParameters().length == 0) {
diff --git 
a/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
 
b/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
index 9baf3bf1b8..52b57304a2 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
@@ -122,7 +122,7 @@ class TraitReceiverTransformer extends 
ClassCodeExpressionTransformer {
                     propertyExpression.getProperty().setSourcePosition(exp);
                     return propertyExpression;
                 }
-            } else if (accessedVariable instanceof DynamicVariable && 
!inClosure) { // GROOVY-9386
+            } else if (accessedVariable instanceof DynamicVariable && 
!inClosure) { // GROOVY-8049, GROOVY-9386
                 PropertyExpression propertyExpression = propX(varX(weaved), 
vexp.getName());
                 propertyExpression.putNodeMetaData(DYNAMIC_RESOLUTION, 
Boolean.TRUE);
                 propertyExpression.getProperty().setSourcePosition(exp);
diff --git 
a/src/test/groovy/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
 
b/src/test/groovy/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
index 1f6e7b493f..3b70b0bcdc 100644
--- 
a/src/test/groovy/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
+++ 
b/src/test/groovy/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
@@ -3749,43 +3749,73 @@ final class TraitASTTransformationTest {
     }
 
     // GROOVY-9386
-    @Test
-    void testTraitPropertyInitializedByTap() {
-        assertScript shell, '''
+    @CompileModesTest
+    void testTraitPropertyInitializedByTap(String mode) {
+        assertScript shell, """
             class P {
                 int prop
             }
+            $mode
             trait T {
                 P pogo = new P().tap {
                     prop = 42 // MissingPropertyException: No such property: 
prop for class: C
                 }
             }
+            $mode
             class C implements T {
             }
 
             def pogo = new C().pogo
             assert pogo.prop == 42
-        '''
+        """
     }
 
     // GROOVY-9386
-    @Test
-    void testTraitPropertyInitializedByWith() {
-        assertScript shell, '''
+    @CompileModesTest
+    void testTraitPropertyInitializedByWith(String mode) {
+        assertScript shell, """
             class P {
                 int prop
             }
+            $mode
             trait T {
                 P pogo = new P().with {
                     prop = 42 // MissingPropertyException: No such property: 
prop for class: C
                     return it
                 }
             }
+            $mode
             class C implements T {
             }
+
             def pogo = new C().pogo
             assert pogo.prop == 42
-        '''
+        """
+    }
+
+    // GROOVY-8049
+    @CompileModesTest
+    void testTraitPropertyAsReceiverForWith(String mode) {
+        assertScript shell, """
+            interface I {
+              String getJay()
+            }
+            $mode
+            trait T {
+              abstract I getEye()
+              String m() {
+                eye.with {
+                  jay.toUpperCase()
+                }
+              }
+            }
+            $mode
+            class C implements T {
+              I eye = { -> 'works' }
+            }
+
+            assert new C().m() == 'WORKS'
+        """
     }
 
     // GROOVY-8000

Reply via email to