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 2020/08/09 00:40:42 UTC

[groovy] 02/02: minor refactor

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 230c148df3f985d10dbeeb4058557dbb03f7b14a
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Wed Aug 5 17:59:29 2020 -0500

    minor refactor
    
    (cherry picked from commit 7a4860efcf29bc82edcb35e4358248bba1407fb5)
---
 .../transform/trait/SuperCallTraitTransformer.java | 40 +++++++++-------------
 1 file changed, 17 insertions(+), 23 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java b/src/main/java/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java
index 76f5782..4eccccb 100644
--- a/src/main/java/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java
+++ b/src/main/java/org/codehaus/groovy/transform/trait/SuperCallTraitTransformer.java
@@ -80,9 +80,9 @@ class SuperCallTraitTransformer extends ClassCodeExpressionTransformer {
                 PropertyExpression leftExpression = (PropertyExpression) bin.getLeftExpression();
                 ClassNode traitType = getTraitSuperTarget(leftExpression.getObjectExpression());
                 if (traitType != null) {
+                    ClassNode helperType = getHelper(traitType);
                     // TraitType.super.foo = ... -> TraitType$Helper.setFoo(this, ...)
 
-                    ClassNode helperType = getHelper(traitType);
                     String setterName = MetaProperty.getSetterName(leftExpression.getPropertyAsString());
                     for (MethodNode method : helperType.getMethods(setterName)) {
                         Parameter[] parameters = method.getParameters();
@@ -95,8 +95,8 @@ class SuperCallTraitTransformer extends ClassCodeExpressionTransformer {
                                             bin.getRightExpression()
                                     )
                             );
+                            setterCall.getObjectExpression().setSourcePosition(leftExpression.getObjectExpression());
                             setterCall.getMethod().setSourcePosition(leftExpression.getProperty());
-                            setterCall.getObjectExpression().setSourcePosition(traitType);
                             setterCall.setSpreadSafe(leftExpression.isSpreadSafe());
                             setterCall.setMethodTarget(method);
                             setterCall.setImplicitThis(false);
@@ -112,6 +112,7 @@ class SuperCallTraitTransformer extends ClassCodeExpressionTransformer {
     private Expression transformMethodCallExpression(final MethodCallExpression exp) {
         ClassNode traitType = getTraitSuperTarget(exp.getObjectExpression());
         if (traitType != null) {
+            ClassNode helperType = getHelper(traitType);
             // TraitType.super.foo() -> TraitType$Helper.foo(this)
 
             ArgumentListExpression newArgs = new ArgumentListExpression();
@@ -126,11 +127,11 @@ class SuperCallTraitTransformer extends ClassCodeExpressionTransformer {
             }
 
             MethodCallExpression newCall = new MethodCallExpression(
-                    new ClassExpression(getHelper(traitType)),
+                    new ClassExpression(helperType),
                     transform(exp.getMethod()),
                     newArgs
             );
-            newCall.getObjectExpression().setSourcePosition(traitType);
+            newCall.getObjectExpression().setSourcePosition(((PropertyExpression) exp.getObjectExpression()).getObjectExpression());
             newCall.setSpreadSafe(exp.isSpreadSafe());
             newCall.setImplicitThis(false);
             return newCall;
@@ -138,31 +139,24 @@ class SuperCallTraitTransformer extends ClassCodeExpressionTransformer {
         return super.transform(exp);
     }
 
-    private ClassNode getHelper(final ClassNode traitReceiver) {
-        if (helperClassNotCreatedYet(traitReceiver)) {
-            // GROOVY-7909: A Helper class in same compilation unit may have not been created when referenced
-            // Here create a symbol as a "placeholder" and it will be resolved later.
-            ClassNode ret = new InnerClassNode(
-                    traitReceiver,
-                    Traits.helperClassName(traitReceiver),
+    private ClassNode getHelper(final ClassNode traitType) {
+        // GROOVY-7909: A helper class in the same compilation unit may not have
+        // been created when referenced; create a placeholder to be resolved later.
+        if (!traitType.redirect().getInnerClasses().hasNext()
+                && getSourceUnit().getAST().getClasses().contains(traitType.redirect())) {
+            ClassNode helperType = new InnerClassNode(
+                    traitType,
+                    Traits.helperClassName(traitType),
                     ACC_PUBLIC | ACC_STATIC | ACC_ABSTRACT | ACC_SYNTHETIC,
                     ClassHelper.OBJECT_TYPE,
                     ClassNode.EMPTY_ARRAY,
                     null
             ).getPlainNodeReference();
-
-            ret.setRedirect(null);
-            traitReceiver.redirect().setNodeMetaData(UNRESOLVED_HELPER_CLASS, ret);
-            return ret;
-        } else {
-            TraitHelpersTuple helpers = Traits.findHelpers(traitReceiver);
-            return helpers.getHelper();
+            helperType.setRedirect(null);
+            traitType.redirect().setNodeMetaData(UNRESOLVED_HELPER_CLASS, helperType);
+            return helperType;
         }
-    }
-
-    private boolean helperClassNotCreatedYet(final ClassNode traitReceiver) {
-        return !traitReceiver.redirect().getInnerClasses().hasNext()
-                && getSourceUnit().getAST().getClasses().contains(traitReceiver.redirect());
+        return Traits.findHelper(traitType);
     }
 
     private ClassNode getTraitSuperTarget(final Expression exp) {