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 2021/11/23 18:22:02 UTC

[groovy] branch master updated (8f4e907 -> 44e0a5e)

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

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


    from 8f4e907  GROOVY-6137, GROOVY-7473: SC: `a in b` should evaluate operands one time
     new aef6637  minor edits
     new 44e0a5e  GROOVY-10379: interface default methods in `ClassNode#hasPossibleMethod`

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:
 .../java/org/codehaus/groovy/ast/ClassNode.java    |  7 +++
 .../groovy/classgen/asm/WriterController.java      |  4 +-
 .../transform/sc/TemporaryVariableExpression.java  | 21 +++++----
 .../transformers/BinaryExpressionTransformer.java  | 10 ++---
 src/test/groovy/bugs/Groovy8964.groovy             | 51 ++++++++++++++++++++++
 5 files changed, 74 insertions(+), 19 deletions(-)

[groovy] 02/02: GROOVY-10379: interface default methods in `ClassNode#hasPossibleMethod`

Posted by em...@apache.org.
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

commit 44e0a5ecb56fa53cc2ad66ee74e9fcf11bcbb69b
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Nov 23 12:13:14 2021 -0600

    GROOVY-10379: interface default methods in `ClassNode#hasPossibleMethod`
---
 .../java/org/codehaus/groovy/ast/ClassNode.java    |  7 +++
 src/test/groovy/bugs/Groovy8964.groovy             | 51 ++++++++++++++++++++++
 2 files changed, 58 insertions(+)

diff --git a/src/main/java/org/codehaus/groovy/ast/ClassNode.java b/src/main/java/org/codehaus/groovy/ast/ClassNode.java
index 340efb4..2732d8c 100644
--- a/src/main/java/org/codehaus/groovy/ast/ClassNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/ClassNode.java
@@ -1273,6 +1273,13 @@ public class ClassNode extends AnnotatedNode {
                     return true;
                 }
             }
+            for (ClassNode in : cn.getAllInterfaces()) {
+                for (MethodNode mn : in.getDeclaredMethods(name)) {
+                    if (mn.isDefault() && hasCompatibleNumberOfArgs(mn, count)) {
+                        return true;
+                    }
+                }
+            }
         }
 
         return false;
diff --git a/src/test/groovy/bugs/Groovy8964.groovy b/src/test/groovy/bugs/Groovy8964.groovy
index 0a0e13a..df154e8 100644
--- a/src/test/groovy/bugs/Groovy8964.groovy
+++ b/src/test/groovy/bugs/Groovy8964.groovy
@@ -18,6 +18,8 @@
  */
 package groovy.bugs
 
+import org.codehaus.groovy.control.CompilerConfiguration
+import org.codehaus.groovy.tools.javac.JavaAwareCompilationUnit
 import org.junit.Test
 
 import static groovy.test.GroovyAssert.assertScript
