Skip inlined lambdas when determining EnclosingMethod
#KT-6368 Fixed
This commit is contained in:
@@ -848,7 +848,11 @@ public class AsmUtil {
|
|||||||
@NotNull ClassBuilder v
|
@NotNull ClassBuilder v
|
||||||
) {
|
) {
|
||||||
String outerClassName = getOuterClassName(descriptor, originalDescriptor, typeMapper);
|
String outerClassName = getOuterClassName(descriptor, originalDescriptor, typeMapper);
|
||||||
|
|
||||||
FunctionDescriptor function = DescriptorUtils.getParentOfType(descriptor, FunctionDescriptor.class);
|
FunctionDescriptor function = DescriptorUtils.getParentOfType(descriptor, FunctionDescriptor.class);
|
||||||
|
while (function != null && JvmCodegenUtil.isLambdaWhichWillBeInlined(typeMapper.getBindingContext(), function)) {
|
||||||
|
function = DescriptorUtils.getParentOfType(function, FunctionDescriptor.class);
|
||||||
|
}
|
||||||
|
|
||||||
if (function != null) {
|
if (function != null) {
|
||||||
Method method = typeMapper.mapSignature(function).getAsmMethod();
|
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);
|
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")
|
@TestMetadata("localClassInTopLevelFunction.kt")
|
||||||
public void testLocalClassInTopLevelFunction() throws Exception {
|
public void testLocalClassInTopLevelFunction() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/enclosing/localClassInTopLevelFunction.kt");
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/enclosing/localClassInTopLevelFunction.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user