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' ''' } }