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 e999d51126 GROOVY-11369: map entry comes before access method (pt.2)
e999d51126 is described below
commit e999d5112638be30b94946d7d4305c08046247c3
Author: Eric Milles <[email protected]>
AuthorDate: Tue May 14 15:22:34 2024 -0500
GROOVY-11369: map entry comes before access method (pt.2)
---
.../transform/stc/StaticTypeCheckingVisitor.java | 27 +++++++++++++++-------
.../stc/FieldsAndPropertiesSTCTest.groovy | 20 ++++++++++++++++
.../sc/FieldsAndPropertiesStaticCompileTest.groovy | 21 +++++++++++++++++
3 files changed, 60 insertions(+), 8 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 68eaec6182..917d74f8e9 100644
---
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -238,6 +238,7 @@ import static org.codehaus.groovy.syntax.Types.MINUS_MINUS;
import static org.codehaus.groovy.syntax.Types.MOD;
import static org.codehaus.groovy.syntax.Types.MOD_EQUAL;
import static org.codehaus.groovy.syntax.Types.PLUS_PLUS;
+import static
org.codehaus.groovy.transform.sc.StaticCompilationVisitor.COMPILESTATIC_CLASSNODE;
import static
org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.ArrayList_TYPE;
import static
org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.Collection_TYPE;
import static
org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport.LinkedHashMap_TYPE;
@@ -1567,16 +1568,17 @@ public class StaticTypeCheckingVisitor extends
ClassCodeVisitorSupport {
}
}
- MethodNode getter = findGetter(current, getterName,
pexp.isImplicitThis());
- getter = allowStaticAccessToMember(getter, staticOnly);
- if (getter == null) getter = findGetter(current, isserName,
pexp.isImplicitThis());
- getter = allowStaticAccessToMember(getter, staticOnly);
- if (getter != null && !isThisExpression(objectExpression) &&
!isSuperExpression(objectExpression) && isOrImplements(objectExpressionType,
MAP_TYPE)) {
- getter = null; // GROOVY-11369: map entry comes before
access method
+ MethodNode getter = null;
+ if (!isMapProperty(pexp)) { // GROOVY-11369: map entry before
getter
+ getter = findGetter(current, getterName,
pexp.isImplicitThis());
+ getter = allowStaticAccessToMember(getter, staticOnly);
+ if (getter == null) {
+ getter = findGetter(current, isserName,
pexp.isImplicitThis());
+ getter = allowStaticAccessToMember(getter, staticOnly);
+ }
+ if (readMode && getter != null && visitor != null)
visitor.visitMethod(getter);
}
- if (readMode && getter != null && visitor != null)
visitor.visitMethod(getter);
-
PropertyNode property = current.getProperty(propertyName);
property = allowStaticAccessToMember(property, staticOnly);
// prefer explicit getter or setter over property if receiver
is not 'this'
@@ -1787,6 +1789,15 @@ public class StaticTypeCheckingVisitor extends
ClassCodeVisitorSupport {
return null;
}
+ private boolean isMapProperty(final PropertyExpression pexp) {
+ final Expression objectExpression = pexp.getObjectExpression();
+ if ((isThisExpression(objectExpression) ||
isSuperExpression(objectExpression))
+ &&
Arrays.asList(getTypeCheckingAnnotations()).contains(COMPILESTATIC_CLASSNODE)) {
+ return false;
+ }
+ return isOrImplements(getType(objectExpression), MAP_TYPE);
+ }
+
/**
* Filters search result to prevent access to instance members from a
static
* context.
diff --git a/src/test/groovy/transform/stc/FieldsAndPropertiesSTCTest.groovy
b/src/test/groovy/transform/stc/FieldsAndPropertiesSTCTest.groovy
index 669d1131c5..d75b3cf86b 100644
--- a/src/test/groovy/transform/stc/FieldsAndPropertiesSTCTest.groovy
+++ b/src/test/groovy/transform/stc/FieldsAndPropertiesSTCTest.groovy
@@ -723,6 +723,26 @@ class FieldsAndPropertiesSTCTest extends
StaticTypeCheckingTestCase {
'''
}
+ // GROOVY-11369
+ void testMapPropertyAccess5a() {
+ for (mod in ['def', 'public', 'protected',
'@groovy.transform.PackageScope', 'private']) {
+ assertScript """
+ class C implements Map<String,String> {
+ @Delegate Map<String,String> impl =
[:].withDefault{'entry'}
+ $mod getFoo() { 'getter' }
+ void test() {
+ @ASTTest(phase=INSTRUCTION_SELECTION, value={
+ assert node.getNodeMetaData(INFERRED_TYPE) ==
STRING_TYPE
+ })
+ def which = this.foo
+ assert which == 'entry'
+ }
+ }
+ new C().test()
+ """
+ }
+ }
+
// GROOVY-8074
void testMapPropertyAccess6() {
assertScript '''
diff --git
a/src/test/org/codehaus/groovy/classgen/asm/sc/FieldsAndPropertiesStaticCompileTest.groovy
b/src/test/org/codehaus/groovy/classgen/asm/sc/FieldsAndPropertiesStaticCompileTest.groovy
index f52f0ecc70..2ec83bad4e 100644
---
a/src/test/org/codehaus/groovy/classgen/asm/sc/FieldsAndPropertiesStaticCompileTest.groovy
+++
b/src/test/org/codehaus/groovy/classgen/asm/sc/FieldsAndPropertiesStaticCompileTest.groovy
@@ -827,4 +827,25 @@ final class FieldsAndPropertiesStaticCompileTest extends
FieldsAndPropertiesSTCT
void testPublicFieldVersusPrivateGetter() {
super.testPublicFieldVersusPrivateGetter()
}
+
+ // GROOVY-11369
+ @Override
+ void testMapPropertyAccess5a() {
+ for (mod in ['def', 'public', 'protected',
'@groovy.transform.PackageScope', 'private']) {
+ assertScript """
+ class C implements Map<String,String> {
+ @Delegate Map<String,String> impl =
[:].withDefault{'entry'}
+ $mod getFoo() { 'getter' }
+ void test() {
+ @ASTTest(phase=INSTRUCTION_SELECTION, value={
+ assert node.getNodeMetaData(INFERRED_TYPE) ==
OBJECT_TYPE
+ })
+ def which = this.foo
+ assert which == 'getter'
+ }
+ }
+ new C().test()
+ """
+ }
+ }
}