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/05/25 18:04:10 UTC

[groovy] branch GROOVY_2_5_X updated: GROOVY-9136: Refactor StaticTypeCheckingVisitor.checkOrMarkInnerPropertyOwnerAccess(closes #935)

This is an automated email from the ASF dual-hosted git repository.

sunlan pushed a commit to branch GROOVY_2_5_X
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY_2_5_X by this push:
     new e62ecfb  GROOVY-9136: Refactor StaticTypeCheckingVisitor.checkOrMarkInnerPropertyOwnerAccess(closes #935)
e62ecfb is described below

commit e62ecfb2981929d42aa75af1be690b3187269d9f
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sun May 26 01:51:34 2019 +0800

    GROOVY-9136: Refactor StaticTypeCheckingVisitor.checkOrMarkInnerPropertyOwnerAccess(closes #935)
    
    (cherry picked from commit 18c8b08a471b112762b0e91d961db72f63d96548)
---
 .../transform/stc/StaticTypeCheckingVisitor.java    | 21 +++++++++------------
 1 file changed, 9 insertions(+), 12 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index c23824a..3579f18 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -517,18 +517,13 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
     /**
      * Checks valid cases for accessing a field from an inner class.
      */
-    private String checkOrMarkInnerPropertyOwnerAccess(Expression source, FieldNode fn, boolean lhsOfAssignment, String delegationData) {
-        if (fn != null && !fn.isStatic() && !fn.isPrivate() && !"delegate".equals(delegationData) &&
-                source instanceof PropertyExpression && typeCheckingContext.getEnclosingClosureStack().size() == 1) {
-            PropertyExpression pe = (PropertyExpression) source;
-            boolean ownerProperty = !("this".equals(pe.getPropertyAsString()));
-            // check for reference to method, closure, for loop or catch block parameter
-            if (ownerProperty && pe.getObjectExpression() instanceof VariableExpression) {
-                ownerProperty = !(((VariableExpression) pe.getObjectExpression()).getAccessedVariable() instanceof Parameter);
-            }
-            if (ownerProperty) {
+    private String checkOrMarkInnerPropertyOwnerAccess(PropertyExpression source, boolean lhsOfAssignment, String delegationData) {
+        // check for reference to method, closure, for loop, try with, or catch block parameter from a non-nested closure
+        if (typeCheckingContext.getEnclosingClosureStack().size() == 1 && !"this".equals(source.getPropertyAsString())) {
+            if (!(source.getObjectExpression() instanceof VariableExpression &&
+                    ((VariableExpression) source.getObjectExpression()).getAccessedVariable() instanceof Parameter)) {
                 delegationData = "owner";
-                pe.getObjectExpression().putNodeMetaData(StaticTypesMarker.IMPLICIT_RECEIVER, delegationData);
+                source.getObjectExpression().putNodeMetaData(StaticTypesMarker.IMPLICIT_RECEIVER, delegationData);
             }
         }
         return delegationData;
@@ -1745,7 +1740,9 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
         if (visitor != null) visitor.visitField(field);
         storeWithResolve(field.getOriginType(), receiver, field.getDeclaringClass(), field.isStatic(), expressionToStoreOn);
         checkOrMarkPrivateAccess(expressionToStoreOn, field, lhsOfAssignment);
-        delegationData = checkOrMarkInnerPropertyOwnerAccess(expressionToStoreOn, field, lhsOfAssignment, delegationData);
+        if (field != null && !field.isStatic() && !field.isPrivate() && !"delegate".equals(delegationData)) {
+            delegationData = checkOrMarkInnerPropertyOwnerAccess(expressionToStoreOn, lhsOfAssignment, delegationData);
+        }
         if (delegationData != null) {
             expressionToStoreOn.putNodeMetaData(StaticTypesMarker.IMPLICIT_RECEIVER, delegationData);
         }