diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java index 47a45f2f04f..3affc58248a 100644 --- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java +++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticInvocationWriter.java @@ -721,7 +721,8 @@ private boolean tryImplicitReceiver(final Expression origin, final Expression me rewritten.putNodeMetaData(StaticTypesMarker.INFERRED_TYPE, origin.getNodeMetaData(StaticTypesMarker.INFERRED_TYPE)); } else { - makeCall(origin, pexp, message, arguments, adapter, safe, spreadSafe, false); + // the receiver is no longer this, so a call without a target must not be made on the current object + makeCall(origin, pexp, message, arguments, adapter == invokeMethodOnCurrent ? invokeMethod : adapter, safe, spreadSafe, false); } return true; } diff --git a/src/test/groovy/groovy/transform/stc/ClosuresSTCTest.groovy b/src/test/groovy/groovy/transform/stc/ClosuresSTCTest.groovy index df0c8d37c8e..3dafc45efd3 100644 --- a/src/test/groovy/groovy/transform/stc/ClosuresSTCTest.groovy +++ b/src/test/groovy/groovy/transform/stc/ClosuresSTCTest.groovy @@ -1444,6 +1444,24 @@ class ClosuresSTCTest extends StaticTypeCheckingTestCase { ''' } + // GROOVY-12581 + @Test + void testClosureDelegateInInstanceInitializer() { + assertScript ''' + class C { + List log = []; + { + log << new StringBuilder('a').with { append('b') }.toString() + log << new ArrayList().tap { add('c') }.toString() + log << new ArrayList(['d']).with { get(0) } + log << new StringBuilder('e').with { length().toString() } + } + } + + assert new C().log == ['ab', '[c]', 'd', '1'] + ''' + } + // GROOVY-9604 @Test void testClosureResolveStrategy() {