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

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

commit f50ce0c1dee7683d3e9ab15098aefdbda89f4251
Author: Eric Milles <eric.mil...@thomsonreuters.com>
AuthorDate: Fri Sep 13 11:52:51 2024 -0500

    GROOVY-8600, GROOVY-11366: SC: implicit-`this` closure field call
---
 .../sc/transformers/MethodCallExpressionTransformer.java |  8 +++-----
 .../sc/transformers/StaticCompilationTransformer.java    | 12 ++----------
 .../bugs/{Groovy8600Bug.groovy => Groovy8600.groovy}     | 16 ++++++++--------
 3 files changed, 13 insertions(+), 23 deletions(-)

diff --git 
a/src/main/java/org/codehaus/groovy/transform/sc/transformers/MethodCallExpressionTransformer.java
 
b/src/main/java/org/codehaus/groovy/transform/sc/transformers/MethodCallExpressionTransformer.java
index 095055b191..d24c32571a 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/sc/transformers/MethodCallExpressionTransformer.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/sc/transformers/MethodCallExpressionTransformer.java
@@ -31,8 +31,6 @@ import org.codehaus.groovy.transform.stc.ExtensionMethodNode;
 import org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor;
 import org.codehaus.groovy.transform.stc.StaticTypesMarker;
 
-import java.util.Optional;
-
 import static org.apache.groovy.ast.tools.ClassNodeUtils.getField;
 import static org.codehaus.groovy.classgen.AsmClassGenerator.argumentSize;
 import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
@@ -64,10 +62,10 @@ class MethodCallExpressionTransformer {
         }
 
         if (isCallOnClosure(mce)) {
-            var field = 
Optional.ofNullable(scTransformer.getClassNode()).map(cn -> getField(cn, 
mce.getMethodAsString()));
-            if (field.isPresent()) {
+            var field = getField(scTransformer.getClassNode(), 
mce.getMethodAsString());
+            if (field != null) {
                 var closureFieldCall = new MethodCallExpression(
-                        new VariableExpression(field.get()),
+                        new VariableExpression(field),
                         "call",
                         scTransformer.transform(arguments));
                 // implicit-this "field(args)" expression has no place for 
safe, spread-safe, or type arguments
diff --git 
a/src/main/java/org/codehaus/groovy/transform/sc/transformers/StaticCompilationTransformer.java
 
b/src/main/java/org/codehaus/groovy/transform/sc/transformers/StaticCompilationTransformer.java
index 1b8e6fcc0d..577645f9bc 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/sc/transformers/StaticCompilationTransformer.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/sc/transformers/StaticCompilationTransformer.java
@@ -22,7 +22,6 @@ import org.apache.groovy.util.Maps;
 import org.codehaus.groovy.ast.ClassCodeExpressionTransformer;
 import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
-import org.codehaus.groovy.ast.InnerClassNode;
 import org.codehaus.groovy.ast.MethodNode;
 import org.codehaus.groovy.ast.expr.BinaryExpression;
 import org.codehaus.groovy.ast.expr.BooleanExpression;
@@ -43,7 +42,6 @@ import org.codehaus.groovy.runtime.ScriptBytecodeAdapter;
 import org.codehaus.groovy.syntax.Types;
 import org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor;
 
-import java.util.Iterator;
 import java.util.Map;
 
 /**
@@ -64,7 +62,6 @@ public class StaticCompilationTransformer extends 
ClassCodeExpressionTransformer
         Types.COMPARE_TO, BYTECODE_ADAPTER_CLASS.getMethods("compareTo").get(0)
     );
 
-    private ClassNode classNode;
     private final SourceUnit unit;
 
     private final StaticTypesTypeChooser typeChooser = new 
StaticTypesTypeChooser();
@@ -98,7 +95,7 @@ public class StaticCompilationTransformer extends 
ClassCodeExpressionTransformer
     }
 
     public ClassNode getClassNode() {
-        return classNode;
+        return 
staticCompilationVisitor.getTypeCheckingContext().getEnclosingClassNode();
     }
 
     @Override
@@ -153,13 +150,8 @@ public class StaticCompilationTransformer extends 
ClassCodeExpressionTransformer
 
     @Override
     public void visitClass(final ClassNode node) {
-        ClassNode prev = classNode;
-        classNode = node;
         super.visitClass(node);
-        for (Iterator<InnerClassNode> innerClasses = 
classNode.getInnerClasses(); innerClasses.hasNext();) {
-            visitClass(innerClasses.next());
-        }
-        classNode = prev;
+        node.getInnerClasses().forEachRemaining(this::visitClass);
     }
 
     @Override
diff --git a/src/test/groovy/bugs/Groovy8600Bug.groovy 
b/src/test/groovy/bugs/Groovy8600.groovy
similarity index 78%
rename from src/test/groovy/bugs/Groovy8600Bug.groovy
rename to src/test/groovy/bugs/Groovy8600.groovy
index 17fccfcfc2..a71490149f 100644
--- a/src/test/groovy/bugs/Groovy8600Bug.groovy
+++ b/src/test/groovy/bugs/Groovy8600.groovy
@@ -18,22 +18,22 @@
  */
 package groovy.bugs
 
-import groovy.test.GroovyTestCase
+import org.junit.Test
 
-class Groovy8600Bug extends GroovyTestCase {
+import static groovy.test.GroovyAssert.assertScript
+
+final class Groovy8600 {
+    @Test
     void testClosureFieldUseWithinMethod() {
         assertScript '''
-            import groovy.transform.CompileStatic
-
-            class TestCompileStatic {
+            class C {
                 private Closure<String> func = { it.toUpperCase() }
-                @CompileStatic
-                def testCallFunc () {
+                @groovy.transform.CompileStatic m() {
                     func('foo') + func.call('bar')
                 }
             }
 
-            assert new TestCompileStatic().testCallFunc() == 'FOOBAR'
+            assert new C().m() == 'FOOBAR'
         '''
     }
 }

Reply via email to