From 3e24444aee9db36d8de530dee9c0283ce793c6fd Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Fri, 24 Apr 2020 10:23:01 +0800 Subject: Cacheproc-macro dlls --- crates/ra_proc_macro_srv/src/lib.rs | 46 +++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 17 deletions(-) (limited to 'crates/ra_proc_macro_srv/src/lib.rs') diff --git a/crates/ra_proc_macro_srv/src/lib.rs b/crates/ra_proc_macro_srv/src/lib.rs index 3aca859db..0954bd6b5 100644 --- a/crates/ra_proc_macro_srv/src/lib.rs +++ b/crates/ra_proc_macro_srv/src/lib.rs @@ -21,28 +21,40 @@ mod dylib; use proc_macro::bridge::client::TokenStream; use ra_proc_macro::{ExpansionResult, ExpansionTask, ListMacrosResult, ListMacrosTask}; -use std::path::Path; - -pub(crate) fn expand_task(task: &ExpansionTask) -> Result { - let expander = create_expander(&task.lib); +use std::{ + collections::{hash_map::Entry, HashMap}, + path::{Path, PathBuf}, +}; + +#[derive(Default)] +pub(crate) struct ProcMacroSrv { + expanders: HashMap, +} - match expander.expand(&task.macro_name, &task.macro_body, task.attributes.as_ref()) { - Ok(expansion) => Ok(ExpansionResult { expansion }), - Err(msg) => { - Err(format!("Cannot perform expansion for {}: error {:?}", &task.macro_name, msg)) +impl ProcMacroSrv { + pub fn expand(&mut self, task: &ExpansionTask) -> Result { + let expander = self.expander(&task.lib)?; + match expander.expand(&task.macro_name, &task.macro_body, task.attributes.as_ref()) { + Ok(expansion) => Ok(ExpansionResult { expansion }), + Err(msg) => { + Err(format!("Cannot perform expansion for {}: error {:?}", &task.macro_name, msg)) + } } } -} - -pub(crate) fn list_macros(task: &ListMacrosTask) -> ListMacrosResult { - let expander = create_expander(&task.lib); - ListMacrosResult { macros: expander.list_macros() } -} + pub fn list_macros(&mut self, task: &ListMacrosTask) -> Result { + let expander = self.expander(&task.lib)?; + Ok(ListMacrosResult { macros: expander.list_macros() }) + } -fn create_expander(lib: &Path) -> dylib::Expander { - dylib::Expander::new(lib) - .unwrap_or_else(|err| panic!("Cannot create expander for {}: {:?}", lib.display(), err)) + fn expander(&mut self, path: &Path) -> Result<&dylib::Expander, String> { + Ok(match self.expanders.entry(path.to_path_buf()) { + Entry::Vacant(v) => v.insert(dylib::Expander::new(path).map_err(|err| { + format!("Cannot create expander for {}: {:?}", path.display(), err) + })?), + Entry::Occupied(e) => e.into_mut(), + }) + } } pub mod cli; -- cgit v1.2.3 From 3bad5587c8cd17cd7dfae9796c8a01f47307214f Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Sat, 25 Apr 2020 12:30:28 +0800 Subject: Compare timestamp --- crates/ra_proc_macro_srv/src/lib.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'crates/ra_proc_macro_srv/src/lib.rs') diff --git a/crates/ra_proc_macro_srv/src/lib.rs b/crates/ra_proc_macro_srv/src/lib.rs index 0954bd6b5..121f531fd 100644 --- a/crates/ra_proc_macro_srv/src/lib.rs +++ b/crates/ra_proc_macro_srv/src/lib.rs @@ -23,12 +23,14 @@ use proc_macro::bridge::client::TokenStream; use ra_proc_macro::{ExpansionResult, ExpansionTask, ListMacrosResult, ListMacrosTask}; use std::{ collections::{hash_map::Entry, HashMap}, + fs::metadata, path::{Path, PathBuf}, + time::SystemTime, }; #[derive(Default)] pub(crate) struct ProcMacroSrv { - expanders: HashMap, + expanders: HashMap<(PathBuf, SystemTime), dylib::Expander>, } impl ProcMacroSrv { @@ -48,7 +50,11 @@ impl ProcMacroSrv { } fn expander(&mut self, path: &Path) -> Result<&dylib::Expander, String> { - Ok(match self.expanders.entry(path.to_path_buf()) { + let time = metadata(path) + .and_then(|it| it.modified()) + .map_err(|err| format!("Failed to file metadata for {}: {:?}", path.display(), err))?; + + Ok(match self.expanders.entry((path.to_path_buf(), time)) { Entry::Vacant(v) => v.insert(dylib::Expander::new(path).map_err(|err| { format!("Cannot create expander for {}: {:?}", path.display(), err) })?), -- cgit v1.2.3 From 183673655f72250ee05ab1c5864feeae33a3c662 Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Sun, 26 Apr 2020 17:58:56 +0800 Subject: Simpify code --- crates/ra_proc_macro_srv/src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'crates/ra_proc_macro_srv/src/lib.rs') diff --git a/crates/ra_proc_macro_srv/src/lib.rs b/crates/ra_proc_macro_srv/src/lib.rs index 121f531fd..922bb84bb 100644 --- a/crates/ra_proc_macro_srv/src/lib.rs +++ b/crates/ra_proc_macro_srv/src/lib.rs @@ -23,7 +23,7 @@ use proc_macro::bridge::client::TokenStream; use ra_proc_macro::{ExpansionResult, ExpansionTask, ListMacrosResult, ListMacrosTask}; use std::{ collections::{hash_map::Entry, HashMap}, - fs::metadata, + fs, path::{Path, PathBuf}, time::SystemTime, }; @@ -50,9 +50,9 @@ impl ProcMacroSrv { } fn expander(&mut self, path: &Path) -> Result<&dylib::Expander, String> { - let time = metadata(path) - .and_then(|it| it.modified()) - .map_err(|err| format!("Failed to file metadata for {}: {:?}", path.display(), err))?; + let time = fs::metadata(path).and_then(|it| it.modified()).map_err(|err| { + format!("Failed to get file metadata for {}: {:?}", path.display(), err) + })?; Ok(match self.expanders.entry((path.to_path_buf(), time)) { Entry::Vacant(v) => v.insert(dylib::Expander::new(path).map_err(|err| { -- cgit v1.2.3