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) {