]> git.lizzy.rs Git - rust.git/commitdiff
Retain types of proc macros and allow attr. macros
authorJonas Schievink <jonasschievink@gmail.com>
Mon, 7 Dec 2020 16:06:14 +0000 (17:06 +0100)
committerJonas Schievink <jonasschievink@gmail.com>
Mon, 7 Dec 2020 16:06:14 +0000 (17:06 +0100)
Cargo.lock
crates/base_db/src/input.rs
crates/base_db/src/lib.rs
crates/proc_macro_api/Cargo.toml
crates/proc_macro_api/src/lib.rs
crates/proc_macro_api/src/rpc.rs

index f1847e7699bb54da1419edc3f568fdcc9e5f2e44..b73fb909c9eb4f4aac0df8785a3ebcc3d20a2dbc 100644 (file)
@@ -1187,6 +1187,7 @@ dependencies = [
 name = "proc_macro_api"
 version = "0.0.0"
 dependencies = [
+ "base_db",
  "crossbeam-channel 0.5.0",
  "jod-thread",
  "log",
index 98ba372ad8dbd885895476bcb80c7cd15f832efb..cda5e57dc7125fc9945b64d70bb38b848ef2c173 100644 (file)
@@ -143,9 +143,17 @@ pub fn from_canonical_name(canonical_name: String) -> CrateDisplayName {
 #[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>,
 }
 
@@ -198,11 +206,8 @@ pub fn add_crate_root(
         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,
index ce75a5337a4b8a83d680e89ce9a20e61f1d37a81..5571af4954035315abfe777889bed01008e9b794 100644 (file)
@@ -14,7 +14,7 @@
     change::Change,
     input::{
         CrateData, CrateDisplayName, CrateGraph, CrateId, CrateName, Dependency, Edition, Env,
-        ProcMacroId, SourceRoot, SourceRootId,
+        ProcMacro, ProcMacroId, ProcMacroKind, SourceRoot, SourceRootId,
     },
 };
 pub use salsa;
index 3863e51895d62fe1491f813673921959ab3c17c6..1af2bbca782b163a9ac23430286cb0ac89ef0ac6 100644 (file)
@@ -17,3 +17,4 @@ crossbeam-channel = "0.5.0"
 jod-thread = "0.1.1"
 
 tt = { path = "../tt", version = "0.0.0" }
+base_db = { path = "../base_db", version = "0.0.0" }
index 40fdbfd5a4874fe49fb1c29db4b371fc6b999eb9..bf1f908799cf7ad7b3609054699abe14968ee4b6 100644 (file)
@@ -16,6 +16,7 @@
     sync::Arc,
 };
 
+use base_db::ProcMacro;
 use tt::{SmolStr, Subtree};
 
 use crate::process::{ProcMacroProcessSrv, ProcMacroProcessThread};
@@ -82,7 +83,7 @@ pub fn dummy() -> ProcMacroClient {
         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, .. } => {
@@ -96,21 +97,21 @@ pub fn by_dylib_path(&self, dylib_path: &Path) -> Vec<(SmolStr, Arc<dyn tt::Toke
 
                 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()
             }
index 203109ca40d18e54a15573b9d6f5af3c7d38b70b..b85f92eeada9dc4bbd705df08c484d06b8a2dedd 100644 (file)
@@ -19,7 +19,7 @@ pub struct ListMacrosTask {
     pub lib: PathBuf,
 }
 
-#[derive(Clone, Eq, PartialEq, Debug, Serialize, Deserialize)]
+#[derive(Copy, Clone, Eq, PartialEq, Debug, Serialize, Deserialize)]
 pub enum ProcMacroKind {
     CustomDerive,
     FuncLike,