diff --git a/java/debugger/impl/resources/META-INF/java-debugger.xml b/java/debugger/impl/resources/META-INF/java-debugger.xml
index 18b80a98e61e..9a7d0a0e9b3c 100644
--- a/java/debugger/impl/resources/META-INF/java-debugger.xml
+++ b/java/debugger/impl/resources/META-INF/java-debugger.xml
@@ -117,6 +117,7 @@
+
diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/attach/JavaAttachDebuggerProvider.java b/java/debugger/impl/src/com/intellij/debugger/impl/attach/JavaAttachDebuggerProvider.java
index 5f9093a72f89..82c6307b7e37 100644
--- a/java/debugger/impl/src/com/intellij/debugger/impl/attach/JavaAttachDebuggerProvider.java
+++ b/java/debugger/impl/src/com/intellij/debugger/impl/attach/JavaAttachDebuggerProvider.java
@@ -24,9 +24,12 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.rt.execution.application.AppMainV2;
import com.intellij.util.ArrayUtil;
import com.intellij.util.PathUtil;
+import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.execution.ParametersListUtil;
import com.intellij.util.ui.EmptyIcon;
import com.intellij.xdebugger.attach.*;
+import com.intellij.xdebugger.impl.ui.attach.dialog.AttachDialogProcessItem;
+import com.intellij.xdebugger.impl.ui.attach.dialog.extensions.XAttachDialogItemPresentationProvider;
import com.jetbrains.sa.SaJdwp;
import com.sun.tools.attach.AttachNotSupportedException;
import com.sun.tools.attach.VirtualMachine;
@@ -115,6 +118,10 @@ public class JavaAttachDebuggerProvider implements XAttachDebuggerProvider {
}
}
+ static boolean isJavaAttachDebugger(XAttachDebugger debugger) {
+ return debugger instanceof JavaLocalAttachDebugger;
+ }
+
@Override
public @NotNull XAttachPresentationGroup getPresentationGroup() {
return ourAttachGroup;
@@ -157,6 +164,10 @@ public class JavaAttachDebuggerProvider implements XAttachDebuggerProvider {
return info instanceof DebuggerLocalAttachInfo;
}
+ static @Nullable LocalAttachInfo getAttachInfo(@NotNull ProcessInfo info, @NotNull UserDataHolder dataHolder) {
+ return getAttachInfo(null, info.getPid(), info.getCommandLine(), dataHolder.getUserData(ADDRESS_MAP_KEY));
+ }
+
private static @Nullable LocalAttachInfo getAttachInfo(@Nullable Project project,
int pid,
String commandLine,
@@ -357,8 +368,8 @@ public class JavaAttachDebuggerProvider implements XAttachDebuggerProvider {
}
@Override
- String getProcessDisplayText(String text) {
- return text + " (" + myAddress + ")";
+ @Nullable @NlsSafe String getAddress() {
+ return myAddress;
}
}
@@ -436,9 +447,15 @@ public class JavaAttachDebuggerProvider implements XAttachDebuggerProvider {
abstract @NlsSafe String getDebuggerName();
- @NlsSafe
- String getProcessDisplayText(String text) {
- return text;
+ final @NlsSafe String getProcessDisplayText(String text) {
+ var extra = getAddress();
+ return StringUtil.isEmpty(extra)
+ ? text
+ : text + " (" + extra + ")";
+ }
+
+ @Nullable @NlsSafe String getAddress() {
+ return null;
}
}
@@ -541,3 +558,49 @@ public class JavaAttachDebuggerProvider implements XAttachDebuggerProvider {
ProgramRunnerUtil.executeConfiguration(runSettings, JavaAttachDebuggerProvider.ProcessAttachDebugExecutor.INSTANCE);
}
}
+
+class JavaAttachDialogItemPresentationProvider implements XAttachDialogItemPresentationProvider {
+
+ @Override
+ public boolean isApplicableFor(@NotNull AttachDialogProcessItem item) {
+ return ContainerUtil.exists(item.getDebuggers(), JavaAttachDebuggerProvider::isJavaAttachDebugger);
+ }
+
+ @Override
+ public int getPriority() {
+ // Almost arbitrary number.
+ return 5;
+ }
+
+ @Override
+ public @Nls @NotNull String getProcessExecutableText(@NotNull AttachDialogProcessItem item) {
+ String executable = XAttachDialogItemPresentationProvider.super.getProcessExecutableText(item);
+
+ JavaAttachDebuggerProvider.LocalAttachInfo attachInfo = JavaAttachDebuggerProvider.getAttachInfo(item.getProcessInfo(), item.getDataHolder());
+ if (attachInfo == null) return executable;
+
+ StringBuilder extra = new StringBuilder();
+ if ("java".equals(executable)) {
+ if (!StringUtil.isEmpty(attachInfo.myClass)) {
+ extra.append(attachInfo.myClass);
+ }
+ else {
+ var shouldBeClassName = ArrayUtil.getLastElement(item.getProcessInfo().getCommandLine().split(" "));
+ if (!StringUtil.isEmpty(shouldBeClassName)) {
+ extra.append(shouldBeClassName);
+ }
+ }
+ }
+ var address = attachInfo.getAddress();
+ if (!StringUtil.isEmpty(address)) {
+ if (!extra.isEmpty()) {
+ extra.append(", ");
+ }
+ extra.append(address);
+ }
+
+ return !extra.isEmpty()
+ ? executable + " (" + extra + ")"
+ : executable;
+ }
+}
\ No newline at end of file