You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2018/04/05 17:53:13 UTC

[2/2] groovy git commit: Refine "GROOVY-8531: Fail to resolve type defined in super class written in Java"

Refine "GROOVY-8531: Fail to resolve type defined in super class written in Java"

Check visibility of inner type

(cherry picked from commit 4181626)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/a313e9fe
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/a313e9fe
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/a313e9fe

Branch: refs/heads/GROOVY_2_6_X
Commit: a313e9fed3ffdbb1accfa725a50817ea335d7794
Parents: e23d27c
Author: danielsun1106 <re...@hotmail.com>
Authored: Fri Apr 6 01:38:33 2018 +0800
Committer: danielsun1106 <re...@hotmail.com>
Committed: Fri Apr 6 01:52:58 2018 +0800

----------------------------------------------------------------------
 .../codehaus/groovy/control/ResolveVisitor.java    | 17 ++++++++++++++++-
 .../groovy/bugs/groovy8531/Groovy8531Bug.groovy    | 16 ++++++++++++++--
 src/test/groovy/bugs/groovy8531/Reducer.java       |  4 +++-
 3 files changed, 33 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/a313e9fe/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
index a48d516..6cfd9be 100644
--- a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
+++ b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
@@ -282,7 +282,6 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
             if (resolve(type)) return true;
         }
 
-        // GROOVY-8531: Fail to resolve type defined in super class written in Java
         if (resolveToNestedOfCurrentClassAndSuperClasses(type)) return true;
 
         type.setName(saved);
@@ -290,6 +289,7 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
     }
 
     private boolean resolveToNestedOfCurrentClassAndSuperClasses(ClassNode type) {
+        // GROOVY-8531: Fail to resolve type defined in super class written in Java
         for (ClassNode enclosingClassNode = currentClass; ClassHelper.OBJECT_TYPE != enclosingClassNode; enclosingClassNode = enclosingClassNode.getSuperClass()) {
             if(resolveToNested(enclosingClassNode, type)) return true;
         }
@@ -305,6 +305,8 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
         if (enclosingType != type && !name.contains(".") && type.getClass().equals(ClassNode.class)) {
             ClassNode tmp = new ConstructedNestedClass(enclosingType,name);
             if (resolve(tmp)) {
+                if (!checkInnerTypeVisibility(enclosingType, tmp)) return false;
+
                 type.setRedirect(tmp);
                 return true;
             }
@@ -313,6 +315,19 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
 
     }
 
+    private boolean checkInnerTypeVisibility(ClassNode enclosingType, ClassNode innerClassNode) {
+        if (currentClass == enclosingType) {
+            return true;
+        }
+
+        int modifiers = innerClassNode.getModifiers();
+        if (Modifier.isPublic(modifiers) || Modifier.isProtected(modifiers)) {
+            return true;
+        }
+
+        return false;
+    }
+
     private void resolveOrFail(ClassNode type, String msg, ASTNode node) {
         if (resolve(type)) return;
         if (resolveToInner(type)) return;

http://git-wip-us.apache.org/repos/asf/groovy/blob/a313e9fe/src/test/groovy/bugs/groovy8531/Groovy8531Bug.groovy
----------------------------------------------------------------------
diff --git a/src/test/groovy/bugs/groovy8531/Groovy8531Bug.groovy b/src/test/groovy/bugs/groovy8531/Groovy8531Bug.groovy
index b7ee0d2..72dd08b 100644
--- a/src/test/groovy/bugs/groovy8531/Groovy8531Bug.groovy
+++ b/src/test/groovy/bugs/groovy8531/Groovy8531Bug.groovy
@@ -19,18 +19,30 @@
 package groovy.bugs.groovy8531
 
 class Groovy8531Bug extends GroovyTestCase {
-    void test() {
+    void testPublicAndProtectedInnerType() {
         assertScript '''
             package groovy.bugs.groovy8531
             class Example extends Reducer {
-                public void reduce(Context context) {}
+                public void reduce(PublicContext context) {}
+                public void reduce2(ProtectedContext context) {}
                 public boolean isDynamic(Type type) {
                     return Type.DYNAMIC == type
                 }
             }
             
             new Example().reduce(null)
+            new Example().reduce2(null)
             assert new Example().isDynamic(Reducer.Type.DYNAMIC)
         '''
     }
+
+    void testPrivateInnerType() {
+        def errMsg = shouldFail '''
+            package groovy.bugs.groovy8531
+            class Example extends Reducer {
+                public void reduce3(PrivateContext context) {}
+            }
+        '''
+        assert errMsg.contains('unable to resolve class')
+    }
 }

http://git-wip-us.apache.org/repos/asf/groovy/blob/a313e9fe/src/test/groovy/bugs/groovy8531/Reducer.java
----------------------------------------------------------------------
diff --git a/src/test/groovy/bugs/groovy8531/Reducer.java b/src/test/groovy/bugs/groovy8531/Reducer.java
index c9b78bf..95b5b24 100644
--- a/src/test/groovy/bugs/groovy8531/Reducer.java
+++ b/src/test/groovy/bugs/groovy8531/Reducer.java
@@ -19,7 +19,9 @@
 package groovy.bugs.groovy8531;
 
 public class Reducer {
-    public abstract class Context {}
+    public abstract class PublicContext {}
+    protected abstract class ProtectedContext {}
+    private abstract class PrivateContext {}
 
     public enum Type {
         DYNAMIC, STATIC