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 <[email protected]> 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)
