You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2019/11/05 23:20:35 UTC

[groovy] branch GROOVY-7996 updated: Exclude closure parameter references from dynamic resolution

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

emilles pushed a commit to branch GROOVY-7996
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY-7996 by this push:
     new bed7f93  Exclude closure parameter references from dynamic resolution
bed7f93 is described below

commit bed7f9312533d0c5c7209b9ff9e8dc1f07a5fcb0
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Tue Nov 5 17:20:29 2019 -0600

    Exclude closure parameter references from dynamic resolution
---
 src/main/java/org/codehaus/groovy/ast/tools/ClosureUtils.java     | 8 +++++++-
 .../codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java  | 4 +++-
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/tools/ClosureUtils.java b/src/main/java/org/codehaus/groovy/ast/tools/ClosureUtils.java
index da07990..16db26d 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/ClosureUtils.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/ClosureUtils.java
@@ -21,11 +21,14 @@ package org.codehaus.groovy.ast.tools;
 import groovy.lang.Closure;
 import org.codehaus.groovy.ast.Parameter;
 import org.codehaus.groovy.ast.expr.ClosureExpression;
+import org.codehaus.groovy.ast.expr.VariableExpression;
 import org.codehaus.groovy.control.io.ReaderSource;
+
+import java.util.Arrays;
+
 /**
  * Handy methods when working with Closure AST data structures.
  */
-
 public class ClosureUtils {
 
     /**
@@ -81,4 +84,7 @@ public class ClosureUtils {
         return ce.getParameters() != null ? ce.getParameters() : Parameter.EMPTY_ARRAY;
     }
 
+    public static boolean isParameterReference(VariableExpression ve, ClosureExpression ce) {
+        return Arrays.asList(getParametersSafe(ce)).contains(ve.getAccessedVariable());
+    }
 }
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 3e562e2..9ea7130 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -180,6 +180,7 @@ import static org.codehaus.groovy.ast.ClassHelper.long_TYPE;
 import static org.codehaus.groovy.ast.ClassHelper.short_TYPE;
 import static org.codehaus.groovy.ast.ClassHelper.void_WRAPPER_TYPE;
 import static org.codehaus.groovy.ast.tools.ClosureUtils.getParametersSafe;
+import static org.codehaus.groovy.ast.tools.ClosureUtils.isParameterReference;
 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.block;
@@ -1719,7 +1720,8 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
 
             // GROOVY-7996: check if receiver implements get(String)/set(String,Object) or propertyMissing(String)
             if (!testClass.isArray() && !isPrimitiveType(getUnwrapper(testClass))
-                    && objectExpression instanceof VariableExpression && typeCheckingContext.getEnclosingClosure() != null) {
+                    && objectExpression instanceof VariableExpression && typeCheckingContext.getEnclosingClosure() != null
+                    && !isParameterReference((VariableExpression) objectExpression, typeCheckingContext.getEnclosingClosure().getClosureExpression())) {
                 MethodNode mopMethod;
                 if (readMode) {
                     mopMethod = testClass.getMethod("get", new Parameter[]{new Parameter(STRING_TYPE, "name")});