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 6d2b8660e6 GROOVY-6277, GROOVY-10390: SC: ensure accessibility of 
getter method
6d2b8660e6 is described below

commit 6d2b8660e6969b2445273fd30febae5f41ae9000
Author: Eric Milles <[email protected]>
AuthorDate: Wed May 29 15:02:14 2024 -0500

    GROOVY-6277, GROOVY-10390: SC: ensure accessibility of getter method
    
    3_0_X backport
---
 .../codehaus/groovy/ast/tools/GeneralUtils.java    | 15 ++++-------
 .../classgen/asm/sc/StaticTypesCallSiteWriter.java |  9 +++++++
 .../stc/FieldsAndPropertiesSTCTest.groovy          | 29 +++++++++++++++++++++-
 .../sc/FieldsAndPropertiesStaticCompileTest.groovy |  7 ------
 4 files changed, 42 insertions(+), 18 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java 
b/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
index 43d138c73f..76d81cc148 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
@@ -26,7 +26,6 @@ import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.FieldNode;
 import org.codehaus.groovy.ast.MethodNode;
-import org.codehaus.groovy.ast.PackageNode;
 import org.codehaus.groovy.ast.Parameter;
 import org.codehaus.groovy.ast.PropertyNode;
 import org.codehaus.groovy.ast.Variable;
@@ -77,6 +76,7 @@ import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.function.Consumer;
 
@@ -991,17 +991,12 @@ public class GeneralUtils {
     }
 
     public static boolean inSamePackage(final ClassNode first, final ClassNode 
second) {
-        PackageNode firstPackage = first.getPackage();
-        PackageNode secondPackage = second.getPackage();
-        return ((firstPackage == null && secondPackage == null)
-                || firstPackage != null && secondPackage != null && 
firstPackage.getName().equals(secondPackage.getName()));
+        return Objects.equals(first.getPackageName(), second.getPackageName());
     }
 
-    public static boolean inSamePackage(final Class<?> first, final Class<?> 
second) {
-        Package firstPackage = first.getPackage();
-        Package secondPackage = second.getPackage();
-        return ((firstPackage == null && secondPackage == null)
-                || firstPackage != null && secondPackage != null && 
firstPackage.getName().equals(secondPackage.getName()));
+    public static boolean inSamePackage(final Class<?>  first, final Class<?>  
second) {
+        Package firstPackage = first.getPackage(), secondPackage = 
second.getPackage();
+        return (firstPackage == null ? secondPackage == null : 
firstPackage.getName().equals(secondPackage.getName()));
     }
 
     public static boolean isDefaultVisibility(final int modifiers) {
diff --git 
a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java
 
b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java
index 3ffc0dfb68..7e1eebd44e 100644
--- 
a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java
+++ 
b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java
@@ -85,6 +85,7 @@ import static 
org.codehaus.groovy.ast.tools.GeneralUtils.callX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.castX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.classX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.constX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.inSamePackage;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.isOrImplements;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.propX;
@@ -475,6 +476,14 @@ public class StaticTypesCallSiteWriter extends 
CallSiteWriter implements Opcodes
             getterNode.setDeclaringClass(receiverType);
         }
         if (getterNode != null) {
+            // GROOVY-6277, GROOVY-11390: ensure accessibility
+            ClassNode accessingClass = controller.getClassNode();
+            ClassNode declaringClass = getterNode.getDeclaringClass();
+            if (!getterNode.isPublic() && 
!accessingClass.equals(declaringClass)
+                    && !(getterNode.isProtected() && 
accessingClass.isDerivedFrom(declaringClass))
+                    && (getterNode.isPrivate() || 
!inSamePackage(accessingClass, declaringClass))) {
+                return false;
+            }
             MethodCallExpression call = callX(receiver, getterName);
             call.setImplicitThis(implicitThis);
             call.setMethodTarget(getterNode);
diff --git a/src/test/groovy/transform/stc/FieldsAndPropertiesSTCTest.groovy 
b/src/test/groovy/transform/stc/FieldsAndPropertiesSTCTest.groovy
index cea091f780..21988da22c 100644
--- a/src/test/groovy/transform/stc/FieldsAndPropertiesSTCTest.groovy
+++ b/src/test/groovy/transform/stc/FieldsAndPropertiesSTCTest.groovy
@@ -764,7 +764,7 @@ class FieldsAndPropertiesSTCTest extends 
StaticTypeCheckingTestCase {
         }
     }
 
-    // GROOVY-8074
+    // GROOVY-8074, GROOVY-11390
     void testMapPropertyAccess6() {
         assertScript '''
             class C extends HashMap {
@@ -787,6 +787,26 @@ class FieldsAndPropertiesSTCTest extends 
StaticTypeCheckingTestCase {
             assert map.baz == 33
             assert map['baz'] == 33
         """
+        assertScript """ // map entry before super property
+            class C extends ${PogoType.name} implements Map {
+                @Delegate private Map impl = [:]
+                void test() {
+                    put('foo', 11)
+                  //assert this.foo    == 11 // public getter of super
+                    assert this['foo'] == 11
+                    put('bar', 22)
+                  //assert this.bar    == 22 // protected getter of super
+                    assert this['bar'] == 22
+                    put('baz', 33)
+                    assert this.baz    == 33 // package-private getter of super
+                    assert this['baz'] == 33
+                    put('xxx', 44)
+                    assert this.xxx    == 44 // private getter of super
+                    assert this['xxx'] == 44
+                }
+            }
+            new C().test()
+        """
     }
 
     // GROOVY-5001, GROOVY-5491, GROOVY-6144, GROOVY-8555
@@ -1902,6 +1922,13 @@ class FieldsAndPropertiesSTCTest extends 
StaticTypeCheckingTestCase {
         @PackageScope void setBaz(baz) {}
     }
 
+    static class PogoType {
+        public        getFoo() { 1 }
+        protected     getBar() { 2 }
+        @PackageScope getBaz() { 3 }
+        private       getXxx() { 4 }
+    }
+
     static class BaseClass {
         int x
     }
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 0f8d1a46d5..77eec2d51d 100644
--- 
a/src/test/org/codehaus/groovy/classgen/asm/sc/FieldsAndPropertiesStaticCompileTest.groovy
+++ 
b/src/test/org/codehaus/groovy/classgen/asm/sc/FieldsAndPropertiesStaticCompileTest.groovy
@@ -18,7 +18,6 @@
  */
 package org.codehaus.groovy.classgen.asm.sc
 
-import groovy.test.NotYetImplemented
 import groovy.transform.stc.FieldsAndPropertiesSTCTest
 
 /**
@@ -822,12 +821,6 @@ final class FieldsAndPropertiesStaticCompileTest extends 
FieldsAndPropertiesSTCT
         '''
     }
 
-    // GROOVY-6277
-    @Override @NotYetImplemented
-    void testPublicFieldVersusPrivateGetter() {
-        super.testPublicFieldVersusPrivateGetter()
-    }
-
     // GROOVY-11369
     @Override
     void testMapPropertyAccess5a() {

Reply via email to