]> git.lizzy.rs Git - rust.git/commitdiff
Fix proc macro token mapping
authorJonas Schievink <jonasschievink@gmail.com>
Thu, 3 Dec 2020 17:38:05 +0000 (18:38 +0100)
committerJonas Schievink <jonasschievink@gmail.com>
Thu, 3 Dec 2020 17:38:05 +0000 (18:38 +0100)
crates/hir_def/src/lib.rs
crates/hir_expand/src/lib.rs

index ce2be8e2b9bf41337eab83e5b1b410add07c2464..b41c5acb2a0ea76ae513741ff174a3adb95d6244 100644 (file)
@@ -521,7 +521,7 @@ fn as_call_id_with_errors(
         error_sink: &mut dyn FnMut(mbe::ExpandError),
     ) -> Option<MacroCallId> {
         let def: MacroDefId = resolver(self.path.clone()).or_else(|| {
-            error_sink(mbe::ExpandError::Other("could not resolve macro".into()));
+            error_sink(mbe::ExpandError::Other(format!("could not resolve macro `{}`", self.path)));
             None
         })?;
 
@@ -556,7 +556,7 @@ fn as_call_id_with_errors(
         error_sink: &mut dyn FnMut(mbe::ExpandError),
     ) -> Option<MacroCallId> {
         let def: MacroDefId = resolver(self.path.clone()).or_else(|| {
-            error_sink(mbe::ExpandError::Other("could not resolve macro".into()));
+            error_sink(mbe::ExpandError::Other(format!("could not resolve macro `{}`", self.path)));
             None
         })?;
 
index 6dad2507bf3b2ab82bfc2d056c413755871666e9..2633fd8f736dc40fcb147de3201c1d4c47752150 100644 (file)
@@ -143,7 +143,11 @@ pub fn expansion_info(self, db: &dyn db::AstDatabase) -> Option<ExpansionInfo> {
                 let loc: MacroCallLoc = db.lookup_intern_macro(lazy_id);
 
                 let arg_tt = loc.kind.arg(db)?;
-                let def_tt = loc.def.ast_id?.to_node(db).token_tree()?;
+
+                let def = loc.def.ast_id.and_then(|id| {
+                    let def_tt = id.to_node(db).token_tree()?;
+                    Some(InFile::new(id.file_id, def_tt))
+                });
 
                 let macro_def = db.macro_def(loc.def)?;
                 let (parse, exp_map) = db.parse_macro_expansion(macro_file).value?;
@@ -152,7 +156,7 @@ pub fn expansion_info(self, db: &dyn db::AstDatabase) -> Option<ExpansionInfo> {
                 Some(ExpansionInfo {
                     expanded: InFile::new(self, parse.syntax_node()),
                     arg: InFile::new(loc.kind.file_id(), arg_tt),
-                    def: InFile::new(loc.def.ast_id?.file_id, def_tt),
+                    def,
                     macro_arg,
                     macro_def,
                     exp_map,
@@ -311,7 +315,8 @@ pub struct EagerCallLoc {
 pub struct ExpansionInfo {
     expanded: InFile<SyntaxNode>,
     arg: InFile<SyntaxNode>,
-    def: InFile<ast::TokenTree>,
+    /// The `macro_rules!` arguments.
+    def: Option<InFile<ast::TokenTree>>,
 
     macro_def: Arc<(db::TokenExpander, mbe::TokenMap)>,
     macro_arg: Arc<(tt::Subtree, mbe::TokenMap)>,
@@ -348,9 +353,14 @@ pub fn map_token_up(
         let (token_id, origin) = self.macro_def.0.map_id_up(token_id);
         let (token_map, tt) = match origin {
             mbe::Origin::Call => (&self.macro_arg.1, self.arg.clone()),
-            mbe::Origin::Def => {
-                (&self.macro_def.1, self.def.as_ref().map(|tt| tt.syntax().clone()))
-            }
+            mbe::Origin::Def => (
+                &self.macro_def.1,
+                self.def
+                    .as_ref()
+                    .expect("`Origin::Def` used with non-`macro_rules!` macro")
+                    .as_ref()
+                    .map(|tt| tt.syntax().clone()),
+            ),
         };
 
         let range = token_map.range_by_token(token_id)?.by_kind(token.value.kind())?;