You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2019/12/13 06:04:51 UTC
[groovy] 02/04: Minor refactoring: extract common checking logic
This is an automated email from the ASF dual-hosted git repository.
sunlan pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 31c42c408ed3dc29bae1f1d12aa6faa8d066d78e
Author: Daniel Sun <su...@apache.org>
AuthorDate: Fri Dec 13 11:13:05 2019 +0800
Minor refactoring: extract common checking logic
(cherry picked from commit 9015d61eb33603fa80a9bc739e7d0890fe93e400)
---
src/main/java/org/codehaus/groovy/ast/ClassHelper.java | 12 ++++++++++++
.../java/org/codehaus/groovy/classgen/AsmClassGenerator.java | 2 +-
.../org/codehaus/groovy/classgen/asm/InvocationWriter.java | 2 +-
.../java/org/codehaus/groovy/classgen/asm/MopWriter.java | 2 +-
.../org/codehaus/groovy/classgen/asm/WriterController.java | 2 +-
.../groovy/classgen/asm/sc/StaticTypesWriterController.java | 2 +-
.../groovy/groovy/console/ui/ScriptToTreeNodeAdapter.groovy | 2 +-
7 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/ast/ClassHelper.java b/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
index 9b30986..0a659d2 100644
--- a/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
+++ b/src/main/java/org/codehaus/groovy/ast/ClassHelper.java
@@ -68,6 +68,7 @@ import java.math.BigInteger;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.regex.Pattern;
/**
@@ -407,6 +408,17 @@ public class ClassHelper {
return false;
}
+ /**
+ * Check if the type is a generated function, i.e. closure/lambda
+ * @param type the type to check
+ * @return the check result
+ * @since 3.0.0
+ */
+ public static boolean isGeneratedFunction(ClassNode type) {
+ Objects.requireNonNull(type, "type should not be null");
+ return type.implementsAnyInterfaces(GENERATED_CLOSURE_Type, GENERATED_LAMBDA_TYPE);
+ }
+
static class ClassHelperCache {
static ManagedConcurrentMap<Class, SoftReference<ClassNode>> classCache = new ManagedConcurrentMap<Class, SoftReference<ClassNode>>(ReferenceBundle.getWeakBundle());
}
diff --git a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
index 18038cf..428436c 100644
--- a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
+++ b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
@@ -940,7 +940,7 @@ public class AsmClassGenerator extends ClassGenerator {
iterType = iterType.getOuterClass();
if (thisField == null) {
// closure within inner class
- while (iterType.isDerivedFrom(ClassHelper.CLOSURE_TYPE) && iterType.implementsAnyInterfaces(ClassHelper.GENERATED_CLOSURE_Type, ClassHelper.GENERATED_LAMBDA_TYPE)) {
+ while (iterType.isDerivedFrom(ClassHelper.CLOSURE_TYPE) && ClassHelper.isGeneratedFunction(iterType)) {
// GROOVY-8881: cater for closures within closures - getThisObject is already outer class of all closures
iterType = iterType.getOuterClass();
}
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 2927d8a..8cd5780 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/InvocationWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/InvocationWriter.java
@@ -100,7 +100,7 @@ public class InvocationWriter {
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)) {
- while (sender.isDerivedFrom(ClassHelper.CLOSURE_TYPE) && sender.implementsAnyInterfaces(ClassHelper.GENERATED_CLOSURE_Type, ClassHelper.GENERATED_LAMBDA_TYPE)) {
+ while (sender.isDerivedFrom(ClassHelper.CLOSURE_TYPE) && ClassHelper.isGeneratedFunction(sender)) {
sender = sender.getOuterClass();
}
if (AsmClassGenerator.isSuperExpression(receiver)) {
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/MopWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/MopWriter.java
index 8ec0140..ad3f1bb 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/MopWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/MopWriter.java
@@ -85,7 +85,7 @@ public class MopWriter {
public void createMopMethods() {
ClassNode classNode = controller.getClassNode();
- if (classNode.declaresAnyInterfaces(ClassHelper.GENERATED_CLOSURE_Type, ClassHelper.GENERATED_LAMBDA_TYPE)) {
+ if (ClassHelper.isGeneratedFunction(classNode)) {
return;
}
Set<MopKey> currentClassSignatures = classNode.getMethods().stream()
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 a1f6caa..6e21864 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
@@ -285,7 +285,7 @@ public class WriterController {
public boolean isInClosure() {
return classNode.getOuterClass() != null
&& classNode.getSuperClass().equals(ClassHelper.CLOSURE_TYPE)
- && classNode.implementsAnyInterfaces(ClassHelper.GENERATED_CLOSURE_Type, ClassHelper.GENERATED_LAMBDA_TYPE);
+ && ClassHelper.isGeneratedFunction(classNode);
}
public boolean isInClosureConstructor() {
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesWriterController.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesWriterController.java
index edfd27f..25bd2a0 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesWriterController.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesWriterController.java
@@ -95,7 +95,7 @@ public class StaticTypesWriterController extends DelegatingController {
private void updateStaticCompileFlag(final MethodNode mn) {
ClassNode classNode = getClassNode();
AnnotatedNode node = mn;
- boolean implementsGeneratedClosureOrGeneratedLambdaInterface = classNode.implementsAnyInterfaces(ClassHelper.GENERATED_CLOSURE_Type, ClassHelper.GENERATED_LAMBDA_TYPE);
+ boolean implementsGeneratedClosureOrGeneratedLambdaInterface = ClassHelper.isGeneratedFunction(classNode);
if (implementsGeneratedClosureOrGeneratedLambdaInterface) {
node = classNode.getOuterClass();
}
diff --git a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ScriptToTreeNodeAdapter.groovy b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ScriptToTreeNodeAdapter.groovy
index d9eed68..d42f3ba 100644
--- a/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ScriptToTreeNodeAdapter.groovy
+++ b/subprojects/groovy-console/src/main/groovy/groovy/console/ui/ScriptToTreeNodeAdapter.groovy
@@ -336,7 +336,7 @@ class TreeNodeBuildingNodeOperation extends PrimaryClassNodeOperation {
def innerClassNodes = compileUnit.generatedInnerClasses.values().sort { it.name }
innerClassNodes.each { InnerClassNode innerClassNode ->
- if (!innerClassNode.implementsAnyInterfaces(ClassHelper.GENERATED_CLOSURE_Type, ClassHelper.GENERATED_LAMBDA_TYPE)) return
+ if (!ClassHelper.isGeneratedFunction(innerClassNode)) return
if (innerClassNode.outerMostClass != classNode) return
def child = adapter.make(innerClassNode)