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()
+            """
+        }
+    }
 }

Reply via email to