A simple CPU rendered GUI IDE experience.
Diffstat (limited to 'src/edi/lsp_mn.rs')
| -rw-r--r-- | src/edi/lsp_mn.rs | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/edi/lsp_mn.rs b/src/edi/lsp_mn.rs new file mode 100644 index 0000000..6c76bdc --- /dev/null +++ b/src/edi/lsp_mn.rs @@ -0,0 +1,100 @@ +use std::collections::HashMap; +use std::io::BufReader; +use std::path::PathBuf; +use std::process::Stdio; +use std::sync::Arc; + +use log::info; +use lsp_server::{Connection, IoThreads}; +use lsp_types::*; +use tokio::sync::oneshot::Sender; +use tree_house::Language; +use winit::window::Window; + +struct LSP4 { + four: HashMap<(Language, PathBuf), &'static Client>, +} + +struct Loaded { + iot: Option<IoThreads>, + +} +use crate::lsp::Client; +pub fn load( + workspace: &PathBuf, + l: Language, + vsc: Option<serde_json::Value>, +) -> Option<( + Arc<Client>, + std::thread::JoinHandle<()>, + Option<Sender<Arc<dyn Window + 'static>>>, +)> { + let l = super::LOADER.language(l).config(); + let (Connection { sender, receiver }, conf,iot) = if l.language_id + == "rust" + { + let (_jh, a) = super::ra::ra(workspace.clone()); + ( + a, + ( + &super::LOADER.language_server_configs()["rust-analyzer"], + &l.language_servers[0], + ), + None + ) + } else { + let (mut c, conf) = l + .language_servers + .iter() + .find_map(|l| { + let lc = super::LOADER + .language_server_configs() + .get(&l.name)?; + std::process::Command::new(&lc.command) + .args(&lc.args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::inherit()) + .spawn() + .ok() + .zip(Some((lc, l))) + }) + .ok_or_else(|| { + log::error!( + "no lsp for this language; install one of {:?}", + l.language_servers + ) + }) + .ok()?; + + let (x, iot) = Connection::stdio( + BufReader::new(c.stdout.take().unwrap()), + c.stdin.take().unwrap(), + ); + (x, conf, Some(iot)) + }; + info!("spawned {conf:?}"); + let (c, t2, changed) = crate::lsp::run( + (sender, receiver), + WorkspaceFolder { + uri: Url::from_file_path(&workspace).unwrap(), + name: workspace + .file_name() + .unwrap() + .to_string_lossy() + .into_owned(), + }, + vsc.and_then(|x| x.as_object()?.get(&conf.1.name).cloned()), + conf, + ) + .unwrap(); + Some((Arc::new(c), (t2), Some(changed))) +} + +fn rah() { +let stdout = 4; +super let x =( + &stdout, + + ); +}
\ No newline at end of file |