You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2022/01/26 21:20:18 UTC

[groovy] branch master updated: GROOVY-6277: STC: protected member is accessible by same-package element

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 5bec4f2  GROOVY-6277: STC: protected member is accessible by same-package element
5bec4f2 is described below

commit 5bec4f25783c66c0a3b94dc4d991dae8dcd39000
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Wed Jan 26 14:51:21 2022 -0600

    GROOVY-6277: STC: protected member is accessible by same-package element
---
 .../groovy/transform/stc/StaticTypeCheckingVisitor.java  |  7 +++----
 .../transform/stc/FieldsAndPropertiesSTCTest.groovy      | 16 ++++++++++++++++
 2 files changed, 19 insertions(+), 4 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 1426e5c..2478e23 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -1705,11 +1705,10 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
                 || accessor.getOuterClasses().contains(receiver)) {
             return true;
         }
-        if (Modifier.isProtected(modifiers)) {
-            return accessor.isDerivedFrom(receiver);
-        } else {
-            return !Modifier.isPrivate(modifiers) && Objects.equals(accessor.getPackageName(), receiver.getPackageName());
+        if (!Modifier.isPrivate(modifiers) && Objects.equals(accessor.getPackageName(), receiver.getPackageName())) {
+            return true;
         }
+        return Modifier.isProtected(modifiers) && accessor.isDerivedFrom(receiver);
     }
 
     private MethodNode findGetter(final ClassNode current, String name, final boolean searchOuterClasses) {
diff --git a/src/test/groovy/transform/stc/FieldsAndPropertiesSTCTest.groovy b/src/test/groovy/transform/stc/FieldsAndPropertiesSTCTest.groovy
index a4ca030..d24f1d7 100644
--- a/src/test/groovy/transform/stc/FieldsAndPropertiesSTCTest.groovy
+++ b/src/test/groovy/transform/stc/FieldsAndPropertiesSTCTest.groovy
@@ -864,6 +864,22 @@ class FieldsAndPropertiesSTCTest extends StaticTypeCheckingTestCase {
         '''
     }
 
+    void testProtectedAccessorFromSamePackage() {
+        assertScript '''
+            class Foo {
+                protected String getWho() { 'Foo' }
+            }
+            class Bar {
+                def m(Foo foo) {
+                    def x = foo.who
+                    x.toLowerCase()
+                }
+            }
+            String result = new Bar().m(new Foo())
+            assert result == 'foo'
+        '''
+    }
+
     // GROOVY-6610
     void testPrivateStaticFieldAccessBeforeThis() {
         assertScript '''