Skip to content

Commit

Permalink
GROOVY-8600, GROOVY-11366: SC: implicit-this closure field call
Browse files Browse the repository at this point in the history
  • Loading branch information
eric-milles committed Sep 13, 2024
1 parent 8aa0b91 commit f50ce0c
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@
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;
Expand Down Expand Up @@ -64,10 +62,10 @@ Expression transformMethodCallExpression(final MethodCallExpression mce) {
}

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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
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;
Expand All @@ -43,7 +42,6 @@
import org.codehaus.groovy.syntax.Types;
import org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor;

import java.util.Iterator;
import java.util.Map;

/**
Expand All @@ -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();
Expand Down Expand Up @@ -98,7 +95,7 @@ public StaticTypesTypeChooser getTypeChooser() {
}

public ClassNode getClassNode() {
return classNode;
return staticCompilationVisitor.getTypeCheckingContext().getEnclosingClassNode();
}

@Override
Expand Down Expand Up @@ -153,13 +150,8 @@ final Expression superTransform(final Expression expr) {

@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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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'
'''
}
}

0 comments on commit f50ce0c

Please sign in to comment.