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/03/21 21:25:58 UTC

[groovy] branch master updated: platform-independent `GroovyObject` checking

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 9688b28  platform-independent `GroovyObject` checking
9688b28 is described below

commit 9688b280c670a718611bb03addded4a96038b49b
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Mon Mar 21 16:09:31 2022 -0500

    platform-independent `GroovyObject` checking
    
    https://stackoverflow.com/a/61071840/1082681
    https://github.com/groovy/groovy-eclipse/issues/1353
---
 .../java/org/codehaus/groovy/ast/ClassNode.java    | 22 ++++++++--------------
 .../groovy/classgen/AsmClassGenerator.java         | 10 +++++++---
 .../org/codehaus/groovy/classgen/Verifier.java     |  3 +--
 .../codehaus/groovy/control/ResolveVisitor.java    |  4 +---
 .../org/codehaus/groovy/control/SourceUnit.java    | 15 +++------------
 5 files changed, 20 insertions(+), 34 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/ClassNode.java b/src/main/java/org/codehaus/groovy/ast/ClassNode.java
index 9d39dc3..0d2903e 100644
--- a/src/main/java/org/codehaus/groovy/ast/ClassNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/ClassNode.java
@@ -36,6 +36,7 @@ import org.codehaus.groovy.vmplugin.VMPluginFactory;
 
 import java.lang.reflect.Array;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.EnumMap;
 import java.util.Iterator;
