From 839d2105739036decf045f6af85ce05152f514ef Mon Sep 17 00:00:00 2001 From: Dmitry Sharshakov Date: Mon, 23 Aug 2021 17:18:03 +0300 Subject: [PATCH] Enable stdio transport via config --- helix-dap/src/client.rs | 40 +++++++++++++++++++++++++++++++++----- helix-dap/src/types.rs | 3 ++- helix-term/src/commands.rs | 2 +- languages.toml | 2 +- 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/helix-dap/src/client.rs b/helix-dap/src/client.rs index 79c65cf7..9a2e3920 100644 --- a/helix-dap/src/client.rs +++ b/helix-dap/src/client.rs @@ -1,8 +1,9 @@ use crate::{ transport::{Payload, Request, Transport}, types::*, - Result, + Error, Result, }; +use anyhow::anyhow; pub use log::{error, info}; use std::{ collections::HashMap, @@ -35,6 +36,33 @@ pub struct Client { } impl Client { + // Spawn a process and communicate with it by either TCP or stdio + pub async fn process( + cfg: DebugAdapterConfig, + id: usize, + ) -> Result<(Self, UnboundedReceiver)> { + if cfg.transport == "tcp" && cfg.port_arg.is_some() { + Self::tcp_process( + &cfg.command, + cfg.args.iter().map(|s| s.as_str()).collect(), + &cfg.port_arg.unwrap(), + id, + ) + .await + } else if cfg.transport == "stdio" { + Self::stdio( + &cfg.command, + cfg.args.iter().map(|s| s.as_str()).collect(), + id, + ) + } else { + Result::Err(Error::Other(anyhow!( + "Incorrect transport {}", + cfg.transport + ))) + } + } + pub fn streams( rx: Box, tx: Box, @@ -113,14 +141,16 @@ impl Client { } pub async fn tcp_process( - config: DebugAdapterConfig, + cmd: &str, + args: Vec<&str>, + port_format: &str, id: usize, ) -> Result<(Self, UnboundedReceiver)> { let port = Self::get_port().await.unwrap(); - let process = Command::new(config.command) - .args(config.args) - .args(config.port_arg.replace("{}", &port.to_string()).split(' ')) + let process = Command::new(cmd) + .args(args) + .args(port_format.replace("{}", &port.to_string()).split(' ')) // silence messages .stdin(Stdio::null()) .stdout(Stdio::null()) diff --git a/helix-dap/src/types.rs b/helix-dap/src/types.rs index 152996a1..a31bc1d1 100644 --- a/helix-dap/src/types.rs +++ b/helix-dap/src/types.rs @@ -5,9 +5,10 @@ use std::path::PathBuf; #[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] #[serde(rename_all = "kebab-case")] pub struct DebugAdapterConfig { + pub transport: String, pub command: String, pub args: Vec, - pub port_arg: String, + pub port_arg: Option, } pub trait Request { diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 9ecc5bfe..749b8820 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -4362,7 +4362,7 @@ fn dap_start(cx: &mut Context) { return; } }; - let started = Client::tcp_process(config, 0); + let started = Client::process(config, 0); let (mut debugger, events) = block_on(started).unwrap(); let request = debugger.initialize("go".to_owned()); diff --git a/languages.toml b/languages.toml index 00d81b50..95d0b177 100644 --- a/languages.toml +++ b/languages.toml @@ -93,7 +93,7 @@ comment-token = "//" language-server = { command = "gopls" } # TODO: gopls needs utf-8 offsets? indent = { tab-width = 4, unit = "\t" } -debug-adapter = { command = "dlv", args = ["dap"], port-arg = "-l 127.0.0.1:{}" } +debug-adapter = { transport = "tcp", command = "dlv", args = ["dap"], port-arg = "-l 127.0.0.1:{}" } [[language.debug-configs]] request = "launch"