]> git.lizzy.rs Git - rust.git/commitdiff
Make MacroDefId's `AstId` mandatory when possible
authorJonas Schievink <jonasschievink@gmail.com>
Thu, 18 Mar 2021 14:37:14 +0000 (15:37 +0100)
committerJonas Schievink <jonasschievink@gmail.com>
Thu, 18 Mar 2021 14:37:14 +0000 (15:37 +0100)
13 files changed:
crates/hir/src/has_source.rs
crates/hir/src/lib.rs
crates/hir/src/semantics/source_to_def.rs
crates/hir_def/src/attr.rs
crates/hir_def/src/import_map.rs
crates/hir_def/src/lib.rs
crates/hir_def/src/nameres/collector.rs
crates/hir_expand/src/builtin_derive.rs
crates/hir_expand/src/builtin_macro.rs
crates/hir_expand/src/db.rs
crates/hir_expand/src/eager.rs
crates/hir_expand/src/hygiene.rs
crates/hir_expand/src/lib.rs

index 2620026713c80ed3e234055fe20bfa0039c358f2..5b22ab58bcd6ccacc4e308dff987810782b912eb 100644 (file)
@@ -113,7 +113,7 @@ fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> {
 impl HasSource for MacroDef {
     type Ast = ast::Macro;
     fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> {
-        let ast_id = self.id.ast_id?;
+        let ast_id = self.id.ast_id()?;
         Some(InFile { file_id: ast_id.file_id, value: ast_id.to_node(db.upcast()) })
     }
 }
index b41a36a781c02479f8ff18ca028199e1c641acd3..b860cbf3c46a349f1fd4109595d1ee6688502cae 100644 (file)
@@ -1154,7 +1154,8 @@ pub fn is_proc_macro(&self) -> bool {
 
     /// Indicate it is a derive macro
     pub fn is_derive_macro(&self) -> bool {
-        matches!(self.id.kind, MacroDefKind::ProcMacro(_) | MacroDefKind::BuiltInDerive(_))
+        // FIXME: wrong for `ProcMacro`
+        matches!(self.id.kind, MacroDefKind::ProcMacro(..) | MacroDefKind::BuiltInDerive(..))
     }
 }
 
index c6ad5ecb5fb7fd558a0d8a718e6fd8a87b37bec1..762809fcd0731b050fe85f9601f88e10b91c6414 100644 (file)
@@ -195,12 +195,12 @@ pub(super) fn macro_rules_to_def(
         &mut self,
         src: InFile<ast::MacroRules>,
     ) -> Option<MacroDefId> {
-        let kind = MacroDefKind::Declarative;
+        let file_ast_id = self.db.ast_id_map(src.file_id).ast_id(&src.value);
+        let ast_id = AstId::new(src.file_id, file_ast_id.upcast());
+        let kind = MacroDefKind::Declarative(ast_id);
         let file_id = src.file_id.original_file(self.db.upcast());
         let krate = self.file_to_def(file_id).get(0).copied()?.krate();
-        let file_ast_id = self.db.ast_id_map(src.file_id).ast_id(&src.value);
-        let ast_id = Some(AstId::new(src.file_id, file_ast_id.upcast()));
-        Some(MacroDefId { krate, ast_id, kind, local_inner: false })
+        Some(MacroDefId { krate, kind, local_inner: false })
     }
 
     pub(super) fn find_container(&mut self, src: InFile<&SyntaxNode>) -> Option<ChildContainer> {
index e4c84afbfa1d8ee6070447940f4c5a6e2fb3fff3..8d925c0c19d25688bd498e280a1db9338aa11761 100644 (file)
@@ -209,7 +209,7 @@ pub(crate) fn attrs_query(db: &dyn DefDatabase, def: AttrDefId) -> Attrs {
             },
             AttrDefId::TraitId(it) => attrs_from_item_tree(it.lookup(db).id, db),
             AttrDefId::MacroDefId(it) => {
-                it.ast_id.map_or_else(Default::default, |ast_id| attrs_from_ast(ast_id, db))
+                it.ast_id().map_or_else(Default::default, |ast_id| attrs_from_ast(ast_id, db))
             }
             AttrDefId::ImplId(it) => attrs_from_item_tree(it.lookup(db).id, db),
             AttrDefId::ConstId(it) => attrs_from_item_tree(it.lookup(db).id, db),
index 369bc3350b7f6fcafd49cb7ff54c417c188f3edf..960cabb5fd480ea82261a34b1e9d46d03060d639 100644 (file)
@@ -912,10 +912,10 @@ pub mod fmt {
                 dep::fmt (t)
                 dep::format (f)
                 dep::Fmt (v)
-                dep::fmt::Display (t)
+                dep::Fmt (m)
                 dep::Fmt (t)
                 dep::fmt::Display::fmt (a)
-                dep::Fmt (m)
+                dep::fmt::Display (t)
             "#]],
         );
 
@@ -926,9 +926,9 @@ pub mod fmt {
             expect![[r#"
                 dep::fmt (t)
                 dep::Fmt (v)
+                dep::Fmt (m)
                 dep::Fmt (t)
                 dep::fmt::Display::fmt (a)
-                dep::Fmt (m)
             "#]],
         );
 
@@ -939,10 +939,10 @@ pub mod fmt {
             expect![[r#"
                 dep::fmt (t)
                 dep::Fmt (v)
-                dep::fmt::Display (t)
+                dep::Fmt (m)
                 dep::Fmt (t)
                 dep::fmt::Display::fmt (a)
-                dep::Fmt (m)
+                dep::fmt::Display (t)
             "#]],
         );
     }
@@ -980,10 +980,10 @@ pub mod fmt {
             expect![[r#"
                 dep::fmt (t)
                 dep::Fmt (v)
-                dep::fmt::Display (t)
+                dep::Fmt (m)
                 dep::Fmt (t)
                 dep::fmt::Display::fmt (a)
-                dep::Fmt (m)
+                dep::fmt::Display (t)
             "#]],
         );
 
@@ -994,9 +994,9 @@ pub mod fmt {
             expect![[r#"
                 dep::fmt (t)
                 dep::Fmt (v)
+                dep::Fmt (m)
                 dep::Fmt (t)
                 dep::fmt::Display::fmt (a)
-                dep::Fmt (m)
             "#]],
         );
     }
@@ -1058,8 +1058,8 @@ pub fn no() {}
             Query::new("".to_string()).limit(2),
             expect![[r#"
                 dep::fmt (t)
-                dep::Fmt (t)
                 dep::Fmt (m)
+                dep::Fmt (t)
                 dep::Fmt (v)
             "#]],
         );
index 6758411a0c1ab22184e6a60ef761e6abd6ec7519..21add086d076e97f2da13d9056337dcbac92a9ce 100644 (file)
@@ -650,7 +650,7 @@ fn macro_call_as_call_id(
 ) -> Result<Result<MacroCallId, ErrorEmitted>, UnresolvedMacro> {
     let def: MacroDefId = resolver(call.path.clone()).ok_or(UnresolvedMacro)?;
 
-    let res = if let MacroDefKind::BuiltInEager(_) = def.kind {
+    let res = if let MacroDefKind::BuiltInEager(..) = def.kind {
         let macro_call = InFile::new(call.ast_id.file_id, call.ast_id.to_node(db.upcast()));
         let hygiene = Hygiene::new(db.upcast(), call.ast_id.file_id);
 
index d0fefb5afdfe9d4a5f06072e184858ec1a813da0..45a79e896e6e684b10f62a0228b0268615c8fffc 100644 (file)
@@ -357,13 +357,11 @@ fn resolve_proc_macro(&mut self, name: &Name) {
         self.exports_proc_macros = true;
         let macro_def = match self.proc_macros.iter().find(|(n, _)| n == name) {
             Some((_, expander)) => MacroDefId {
-                ast_id: None,
                 krate: self.def_map.krate,
                 kind: MacroDefKind::ProcMacro(*expander),
                 local_inner: false,
             },
             None => MacroDefId {
-                ast_id: None,
                 krate: self.def_map.krate,
                 kind: MacroDefKind::ProcMacro(ProcMacroExpander::dummy(self.def_map.krate)),
                 local_inner: false,
@@ -1445,9 +1443,8 @@ fn collect_macro_rules(&mut self, id: FileItemTreeId<MacroRules>) {
 
         // Case 2: normal `macro_rules!` macro
         let macro_id = MacroDefId {
-            ast_id: Some(ast_id),
             krate: self.def_collector.def_map.krate,
-            kind: MacroDefKind::Declarative,
+            kind: MacroDefKind::Declarative(ast_id),
             local_inner: is_local_inner,
         };
         self.def_collector.define_macro(self.module_id, mac.name.clone(), macro_id, is_export);
index a8d267c30ecfac507e81571f37204245e0d538e2..60fd2ebdd42f21b8be2c87e1898f7bbb0fe7cad0 100644 (file)
@@ -61,8 +61,7 @@ pub fn find_builtin_derive(
     let expander = BuiltinDeriveExpander::find_by_name(ident)?;
     Some(MacroDefId {
         krate,
-        ast_id: Some(ast_id),
-        kind: MacroDefKind::BuiltInDerive(expander),
+        kind: MacroDefKind::BuiltInDerive(expander, ast_id),
         local_inner: false,
     })
 }
@@ -314,8 +313,7 @@ fn expand_builtin_derive(ra_fixture: &str) -> String {
         let loc = MacroCallLoc {
             def: MacroDefId {
                 krate: CrateId(0),
-                ast_id: Some(macro_ast_id),
-                kind: MacroDefKind::BuiltInDerive(expander),
+                kind: MacroDefKind::BuiltInDerive(expander, macro_ast_id),
                 local_inner: false,
             },
             krate: CrateId(0),
index fce09a9e716712cfc46d60e91f6d7a5949baba4a..8529b43b6d396542b535f6fe50d27428a6d1262d 100644 (file)
@@ -71,14 +71,12 @@ pub fn find_builtin_macro(
     match kind {
         Either::Left(kind) => Some(MacroDefId {
             krate,
-            ast_id: Some(ast_id),
-            kind: MacroDefKind::BuiltIn(kind),
+            kind: MacroDefKind::BuiltIn(kind, ast_id),
             local_inner: false,
         }),
         Either::Right(kind) => Some(MacroDefId {
             krate,
-            ast_id: Some(ast_id),
-            kind: MacroDefKind::BuiltInEager(kind),
+            kind: MacroDefKind::BuiltInEager(kind, ast_id),
             local_inner: false,
         }),
     }
@@ -512,6 +510,7 @@ fn expand_builtin_macro(ra_fixture: &str) -> String {
         let macro_call = macro_calls.pop().unwrap();
 
         let expander = find_by_name(&macro_rules.name().unwrap().as_name()).unwrap();
+        let ast_id = AstId::new(file_id.into(), ast_id_map.ast_id(&macro_rules));
 
         let krate = CrateId(0);
         let file_id = match expander {
@@ -519,8 +518,7 @@ fn expand_builtin_macro(ra_fixture: &str) -> String {
                 // the first one should be a macro_rules
                 let def = MacroDefId {
                     krate: CrateId(0),
-                    ast_id: Some(AstId::new(file_id.into(), ast_id_map.ast_id(&macro_rules))),
-                    kind: MacroDefKind::BuiltIn(expander),
+                    kind: MacroDefKind::BuiltIn(expander, ast_id),
                     local_inner: false,
                 };
 
@@ -540,8 +538,7 @@ fn expand_builtin_macro(ra_fixture: &str) -> String {
                 // the first one should be a macro_rules
                 let def = MacroDefId {
                     krate,
-                    ast_id: Some(AstId::new(file_id.into(), ast_id_map.ast_id(&macro_rules))),
-                    kind: MacroDefKind::BuiltInEager(expander),
+                    kind: MacroDefKind::BuiltInEager(expander, ast_id),
                     local_inner: false,
                 };
 
index a3070f1f94b58404bb4628ea64645a1c0e3f32f0..4107d778149c585e0875f384f9604949fb753678 100644 (file)
@@ -130,8 +130,8 @@ fn ast_id_map(db: &dyn AstDatabase, file_id: HirFileId) -> Arc<AstIdMap> {
 
 fn macro_def(db: &dyn AstDatabase, id: MacroDefId) -> Option<Arc<(TokenExpander, mbe::TokenMap)>> {
     match id.kind {
-        MacroDefKind::Declarative => {
-            let macro_rules = match id.ast_id?.to_node(db) {
+        MacroDefKind::Declarative(ast_id) => {
+            let macro_rules = match ast_id.to_node(db) {
                 syntax::ast::Macro::MacroRules(mac) => mac,
                 syntax::ast::Macro::MacroDef(_) => return None,
             };
@@ -150,13 +150,13 @@ fn macro_def(db: &dyn AstDatabase, id: MacroDefId) -> Option<Arc<(TokenExpander,
             };
             Some(Arc::new((TokenExpander::MacroRules(rules), tmap)))
         }
-        MacroDefKind::BuiltIn(expander) => {
+        MacroDefKind::BuiltIn(expander, _) => {
             Some(Arc::new((TokenExpander::Builtin(expander), mbe::TokenMap::default())))
         }
-        MacroDefKind::BuiltInDerive(expander) => {
+        MacroDefKind::BuiltInDerive(expander, _) => {
             Some(Arc::new((TokenExpander::BuiltinDerive(expander), mbe::TokenMap::default())))
         }
-        MacroDefKind::BuiltInEager(_) => None,
+        MacroDefKind::BuiltInEager(..) => None,
         MacroDefKind::ProcMacro(expander) => {
             Some(Arc::new((TokenExpander::ProcMacro(expander), mbe::TokenMap::default())))
         }
index dc618a9ee1f5354ede4c1f75aaec77a33290b43a..ddadaffd3730ebb9be6f5567abcc39bdd7a18658 100644 (file)
@@ -140,7 +140,7 @@ pub fn expand_eager_macro(
     let subtree =
         diagnostic_sink.option(to_subtree(&result), || err("failed to parse macro result"))?;
 
-    if let MacroDefKind::BuiltInEager(eager) = def.kind {
+    if let MacroDefKind::BuiltInEager(eager, _) = def.kind {
         let res = eager.expand(db, arg_id, &subtree);
 
         let (subtree, fragment) = diagnostic_sink.expand_result_option(res)?;
@@ -193,7 +193,7 @@ fn eager_macro_recur(
         let def = diagnostic_sink
             .option_with(|| macro_resolver(child.path()?), || err("failed to resolve macro"))?;
         let insert = match def.kind {
-            MacroDefKind::BuiltInEager(_) => {
+            MacroDefKind::BuiltInEager(..) => {
                 let id: MacroCallId = expand_eager_macro(
                     db,
                     krate,
@@ -206,9 +206,9 @@ fn eager_macro_recur(
                 db.parse_or_expand(id.as_file())
                     .expect("successful macro expansion should be parseable")
             }
-            MacroDefKind::Declarative
-            | MacroDefKind::BuiltIn(_)
-            | MacroDefKind::BuiltInDerive(_)
+            MacroDefKind::Declarative(_)
+            | MacroDefKind::BuiltIn(..)
+            | MacroDefKind::BuiltInDerive(..)
             | MacroDefKind::ProcMacro(_) => {
                 let res = lazy_expand(db, &def, curr.with_value(child.clone()), krate);
                 let val = diagnostic_sink.expand_result_option(res)?;
index 87cad326d1cbed20373c2fc30b12ae85ef797a45..e758b3c0ae8512e6605f487a94de1a003840ac6d 100644 (file)
@@ -145,7 +145,7 @@ fn make_hygiene_info(
 ) -> Option<HygieneInfo> {
     let arg_tt = loc.kind.arg(db)?;
 
-    let def_offset = loc.def.ast_id.and_then(|id| {
+    let def_offset = loc.def.ast_id().and_then(|id| {
         let def_tt = match id.to_node(db) {
             ast::Macro::MacroRules(mac) => mac.token_tree()?.syntax().text_range().start(),
             ast::Macro::MacroDef(_) => return None,
@@ -176,12 +176,12 @@ pub(crate) fn new(db: &dyn AstDatabase, file_id: HirFileId) -> HygieneFrame {
                     let loc = db.lookup_intern_macro(id);
                     let info = make_hygiene_info(db, macro_file, &loc);
                     match loc.def.kind {
-                        MacroDefKind::Declarative => {
+                        MacroDefKind::Declarative(_) => {
                             (info, Some(loc.def.krate), loc.def.local_inner)
                         }
-                        MacroDefKind::BuiltIn(_) => (info, Some(loc.def.krate), false),
-                        MacroDefKind::BuiltInDerive(_) => (info, None, false),
-                        MacroDefKind::BuiltInEager(_) => (info, None, false),
+                        MacroDefKind::BuiltIn(..) => (info, Some(loc.def.krate), false),
+                        MacroDefKind::BuiltInDerive(..) => (info, None, false),
+                        MacroDefKind::BuiltInEager(..) => (info, None, false),
                         MacroDefKind::ProcMacro(_) => (info, None, false),
                     }
                 }
index 7532d00b833a853853ffa0034a728c4c699eafcc..83e11019fd1c378450b1fac1df9463abdbaadcb9 100644 (file)
@@ -143,7 +143,7 @@ pub fn expansion_info(self, db: &dyn db::AstDatabase) -> Option<ExpansionInfo> {
 
                 let arg_tt = loc.kind.arg(db)?;
 
-                let def = loc.def.ast_id.and_then(|id| {
+                let def = loc.def.ast_id().and_then(|id| {
                     let def_tt = match id.to_node(db) {
                         ast::Macro::MacroRules(mac) => mac.token_tree()?,
                         ast::Macro::MacroDef(_) => return None,
@@ -180,7 +180,7 @@ pub fn is_builtin_derive(&self, db: &dyn db::AstDatabase) -> Option<InFile<ast::
                 };
                 let loc: MacroCallLoc = db.lookup_intern_macro(lazy_id);
                 let item = match loc.def.kind {
-                    MacroDefKind::BuiltInDerive(_) => loc.kind.node(db),
+                    MacroDefKind::BuiltInDerive(..) => loc.kind.node(db),
                     _ => return None,
                 };
                 Some(item.with_value(ast::Item::cast(item.value.clone())?))
@@ -224,7 +224,6 @@ fn from(it: EagerMacroId) -> Self {
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
 pub struct MacroDefId {
     pub krate: CrateId,
-    pub ast_id: Option<AstId<ast::Macro>>,
     pub kind: MacroDefKind,
 
     pub local_inner: bool,
@@ -239,15 +238,26 @@ pub fn as_lazy_macro(
     ) -> LazyMacroId {
         db.intern_macro(MacroCallLoc { def: self, krate, kind })
     }
+
+    pub fn ast_id(&self) -> Option<AstId<ast::Macro>> {
+        let id = match &self.kind {
+            MacroDefKind::Declarative(id) => id,
+            MacroDefKind::BuiltIn(_, id) => id,
+            MacroDefKind::BuiltInDerive(_, id) => id,
+            MacroDefKind::BuiltInEager(_, id) => id,
+            MacroDefKind::ProcMacro(_) => return None,
+        };
+        Some(*id)
+    }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
 pub enum MacroDefKind {
-    Declarative,
-    BuiltIn(BuiltinFnLikeExpander),
+    Declarative(AstId<ast::Macro>),
+    BuiltIn(BuiltinFnLikeExpander, AstId<ast::Macro>),
     // FIXME: maybe just Builtin and rename BuiltinFnLikeExpander to BuiltinExpander
-    BuiltInDerive(BuiltinDeriveExpander),
-    BuiltInEager(EagerExpander),
+    BuiltInDerive(BuiltinDeriveExpander, AstId<ast::Macro>),
+    BuiltInEager(EagerExpander, AstId<ast::Macro>),
     ProcMacro(ProcMacroExpander),
 }