From 02a58d62f4e2aaa15c71bfb5c220e469d4e4c613 Mon Sep 17 00:00:00 2001 From: Maksim Zuev Date: Tue, 10 Sep 2024 13:03:38 +0200 Subject: [PATCH] [debugger] IDEA-359016 Fix navigation to Kotlin lambdas * due to primitive types boxing/unboxing lambda method heuristic search was broken * now methods from the same class are preferred for the search GitOrigin-RevId: 59cb85ead6729a98f58107ebd8487237c7ee27e3 --- .../intellij/debugger/jdi/MethodBytecodeUtil.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/jdi/MethodBytecodeUtil.java b/java/debugger/impl/src/com/intellij/debugger/jdi/MethodBytecodeUtil.java index 84d595ccb2b8..7fa680e8236f 100644 --- a/java/debugger/impl/src/com/intellij/debugger/jdi/MethodBytecodeUtil.java +++ b/java/debugger/impl/src/com/intellij/debugger/jdi/MethodBytecodeUtil.java @@ -229,6 +229,7 @@ public final class MethodBytecodeUtil { } private static Method getFirstCalledMethod(Method method, @NotNull ClassesByNameProvider classesByName) { + Ref methodInSameClass = Ref.create(); Ref methodRef = Ref.create(); visit(method, new MethodVisitor(Opcodes.API_VERSION) { @Override @@ -238,14 +239,19 @@ public final class MethodBytecodeUtil { } ReferenceType declaringType = method.declaringType(); owner = Type.getObjectType(owner).getClassName(); - ReferenceType cls = declaringType.name().equals(owner) ? + String declaringTypeName = declaringType.name(); + ReferenceType cls = declaringTypeName.equals(owner) ? declaringType : ContainerUtil.getFirstItem(classesByName.get(owner)); - if (cls != null) { - methodRef.setIfNull(DebuggerUtils.findMethod(cls, name, desc)); + if (cls == null) return; + Method targetMethod = DebuggerUtils.findMethod(cls, name, desc); + methodRef.setIfNull(targetMethod); + if (owner.equals(DebuggerUtilsEx.getLambdaBaseClassName(declaringTypeName))) { + methodInSameClass.setIfNull(targetMethod); } } }, false); + if (methodInSameClass.get() != null) return methodInSameClass.get(); return methodRef.get(); }