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 f8b06bfd24bc..d4f54d1a390d 100644 --- a/java/debugger/impl/src/com/intellij/debugger/jdi/MethodBytecodeUtil.java +++ b/java/debugger/impl/src/com/intellij/debugger/jdi/MethodBytecodeUtil.java @@ -242,7 +242,7 @@ public class MethodBytecodeUtil { visit(applicableMethods.get(0), new MethodVisitor(Opcodes.API_VERSION) { @Override public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { - ReferenceType cls = ContainerUtil.getFirstItem(vm.classesByName(owner.replace("/", "."))); + ReferenceType cls = ContainerUtil.getFirstItem(vm.classesByName(owner)); if (cls != null) { Method method = DebuggerUtils.findMethod(cls, name, desc); if (method != null) { diff --git a/java/debugger/impl/src/com/intellij/debugger/jdi/VirtualMachineProxyImpl.java b/java/debugger/impl/src/com/intellij/debugger/jdi/VirtualMachineProxyImpl.java index 0e6c8114e2fc..b2af9fd6a7e6 100644 --- a/java/debugger/impl/src/com/intellij/debugger/jdi/VirtualMachineProxyImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/jdi/VirtualMachineProxyImpl.java @@ -35,6 +35,7 @@ import com.intellij.util.containers.MultiMap; import com.sun.jdi.*; import com.sun.jdi.event.EventQueue; import com.sun.jdi.request.EventRequestManager; +import com.sun.tools.jdi.JNITypeParser; import com.sun.tools.jdi.TargetVM; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -100,12 +101,41 @@ public class VirtualMachineProxyImpl implements JdiTimer, VirtualMachineProxy { return myVirtualMachine; } + static final class JNITypeParserReflect { + static final Method typeNameToSignatureMethod; + + static { + typeNameToSignatureMethod = ReflectionUtil.getDeclaredMethod(JNITypeParser.class, "typeNameToSignature", String.class); + if (typeNameToSignatureMethod == null) { + LOG.warn("Unable to find JNITypeParser.typeNameToSignature method"); + } + } + + @Nullable + static String typeNameToSignature(@NotNull String name) { + if (typeNameToSignatureMethod != null) { + try { + return (String)typeNameToSignatureMethod.invoke(null, name); + } + catch (Exception ignored) { + } + } + return null; + } + } + public List classesByName(String s) { - if (myAllClassesByName == null) { - myAllClassesByName = new MultiMap<>(); - allClasses().forEach(t -> myAllClassesByName.putValue(t.name(), t)); + String signature = JNITypeParserReflect.typeNameToSignature(s); + if (signature != null) { + if (myAllClassesByName == null) { + myAllClassesByName = new MultiMap<>(); + allClasses().forEach(t -> myAllClassesByName.putValue(t.signature(), t)); + } + return (List)myAllClassesByName.get(signature); + } + else { + return myVirtualMachine.classesByName(s); } - return (List)myAllClassesByName.get(s); } public List nestedTypes(ReferenceType refType) {