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