From bb22a4e386c13a17b518a3822d343f6dd3dc4398 Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Sun, 22 Mar 2020 15:00:44 +0800 Subject: Add support for macro in symbo_index --- crates/ra_hir_def/src/body/lower.rs | 12 +----------- crates/ra_ide_db/src/symbol_index.rs | 7 +++++++ crates/ra_syntax/src/ast/extensions.rs | 13 ++++++++++++- 3 files changed, 20 insertions(+), 12 deletions(-) (limited to 'crates') diff --git a/crates/ra_hir_def/src/body/lower.rs b/crates/ra_hir_def/src/body/lower.rs index e8c58ed32..3cf0c66ea 100644 --- a/crates/ra_hir_def/src/body/lower.rs +++ b/crates/ra_hir_def/src/body/lower.rs @@ -453,7 +453,7 @@ impl ExprCollector<'_> { } } ast::Expr::MacroCall(e) => { - if let Some(name) = is_macro_rules(&e) { + if let Some(name) = e.is_macro_rules().map(|it| it.as_name()) { let mac = MacroDefId { krate: Some(self.expander.module.krate), ast_id: Some(self.expander.ast_id(&e)), @@ -697,16 +697,6 @@ impl ExprCollector<'_> { } } -fn is_macro_rules(m: &ast::MacroCall) -> Option { - let name = m.path()?.segment()?.name_ref()?.as_name(); - - if name == name![macro_rules] { - Some(m.name()?.as_name()) - } else { - None - } -} - impl From for BinaryOp { fn from(ast_op: ast::BinOp) -> Self { match ast_op { diff --git a/crates/ra_ide_db/src/symbol_index.rs b/crates/ra_ide_db/src/symbol_index.rs index 884359ee3..0f46f93c1 100644 --- a/crates/ra_ide_db/src/symbol_index.rs +++ b/crates/ra_ide_db/src/symbol_index.rs @@ -362,6 +362,13 @@ fn to_symbol(node: &SyntaxNode) -> Option<(SmolStr, SyntaxNodePtr, TextRange)> { ast::TypeAliasDef(it) => { decl(it) }, ast::ConstDef(it) => { decl(it) }, ast::StaticDef(it) => { decl(it) }, + ast::MacroCall(it) => { + if it.is_macro_rules().is_some() { + decl(it) + } else { + None + } + }, _ => None, } } diff --git a/crates/ra_syntax/src/ast/extensions.rs b/crates/ra_syntax/src/ast/extensions.rs index c3ae8f90e..392731dac 100644 --- a/crates/ra_syntax/src/ast/extensions.rs +++ b/crates/ra_syntax/src/ast/extensions.rs @@ -4,7 +4,7 @@ use itertools::Itertools; use crate::{ - ast::{self, child_opt, children, AstNode, AttrInput, SyntaxNode}, + ast::{self, child_opt, children, AstNode, AttrInput, NameOwner, SyntaxNode}, SmolStr, SyntaxElement, SyntaxKind::*, SyntaxToken, T, @@ -514,3 +514,14 @@ impl ast::Visibility { self.syntax().children_with_tokens().any(|it| it.kind() == T![super]) } } + +impl ast::MacroCall { + pub fn is_macro_rules(&self) -> Option { + let name_ref = self.path()?.segment()?.name_ref()?; + if name_ref.text() == "macro_rules" { + self.name() + } else { + None + } + } +} -- cgit v1.2.3