diff --git a/java/debugger/impl/resources/META-INF/java-debugger.xml b/java/debugger/impl/resources/META-INF/java-debugger.xml
index 45f3c5279d1b..3fa283e22f3b 100644
--- a/java/debugger/impl/resources/META-INF/java-debugger.xml
+++ b/java/debugger/impl/resources/META-INF/java-debugger.xml
@@ -178,6 +178,10 @@
+
+
diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/MethodInvokeUtils.kt b/java/debugger/impl/src/com/intellij/debugger/engine/MethodInvokeUtils.kt
index 867313811224..e3ca0dc2afed 100644
--- a/java/debugger/impl/src/com/intellij/debugger/engine/MethodInvokeUtils.kt
+++ b/java/debugger/impl/src/com/intellij/debugger/engine/MethodInvokeUtils.kt
@@ -14,6 +14,7 @@ import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.diagnostic.Attachment
import com.intellij.openapi.diagnostic.RuntimeExceptionWithAttachments
import com.intellij.openapi.diagnostic.logger
+import com.intellij.openapi.util.Key
import com.intellij.openapi.util.registry.Registry
import com.intellij.psi.CommonClassNames
import com.intellij.rt.debugger.MethodInvoker
@@ -25,6 +26,9 @@ import org.jetbrains.annotations.ApiStatus
@ApiStatus.Internal
object MethodInvokeUtils {
+ @JvmStatic
+ internal val INVOKE_WITH_HELPER_KEY: Key = Key("invoke.with.helper")
+
fun getHelperExceptionStackTrace(evaluationContext: EvaluationContextImpl, e: Exception): String? {
if (e !is EvaluateException) return null
val exceptionFromTargetVM = e.exceptionFromTargetVM ?: return null
@@ -83,8 +87,10 @@ internal fun tryInvokeWithHelper(
invocationOptions: Int,
internalEvaluate: Boolean,
): InvocationResult {
+ val useHelper = Registry.get("debugger.evaluate.method.helper").selectedOption
if (internalEvaluate ||
- !Registry.`is`("debugger.evaluate.method.helper") ||
+ ("auto" == useHelper && evaluationContext.getUserData(MethodInvokeUtils.INVOKE_WITH_HELPER_KEY) != true) ||
+ "off" == useHelper ||
isSet(invocationOptions, INVOKE_NONVIRTUAL) || //TODO: support
isPrimitiveType(method.returnTypeName()) ||
(isVoid(method) && !method.isConstructor) ||
diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java
index 4338e30399a3..3fb3f2cc9cdf 100644
--- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java
+++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java
@@ -1450,7 +1450,6 @@ public final class EvaluatorBuilderImpl implements EvaluatorBuilder {
PsiElement qualifier = expression.getQualifier();
PsiType interfaceType = expression.getFunctionalInterfaceType();
if (!Registry.is("debugger.compiling.evaluator.method.refs") &&
- !Registry.is("debugger.evaluate.method.helper") &&
interfaceType != null &&
qualifier != null) {
String code = null;
diff --git a/platform/testFramework/src/com/intellij/testFramework/UsefulTestCase.java b/platform/testFramework/src/com/intellij/testFramework/UsefulTestCase.java
index 50f31ac75d7b..cda74d60ccde 100644
--- a/platform/testFramework/src/com/intellij/testFramework/UsefulTestCase.java
+++ b/platform/testFramework/src/com/intellij/testFramework/UsefulTestCase.java
@@ -1,4 +1,4 @@
-// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.testFramework;
import com.intellij.codeInsight.CodeInsightSettings;
@@ -17,6 +17,7 @@ import com.intellij.openapi.util.JDOMUtil;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.io.FileUtilRt;
import com.intellij.openapi.util.registry.Registry;
+import com.intellij.openapi.util.registry.RegistryValue;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.util.text.Strings;
import com.intellij.openapi.vfs.LocalFileSystem;
@@ -1239,8 +1240,14 @@ Most likely there was an uncaught exception in asynchronous execution that resul
}
protected void setRegistryPropertyForTest(@NotNull String property, @SuppressWarnings("SameParameterValue") @NotNull String value) {
- Registry.get(property).setValue(value);
- Disposer.register(getTestRootDisposable(), () -> Registry.get(property).resetToDefault());
+ RegistryValue registryValue = Registry.get(property);
+ if (registryValue.isMultiValue()) {
+ registryValue.setSelectedOption(value);
+ }
+ else {
+ registryValue.setValue(value);
+ }
+ Disposer.register(getTestRootDisposable(), () -> registryValue.resetToDefault());
}
protected void allowAccessToDirsIfExists(@NotNull String @NotNull ... dirNames) {
diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties
index af2f68fa0500..3341d1a0d5e6 100644
--- a/platform/util/resources/misc/registry.properties
+++ b/platform/util/resources/misc/registry.properties
@@ -660,8 +660,6 @@ debugger.attach.to.process.action=false
debugger.sa.jdwp.debug=false
debugger.add.rt.jar=true
debugger.add.rt.jar.description=Add rt.jar to the classpath
-debugger.evaluate.method.helper=false
-debugger.evaluate.method.helper.description=Use helper to invoke methods avoiding the immediate return value collection
debugger.evaluate.single.threaded.timeout=1000
debugger.evaluate.single.threaded.timeout.description=Number of milliseconds to evaluate resuming only the current thread, then resume all threads
debugger.evaluate.load.helper.in.separate.classloader=false
diff --git a/plugins/stream-debugger/test/com/intellij/debugger/streams/exec/EvaluationFailedTest.java b/plugins/stream-debugger/test/com/intellij/debugger/streams/exec/EvaluationFailedTest.java
index abc7e073bfee..fade1a3a1ffd 100644
--- a/plugins/stream-debugger/test/com/intellij/debugger/streams/exec/EvaluationFailedTest.java
+++ b/plugins/stream-debugger/test/com/intellij/debugger/streams/exec/EvaluationFailedTest.java
@@ -27,13 +27,13 @@ import static org.junit.Assume.assumeTrue;
public class EvaluationFailedTest extends FailEvaluationTestCase {
@Test
public void testEvaluationExceptionDetected() {
- assumeFalse(Registry.is("debugger.evaluate.method.helper"));
+ assumeTrue("off".equals(Registry.get("debugger.evaluate.method.helper").getSelectedOption()));
doTest(true, "EvaluationExceptionDetected");
}
@Test
public void testEvaluationExceptionDetectedHelper() {
- assumeTrue(Registry.is("debugger.evaluate.method.helper"));
+ assumeTrue("always".equals(Registry.get("debugger.evaluate.method.helper").getSelectedOption()));
doTest(true, "EvaluationExceptionDetected");
}