debugger: Use integrated terminal for Python (#31190)

Piotr Osiewicz created

Closes #ISSUE

Release Notes:

- debugger: Use integrated terminal for Python, allowing one to interact
with standard input/output when debugging Python projects.

Change summary

Cargo.lock                        | 13 +++++++++++++
Cargo.toml                        |  1 +
crates/dap_adapters/Cargo.toml    |  1 +
crates/dap_adapters/src/python.rs | 12 +++++++++++-
4 files changed, 26 insertions(+), 1 deletion(-)

Detailed changes

Cargo.lock 🔗

@@ -4054,6 +4054,7 @@ dependencies = [
  "dap",
  "futures 0.3.31",
  "gpui",
+ "json_dotpath",
  "language",
  "paths",
  "serde",
@@ -8550,6 +8551,18 @@ dependencies = [
  "wasm-bindgen",
 ]
 
+[[package]]
+name = "json_dotpath"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbdcfef3cf5591f0cef62da413ae795e3d1f5a00936ccec0b2071499a32efd1a"
+dependencies = [
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "thiserror 1.0.69",
+]
+
 [[package]]
 name = "jsonschema"
 version = "0.30.0"

Cargo.toml 🔗

@@ -462,6 +462,7 @@ indoc = "2"
 inventory = "0.3.19"
 itertools = "0.14.0"
 jj-lib = { git = "https://github.com/jj-vcs/jj", rev = "e18eb8e05efaa153fad5ef46576af145bba1807f" }
+json_dotpath = "1.1"
 jsonschema = "0.30.0"
 jsonwebtoken = "9.3"
 jupyter-protocol = { git = "https://github.com/ConradIrwin/runtimed", rev = "7130c804216b6914355d15d0b91ea91f6babd734" }

crates/dap_adapters/Cargo.toml 🔗

@@ -26,6 +26,7 @@ async-trait.workspace = true
 dap.workspace = true
 futures.workspace = true
 gpui.workspace = true
+json_dotpath.workspace = true
 language.workspace = true
 paths.workspace = true
 serde.workspace = true

crates/dap_adapters/src/python.rs 🔗

@@ -5,7 +5,9 @@ use dap::{
     adapters::DebugTaskDefinition,
 };
 use gpui::{AsyncApp, SharedString};
+use json_dotpath::DotPaths;
 use language::LanguageName;
+use serde_json::Value;
 use std::{collections::HashMap, ffi::OsStr, path::PathBuf, sync::OnceLock};
 use util::ResultExt;
 
@@ -26,8 +28,16 @@ impl PythonDebugAdapter {
     ) -> Result<StartDebuggingRequestArguments> {
         let request = self.validate_config(&task_definition.config)?;
 
+        let mut configuration = task_definition.config.clone();
+        if let Ok(console) = configuration.dot_get_mut("console") {
+            // Use built-in Zed terminal if user did not explicitly provide a setting for console.
+            if console.is_null() {
+                *console = Value::String("integratedTerminal".into());
+            }
+        }
+
         Ok(StartDebuggingRequestArguments {
-            configuration: task_definition.config.clone(),
+            configuration,
             request,
         })
     }