#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct ProcMacroId(pub u32);
+#[derive(Copy, Clone, Eq, PartialEq, Debug)]
+pub enum ProcMacroKind {
+ CustomDerive,
+ FuncLike,
+ Attr,
+}
+
#[derive(Debug, Clone)]
pub struct ProcMacro {
pub name: SmolStr,
+ pub kind: ProcMacroKind,
pub expander: Arc<dyn TokenExpander>,
}
display_name: Option<CrateDisplayName>,
cfg_options: CfgOptions,
env: Env,
- proc_macro: Vec<(SmolStr, Arc<dyn tt::TokenExpander>)>,
+ proc_macro: Vec<ProcMacro>,
) -> CrateId {
- let proc_macro =
- proc_macro.into_iter().map(|(name, it)| ProcMacro { name, expander: it }).collect();
-
let data = CrateData {
root_file_id: file_id,
edition,
change::Change,
input::{
CrateData, CrateDisplayName, CrateGraph, CrateId, CrateName, Dependency, Edition, Env,
- ProcMacroId, SourceRoot, SourceRootId,
+ ProcMacro, ProcMacroId, ProcMacroKind, SourceRoot, SourceRootId,
},
};
pub use salsa;
sync::Arc,
};
+use base_db::ProcMacro;
use tt::{SmolStr, Subtree};
use crate::process::{ProcMacroProcessSrv, ProcMacroProcessThread};
ProcMacroClient { kind: ProcMacroClientKind::Dummy }
}
- pub fn by_dylib_path(&self, dylib_path: &Path) -> Vec<(SmolStr, Arc<dyn tt::TokenExpander>)> {
+ pub fn by_dylib_path(&self, dylib_path: &Path) -> Vec<ProcMacro> {
match &self.kind {
ProcMacroClientKind::Dummy => vec![],
ProcMacroClientKind::Process { process, .. } => {
macros
.into_iter()
- .filter_map(|(name, kind)| {
- match kind {
- ProcMacroKind::CustomDerive | ProcMacroKind::FuncLike => {
- let name = SmolStr::new(&name);
- let expander: Arc<dyn tt::TokenExpander> =
- Arc::new(ProcMacroProcessExpander {
- process: process.clone(),
- name: name.clone(),
- dylib_path: dylib_path.into(),
- });
- Some((name, expander))
- }
- // FIXME: Attribute macro are currently unsupported.
- ProcMacroKind::Attr => None,
- }
+ .map(|(name, kind)| {
+ let name = SmolStr::new(&name);
+ let kind = match kind {
+ ProcMacroKind::CustomDerive => base_db::ProcMacroKind::CustomDerive,
+ ProcMacroKind::FuncLike => base_db::ProcMacroKind::FuncLike,
+ ProcMacroKind::Attr => base_db::ProcMacroKind::Attr,
+ };
+ let expander: Arc<dyn tt::TokenExpander> =
+ Arc::new(ProcMacroProcessExpander {
+ process: process.clone(),
+ name: name.clone(),
+ dylib_path: dylib_path.into(),
+ });
+
+ ProcMacro { name, kind, expander }
})
.collect()
}