on master help sign in
Add debug-adapter field to languages.toml
c5b210dDmitry Sharshakov
Cargo.lock+2
@@ -306,12 +306,14 @@ version = "0.4.1"
306dependencies = [
306dependencies = [
307 "arc-swap",
307 "arc-swap",
308 "etcetera",
308 "etcetera",
309+ "helix-dap",
309 "helix-syntax",
310 "helix-syntax",
310 "once_cell",
311 "once_cell",
311 "quickcheck",
312 "quickcheck",
312 "regex",
313 "regex",
313 "ropey",
314 "ropey",
314 "serde",
315 "serde",
316+ "serde_json",
315 "similar",
317 "similar",
316 "smallvec",
318 "smallvec",
317 "tendril",
319 "tendril",
helix-core/Cargo.toml+2
@@ -14,6 +14,7 @@ include = ["src/**/*", "README.md"]
14
14
15[dependencies]
15[dependencies]
16helix-syntax = { version = "0.4", path = "../helix-syntax" }
16helix-syntax = { version = "0.4", path = "../helix-syntax" }
17+helix-dap = { version = "0.4", path = "../helix-dap" }
17
18
18ropey = "1.3"
19ropey = "1.3"
19smallvec = "1.4"
20smallvec = "1.4"
@@ -28,6 +29,7 @@ arc-swap = "1"
28regex = "1"
29regex = "1"
29
30
30serde = { version = "1.0", features = ["derive"] }
31serde = { version = "1.0", features = ["derive"] }
32+serde_json = "1.0"
31toml = "0.5"
33toml = "0.5"
32
34
33similar = "1.3"
35similar = "1.3"
helix-core/src/syntax.rs+3
@@ -5,6 +5,7 @@ use crate::{
5 Rope, RopeSlice, Tendril,
5 Rope, RopeSlice, Tendril,
6};
6};
7
7
8+use helix_dap::DebugAdapterConfig;
8pub use helix_syntax::get_language;
9pub use helix_syntax::get_language;
9
10
10use arc_swap::ArcSwap;
11use arc_swap::ArcSwap;
@@ -55,6 +56,8 @@ pub struct LanguageConfiguration {
55
56
56 #[serde(skip)]
57 #[serde(skip)]
57 pub(crate) indent_query: OnceCell<Option<IndentQuery>>,
58 pub(crate) indent_query: OnceCell<Option<IndentQuery>>,
59+ #[serde(skip_serializing_if = "Option::is_none")]
60+ pub debug_adapter: Option<DebugAdapterConfig>,
58}
61}
59
62
60#[derive(Debug, Serialize, Deserialize)]
63#[derive(Debug, Serialize, Deserialize)]
helix-dap/src/client.rs+4−6
@@ -113,16 +113,14 @@ impl Client {
113 }
113 }
114
114
115 pub async fn tcp_process(
115 pub async fn tcp_process(
116− cmd: &str,
116+ config: DebugAdapterConfig,
117− args: Vec<&str>,
118− port_format: &str,
119 id: usize,
117 id: usize,
120 ) -> Result<(Self, UnboundedReceiver<Payload>)> {
118 ) -> Result<(Self, UnboundedReceiver<Payload>)> {
121 let port = Self::get_port().await.unwrap();
119 let port = Self::get_port().await.unwrap();
122
120
123− let process = Command::new(cmd)
121+ let process = Command::new(config.command)
124− .args(args)
122+ .args(config.args)
125− .args(port_format.replace("{}", &port.to_string()).split(' '))
123+ .args(config.port_arg.replace("{}", &port.to_string()).split(' '))
126 // silence messages
124 // silence messages
127 .stdin(Stdio::null())
125 .stdin(Stdio::null())
128 .stdout(Stdio::null())
126 .stdout(Stdio::null())
helix-dap/src/types.rs+8
@@ -2,6 +2,14 @@ use serde::{Deserialize, Serialize};
2use serde_json::Value;
2use serde_json::Value;
3use std::path::PathBuf;
3use std::path::PathBuf;
4
4
5+#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
6+#[serde(rename_all = "kebab-case")]
7+pub struct DebugAdapterConfig {
8+ pub command: String,
9+ pub args: Vec<String>,
10+ pub port_arg: String,
11+}
12+
5pub trait Request {
13pub trait Request {
6 type Arguments: serde::de::DeserializeOwned + serde::Serialize;
14 type Arguments: serde::de::DeserializeOwned + serde::Serialize;
7 type Result: serde::de::DeserializeOwned + serde::Serialize;
15 type Result: serde::de::DeserializeOwned + serde::Serialize;
helix-term/src/commands.rs+25−4
@@ -4336,12 +4336,33 @@ fn dap_start(cx: &mut Context) {
4336 use helix_lsp::block_on;
4336 use helix_lsp::block_on;
4337 use serde_json::to_value;
4337 use serde_json::to_value;
4338
4338
4339− let (_, _doc) = current!(cx.editor);
4339+ let (_, doc) = current!(cx.editor);
4340
4340
4341− // look up config for filetype
4341+ // TODO config picker
4342− // if multiple available, open picker
4342+ let path = match doc.path() {
4343+ Some(path) => path.to_path_buf(),
4344+ None => {
4345+ cx.editor
4346+ .set_error("Can't start debug: document has no path".to_string());
4347+ return;
4348+ }
4349+ };
4343
4350
4351+ let config = cx
4352+ .editor
4353+ .syn_loader
4354+ .language_config_for_file_name(&path)
4355+ .and_then(|x| x.debug_adapter.clone());
4356+ let config = match config {
4357+ Some(c) => c,
4358+ None => {
4359+ cx.editor.set_error(
4360+ "Can't start debug: no debug adapter available for language".to_string(),
4361+ );
4362+ return;
4363+ }
4364+ };
4344− let started = Client::tcp_process("dlv", vec!["dap"], "-l 127.0.0.1:{}", 0);
4365+ let started = Client::tcp_process(config, 0);
4345 let (mut debugger, events) = block_on(started).unwrap();
4366 let (mut debugger, events) = block_on(started).unwrap();
4346
4367
4347 let request = debugger.initialize("go".to_owned());
4368 let request = debugger.initialize("go".to_owned());
languages.toml+1
@@ -93,6 +93,7 @@ comment-token = "//"
93language-server = { command = "gopls" }
93language-server = { command = "gopls" }
94# TODO: gopls needs utf-8 offsets?
94# TODO: gopls needs utf-8 offsets?
95indent = { tab-width = 4, unit = "\t" }
95indent = { tab-width = 4, unit = "\t" }
96+debug-adapter = { command = "dlv", args = ["dap"], port-arg = "-l 127.0.0.1:{}" }
96
97
97[[language]]
98[[language]]
98name = "javascript"
99name = "javascript"