aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdwin Cheng <[email protected]>2020-04-16 14:13:57 +0100
committerEdwin Cheng <[email protected]>2020-04-16 14:13:57 +0100
commit177becea98bddcd995a2abec59c6b60bac6b5a2b (patch)
tree64b7ecca11b93b71aab3e2fc0648d70aa012ee8b
parentca7dc69a8e87883c6a0c9df88c936fa2a4658c7b (diff)
Add proc-macro cli command for rust-analyzer
-rw-r--r--.github/workflows/ci.yaml6
-rw-r--r--Cargo.lock1
-rw-r--r--crates/ra_proc_macro/src/lib.rs7
-rw-r--r--crates/ra_proc_macro/src/process.rs8
-rw-r--r--crates/ra_proc_macro_srv/src/cli.rs (renamed from crates/ra_proc_macro_srv/src/main.rs)5
-rw-r--r--crates/ra_proc_macro_srv/src/lib.rs6
-rw-r--r--crates/rust-analyzer/Cargo.toml2
-rw-r--r--crates/rust-analyzer/src/bin/args.rs2
-rw-r--r--crates/rust-analyzer/src/bin/main.rs6
-rw-r--r--crates/rust-analyzer/src/cli/load_cargo.rs5
-rw-r--r--crates/rust-analyzer/src/config.rs8
-rw-r--r--crates/rust-analyzer/src/world.rs6
-rw-r--r--crates/rust-analyzer/tests/heavy_tests/main.rs6
-rw-r--r--editors/code/package.json5
14 files changed, 47 insertions, 26 deletions
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 13a11c95b..9068064f7 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -85,9 +85,9 @@ jobs:
85 - name: Compile 85 - name: Compile
86 run: cargo test --no-run 86 run: cargo test --no-run
87 87
88 # We have to build ra_proc_macro_srv first for running related heavy tests 88 # We have to build rust-analyzer first for running related heavy tests
89 - name: Build ra_proc_macro_srv 89 - name: Build rust-analyzer
90 run: cargo build -p ra_proc_macro_srv 90 run: cargo build -p rust-analyzer
91 91
92 - name: Test 92 - name: Test
93 run: cargo test 93 run: cargo test
diff --git a/Cargo.lock b/Cargo.lock
index 01fa64e6f..8e204d39f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1341,6 +1341,7 @@ dependencies = [
1341 "ra_hir_def", 1341 "ra_hir_def",
1342 "ra_hir_ty", 1342 "ra_hir_ty",
1343 "ra_ide", 1343 "ra_ide",
1344 "ra_proc_macro_srv",
1344 "ra_prof", 1345 "ra_prof",
1345 "ra_project_model", 1346 "ra_project_model",
1346 "ra_syntax", 1347 "ra_syntax",
diff --git a/crates/ra_proc_macro/src/lib.rs b/crates/ra_proc_macro/src/lib.rs
index 63da9f1b4..14a675db2 100644
--- a/crates/ra_proc_macro/src/lib.rs
+++ b/crates/ra_proc_macro/src/lib.rs
@@ -56,8 +56,11 @@ pub struct ProcMacroClient {
56} 56}
57 57
58impl ProcMacroClient { 58impl ProcMacroClient {
59 pub fn extern_process(process_path: &Path) -> Result<ProcMacroClient, std::io::Error> { 59 pub fn extern_process<T: AsRef<str>>(
60 let (thread, process) = ProcMacroProcessSrv::run(process_path)?; 60 process_path: &Path,
61 args: &[T],
62 ) -> Result<ProcMacroClient, std::io::Error> {
63 let (thread, process) = ProcMacroProcessSrv::run(process_path, args)?;
61 Ok(ProcMacroClient { 64 Ok(ProcMacroClient {
62 kind: ProcMacroClientKind::Process { process: Arc::new(process), thread }, 65 kind: ProcMacroClientKind::Process { process: Arc::new(process), thread },
63 }) 66 })
diff --git a/crates/ra_proc_macro/src/process.rs b/crates/ra_proc_macro/src/process.rs
index e8c85be38..b5e8493ac 100644
--- a/crates/ra_proc_macro/src/process.rs
+++ b/crates/ra_proc_macro/src/process.rs
@@ -44,8 +44,9 @@ impl Drop for Process {
44} 44}
45 45
46impl Process { 46impl Process {
47 fn run(process_path: &Path) -> Result<Process, io::Error> { 47 fn run<T: AsRef<str>>(process_path: &Path, args: &[T]) -> Result<Process, io::Error> {
48 let child = Command::new(process_path.clone()) 48 let child = Command::new(process_path.clone())
49 .args(args.iter().map(|it| it.as_ref()))
49 .stdin(Stdio::piped()) 50 .stdin(Stdio::piped())
50 .stdout(Stdio::piped()) 51 .stdout(Stdio::piped())
51 .stderr(Stdio::null()) 52 .stderr(Stdio::null())
@@ -74,10 +75,11 @@ impl Process {
74} 75}
75 76
76impl ProcMacroProcessSrv { 77impl ProcMacroProcessSrv {
77 pub fn run( 78 pub fn run<T: AsRef<str>>(
78 process_path: &Path, 79 process_path: &Path,
80 args: &[T],
79 ) -> Result<(ProcMacroProcessThread, ProcMacroProcessSrv), io::Error> { 81 ) -> Result<(ProcMacroProcessThread, ProcMacroProcessSrv), io::Error> {
80 let process = Process::run(process_path)?; 82 let process = Process::run(process_path, args)?;
81 83
82 let (task_tx, task_rx) = bounded(0); 84 let (task_tx, task_rx) = bounded(0);
83 let handle = jod_thread::spawn(move || { 85 let handle = jod_thread::spawn(move || {
diff --git a/crates/ra_proc_macro_srv/src/main.rs b/crates/ra_proc_macro_srv/src/cli.rs
index 70743c1f4..c771f2b38 100644
--- a/crates/ra_proc_macro_srv/src/main.rs
+++ b/crates/ra_proc_macro_srv/src/cli.rs
@@ -1,7 +1,7 @@
1//! Driver for proc macro server 1//! Driver for proc macro server
2 2
3use crate::{expand_task, list_macros};
3use ra_proc_macro::msg::{self, Message}; 4use ra_proc_macro::msg::{self, Message};
4use ra_proc_macro_srv::{expand_task, list_macros};
5 5
6use std::io; 6use std::io;
7 7
@@ -24,7 +24,8 @@ fn write_response(res: Result<msg::Response, String>) -> Result<(), io::Error> {
24 let mut stdout = stdout.lock(); 24 let mut stdout = stdout.lock();
25 msg.write(&mut stdout) 25 msg.write(&mut stdout)
26} 26}
27fn main() { 27
28pub fn run() {
28 loop { 29 loop {
29 let req = match read_request() { 30 let req = match read_request() {
30 Err(err) => { 31 Err(err) => {
diff --git a/crates/ra_proc_macro_srv/src/lib.rs b/crates/ra_proc_macro_srv/src/lib.rs
index 59716cbb3..c62b0ed89 100644
--- a/crates/ra_proc_macro_srv/src/lib.rs
+++ b/crates/ra_proc_macro_srv/src/lib.rs
@@ -22,7 +22,7 @@ mod dylib;
22use proc_macro::bridge::client::TokenStream; 22use proc_macro::bridge::client::TokenStream;
23use ra_proc_macro::{ExpansionResult, ExpansionTask, ListMacrosResult, ListMacrosTask}; 23use ra_proc_macro::{ExpansionResult, ExpansionTask, ListMacrosResult, ListMacrosTask};
24 24
25pub fn expand_task(task: &ExpansionTask) -> Result<ExpansionResult, String> { 25pub(crate) fn expand_task(task: &ExpansionTask) -> Result<ExpansionResult, String> {
26 let expander = dylib::Expander::new(&task.lib) 26 let expander = dylib::Expander::new(&task.lib)
27 .expect(&format!("Cannot expand with provided libraries: ${:?}", &task.lib)); 27 .expect(&format!("Cannot expand with provided libraries: ${:?}", &task.lib));
28 28
@@ -39,7 +39,7 @@ pub fn expand_task(task: &ExpansionTask) -> Result<ExpansionResult, String> {
39 } 39 }
40} 40}
41 41
42pub fn list_macros(task: &ListMacrosTask) -> Result<ListMacrosResult, String> { 42pub(crate) fn list_macros(task: &ListMacrosTask) -> Result<ListMacrosResult, String> {
43 let expander = dylib::Expander::new(&task.lib) 43 let expander = dylib::Expander::new(&task.lib)
44 .expect(&format!("Cannot expand with provided libraries: ${:?}", &task.lib)); 44 .expect(&format!("Cannot expand with provided libraries: ${:?}", &task.lib));
45 45
@@ -53,5 +53,7 @@ pub fn list_macros(task: &ListMacrosTask) -> Result<ListMacrosResult, String> {
53 } 53 }
54} 54}
55 55
56pub mod cli;
57
56#[cfg(test)] 58#[cfg(test)]
57mod tests; 59mod tests;
diff --git a/crates/rust-analyzer/Cargo.toml b/crates/rust-analyzer/Cargo.toml
index f5f773432..cee0248b6 100644
--- a/crates/rust-analyzer/Cargo.toml
+++ b/crates/rust-analyzer/Cargo.toml
@@ -46,7 +46,7 @@ ra_db = { path = "../ra_db" }
46hir = { path = "../ra_hir", package = "ra_hir" } 46hir = { path = "../ra_hir", package = "ra_hir" }
47hir_def = { path = "../ra_hir_def", package = "ra_hir_def" } 47hir_def = { path = "../ra_hir_def", package = "ra_hir_def" }
48hir_ty = { path = "../ra_hir_ty", package = "ra_hir_ty" } 48hir_ty = { path = "../ra_hir_ty", package = "ra_hir_ty" }
49 49ra_proc_macro_srv = { path = "../ra_proc_macro_srv" }
50 50
51[target.'cfg(windows)'.dependencies] 51[target.'cfg(windows)'.dependencies]
52winapi = "0.3.8" 52winapi = "0.3.8"
diff --git a/crates/rust-analyzer/src/bin/args.rs b/crates/rust-analyzer/src/bin/args.rs
index ec93e9e4e..5e19253a6 100644
--- a/crates/rust-analyzer/src/bin/args.rs
+++ b/crates/rust-analyzer/src/bin/args.rs
@@ -45,6 +45,7 @@ pub(crate) enum Command {
45 /// this would include the parser test files. 45 /// this would include the parser test files.
46 all: bool, 46 all: bool,
47 }, 47 },
48 ProcMacro,
48 RunServer, 49 RunServer,
49 Version, 50 Version,
50} 51}
@@ -264,6 +265,7 @@ ARGS:
264 265
265 Command::Diagnostics { path, load_output_dirs, with_proc_macro, all } 266 Command::Diagnostics { path, load_output_dirs, with_proc_macro, all }
266 } 267 }
268 "proc-macro" => Command::ProcMacro,
267 _ => { 269 _ => {
268 eprintln!( 270 eprintln!(
269 "\ 271 "\
diff --git a/crates/rust-analyzer/src/bin/main.rs b/crates/rust-analyzer/src/bin/main.rs
index 5f614a013..28b67cfe2 100644
--- a/crates/rust-analyzer/src/bin/main.rs
+++ b/crates/rust-analyzer/src/bin/main.rs
@@ -51,6 +51,7 @@ fn main() -> Result<()> {
51 cli::diagnostics(path.as_ref(), load_output_dirs, with_proc_macro, all)? 51 cli::diagnostics(path.as_ref(), load_output_dirs, with_proc_macro, all)?
52 } 52 }
53 53
54 args::Command::ProcMacro => run_proc_macro_sv()?,
54 args::Command::RunServer => run_server()?, 55 args::Command::RunServer => run_server()?,
55 args::Command::Version => println!("rust-analyzer {}", env!("REV")), 56 args::Command::Version => println!("rust-analyzer {}", env!("REV")),
56 } 57 }
@@ -64,6 +65,11 @@ fn setup_logging() -> Result<()> {
64 Ok(()) 65 Ok(())
65} 66}
66 67
68fn run_proc_macro_sv() -> Result<()> {
69 ra_proc_macro_srv::cli::run();
70 Ok(())
71}
72
67fn run_server() -> Result<()> { 73fn run_server() -> Result<()> {
68 log::info!("lifecycle: server started"); 74 log::info!("lifecycle: server started");
69 75
diff --git a/crates/rust-analyzer/src/cli/load_cargo.rs b/crates/rust-analyzer/src/cli/load_cargo.rs
index dfda488fb..32a9ee339 100644
--- a/crates/rust-analyzer/src/cli/load_cargo.rs
+++ b/crates/rust-analyzer/src/cli/load_cargo.rs
@@ -73,7 +73,10 @@ pub(crate) fn load_cargo(
73 let proc_macro_client = if !with_proc_macro { 73 let proc_macro_client = if !with_proc_macro {
74 ProcMacroClient::dummy() 74 ProcMacroClient::dummy()
75 } else { 75 } else {
76 ProcMacroClient::extern_process(Path::new("ra_proc_macro_srv")).unwrap() 76 let mut path = std::env::current_exe()?;
77 path.pop();
78 path.push("rust-analyzer");
79 ProcMacroClient::extern_process(&path, &["proc-macro"]).unwrap()
77 }; 80 };
78 let host = load(&source_roots, ws, &mut vfs, receiver, extern_dirs, &proc_macro_client); 81 let host = load(&source_roots, ws, &mut vfs, receiver, extern_dirs, &proc_macro_client);
79 Ok((host, source_roots)) 82 Ok((host, source_roots))
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs
index 46a89b37e..2b45f1310 100644
--- a/crates/rust-analyzer/src/config.rs
+++ b/crates/rust-analyzer/src/config.rs
@@ -20,7 +20,7 @@ pub struct Config {
20 pub with_sysroot: bool, 20 pub with_sysroot: bool,
21 pub publish_diagnostics: bool, 21 pub publish_diagnostics: bool,
22 pub lru_capacity: Option<usize>, 22 pub lru_capacity: Option<usize>,
23 pub proc_macro_srv: Option<String>, 23 pub proc_macro_srv: Option<(String, Vec<String>)>,
24 pub files: FilesConfig, 24 pub files: FilesConfig,
25 pub notifications: NotificationsConfig, 25 pub notifications: NotificationsConfig,
26 26
@@ -134,7 +134,11 @@ impl Config {
134 134
135 match get::<bool>(value, "/procMacro/enabled") { 135 match get::<bool>(value, "/procMacro/enabled") {
136 Some(true) => { 136 Some(true) => {
137 set(value, "/procMacro/serverPath", &mut self.proc_macro_srv); 137 if let Ok(mut path) = std::env::current_exe() {
138 path.pop();
139 path.push("rust-analyzer");
140 self.proc_macro_srv = Some((path.to_string_lossy().to_string(), vec!["proc-macro".to_string()]));
141 }
138 } 142 }
139 _ => self.proc_macro_srv = None, 143 _ => self.proc_macro_srv = None,
140 } 144 }
diff --git a/crates/rust-analyzer/src/world.rs b/crates/rust-analyzer/src/world.rs
index b7142e83b..f2ad453fa 100644
--- a/crates/rust-analyzer/src/world.rs
+++ b/crates/rust-analyzer/src/world.rs
@@ -148,9 +148,9 @@ impl WorldState {
148 148
149 let proc_macro_client = match &config.proc_macro_srv { 149 let proc_macro_client = match &config.proc_macro_srv {
150 None => ProcMacroClient::dummy(), 150 None => ProcMacroClient::dummy(),
151 Some(srv) => { 151 Some((path, args)) => {
152 let path = Path::new(&srv); 152 let path = std::path::Path::new(path);
153 match ProcMacroClient::extern_process(path) { 153 match ProcMacroClient::extern_process(path, args) {
154 Ok(it) => it, 154 Ok(it) => it,
155 Err(err) => { 155 Err(err) => {
156 log::error!( 156 log::error!(
diff --git a/crates/rust-analyzer/tests/heavy_tests/main.rs b/crates/rust-analyzer/tests/heavy_tests/main.rs
index 26ab81a8f..1dd2676b6 100644
--- a/crates/rust-analyzer/tests/heavy_tests/main.rs
+++ b/crates/rust-analyzer/tests/heavy_tests/main.rs
@@ -692,13 +692,15 @@ pub fn foo(_input: TokenStream) -> TokenStream {
692"###, 692"###,
693 ) 693 )
694 .with_config(|config| { 694 .with_config(|config| {
695 // FIXME: Use env!("CARGO_BIN_EXE_ra-analyzer") instead after
696 // https://github.com/rust-lang/cargo/pull/7697 landed
695 let macro_srv_path = std::path::Path::new(std::env!("CARGO_MANIFEST_DIR")) 697 let macro_srv_path = std::path::Path::new(std::env!("CARGO_MANIFEST_DIR"))
696 .join("../../target/debug/ra_proc_macro_srv") 698 .join("../../target/debug/rust-analyzer")
697 .to_string_lossy() 699 .to_string_lossy()
698 .to_string(); 700 .to_string();
699 701
700 config.cargo.load_out_dirs_from_check = true; 702 config.cargo.load_out_dirs_from_check = true;
701 config.proc_macro_srv = Some(macro_srv_path) 703 config.proc_macro_srv = Some((macro_srv_path, vec!["proc-macro".to_string()]));
702 }) 704 })
703 .root("foo") 705 .root("foo")
704 .root("bar") 706 .root("bar")
diff --git a/editors/code/package.json b/editors/code/package.json
index d39a9b6d8..5ce59e54a 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -393,11 +393,6 @@
393 "description": "Enable Proc macro support, cargo.loadOutDirsFromCheck must be enabled.", 393 "description": "Enable Proc macro support, cargo.loadOutDirsFromCheck must be enabled.",
394 "type": "boolean", 394 "type": "boolean",
395 "default": false 395 "default": false
396 },
397 "rust-analyzer.procMacro.serverPath": {
398 "description": "Proc macro server path",
399 "type": "string",
400 "default": "ra_proc_macro_srv"
401 } 396 }
402 } 397 }
403 }, 398 },