@@ -77,6 +79,55 @@ final class Groovy8964 {
         '''
     }
 
+    @Test // GROOVY-10379
+    void testInstanceMethodNotMaskedByStaticMethodWithSameNumberOfArgs3() {
+        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 implements I {
+                    public static String m(Number n) { return "number"; }
+                }
+            '''
+            def b = new File(parentDir, 'p/I.java')
+            b.write '''
+                package p;
+                public interface I {
+                    default String m(String s) { return "string"; }
+                }
+            '''
+            def c = new File(parentDir, 'Main.groovy')
+            c.write '''
+                @groovy.transform.CompileStatic
+                class C extends p.A {
+                    void test() {
+                        String result = m('') // GroovyCastException: Cannot cast object 'class C' with class 'java.lang.Class' to class 'p.I'
+                        assert result == 'string'
+                    }
+                }
+                new C().test()
+            '''
+
+            def loader = new GroovyClassLoader(this.class.classLoader)
+            def cu = new JavaAwareCompilationUnit(config, loader)
+            cu.addSources(a, b, c)
+            cu.compile()
+
+            loader.loadClass('Main').getDeclaredConstructor().newInstance().run()
+        } finally {
+            config.targetDirectory.deleteDir()
+            parentDir.deleteDir()
+        }
+    }
+
     static abstract class A {
         static void m(Integer i) {}
         protected void m(String s) {}

[groovy] 01/02: minor edits

Posted by em...@apache.org.
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

commit aef6637d2c51a98bd0fabfe4846c2af999632725
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Nov 23 12:04:28 2021 -0600

    minor edits
---
 .../groovy/classgen/asm/WriterController.java       |  4 +---
 .../transform/sc/TemporaryVariableExpression.java   | 21 ++++++++++-----------
 .../transformers/BinaryExpressionTransformer.java   | 10 +++++-----
 3 files changed, 16 insertions(+), 19 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
index a71bf44..a266571 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
@@ -43,8 +43,6 @@ import java.util.Map;
 import static org.codehaus.groovy.ast.ClassHelper.isGeneratedFunction;
 
 public class WriterController {
-    private static final String RECORD_CLASS_NAME = "java.lang.Record";
-
     private AsmClassGenerator acg;
     private MethodVisitor methodVisitor;
     private CompileStack compileStack;
@@ -136,7 +134,7 @@ public class WriterController {
         this.typeChooser = new StatementMetaTypeChooser();
     }
 
-    private static ClassVisitor createClassVisitor(final ClassVisitor cv, CompilerConfiguration config) {
+    private static ClassVisitor createClassVisitor(final ClassVisitor cv, final CompilerConfiguration config) {
         if (!config.isLogClassgen() || cv instanceof LoggableClassVisitor) {
             return cv;
         }
diff --git a/src/main/java/org/codehaus/groovy/transform/sc/TemporaryVariableExpression.java b/src/main/java/org/codehaus/groovy/transform/sc/TemporaryVariableExpression.java
index 14e9521..37fcb85 100644
--- a/src/main/java/org/codehaus/groovy/transform/sc/TemporaryVariableExpression.java
+++ b/src/main/java/org/codehaus/groovy/transform/sc/TemporaryVariableExpression.java
@@ -43,11 +43,20 @@ public class TemporaryVariableExpression extends Expression {
 
     public TemporaryVariableExpression(final Expression expression) {
         this.expression = expression;
-        setType(expression.getType());
         putNodeMetaData(INFERRED_TYPE, expression.getNodeMetaData(INFERRED_TYPE));
     }
 
     @Override
+    public ClassNode getType() {
+        return expression.getType();
+    }
+
+    public void remove(final WriterController controller) {
+        controller.getCompileStack().removeVar(variable[0].getIndex());
+        variable[0] = null;
+    }
+
+    @Override
     public Expression transformExpression(final ExpressionTransformer transformer) {
         TemporaryVariableExpression result = new TemporaryVariableExpression(transformer.transform(expression));
         result.copyNodeMetaData(this);
@@ -67,14 +76,4 @@ public class TemporaryVariableExpression extends Expression {
             expression.visit(visitor);
         }
     }
-
-    public void remove(final WriterController controller) {
-        controller.getCompileStack().removeVar(variable[0].getIndex());
-        variable[0] = null;
-    }
-
-    @Override
-    public ClassNode getType() {
-        return expression.getType();
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/transform/sc/transformers/BinaryExpressionTransformer.java b/src/main/java/org/codehaus/groovy/transform/sc/transformers/BinaryExpressionTransformer.java
index a66c233..b31d5fc 100644
--- a/src/main/java/org/codehaus/groovy/transform/sc/transformers/BinaryExpressionTransformer.java
+++ b/src/main/java/org/codehaus/groovy/transform/sc/transformers/BinaryExpressionTransformer.java
@@ -246,12 +246,12 @@ public class BinaryExpressionTransformer {
         return staticCompilationTransformer.transform(ternaryX(isNullX(rightExpression), isNullX(leftExpression), call));
     }
 
-    private Expression transformRepeatedReference(final Expression expr) {
-        if (expr instanceof ConstantExpression || expr instanceof VariableExpression
-                && ((VariableExpression) expr).getAccessedVariable() instanceof Parameter) {
-            return expr;
+    private Expression transformRepeatedReference(final Expression exp) {
+        if (exp instanceof ConstantExpression || exp instanceof VariableExpression
+                && ((VariableExpression) exp).getAccessedVariable() instanceof Parameter) {
+            return exp;
         }
-        return new TemporaryVariableExpression(expr);
+        return new TemporaryVariableExpression(exp);
     }
 
     private Expression transformEqualityComparison(final BinaryExpression bin, final boolean eq) {