feat: Add config to replace specific proc-macros with dummy expanders
This commit is contained in:
@@ -66,7 +66,8 @@ pub fn load_workspace(
|
||||
};
|
||||
|
||||
let crate_graph = ws.to_crate_graph(
|
||||
&mut |path: &AbsPath| load_proc_macro(proc_macro_client.as_ref(), path),
|
||||
&Default::default(),
|
||||
&mut |path: &AbsPath, _| load_proc_macro(proc_macro_client.as_ref(), path, &[]),
|
||||
&mut |path: &AbsPath| {
|
||||
let contents = loader.load_sync(path);
|
||||
let path = vfs::VfsPath::from(path.to_path_buf());
|
||||
|
||||
@@ -301,6 +301,7 @@ config_data! {
|
||||
/// Internal config, path to proc-macro server executable (typically,
|
||||
/// this is rust-analyzer itself, but we override this in tests).
|
||||
procMacro_server: Option<PathBuf> = "null",
|
||||
procMacro_dummies: FxHashMap<Box<str>, Box<[Box<str>]>> = "{}",
|
||||
|
||||
/// Command to be executed instead of 'cargo' for runnables.
|
||||
runnables_overrideCargo: Option<String> = "null",
|
||||
@@ -716,6 +717,9 @@ impl Config {
|
||||
};
|
||||
Some((path, vec!["proc-macro".into()]))
|
||||
}
|
||||
pub fn dummy_replacements(&self) -> &FxHashMap<Box<str>, Box<[Box<str>]>> {
|
||||
&self.data.procMacro_dummies
|
||||
}
|
||||
pub fn expand_proc_attr_macros(&self) -> bool {
|
||||
self.data.experimental_procAttrMacros
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ use ide_db::base_db::{
|
||||
};
|
||||
use proc_macro_api::{MacroDylib, ProcMacroServer};
|
||||
use project_model::{ProjectWorkspace, WorkspaceBuildScripts};
|
||||
use syntax::SmolStr;
|
||||
use vfs::{file_set::FileSetConfig, AbsPath, AbsPathBuf, ChangeKind};
|
||||
|
||||
use crate::{
|
||||
@@ -290,6 +291,9 @@ impl GlobalState {
|
||||
}
|
||||
},
|
||||
};
|
||||
self.analysis_host
|
||||
.raw_database_mut()
|
||||
.set_enable_proc_attr_macros(self.config.expand_proc_attr_macros());
|
||||
}
|
||||
|
||||
let watch = match files_config.watcher {
|
||||
@@ -306,8 +310,9 @@ impl GlobalState {
|
||||
// Create crate graph from all the workspaces
|
||||
let crate_graph = {
|
||||
let proc_macro_client = self.proc_macro_client.as_ref();
|
||||
let mut load_proc_macro =
|
||||
move |path: &AbsPath| load_proc_macro(proc_macro_client, path);
|
||||
let mut load_proc_macro = move |path: &AbsPath, dummy_replace: &_| {
|
||||
load_proc_macro(proc_macro_client, path, dummy_replace)
|
||||
};
|
||||
|
||||
let vfs = &mut self.vfs.write().0;
|
||||
let loader = &mut self.loader;
|
||||
@@ -328,7 +333,11 @@ impl GlobalState {
|
||||
|
||||
let mut crate_graph = CrateGraph::default();
|
||||
for ws in self.workspaces.iter() {
|
||||
crate_graph.extend(ws.to_crate_graph(&mut load_proc_macro, &mut load));
|
||||
crate_graph.extend(ws.to_crate_graph(
|
||||
self.config.dummy_replacements(),
|
||||
&mut load_proc_macro,
|
||||
&mut load,
|
||||
));
|
||||
}
|
||||
crate_graph
|
||||
};
|
||||
@@ -505,7 +514,11 @@ impl SourceRootConfig {
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn load_proc_macro(client: Option<&ProcMacroServer>, path: &AbsPath) -> Vec<ProcMacro> {
|
||||
pub(crate) fn load_proc_macro(
|
||||
client: Option<&ProcMacroServer>,
|
||||
path: &AbsPath,
|
||||
dummy_replace: &[Box<str>],
|
||||
) -> Vec<ProcMacro> {
|
||||
let dylib = match MacroDylib::new(path.to_path_buf()) {
|
||||
Ok(it) => it,
|
||||
Err(err) => {
|
||||
@@ -532,17 +545,25 @@ pub(crate) fn load_proc_macro(client: Option<&ProcMacroServer>, path: &AbsPath)
|
||||
Vec::new()
|
||||
}
|
||||
})
|
||||
.map(expander_to_proc_macro)
|
||||
.map(|expander| expander_to_proc_macro(expander, dummy_replace))
|
||||
.collect();
|
||||
|
||||
fn expander_to_proc_macro(expander: proc_macro_api::ProcMacro) -> ProcMacro {
|
||||
let name = expander.name().into();
|
||||
fn expander_to_proc_macro(
|
||||
expander: proc_macro_api::ProcMacro,
|
||||
dummy_replace: &[Box<str>],
|
||||
) -> ProcMacro {
|
||||
let name = SmolStr::from(expander.name());
|
||||
let kind = match expander.kind() {
|
||||
proc_macro_api::ProcMacroKind::CustomDerive => ProcMacroKind::CustomDerive,
|
||||
proc_macro_api::ProcMacroKind::FuncLike => ProcMacroKind::FuncLike,
|
||||
proc_macro_api::ProcMacroKind::Attr => ProcMacroKind::Attr,
|
||||
};
|
||||
let expander = Arc::new(Expander(expander));
|
||||
let expander: Arc<dyn ProcMacroExpander> =
|
||||
if dummy_replace.iter().any(|replace| &**replace == name) {
|
||||
Arc::new(DummyExpander)
|
||||
} else {
|
||||
Arc::new(Expander(expander))
|
||||
};
|
||||
ProcMacro { name, kind, expander }
|
||||
}
|
||||
|
||||
@@ -564,6 +585,20 @@ pub(crate) fn load_proc_macro(client: Option<&ProcMacroServer>, path: &AbsPath)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct DummyExpander;
|
||||
|
||||
impl ProcMacroExpander for DummyExpander {
|
||||
fn expand(
|
||||
&self,
|
||||
subtree: &tt::Subtree,
|
||||
_: Option<&tt::Subtree>,
|
||||
_: &Env,
|
||||
) -> Result<tt::Subtree, ProcMacroExpansionError> {
|
||||
Ok(subtree.clone())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn should_refresh_for_change(path: &AbsPath, change_kind: ChangeKind) -> bool {
|
||||
|
||||
Reference in New Issue
Block a user