Skip inlined lambdas when determining EnclosingMethod

#KT-6368 Fixed
This commit is contained in:
Alexander Udalov
2015-01-20 17:58:02 +03:00
parent 20dc3438a2
commit ae6ffeb88a
3 changed files with 34 additions and 0 deletions
@@ -848,7 +848,11 @@ public class AsmUtil {
@NotNull ClassBuilder v
) {
String outerClassName = getOuterClassName(descriptor, originalDescriptor, typeMapper);
FunctionDescriptor function = DescriptorUtils.getParentOfType(descriptor, FunctionDescriptor.class);
while (function != null && JvmCodegenUtil.isLambdaWhichWillBeInlined(typeMapper.getBindingContext(), function)) {
function = DescriptorUtils.getParentOfType(function, FunctionDescriptor.class);
}
if (function != null) {
Method method = typeMapper.mapSignature(function).getAsmMethod();
@@ -0,0 +1,24 @@
import kotlin.properties.Delegates
import java.util.HashMap
trait R {
fun result(): String
}
val a by Delegates.lazy {
with(HashMap<String, R>()) {
put("result", object : R {
override fun result(): String = "OK"
})
this
}
}
fun box(): String {
val r = a["result"]
// Check that reflection won't fail
r.javaClass.getEnclosingMethod().toString()
return r.result()
}
@@ -2451,6 +2451,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxWithStdlib/reflection/enclosing"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("kt6368.kt")
public void testKt6368() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/enclosing/kt6368.kt");
doTestWithStdlib(fileName);
}
@TestMetadata("localClassInTopLevelFunction.kt")
public void testLocalClassInTopLevelFunction() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/enclosing/localClassInTopLevelFunction.kt");