diff --git a/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/PyIdeCommonOptionsForm.java b/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/PyIdeCommonOptionsForm.java index 2ee1c4f92c0e..ac65356408a2 100644 --- a/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/PyIdeCommonOptionsForm.java +++ b/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/PyIdeCommonOptionsForm.java @@ -1,6 +1,7 @@ // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.pycharm.community.ide.impl; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; @@ -15,6 +16,7 @@ import com.intellij.ui.CollectionComboBoxModel; import com.intellij.util.PathMappingSettings; import com.jetbrains.python.PyBundle; import com.jetbrains.python.configuration.PyConfigurableInterpreterList; +import com.jetbrains.python.psi.impl.PyPsiUtils; import com.jetbrains.python.run.AbstractPyCommonOptionsForm; import com.jetbrains.python.run.PyCommonOptionsFormData; import com.jetbrains.python.sdk.PySdkListCellRenderer; @@ -46,6 +48,7 @@ public class PyIdeCommonOptionsForm implements AbstractPyCommonOptionsForm { private final List> myRemoteInterpreterModeListeners = new ArrayList<>(); + private static final Logger LOG = Logger.getInstance(PyIdeCommonOptionsForm.class); public PyIdeCommonOptionsForm(PyCommonOptionsFormData data) { myProject = data.getProject(); @@ -269,6 +272,16 @@ public class PyIdeCommonOptionsForm implements AbstractPyCommonOptionsForm { content.addSourceRootsCheckbox.setSelected(flag); } + @Override + public boolean shouldDebugJustMyCode() { + return false; + } + + @Override + public void setDebugJustMyCode(boolean flag) { + LOG.warn("Tried to set debugJustMyCode flag for common options form, which is an unsupported operation"); + } + private void setRemoteInterpreterMode(boolean isInterpreterRemote) { myInterpreterRemote = isInterpreterRemote; } diff --git a/python/pluginCore/impl/src/com/intellij/python/community/plugin/impl/run/PyPluginCommonOptionsForm.java b/python/pluginCore/impl/src/com/intellij/python/community/plugin/impl/run/PyPluginCommonOptionsForm.java index 792f4a39ff7b..481cac3d3486 100644 --- a/python/pluginCore/impl/src/com/intellij/python/community/plugin/impl/run/PyPluginCommonOptionsForm.java +++ b/python/pluginCore/impl/src/com/intellij/python/community/plugin/impl/run/PyPluginCommonOptionsForm.java @@ -1,6 +1,7 @@ // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.python.community.plugin.impl.run; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; @@ -40,6 +41,8 @@ public class PyPluginCommonOptionsForm implements AbstractPyCommonOptionsForm { private final List> myRemoteInterpreterModeListeners = new ArrayList<>(); + private static final Logger LOG = Logger.getInstance(PyPluginCommonOptionsForm.class); + public PyPluginCommonOptionsForm(PyCommonOptionsFormData data) { // setting modules myProject = data.getProject(); @@ -278,6 +281,16 @@ public class PyPluginCommonOptionsForm implements AbstractPyCommonOptionsForm { content.addSourceRootsCheckbox.setSelected(flag); } + @Override + public void setDebugJustMyCode(boolean flag) { + LOG.warn("Tried to set debugJustMyCode flag for common options form, which is an unsupported operation"); + } + + @Override + public boolean shouldDebugJustMyCode() { + return false; + } + @Override public @NotNull List getEnvFilePaths() { return myEnvPaths; diff --git a/python/pluginResources/messages/PyBundle.properties b/python/pluginResources/messages/PyBundle.properties index 572225be1e72..0f947f5a8cd8 100644 --- a/python/pluginResources/messages/PyBundle.properties +++ b/python/pluginResources/messages/PyBundle.properties @@ -1251,6 +1251,8 @@ python.debugger.settings.waiting.for.connection=Waiting for connection\u2026 python.debugger.settings.connecting.to.debugger=Connecting to debugger python.debugger.attaching.to.process.with.pid=Attaching to a process with PID={0} python.debugger.attaching=Attaching Debugger +python.debugger.configuration.group=Debug +python.debugger.configuration.justMyCode.label=Debug just my code python.rename.processor.override.message=Method {0} of class {1}\noverrides method of class {2}.\nDo you want to rename the base method? python.rename.processor.property=Do you want to rename the property ''{0}'' instead of its accessor function ''{1}''? python.configuration.choose.target.to.run=Choose the target to run diff --git a/python/src/com/jetbrains/python/console/PyConsoleOptions.java b/python/src/com/jetbrains/python/console/PyConsoleOptions.java index 23ef8dcd78f8..4cd0305cfee1 100644 --- a/python/src/com/jetbrains/python/console/PyConsoleOptions.java +++ b/python/src/com/jetbrains/python/console/PyConsoleOptions.java @@ -22,6 +22,7 @@ import com.jetbrains.python.console.actions.CommandQueueForPythonConsoleService; import com.jetbrains.python.run.AbstractPyCommonOptionsForm; import com.jetbrains.python.run.AbstractPythonRunConfigurationParams; import com.jetbrains.python.run.PythonRunParams; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -144,6 +145,7 @@ public class PyConsoleOptions implements PersistentStateComponent getEnvFilePaths() { return myEnvFiles; diff --git a/python/src/com/jetbrains/python/run/AbstractPythonRunConfiguration.java b/python/src/com/jetbrains/python/run/AbstractPythonRunConfiguration.java index a277d6d00155..08b1bb303737 100644 --- a/python/src/com/jetbrains/python/run/AbstractPythonRunConfiguration.java +++ b/python/src/com/jetbrains/python/run/AbstractPythonRunConfiguration.java @@ -64,6 +64,7 @@ public abstract class AbstractPythonRunConfiguration diff --git a/python/src/com/jetbrains/python/run/PythonRunParams.java b/python/src/com/jetbrains/python/run/PythonRunParams.java index a401efec78e2..855124e395a1 100644 --- a/python/src/com/jetbrains/python/run/PythonRunParams.java +++ b/python/src/com/jetbrains/python/run/PythonRunParams.java @@ -5,6 +5,7 @@ import com.intellij.execution.EnvFilesOptions; import com.intellij.openapi.module.Module; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.util.PathMappingSettings; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.Map; @@ -69,4 +70,10 @@ public interface PythonRunParams extends EnvFilesOptions { void setAddContentRoots(boolean flag); void setAddSourceRoots(boolean flag); + + @ApiStatus.Internal + void setDebugJustMyCode(boolean flag); + + @ApiStatus.Internal + boolean shouldDebugJustMyCode(); } diff --git a/python/src/com/jetbrains/python/run/configuration/AbstractPythonConfigurationFragmentedEditor.kt b/python/src/com/jetbrains/python/run/configuration/AbstractPythonConfigurationFragmentedEditor.kt index 87992445186e..ed9227d6e825 100644 --- a/python/src/com/jetbrains/python/run/configuration/AbstractPythonConfigurationFragmentedEditor.kt +++ b/python/src/com/jetbrains/python/run/configuration/AbstractPythonConfigurationFragmentedEditor.kt @@ -38,6 +38,8 @@ abstract class AbstractPythonConfigurationFragmentedEditor> addDebuggerOptions(fragments: MutableList>) { + val justMyCodeElement = SettingsEditorFragment.createTag( + "justMyCode", + PyBundle.message("python.debugger.configuration.justMyCode.label"), + PyBundle.message("python.debugger.configuration.group"), + { runConfiguration.shouldDebugJustMyCode() }, + { config, value -> config.setDebugJustMyCode(value) } + ) + justMyCodeElement.isSelected = runConfiguration.shouldDebugJustMyCode() + fragments.add(justMyCodeElement) + } + private fun > addContentSourceRoots(fragments: MutableList>) { val addContentRoots = SettingsEditorFragment.createTag( "py.add.content.roots", diff --git a/python/src/com/jetbrains/python/sdk/uv/run/UvRunConfiguration.kt b/python/src/com/jetbrains/python/sdk/uv/run/UvRunConfiguration.kt index 692de4d6fdfe..7af1587b5b55 100644 --- a/python/src/com/jetbrains/python/sdk/uv/run/UvRunConfiguration.kt +++ b/python/src/com/jetbrains/python/sdk/uv/run/UvRunConfiguration.kt @@ -38,7 +38,8 @@ data class UvRunConfigurationOptions( var env: Map = mapOf(), var checkSync: Boolean = true, var uvSdkKey: String? = null, - var uvArgs: List = listOf() + var uvArgs: List = listOf(), + var debugJustMyCode: Boolean = false ) { val uvSdk: Sdk? get() = uvSdkKey?.let { PythonSdkUtil.findSdkByKey(it)} @@ -82,6 +83,10 @@ class UvRunConfiguration( override fun getSdk(): Sdk? { return options.uvSdk } + + override fun shouldDebugJustMyCode(): Boolean { + return options.debugJustMyCode + } } @ApiStatus.Internal diff --git a/python/src/com/jetbrains/python/sdk/uv/run/UvRunSettingsEditor.kt b/python/src/com/jetbrains/python/sdk/uv/run/UvRunSettingsEditor.kt index 0a048934bf08..18fc73631a99 100644 --- a/python/src/com/jetbrains/python/sdk/uv/run/UvRunSettingsEditor.kt +++ b/python/src/com/jetbrains/python/sdk/uv/run/UvRunSettingsEditor.kt @@ -46,6 +46,8 @@ internal class UvRunSettingsEditor() : SettingsEditor() { private lateinit var uvSdkField: ComboBox private val uvArgsField: RawCommandLineEditor = RawCommandLineEditor().withMonospaced(true) + private lateinit var debugJustMyCodeCheckbox: JBCheckBox + private val propertyGraph = PropertyGraph() private val isScript = propertyGraph.property(true) private val isModule = propertyGraph.property(false) @@ -127,6 +129,10 @@ internal class UvRunSettingsEditor() : SettingsEditor() { cell(uvArgsField) .align(AlignX.FILL) } + row { + debugJustMyCodeCheckbox = checkBox(PyBundle.message("python.debugger.configuration.justMyCode.label")) + .component + } } } @@ -138,6 +144,7 @@ internal class UvRunSettingsEditor() : SettingsEditor() { scriptCheckSyncField.isSelected = uvRunConfiguration.options.checkSync uvSdkField.selectedItem = uvRunConfiguration.options.uvSdk uvArgsField.text = uvRunConfiguration.options.uvArgs.joinToString(" ") + debugJustMyCodeCheckbox.isSelected = uvRunConfiguration.options.debugJustMyCode } override fun applyEditorTo(uvRunConfiguration: UvRunConfiguration) { @@ -153,6 +160,7 @@ internal class UvRunSettingsEditor() : SettingsEditor() { uvRunConfiguration.options.checkSync = scriptCheckSyncField.isSelected uvRunConfiguration.options.uvSdkKey = uvSdkField.selectedItem.let {it as? Sdk}?.name uvRunConfiguration.options.uvArgs = uvArgsField.text.splitParams() + uvRunConfiguration.options.debugJustMyCode = debugJustMyCodeCheckbox.isSelected } override fun createEditor(): JComponent = panel