minor refactor: move some helper methods to a more logical spot
diff --git a/src/main/java/org/apache/groovy/ast/tools/ExpressionUtils.java b/src/main/java/org/apache/groovy/ast/tools/ExpressionUtils.java
index c1a50e8..440e2e3a 100644
--- a/src/main/java/org/apache/groovy/ast/tools/ExpressionUtils.java
+++ b/src/main/java/org/apache/groovy/ast/tools/ExpressionUtils.java
@@ -47,7 +47,7 @@
import static org.codehaus.groovy.syntax.Types.RIGHT_SHIFT;
import static org.codehaus.groovy.syntax.Types.RIGHT_SHIFT_UNSIGNED;
-public class ExpressionUtils {
+public final class ExpressionUtils {
// NOTE: values are sorted in ascending order
private static final int[] HANDLED_TYPES = {
@@ -339,4 +339,21 @@
}
return null;
}
+
+ public static boolean isThisExpression(final Expression expression) {
+ return expression instanceof VariableExpression && ((VariableExpression) expression).isThisExpression();
+ }
+
+ public static boolean isSuperExpression(final Expression expression) {
+ return expression instanceof VariableExpression && ((VariableExpression) expression).isSuperExpression();
+ }
+
+ public static boolean isThisOrSuper(final Expression expression) {
+ return isThisExpression(expression) || isSuperExpression(expression);
+ }
+
+ public static boolean isNullConstant(final Expression expr) {
+ return expr instanceof ConstantExpression && ((ConstantExpression) expr).isNullExpression();
+ }
+
}
diff --git a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
index e8fd5ca..3277474 100644
--- a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
+++ b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
@@ -19,6 +19,7 @@
package org.codehaus.groovy.classgen;
import groovy.lang.GroovyRuntimeException;
+import org.apache.groovy.ast.tools.ExpressionUtils;
import org.apache.groovy.io.StringBuilderWriter;
import org.codehaus.groovy.GroovyBugError;
import org.codehaus.groovy.ast.ASTNode;
@@ -124,6 +125,7 @@
import java.util.Optional;
import static org.apache.groovy.util.BeanUtils.capitalize;
+import static org.apache.groovy.ast.tools.ExpressionUtils.isThisOrSuper;
import static org.codehaus.groovy.ast.tools.GeneralUtils.attrX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.classX;
@@ -789,7 +791,7 @@
if (castExpression.isCoerce()) {
controller.getOperandStack().doAsType(type);
} else {
- if (isNullConstant(subExpression) && !ClassHelper.isPrimitiveType(type)) {
+ if (ExpressionUtils.isNullConstant(subExpression) && !ClassHelper.isPrimitiveType(type)) {
controller.getOperandStack().replace(type);
} else {
ClassNode subExprType = controller.getTypeChooser().resolveType(subExpression, controller.getClassNode());
@@ -1042,7 +1044,7 @@
}
private boolean isGroovyObject(final Expression objectExpression) {
- if (isThisExpression(objectExpression)) return true;
+ if (ExpressionUtils.isThisExpression(objectExpression)) return true;
if (objectExpression instanceof ClassExpression) return false;
ClassNode objectExpressionType = controller.getTypeChooser().resolveType(objectExpression, controller.getClassNode());
@@ -1063,7 +1065,7 @@
FieldNode fieldNode = null;
ClassNode classNode = controller.getClassNode();
- if (isThisExpression(objectExpression)) {
+ if (ExpressionUtils.isThisExpression(objectExpression)) {
if (controller.isInGeneratedFunction()) { // params are stored as fields
if (expression.isImplicitThis()) fieldNode = classNode.getDeclaredField(name);
} else {
@@ -1122,7 +1124,7 @@
String name = expression.getPropertyAsString();
if (name != null) {
ClassNode classNode = controller.getClassNode();
- FieldNode fieldNode = getDeclaredFieldOfCurrentClassOrAccessibleFieldOfSuper(classNode, classNode, name, isSuperExpression(objectExpression));
+ FieldNode fieldNode = getDeclaredFieldOfCurrentClassOrAccessibleFieldOfSuper(classNode, classNode, name, ExpressionUtils.isSuperExpression(objectExpression));
if (fieldNode != null) {
fieldX(fieldNode).visit(this);
visited = true;
@@ -1133,9 +1135,9 @@
if (!visited) {
MethodCallerMultiAdapter adapter;
if (controller.getCompileStack().isLHS()) {
- adapter = isSuperExpression(objectExpression) ? setFieldOnSuper : isGroovyObject(objectExpression) ? setGroovyObjectField : setField;
+ adapter = ExpressionUtils.isSuperExpression(objectExpression) ? setFieldOnSuper : isGroovyObject(objectExpression) ? setGroovyObjectField : setField;
} else {
- adapter = isSuperExpression(objectExpression) ? getFieldOnSuper : isGroovyObject(objectExpression) ? getGroovyObjectField : getField;
+ adapter = ExpressionUtils.isSuperExpression(objectExpression) ? getFieldOnSuper : isGroovyObject(objectExpression) ? getGroovyObjectField : getField;
}
visitAttributeOrProperty(expression, adapter);
}
@@ -1147,6 +1149,16 @@
}
}
+ private static boolean usesSuper(PropertyExpression pe) {
+ Expression expression = pe.getObjectExpression();
+ if (expression instanceof VariableExpression) {
+ VariableExpression varExp = (VariableExpression) expression;
+ String variable = varExp.getName();
+ return variable.equals("super");
+ }
+ return false;
+ }
+
@Override
public void visitFieldExpression(final FieldExpression expression) {
if (expression.getField().isStatic()) {
@@ -2103,20 +2115,19 @@
return controller.getClassNode().getOuterClass() != null;
}
- public static boolean isNullConstant(final Expression expression) {
- return expression instanceof ConstantExpression && ((ConstantExpression) expression).isNullExpression();
- }
-
+ @Deprecated
public static boolean isThisExpression(final Expression expression) {
- return expression instanceof VariableExpression && ((VariableExpression) expression).isThisExpression();
+ return ExpressionUtils.isThisExpression(expression);
}
+ @Deprecated
public static boolean isSuperExpression(final Expression expression) {
- return expression instanceof VariableExpression && ((VariableExpression) expression).isSuperExpression();
+ return ExpressionUtils.isSuperExpression(expression);
}
- private static boolean isThisOrSuper(final Expression expression) {
- return isThisExpression(expression) || isSuperExpression(expression);
+ @Deprecated
+ public static boolean isNullConstant(final Expression expression) {
+ return ExpressionUtils.isNullConstant(expression);
}
private static boolean isVargs(final Parameter[] parameters) {
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java b/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java
index 0e3f623..8861238 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java
@@ -50,6 +50,7 @@
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
+import static org.apache.groovy.ast.tools.ExpressionUtils.isNullConstant;
import static org.codehaus.groovy.ast.tools.GeneralUtils.args;
import static org.codehaus.groovy.ast.tools.GeneralUtils.binX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
@@ -410,15 +411,15 @@
// ensure we try to unbox null to cause a runtime NPE in case we assign
// null to a primitive typed variable, even if it is used only in boxed
// form as it is closure shared
- if (var.isClosureSharedVariable() && ClassHelper.isPrimitiveType(var.getOriginType()) && AsmClassGenerator.isNullConstant(rightExpression)) {
+ if (var.isClosureSharedVariable() && ClassHelper.isPrimitiveType(var.getOriginType()) && isNullConstant(rightExpression)) {
operandStack.doGroovyCast(var.getOriginType());
// these two are never reached in bytecode and only there
- // to avoid verifyerrors and compiler infrastructure hazzle
+ // to avoid verify errors and compiler infrastructure hazzle
operandStack.box();
operandStack.doGroovyCast(lhsType);
}
// normal type transformation
- if (!ClassHelper.isPrimitiveType(lhsType) && AsmClassGenerator.isNullConstant(rightExpression)) {
+ if (!ClassHelper.isPrimitiveType(lhsType) && isNullConstant(rightExpression)) {
operandStack.replace(lhsType);
} else {
operandStack.doGroovyCast(lhsType);
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/InvocationWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/InvocationWriter.java
index 1ea8f15..b3c51ee 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/InvocationWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/InvocationWriter.java
@@ -54,6 +54,9 @@
import java.util.Objects;
import java.util.TreeMap;
+import static org.apache.groovy.ast.tools.ExpressionUtils.isNullConstant;
+import static org.apache.groovy.ast.tools.ExpressionUtils.isSuperExpression;
+import static org.apache.groovy.ast.tools.ExpressionUtils.isThisExpression;
import static org.objectweb.asm.Opcodes.AALOAD;
import static org.objectweb.asm.Opcodes.ACONST_NULL;
import static org.objectweb.asm.Opcodes.ALOAD;
@@ -100,11 +103,11 @@
public void makeCall(final Expression origin, final Expression receiver, final Expression message, final Expression arguments, final MethodCallerMultiAdapter adapter, boolean safe, final boolean spreadSafe, boolean implicitThis) {
ClassNode sender = controller.getClassNode();
- if (AsmClassGenerator.isSuperExpression(receiver) || (AsmClassGenerator.isThisExpression(receiver) && !implicitThis)) {
+ if (isSuperExpression(receiver) || (isThisExpression(receiver) && !implicitThis)) {
while (ClassHelper.isGeneratedFunction(sender)) {
sender = sender.getOuterClass();
}
- if (AsmClassGenerator.isSuperExpression(receiver)) {
+ if (isSuperExpression(receiver)) {
sender = sender.getSuperClass(); // GROOVY-4035
implicitThis = false; // prevent recursion
safe = false; // GROOVY-6045
@@ -129,7 +132,7 @@
opcode = INVOKESTATIC;
} else if (declaringClass.isInterface()) {
opcode = INVOKEINTERFACE;
- } else if (target.isPrivate() || AsmClassGenerator.isSuperExpression(receiver)) {
+ } else if (target.isPrivate() || isSuperExpression(receiver)) {
opcode = INVOKESPECIAL;
}
@@ -434,9 +437,9 @@
}
MethodCallerMultiAdapter adapter = invokeMethod;
Expression objectExpression = call.getObjectExpression();
- if (AsmClassGenerator.isSuperExpression(objectExpression)) {
+ if (isSuperExpression(objectExpression)) {
adapter = invokeMethodOnSuper;
- } else if (AsmClassGenerator.isThisExpression(objectExpression)) {
+ } else if (isThisExpression(objectExpression)) {
adapter = invokeMethodOnCurrent;
}
if (isStaticInvocation(call)) {
@@ -450,7 +453,7 @@
private static boolean isFunctionInterfaceCall(final MethodCallExpression call) {
if ("call".equals(call.getMethodAsString())) {
Expression objectExpression = call.getObjectExpression();
- if (!AsmClassGenerator.isThisExpression(objectExpression)) {
+ if (!isThisExpression(objectExpression)) {
return ClassHelper.isFunctionalInterface(objectExpression.getType());
}
}
@@ -479,7 +482,7 @@
String methodName = call.getMethodAsString();
if (methodName == null) return false;
if (!call.isImplicitThis()) return false;
- if (!AsmClassGenerator.isThisExpression(call.getObjectExpression())) return false;
+ if (!isThisExpression(call.getObjectExpression())) return false;
FieldNode field = classNode.getDeclaredField(methodName);
if (field == null) return false;
if (isStaticInvocation(call) && !field.isStatic()) return false;
@@ -501,7 +504,7 @@
}
private boolean isStaticInvocation(final MethodCallExpression call) {
- if (!AsmClassGenerator.isThisExpression(call.getObjectExpression())) return false;
+ if (!isThisExpression(call.getObjectExpression())) return false;
if (controller.isStaticMethod()) return true;
return controller.isStaticContext() && !call.isImplicitThis();
}
@@ -665,7 +668,7 @@
for (int i = 0, n = params.length; i < n; i += 1) {
Expression expression = argumentList.get(i);
expression.visit(controller.getAcg());
- if (!AsmClassGenerator.isNullConstant(expression)) {
+ if (!isNullConstant(expression)) {
operandStack.doGroovyCast(params[i].getType());
}
operandStack.remove(1);
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java
index d905a33..afbf205 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/OptimizingStatementWriter.java
@@ -63,6 +63,7 @@
import java.util.List;
import java.util.Optional;
+import static org.apache.groovy.ast.tools.ExpressionUtils.isThisExpression;
import static org.codehaus.groovy.ast.ClassHelper.BigDecimal_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.GROOVY_INTERCEPTABLE_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.OBJECT_TYPE;
@@ -804,7 +805,7 @@
if (expression.getNodeMetaData(StatementMeta.class) != null) return;
super.visitMethodCallExpression(expression);
- if (AsmClassGenerator.isThisExpression(expression.getObjectExpression())) {
+ if (isThisExpression(expression.getObjectExpression())) {
setMethodTarget(expression, expression.getMethodAsString(), expression.getArguments(), true);
}
}
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
index 20c3b27..ec55cf5 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java
@@ -70,6 +70,9 @@
import java.util.concurrent.atomic.AtomicInteger;
import static org.apache.groovy.ast.tools.ClassNodeUtils.samePackageName;
+import static org.apache.groovy.ast.tools.ExpressionUtils.isNullConstant;
+import static org.apache.groovy.ast.tools.ExpressionUtils.isSuperExpression;
+import static org.apache.groovy.ast.tools.ExpressionUtils.isThisOrSuper;
import static org.codehaus.groovy.ast.tools.GeneralUtils.args;
import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.classX;
@@ -79,9 +82,6 @@
import static org.codehaus.groovy.ast.tools.GeneralUtils.propX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt;
import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
-import static org.codehaus.groovy.classgen.AsmClassGenerator.isNullConstant;
-import static org.codehaus.groovy.classgen.AsmClassGenerator.isSuperExpression;
-import static org.codehaus.groovy.classgen.AsmClassGenerator.isThisExpression;
import static org.objectweb.asm.Opcodes.ACONST_NULL;
import static org.objectweb.asm.Opcodes.ALOAD;
import static org.objectweb.asm.Opcodes.CHECKCAST;
@@ -287,9 +287,8 @@
if (emn.isStaticExtension()) {
argumentList.add(nullX());
} else {
- boolean isThisOrSuper = isThisExpression(receiver) || isSuperExpression(receiver);
Expression fixedReceiver = null;
- if (isThisOrSuper && classNode.getOuterClass() != null && controller.isInGeneratedFunction()) {
+ if (isThisOrSuper(receiver) && classNode.getOuterClass() != null && controller.isInGeneratedFunction()) {
ClassNode current = classNode.getOuterClass();
fixedReceiver = varX("thisObject", current);
// adjust for multiple levels of nesting if needed
@@ -355,7 +354,7 @@
boolean fixedImplicitThis = implicitThis;
if (target.isProtected()) {
ClassNode node = receiver == null ? ClassHelper.OBJECT_TYPE : controller.getTypeChooser().resolveType(receiver, controller.getClassNode());
- if (!implicitThis && !isThisExpression(receiver) && !isSuperExpression(receiver) && !samePackageName(node, classNode)
+ if (!implicitThis && !isThisOrSuper(receiver) && !samePackageName(node, classNode)
&& StaticTypeCheckingSupport.implementsInterfaceOrIsSubclassOf(node,target.getDeclaringClass())) {
controller.getSourceUnit().addError(new SyntaxException(
"Method " + target.getName() + " is protected in " + target.getDeclaringClass().toString(false),
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesBinaryExpressionMultiTypeDispatcher.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesBinaryExpressionMultiTypeDispatcher.java
index bf17639..b2a6b3c 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesBinaryExpressionMultiTypeDispatcher.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesBinaryExpressionMultiTypeDispatcher.java
@@ -36,7 +36,6 @@
import org.codehaus.groovy.ast.stmt.EmptyStatement;
import org.codehaus.groovy.ast.stmt.ForStatement;
import org.codehaus.groovy.ast.tools.WideningCategories;
-import org.codehaus.groovy.classgen.AsmClassGenerator;
import org.codehaus.groovy.classgen.asm.BinaryExpressionMultiTypeDispatcher;
import org.codehaus.groovy.classgen.asm.BinaryExpressionWriter;
import org.codehaus.groovy.classgen.asm.BytecodeHelper;
@@ -59,6 +58,7 @@
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
+import static org.apache.groovy.ast.tools.ExpressionUtils.isThisExpression;
import static org.codehaus.groovy.ast.ClassHelper.CLOSURE_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.char_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.double_TYPE;
@@ -254,7 +254,7 @@
private boolean makeSetProperty(final Expression receiver, final Expression message, final Expression arguments, final boolean safe, final boolean spreadSafe, final boolean implicitThis, final boolean isAttribute) {
ClassNode receiverType = controller.getTypeChooser().resolveType(receiver, controller.getClassNode());
String property = message.getText();
- boolean isThisExpression = AsmClassGenerator.isThisExpression(receiver);
+ boolean isThisExpression = isThisExpression(receiver);
if (isAttribute || (isThisExpression && receiverType.getDeclaredField(property) != null)) {
ClassNode current = receiverType;
FieldNode fn = null;
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java
index 9c4b041..880c75f 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java
@@ -55,6 +55,7 @@
import java.util.Map;
import java.util.Objects;
+import static org.apache.groovy.ast.tools.ExpressionUtils.isThisExpression;
import static org.apache.groovy.util.BeanUtils.capitalize;
import static org.codehaus.groovy.ast.ClassHelper.BigDecimal_TYPE;
import static org.codehaus.groovy.ast.ClassHelper.BigInteger_TYPE;
@@ -426,7 +427,7 @@
@Override
public void makeGroovyObjectGetPropertySite(final Expression receiver, final String propertyName, final boolean safe, final boolean implicitThis) {
ClassNode receiverType = controller.getClassNode();
- if (!AsmClassGenerator.isThisExpression(receiver) || controller.isInGeneratedFunction()) {
+ if (!isThisExpression(receiver) || controller.isInGeneratedFunction()) {
receiverType = controller.getTypeChooser().resolveType(receiver, receiverType);
}
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 6d870fb..1124d70 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
@@ -46,6 +46,7 @@
import java.util.Iterator;
import java.util.List;
+import static org.apache.groovy.ast.tools.ExpressionUtils.isNullConstant;
import static org.codehaus.groovy.ast.tools.GeneralUtils.args;
import static org.codehaus.groovy.ast.tools.GeneralUtils.binX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.boolX;
@@ -55,7 +56,6 @@
import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.ternaryX;
import static org.codehaus.groovy.ast.tools.GeneralUtils.varX;
-import static org.codehaus.groovy.classgen.AsmClassGenerator.isNullConstant;
public class BinaryExpressionTransformer {
private static final MethodNode COMPARE_TO_METHOD = ClassHelper.COMPARABLE_TYPE.getMethods("compareTo").get(0);