diff options
Diffstat (limited to 'crates/ra_hir_expand/src')
-rw-r--r-- | crates/ra_hir_expand/src/db.rs | 19 | ||||
-rw-r--r-- | crates/ra_hir_expand/src/lib.rs | 6 |
2 files changed, 16 insertions, 9 deletions
diff --git a/crates/ra_hir_expand/src/db.rs b/crates/ra_hir_expand/src/db.rs index bf30d7151..e0ad1567f 100644 --- a/crates/ra_hir_expand/src/db.rs +++ b/crates/ra_hir_expand/src/db.rs | |||
@@ -6,7 +6,7 @@ use mbe::{ExpandResult, MacroRules}; | |||
6 | use ra_db::{salsa, SourceDatabase}; | 6 | use ra_db::{salsa, SourceDatabase}; |
7 | use ra_parser::FragmentKind; | 7 | use ra_parser::FragmentKind; |
8 | use ra_prof::profile; | 8 | use ra_prof::profile; |
9 | use ra_syntax::{algo::diff, AstNode, Parse, SyntaxKind::*, SyntaxNode}; | 9 | use ra_syntax::{algo::diff, AstNode, GreenNode, Parse, SyntaxKind::*, SyntaxNode}; |
10 | 10 | ||
11 | use crate::{ | 11 | use crate::{ |
12 | ast_id_map::AstIdMap, BuiltinDeriveExpander, BuiltinFnLikeExpander, EagerCallLoc, EagerMacroId, | 12 | ast_id_map::AstIdMap, BuiltinDeriveExpander, BuiltinFnLikeExpander, EagerCallLoc, EagerMacroId, |
@@ -72,6 +72,8 @@ pub trait AstDatabase: SourceDatabase { | |||
72 | 72 | ||
73 | #[salsa::interned] | 73 | #[salsa::interned] |
74 | fn intern_macro(&self, macro_call: MacroCallLoc) -> LazyMacroId; | 74 | fn intern_macro(&self, macro_call: MacroCallLoc) -> LazyMacroId; |
75 | fn macro_arg_text(&self, id: MacroCallId) -> Option<GreenNode>; | ||
76 | #[salsa::transparent] | ||
75 | fn macro_arg(&self, id: MacroCallId) -> Option<Arc<(tt::Subtree, mbe::TokenMap)>>; | 77 | fn macro_arg(&self, id: MacroCallId) -> Option<Arc<(tt::Subtree, mbe::TokenMap)>>; |
76 | fn macro_def(&self, id: MacroDefId) -> Option<Arc<(TokenExpander, mbe::TokenMap)>>; | 78 | fn macro_def(&self, id: MacroDefId) -> Option<Arc<(TokenExpander, mbe::TokenMap)>>; |
77 | fn parse_macro(&self, macro_file: MacroFile) | 79 | fn parse_macro(&self, macro_file: MacroFile) |
@@ -148,10 +150,7 @@ pub(crate) fn macro_def( | |||
148 | } | 150 | } |
149 | } | 151 | } |
150 | 152 | ||
151 | pub(crate) fn macro_arg( | 153 | pub(crate) fn macro_arg_text(db: &dyn AstDatabase, id: MacroCallId) -> Option<GreenNode> { |
152 | db: &dyn AstDatabase, | ||
153 | id: MacroCallId, | ||
154 | ) -> Option<Arc<(tt::Subtree, mbe::TokenMap)>> { | ||
155 | let id = match id { | 154 | let id = match id { |
156 | MacroCallId::LazyMacro(id) => id, | 155 | MacroCallId::LazyMacro(id) => id, |
157 | MacroCallId::EagerMacro(_id) => { | 156 | MacroCallId::EagerMacro(_id) => { |
@@ -161,7 +160,15 @@ pub(crate) fn macro_arg( | |||
161 | }; | 160 | }; |
162 | let loc = db.lookup_intern_macro(id); | 161 | let loc = db.lookup_intern_macro(id); |
163 | let arg = loc.kind.arg(db)?; | 162 | let arg = loc.kind.arg(db)?; |
164 | let (tt, tmap) = mbe::syntax_node_to_token_tree(&arg)?; | 163 | Some(arg.green().clone()) |
164 | } | ||
165 | |||
166 | pub(crate) fn macro_arg( | ||
167 | db: &dyn AstDatabase, | ||
168 | id: MacroCallId, | ||
169 | ) -> Option<Arc<(tt::Subtree, mbe::TokenMap)>> { | ||
170 | let arg = db.macro_arg_text(id)?; | ||
171 | let (tt, tmap) = mbe::syntax_node_to_token_tree(&SyntaxNode::new_root(arg))?; | ||
165 | Some(Arc::new((tt, tmap))) | 172 | Some(Arc::new((tt, tmap))) |
166 | } | 173 | } |
167 | 174 | ||
diff --git a/crates/ra_hir_expand/src/lib.rs b/crates/ra_hir_expand/src/lib.rs index 1cf6c1ba9..d9e31ac20 100644 --- a/crates/ra_hir_expand/src/lib.rs +++ b/crates/ra_hir_expand/src/lib.rs | |||
@@ -262,14 +262,14 @@ pub enum MacroCallKind { | |||
262 | } | 262 | } |
263 | 263 | ||
264 | impl MacroCallKind { | 264 | impl MacroCallKind { |
265 | pub fn file_id(&self) -> HirFileId { | 265 | fn file_id(&self) -> HirFileId { |
266 | match self { | 266 | match self { |
267 | MacroCallKind::FnLike(ast_id) => ast_id.file_id, | 267 | MacroCallKind::FnLike(ast_id) => ast_id.file_id, |
268 | MacroCallKind::Attr(ast_id, _) => ast_id.file_id, | 268 | MacroCallKind::Attr(ast_id, _) => ast_id.file_id, |
269 | } | 269 | } |
270 | } | 270 | } |
271 | 271 | ||
272 | pub fn node(&self, db: &dyn db::AstDatabase) -> InFile<SyntaxNode> { | 272 | fn node(&self, db: &dyn db::AstDatabase) -> InFile<SyntaxNode> { |
273 | match self { | 273 | match self { |
274 | MacroCallKind::FnLike(ast_id) => ast_id.with_value(ast_id.to_node(db).syntax().clone()), | 274 | MacroCallKind::FnLike(ast_id) => ast_id.with_value(ast_id.to_node(db).syntax().clone()), |
275 | MacroCallKind::Attr(ast_id, _) => { | 275 | MacroCallKind::Attr(ast_id, _) => { |
@@ -278,7 +278,7 @@ impl MacroCallKind { | |||
278 | } | 278 | } |
279 | } | 279 | } |
280 | 280 | ||
281 | pub fn arg(&self, db: &dyn db::AstDatabase) -> Option<SyntaxNode> { | 281 | fn arg(&self, db: &dyn db::AstDatabase) -> Option<SyntaxNode> { |
282 | match self { | 282 | match self { |
283 | MacroCallKind::FnLike(ast_id) => { | 283 | MacroCallKind::FnLike(ast_id) => { |
284 | Some(ast_id.to_node(db).token_tree()?.syntax().clone()) | 284 | Some(ast_id.to_node(db).token_tree()?.syntax().clone()) |