aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_expand/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_expand/src')
-rw-r--r--crates/ra_hir_expand/src/eager.rs48
1 files changed, 24 insertions, 24 deletions
diff --git a/crates/ra_hir_expand/src/eager.rs b/crates/ra_hir_expand/src/eager.rs
index b2b54ba2b..7fcdfab5a 100644
--- a/crates/ra_hir_expand/src/eager.rs
+++ b/crates/ra_hir_expand/src/eager.rs
@@ -29,6 +29,30 @@ use ra_parser::FragmentKind;
29use ra_syntax::{algo::replace_descendants, SyntaxElement, SyntaxNode}; 29use ra_syntax::{algo::replace_descendants, SyntaxElement, SyntaxNode};
30use std::{collections::HashMap, sync::Arc}; 30use std::{collections::HashMap, sync::Arc};
31 31
32pub fn expand_eager_macro(
33 db: &impl AstDatabase,
34 macro_call: InFile<ast::MacroCall>,
35 def: MacroDefId,
36 resolver: &dyn Fn(ast::Path) -> Option<MacroDefId>,
37) -> Option<EagerMacroId> {
38 let args = macro_call.value.token_tree()?;
39 let parsed_args = mbe::ast_to_token_tree(&args)?.0;
40 let parsed_args = mbe::token_tree_to_syntax_node(&parsed_args, FragmentKind::Expr).ok()?.0;
41 let result = eager_macro_recur(db, macro_call.with_value(parsed_args.syntax_node()), resolver)?;
42
43 let subtree = to_subtree(&result)?;
44
45 if let MacroDefKind::BuiltInEager(eager) = def.kind {
46 let (subtree, fragment) = eager.expand(&subtree).ok()?;
47 let eager =
48 EagerCallLoc { def, fragment, subtree: Arc::new(subtree), file_id: macro_call.file_id };
49
50 Some(db.intern_eager_expansion(eager))
51 } else {
52 None
53 }
54}
55
32fn to_subtree(node: &SyntaxNode) -> Option<tt::Subtree> { 56fn to_subtree(node: &SyntaxNode) -> Option<tt::Subtree> {
33 let mut subtree = mbe::syntax_node_to_token_tree(node)?.0; 57 let mut subtree = mbe::syntax_node_to_token_tree(node)?.0;
34 subtree.delimiter = None; 58 subtree.delimiter = None;
@@ -86,27 +110,3 @@ fn eager_macro_recur(
86 110
87 Some(original) 111 Some(original)
88} 112}
89
90pub fn expand_eager_macro(
91 db: &impl AstDatabase,
92 macro_call: InFile<ast::MacroCall>,
93 def: MacroDefId,
94 resolver: &dyn Fn(ast::Path) -> Option<MacroDefId>,
95) -> Option<EagerMacroId> {
96 let args = macro_call.value.token_tree()?;
97 let parsed_args = mbe::ast_to_token_tree(&args)?.0;
98 let parsed_args = mbe::token_tree_to_syntax_node(&parsed_args, FragmentKind::Expr).ok()?.0;
99 let result = eager_macro_recur(db, macro_call.with_value(parsed_args.syntax_node()), resolver)?;
100
101 let subtree = to_subtree(&result)?;
102
103 if let MacroDefKind::BuiltInEager(eager) = def.kind {
104 let (subtree, fragment) = eager.expand(&subtree).ok()?;
105 let eager =
106 EagerCallLoc { def, fragment, subtree: Arc::new(subtree), file_id: macro_call.file_id };
107
108 Some(db.intern_eager_expansion(eager))
109 } else {
110 None
111 }
112}