mirror of
https://github.com/rust-lang/rust
synced 2024-10-03 23:35:18 +00:00
Retain types of proc macros and allow attr. macros
This commit is contained in:
parent
e8a19e24ea
commit
fb21a215be
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -1187,6 +1187,7 @@ dependencies = [
|
||||||
name = "proc_macro_api"
|
name = "proc_macro_api"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"base_db",
|
||||||
"crossbeam-channel 0.5.0",
|
"crossbeam-channel 0.5.0",
|
||||||
"jod-thread",
|
"jod-thread",
|
||||||
"log",
|
"log",
|
||||||
|
|
|
@ -143,9 +143,17 @@ pub fn from_canonical_name(canonical_name: String) -> CrateDisplayName {
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
|
||||||
pub struct ProcMacroId(pub u32);
|
pub struct ProcMacroId(pub u32);
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
|
||||||
|
pub enum ProcMacroKind {
|
||||||
|
CustomDerive,
|
||||||
|
FuncLike,
|
||||||
|
Attr,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct ProcMacro {
|
pub struct ProcMacro {
|
||||||
pub name: SmolStr,
|
pub name: SmolStr,
|
||||||
|
pub kind: ProcMacroKind,
|
||||||
pub expander: Arc<dyn TokenExpander>,
|
pub expander: Arc<dyn TokenExpander>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,11 +206,8 @@ pub fn add_crate_root(
|
||||||
display_name: Option<CrateDisplayName>,
|
display_name: Option<CrateDisplayName>,
|
||||||
cfg_options: CfgOptions,
|
cfg_options: CfgOptions,
|
||||||
env: Env,
|
env: Env,
|
||||||
proc_macro: Vec<(SmolStr, Arc<dyn tt::TokenExpander>)>,
|
proc_macro: Vec<ProcMacro>,
|
||||||
) -> CrateId {
|
) -> CrateId {
|
||||||
let proc_macro =
|
|
||||||
proc_macro.into_iter().map(|(name, it)| ProcMacro { name, expander: it }).collect();
|
|
||||||
|
|
||||||
let data = CrateData {
|
let data = CrateData {
|
||||||
root_file_id: file_id,
|
root_file_id: file_id,
|
||||||
edition,
|
edition,
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
change::Change,
|
change::Change,
|
||||||
input::{
|
input::{
|
||||||
CrateData, CrateDisplayName, CrateGraph, CrateId, CrateName, Dependency, Edition, Env,
|
CrateData, CrateDisplayName, CrateGraph, CrateId, CrateName, Dependency, Edition, Env,
|
||||||
ProcMacroId, SourceRoot, SourceRootId,
|
ProcMacro, ProcMacroId, ProcMacroKind, SourceRoot, SourceRootId,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
pub use salsa;
|
pub use salsa;
|
||||||
|
|
|
@ -17,3 +17,4 @@ crossbeam-channel = "0.5.0"
|
||||||
jod-thread = "0.1.1"
|
jod-thread = "0.1.1"
|
||||||
|
|
||||||
tt = { path = "../tt", version = "0.0.0" }
|
tt = { path = "../tt", version = "0.0.0" }
|
||||||
|
base_db = { path = "../base_db", version = "0.0.0" }
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
sync::Arc,
|
sync::Arc,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use base_db::ProcMacro;
|
||||||
use tt::{SmolStr, Subtree};
|
use tt::{SmolStr, Subtree};
|
||||||
|
|
||||||
use crate::process::{ProcMacroProcessSrv, ProcMacroProcessThread};
|
use crate::process::{ProcMacroProcessSrv, ProcMacroProcessThread};
|
||||||
|
@ -82,7 +83,7 @@ pub fn dummy() -> ProcMacroClient {
|
||||||
ProcMacroClient { kind: ProcMacroClientKind::Dummy }
|
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 {
|
match &self.kind {
|
||||||
ProcMacroClientKind::Dummy => vec![],
|
ProcMacroClientKind::Dummy => vec![],
|
||||||
ProcMacroClientKind::Process { process, .. } => {
|
ProcMacroClientKind::Process { process, .. } => {
|
||||||
|
@ -96,21 +97,21 @@ pub fn by_dylib_path(&self, dylib_path: &Path) -> Vec<(SmolStr, Arc<dyn tt::Toke
|
||||||
|
|
||||||
macros
|
macros
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter_map(|(name, kind)| {
|
.map(|(name, kind)| {
|
||||||
match kind {
|
|
||||||
ProcMacroKind::CustomDerive | ProcMacroKind::FuncLike => {
|
|
||||||
let name = SmolStr::new(&name);
|
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> =
|
let expander: Arc<dyn tt::TokenExpander> =
|
||||||
Arc::new(ProcMacroProcessExpander {
|
Arc::new(ProcMacroProcessExpander {
|
||||||
process: process.clone(),
|
process: process.clone(),
|
||||||
name: name.clone(),
|
name: name.clone(),
|
||||||
dylib_path: dylib_path.into(),
|
dylib_path: dylib_path.into(),
|
||||||
});
|
});
|
||||||
Some((name, expander))
|
|
||||||
}
|
ProcMacro { name, kind, expander }
|
||||||
// FIXME: Attribute macro are currently unsupported.
|
|
||||||
ProcMacroKind::Attr => None,
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ pub struct ListMacrosTask {
|
||||||
pub lib: PathBuf,
|
pub lib: PathBuf,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Eq, PartialEq, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Eq, PartialEq, Debug, Serialize, Deserialize)]
|
||||||
pub enum ProcMacroKind {
|
pub enum ProcMacroKind {
|
||||||
CustomDerive,
|
CustomDerive,
|
||||||
FuncLike,
|
FuncLike,
|
||||||
|
|
Loading…
Reference in a new issue