]> git.lizzy.rs Git - rust.git/commitdiff
Handle ast::MacroCall in classify_name and impl FromSource for MacroDef
authorkjeremy <kjeremy@gmail.com>
Fri, 15 Nov 2019 21:20:00 +0000 (16:20 -0500)
committerkjeremy <kjeremy@gmail.com>
Fri, 15 Nov 2019 21:47:58 +0000 (16:47 -0500)
Fixes #2260

crates/ra_hir/src/from_source.rs
crates/ra_ide_api/src/references/classify.rs

index 79152a57c4e803cb270212af09a24351f227ea99..1c26756c978a9dc78da52036612525d8ab66b08a 100644 (file)
@@ -1,7 +1,7 @@
 //! FIXME: write short doc here
 
 use hir_def::{ModuleId, StructId, StructOrUnionId, UnionId};
-use hir_expand::name::AsName;
+use hir_expand::{name::AsName, AstId, MacroDefId, MacroDefKind};
 use ra_syntax::{
     ast::{self, AstNode, NameOwner},
     match_ast,
@@ -11,8 +11,8 @@
     db::{AstDatabase, DefDatabase, HirDatabase},
     ids::{AstItemDef, LocationCtx},
     Const, DefWithBody, Enum, EnumVariant, FieldSource, Function, HasBody, HasSource, ImplBlock,
-    Local, Module, ModuleSource, Source, Static, Struct, StructField, Trait, TypeAlias, Union,
-    VariantDef,
+    Local, MacroDef, Module, ModuleSource, Source, Static, Struct, StructField, Trait, TypeAlias,
+    Union, VariantDef,
 };
 
 pub trait FromSource: Sized {
@@ -77,7 +77,22 @@ fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source<Self::Ast>) ->
         Some(TypeAlias { id })
     }
 }
-// FIXME: add impl FromSource for MacroDef
+
+impl FromSource for MacroDef {
+    type Ast = ast::MacroCall;
+    fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source<Self::Ast>) -> Option<Self> {
+        let kind = MacroDefKind::Declarative;
+
+        let module_src = ModuleSource::from_child_node(db, src.as_ref().map(|it| it.syntax()));
+        let module = Module::from_definition(db, Source::new(src.file_id, module_src))?;
+        let krate = module.krate().crate_id();
+
+        let ast_id = AstId::new(src.file_id, db.ast_id_map(src.file_id).ast_id(&src.ast));
+
+        let id: MacroDefId = MacroDefId { krate, ast_id, kind };
+        Some(MacroDef { id })
+    }
+}
 
 impl FromSource for ImplBlock {
     type Ast = ast::ImplBlock;
index b5e35e29f2b9986f5b8cab0ef10b6156d65ae4cd..0eeaa7f384b33353e1908d8a8d0747fc666bb0db 100644 (file)
@@ -21,7 +21,6 @@ pub(crate) fn classify_name(
     let parent = name.syntax().parent()?;
     let file_id = file_id.into();
 
-    // FIXME: add ast::MacroCall(it)
     match_ast! {
         match parent {
             ast::BindPat(it) => {
@@ -104,6 +103,19 @@ pub(crate) fn classify_name(
                     Some(from_module_def(db, def.into(), None))
                 }
             },
+            ast::MacroCall(it) => {
+                let src = hir::Source { file_id, ast: it};
+                let def = hir::MacroDef::from_source(db, src.clone())?;
+
+                let module_src = ModuleSource::from_child_node(db, src.as_ref().map(|it| it.syntax()));
+                let module = Module::from_definition(db, Source::new(file_id, module_src))?;
+
+                Some(NameDefinition {
+                    visibility: None,
+                    container: module,
+                    kind: NameKind::Macro(def),
+                })
+            },
             _ => None,
         }
     }