Skip inlined lambdas when determining EnclosingMethod
#KT-6368 Fixed
This commit is contained in:
@@ -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()
|
||||
}
|
||||
+6
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user