You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2020/07/18 10:23:29 UTC

[groovy] branch master updated (27c81aa -> 0af5fcf)

This is an automated email from the ASF dual-hosted git repository.

paulk pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git.


    from 27c81aa  GROOVY-9642: resolve anon. inner base type in same scope as ctor call (closes #1313)
     new a6c97a4  GROOVY-8715: check array in ResolveVisitor.resolveToInner
     new 0af5fcf  GROOVY-8715: minor refactor (closes #1317)

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../codehaus/groovy/control/ResolveVisitor.java    | 63 +++++++++++---------
 src/test/gls/innerClass/InnerClassTest.groovy      | 68 ++++++++++++++++++++++
 2 files changed, 103 insertions(+), 28 deletions(-)


[groovy] 02/02: GROOVY-8715: minor refactor (closes #1317)

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 0af5fcf2fedc7f7810d9889971e4bf394367ef92
Author: Paul King <pa...@asert.com.au>
AuthorDate: Sat Jul 18 20:22:30 2020 +1000

    GROOVY-8715: minor refactor (closes #1317)
---
 .../org/codehaus/groovy/control/ResolveVisitor.java    | 18 ++++++++++--------
 src/test/gls/innerClass/InnerClassTest.groovy          |  6 +++---
 2 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
index d348a77..dbaba62 100644
--- a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
+++ b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
@@ -322,17 +322,19 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
         genericParameterNames = oldPNames;
     }
 
-    private void resolveOrFailPlus(final ClassNode type, final ASTNode node) {
-        resolveGenericsTypes(type.getGenericsTypes());
-        if (resolveAliasFromModule(type)) return;
-        resolveOrFail(type, node);
-    }
-
     private void resolveOrFail(final ClassNode type, final ASTNode node) {
         resolveOrFail(type, "", node);
     }
 
     private void resolveOrFail(final ClassNode type, final String msg, final ASTNode node) {
+        resolveOrFail(type, "", node, false);
+    }
+
+    private void resolveOrFail(final ClassNode type, final String msg, final ASTNode node, final boolean preferImports) {
+        if (preferImports) {
+            resolveGenericsTypes(type.getGenericsTypes());
+            if (resolveAliasFromModule(type)) return;
+        }
         if (resolve(type)) return;
         if (resolveToInner(type)) return;
         if (resolveToOuterNested(type)) return;
@@ -1476,10 +1478,10 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
         }
 
         ClassNode sn = node.getUnresolvedSuperClass();
-        if (sn != null) resolveOrFailPlus(sn, node);
+        if (sn != null) resolveOrFail(sn, "", node, true);
 
         for (ClassNode anInterface : node.getInterfaces()) {
-            resolveOrFailPlus(anInterface, node);
+            resolveOrFail(anInterface, "", node, true);
         }
 
         checkCyclicInheritance(node, node.getUnresolvedSuperClass(), node.getInterfaces());
diff --git a/src/test/gls/innerClass/InnerClassTest.groovy b/src/test/gls/innerClass/InnerClassTest.groovy
index 65377eb..6f401fe 100644
--- a/src/test/gls/innerClass/InnerClassTest.groovy
+++ b/src/test/gls/innerClass/InnerClassTest.groovy
@@ -1237,7 +1237,7 @@ final class InnerClassTest {
     }
 
     @Test
-    void testResolveInnerOfSuperType9() {
+    void testResolveInnerOfSuperType10() {
         assertScript '''
             abstract class A {
                 static class B {}
@@ -1252,7 +1252,7 @@ final class InnerClassTest {
     }
 
     @Test
-    void testResolveInnerOfSuperType9a() {
+    void testResolveInnerOfSuperType10a() {
         assertScript '''
             abstract class A {
                 static class B {}
@@ -1267,7 +1267,7 @@ final class InnerClassTest {
     }
 
     @CompileDynamic @Test // GROOVY-8715
-    void testResolveInnerOfSuperType9b() {
+    void testResolveInnerOfSuperType10b() {
         def config = new CompilerConfiguration(
             targetDirectory: File.createTempDir(),
             jointCompilationOptions: [memStub: true]


[groovy] 01/02: GROOVY-8715: check array in ResolveVisitor.resolveToInner

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit a6c97a41013dd132f2cada29be34999aed613617
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Fri Jul 17 14:18:12 2020 -0500

    GROOVY-8715: check array in ResolveVisitor.resolveToInner
---
 .../codehaus/groovy/control/ResolveVisitor.java    | 61 ++++++++++---------
 src/test/gls/innerClass/InnerClassTest.groovy      | 68 ++++++++++++++++++++++
 2 files changed, 101 insertions(+), 28 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
index f42e862..d348a77 100644
--- a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
+++ b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
@@ -322,34 +322,49 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
         genericParameterNames = oldPNames;
     }
 
+    private void resolveOrFailPlus(final ClassNode type, final ASTNode node) {
+        resolveGenericsTypes(type.getGenericsTypes());
+        if (resolveAliasFromModule(type)) return;
+        resolveOrFail(type, node);
+    }
+
+    private void resolveOrFail(final ClassNode type, final ASTNode node) {
+        resolveOrFail(type, "", node);
+    }
+
+    private void resolveOrFail(final ClassNode type, final String msg, final ASTNode node) {
+        if (resolve(type)) return;
+        if (resolveToInner(type)) return;
+        if (resolveToOuterNested(type)) return;
+
+        addError("unable to resolve class " + type.toString(false) + msg, node);
+    }
+
     protected boolean resolveToInner(final ClassNode type) {
         // we do not do our name mangling to find an inner class
         // if the type is a ConstructedClassWithPackage, because in this case we
         // are resolving the name at a different place already
         if (type instanceof ConstructedClassWithPackage) return false;
         if (type instanceof ConstructedNestedClass) return false;
-        String name = type.getName();
-        String saved = name;
-        while (name.lastIndexOf('.') != -1) {
-            name = replaceLastPointWithDollar(name);
-            type.setName(name);
-            if (resolve(type)) {
+
+        // GROOVY-8715
+        ClassNode t = type;
+        while (t.isArray()) {
+            t = t.getComponentType();
+        }
+
+        String name = t.getName(), temp = name;
+        while (temp.lastIndexOf('.') != -1) {
+            temp = replaceLastPointWithDollar(temp);
+            t.setName(temp);
+            if (resolve(t, true, false, false)) {
                 return true;
             }
         }
-
-        type.setName(saved);
+        t.setName(name);
         return false;
     }
 
-    private void resolveOrFail(final ClassNode type, final String msg, final ASTNode node) {
-        if (resolve(type)) return;
-        if (resolveToInner(type)) return;
-        if (resolveToOuterNested(type)) return;
-
-        addError("unable to resolve class " + type.toString(false) + msg, node);
-    }
-
     // GROOVY-7812(#1): Static inner classes cannot be accessed from other files when running by 'groovy' command
     // if the type to resolve is an inner class and it is in an outer class which is not resolved,
     // we set the resolved type to a placeholder class node, i.e. a ConstructedOuterNestedClass instance
@@ -447,16 +462,6 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
         return constructedOuterNestedClassNode;
     }
 
-    private void resolveOrFail(final ClassNode type, final ASTNode node, final boolean prefereImports) {
-        resolveGenericsTypes(type.getGenericsTypes());
-        if (prefereImports && resolveAliasFromModule(type)) return;
-        resolveOrFail(type, node);
-    }
-
-    private void resolveOrFail(final ClassNode type, final ASTNode node) {
-        resolveOrFail(type, "", node);
-    }
-
     protected boolean resolve(final ClassNode type) {
         return resolve(type, true, true, true);
     }
@@ -1471,10 +1476,10 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
         }
 
         ClassNode sn = node.getUnresolvedSuperClass();
-        if (sn != null) resolveOrFail(sn, node, true);
+        if (sn != null) resolveOrFailPlus(sn, node);
 
         for (ClassNode anInterface : node.getInterfaces()) {
-            resolveOrFail(anInterface, node, true);
+            resolveOrFailPlus(anInterface, node);
         }
 
         checkCyclicInheritance(node, node.getUnresolvedSuperClass(), node.getInterfaces());
diff --git a/src/test/gls/innerClass/InnerClassTest.groovy b/src/test/gls/innerClass/InnerClassTest.groovy
index 1d4c1ad..65377eb 100644
--- a/src/test/gls/innerClass/InnerClassTest.groovy
+++ b/src/test/gls/innerClass/InnerClassTest.groovy
@@ -1236,6 +1236,74 @@ final class InnerClassTest {
         '''
     }
 
+    @Test
+    void testResolveInnerOfSuperType9() {
+        assertScript '''
+            abstract class A {
+                static class B {}
+            }
+
+            def test(A.B[] bees) {
+                assert bees != null
+            }
+
+            test(new A.B[0])
+        '''
+    }
+
+    @Test
+    void testResolveInnerOfSuperType9a() {
+        assertScript '''
+            abstract class A {
+                static class B {}
+            }
+
+            def test(A.B... bees) {
+                assert bees != null
+            }
+
+            test()
+        '''
+    }
+
+    @CompileDynamic @Test // GROOVY-8715
+    void testResolveInnerOfSuperType9b() {
+        def config = new CompilerConfiguration(
+            targetDirectory: File.createTempDir(),
+            jointCompilationOptions: [memStub: true]
+        )
+        def parentDir = File.createTempDir()
+        try {
+            new File(parentDir, 'p').mkdir()
+
+            def a = new File(parentDir, 'p/A.Java')
+            a.write '''
+                package p;
+                public abstract class A {
+                    public interface I {}
+                }
+            '''
+            def b = new File(parentDir, 'p/B.groovy')
+            b.write '''
+                package p
+                def test(A.I... eyes) {
+                    assert eyes != null
+                }
+                test()
+            '''
+
+            def loader = new GroovyClassLoader(this.class.classLoader)
+            def cu = new JavaAwareCompilationUnit(config, loader)
+            cu.addSources(a, b)
+            cu.compile()
+
+            loader.loadClass('p.B').main()
+        } finally {
+            config.targetDirectory.deleteDir()
+            parentDir.deleteDir()
+        }
+    }
+
     @Test // GROOVY-5679, GROOVY-5681
     void testEnclosingMethodIsSet() {
         assertScript '''