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"); }