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 2024/09/13 17:26:00 UTC
(groovy) 01/02: GROOVY-8600, GROOVY-11366: SC: implicit-`this` closure field call
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 <er...@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'
'''
}
}