@@ -696,20 +697,11 @@ public class ClassNode extends AnnotatedNode {
     }
 
     public void addInterface(ClassNode type) {
-        // let's check if it already implements an interface
-        boolean skip = false;
         ClassNode[] interfaces = getInterfaces();
-        for (ClassNode face : interfaces) {
-            if (type.equals(face)) {
-                skip = true;
-                break;
-            }
-        }
-        if (!skip) {
-            ClassNode[] newInterfaces = new ClassNode[interfaces.length + 1];
-            System.arraycopy(interfaces, 0, newInterfaces, 0, interfaces.length);
-            newInterfaces[interfaces.length] = type;
-            redirect().interfaces = newInterfaces;
+        if (!Arrays.asList(interfaces).contains(type)) {
+            interfaces = Arrays.copyOf(interfaces, interfaces.length + 1);
+            interfaces[interfaces.length - 1] = type;
+            setInterfaces(interfaces);
         }
     }
 
@@ -1017,9 +1009,11 @@ public class ClassNode extends AnnotatedNode {
      * NOTE: Doesn't consider an interface to implement itself.
      * I think this is intended to be called on ClassNodes representing
      * classes, not interfaces.
+     *
+     * @see org.codehaus.groovy.ast.tools.GeneralUtils#isOrImplements
      */
     public boolean declaresInterface(ClassNode classNode) {
-        ClassNode[] interfaces = redirect().getInterfaces();
+        ClassNode[] interfaces = getInterfaces();
         for (ClassNode face : interfaces) {
             if (face.equals(classNode)) {
                 return true;
diff --git a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
index 11f6994..f8ea12e 100644
--- a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
+++ b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
@@ -1159,7 +1159,11 @@ public class AsmClassGenerator extends ClassGenerator {
 
         ClassNode objectExpressionType = controller.getTypeChooser().resolveType(objectExpression, controller.getClassNode());
         if (isObjectType(objectExpressionType)) objectExpressionType = objectExpression.getType();
-        return objectExpressionType.isDerivedFromGroovyObject();
+        return implementsGroovyObject(objectExpressionType);
+    }
+
+    private static boolean implementsGroovyObject(final ClassNode cn) {
+        return cn.isDerivedFromGroovyObject() || (!cn.isInterface() && cn.getCompileUnit() != null);
     }
 
     @Override
@@ -2344,8 +2348,8 @@ public class AsmClassGenerator extends ClassGenerator {
     public void loadWrapper(final Expression argument) {
         MethodVisitor mv = controller.getMethodVisitor();
         ClassNode goalClass = argument.getType();
-        visitClassExpression(new ClassExpression(goalClass));
-        if (goalClass.isDerivedFromGroovyObject()) {
+        visitClassExpression(classX(goalClass));
+        if (implementsGroovyObject(goalClass)) {
             createGroovyObjectWrapperMethod.call(mv);
         } else {
             createPojoWrapperMethod.call(mv);
diff --git a/src/main/java/org/codehaus/groovy/classgen/Verifier.java b/src/main/java/org/codehaus/groovy/classgen/Verifier.java
index 81314b2..86e7641 100644
--- a/src/main/java/org/codehaus/groovy/classgen/Verifier.java
+++ b/src/main/java/org/codehaus/groovy/classgen/Verifier.java
@@ -19,7 +19,6 @@
 package org.codehaus.groovy.classgen;
 
 import groovy.lang.GroovyClassLoader;
-import groovy.lang.GroovyObject;
 import groovy.lang.GroovyRuntimeException;
 import groovy.lang.MetaClass;
 import groovy.transform.CompileStatic;
@@ -524,7 +523,7 @@ public class Verifier implements GroovyClassVisitor, Opcodes {
     }
 
     protected void addGroovyObjectInterfaceAndMethods(final ClassNode node, final String classInternalName) {
-        if (!node.isDerivedFromGroovyObject()) node.addInterface(ClassHelper.make(GroovyObject.class));
+        if (!node.isDerivedFromGroovyObject()) node.addInterface(ClassHelper.GROOVY_OBJECT_TYPE);
         FieldNode metaClassField = getMetaClassField(node);
 
         boolean shouldAnnotate = classNode.getModule().getContext() != null;
diff --git a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
index e639d26..56c65e0 100644
--- a/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
+++ b/src/main/java/org/codehaus/groovy/control/ResolveVisitor.java
@@ -1364,9 +1364,7 @@ public class ResolveVisitor extends ClassCodeExpressionTransformer {
     }
 
     private void addFatalError(final String text, final ASTNode node) {
-        source.getErrorCollector().addFatalError(
-                org.codehaus.groovy.control.messages.Message.create(new SyntaxException(text, node), source)
-        );
+        source.addFatalError(text, node);
     }
 
     private void checkCyclicInheritance(final ClassNode node, final ClassNode type) {
diff --git a/src/main/java/org/codehaus/groovy/control/SourceUnit.java b/src/main/java/org/codehaus/groovy/control/SourceUnit.java
index 255f87c..65ccf6c 100644
--- a/src/main/java/org/codehaus/groovy/control/SourceUnit.java
+++ b/src/main/java/org/codehaus/groovy/control/SourceUnit.java
@@ -26,6 +26,7 @@ import org.codehaus.groovy.control.io.FileReaderSource;
 import org.codehaus.groovy.control.io.ReaderSource;
 import org.codehaus.groovy.control.io.StringReaderSource;
 import org.codehaus.groovy.control.io.URLReaderSource;
+import org.codehaus.groovy.control.messages.Message;
 import org.codehaus.groovy.control.messages.SimpleMessage;
 import org.codehaus.groovy.control.messages.SyntaxErrorMessage;
 import org.codehaus.groovy.syntax.Reduction;
@@ -322,21 +323,11 @@ public class SourceUnit extends ProcessingUnit {
      * @param msg the error message
      * @param node the AST node
      * @throws CompilationFailedException on error
+     *
      * @since 3.0.0
      */
     public void addFatalError(String msg, ASTNode node) throws CompilationFailedException {
-        getErrorCollector().addFatalError(
-                new SyntaxErrorMessage(
-                        new SyntaxException(
-                                msg,
-                                node.getLineNumber(),
-                                node.getColumnNumber(),
-                                node.getLastLineNumber(),
-                                node.getLastColumnNumber()
-                        ),
-                        this
-                )
-        );
+        getErrorCollector().addFatalError(Message.create(new SyntaxException(msg, node), this));
     }
 
     public void addErrorAndContinue(SyntaxException se) {