Skip to content

Commit cb06162

Browse files
committed
Move hypothetical expansion to hir_expand
1 parent f617455 commit cb06162

File tree

4 files changed

+42
-38
lines changed

4 files changed

+42
-38
lines changed

crates/ra_hir/src/semantics.rs

+3-21
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ use hir_expand::ExpansionInfo;
1212
use ra_db::{FileId, FileRange};
1313
use ra_prof::profile;
1414
use ra_syntax::{
15-
algo::{self, skip_trivia_token},
16-
ast, AstNode, Direction, SyntaxNode, SyntaxToken, TextRange, TextUnit,
15+
algo::skip_trivia_token, ast, AstNode, Direction, SyntaxNode, SyntaxToken, TextRange, TextUnit,
1716
};
1817
use rustc_hash::{FxHashMap, FxHashSet};
1918

@@ -74,32 +73,15 @@ impl<'db, DB: HirDatabase> Semantics<'db, DB> {
7473
pub fn expand_hypothetical(
7574
&self,
7675
actual_macro_call: &ast::MacroCall,
77-
hypothetical_call: &ast::MacroCall,
76+
hypothetical_args: &ast::TokenTree,
7877
token_to_map: SyntaxToken,
7978
) -> Option<(SyntaxNode, SyntaxToken)> {
8079
let macro_call =
8180
self.find_file(actual_macro_call.syntax().clone()).with_value(actual_macro_call);
8281
let sa = self.analyze2(macro_call.map(|it| it.syntax()), None);
8382
let macro_call_id = macro_call
8483
.as_call_id(self.db, |path| sa.resolver.resolve_path_as_macro(self.db, &path))?;
85-
let macro_file = macro_call_id.as_file().macro_file().unwrap();
86-
let (tt, tmap_1) =
87-
hir_expand::syntax_node_to_token_tree(hypothetical_call.token_tree().unwrap().syntax())
88-
.unwrap();
89-
let range = token_to_map
90-
.text_range()
91-
.checked_sub(hypothetical_call.token_tree().unwrap().syntax().text_range().start())?;
92-
let token_id = tmap_1.token_by_range(range)?;
93-
let macro_def = hir_expand::db::expander(self.db, macro_call_id)?;
94-
let (node, tmap_2) = hir_expand::db::parse_macro_with_arg(
95-
self.db,
96-
macro_file,
97-
Some(std::sync::Arc::new((tt, tmap_1))),
98-
)?;
99-
let token_id = macro_def.0.map_id_down(token_id);
100-
let range = tmap_2.range_by_token(token_id)?.by_kind(token_to_map.kind())?;
101-
let token = algo::find_covering_element(&node.syntax_node(), range).into_token()?;
102-
Some((node.syntax_node(), token))
84+
hir_expand::db::expand_hypothetical(self.db, macro_call_id, hypothetical_args, token_to_map)
10385
}
10486

10587
pub fn descend_into_macros(&self, token: SyntaxToken) -> SyntaxToken {

crates/ra_hir_expand/src/db.rs

+34-9
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,30 @@ pub trait AstDatabase: SourceDatabase {
7272
fn intern_eager_expansion(&self, eager: EagerCallLoc) -> EagerMacroId;
7373
}
7474

75+
/// This expands the given macro call, but with different arguments. This is
76+
/// used for completion, where we want to see what 'would happen' if we insert a
77+
/// token. The `token_to_map` mapped down into the expansion, with the mapped
78+
/// token returned.
79+
pub fn expand_hypothetical(
80+
db: &impl AstDatabase,
81+
actual_macro_call: MacroCallId,
82+
hypothetical_args: &ra_syntax::ast::TokenTree,
83+
token_to_map: ra_syntax::SyntaxToken,
84+
) -> Option<(SyntaxNode, ra_syntax::SyntaxToken)> {
85+
let macro_file = MacroFile { macro_call_id: actual_macro_call };
86+
let (tt, tmap_1) = crate::syntax_node_to_token_tree(hypothetical_args.syntax()).unwrap();
87+
let range =
88+
token_to_map.text_range().checked_sub(hypothetical_args.syntax().text_range().start())?;
89+
let token_id = tmap_1.token_by_range(range)?;
90+
let macro_def = expander(db, actual_macro_call)?;
91+
let (node, tmap_2) =
92+
parse_macro_with_arg(db, macro_file, Some(std::sync::Arc::new((tt, tmap_1))))?;
93+
let token_id = macro_def.0.map_id_down(token_id);
94+
let range = tmap_2.range_by_token(token_id)?.by_kind(token_to_map.kind())?;
95+
let token = ra_syntax::algo::find_covering_element(&node.syntax_node(), range).into_token()?;
96+
Some((node.syntax_node(), token))
97+
}
98+
7599
pub(crate) fn ast_id_map(db: &dyn AstDatabase, file_id: HirFileId) -> Arc<AstIdMap> {
76100
let map =
77101
db.parse_or_expand(file_id).map_or_else(AstIdMap::default, |it| AstIdMap::from_source(&it));
@@ -133,10 +157,7 @@ pub(crate) fn macro_expand(
133157
macro_expand_with_arg(db, id, None)
134158
}
135159

136-
pub fn expander(
137-
db: &dyn AstDatabase,
138-
id: MacroCallId,
139-
) -> Option<Arc<(TokenExpander, mbe::TokenMap)>> {
160+
fn expander(db: &dyn AstDatabase, id: MacroCallId) -> Option<Arc<(TokenExpander, mbe::TokenMap)>> {
140161
let lazy_id = match id {
141162
MacroCallId::LazyMacro(id) => id,
142163
MacroCallId::EagerMacro(_id) => {
@@ -149,7 +170,7 @@ pub fn expander(
149170
Some(macro_rules)
150171
}
151172

152-
pub(crate) fn macro_expand_with_arg(
173+
fn macro_expand_with_arg(
153174
db: &dyn AstDatabase,
154175
id: MacroCallId,
155176
arg: Option<Arc<(tt::Subtree, mbe::TokenMap)>>,
@@ -158,7 +179,9 @@ pub(crate) fn macro_expand_with_arg(
158179
MacroCallId::LazyMacro(id) => id,
159180
MacroCallId::EagerMacro(id) => {
160181
if arg.is_some() {
161-
return Err("hypothetical macro expansion not implemented for eager macro".to_owned());
182+
return Err(
183+
"hypothetical macro expansion not implemented for eager macro".to_owned()
184+
);
162185
} else {
163186
return Ok(db.lookup_intern_eager_expansion(id).subtree);
164187
}
@@ -225,13 +248,15 @@ pub fn parse_macro_with_arg(
225248
.collect::<Vec<_>>()
226249
.join("\n");
227250

228-
eprintln!(
251+
log::debug!(
229252
"fail on macro_parse: (reason: {} macro_call: {:#}) parents: {}",
230-
err, node.value, parents
253+
err,
254+
node.value,
255+
parents
231256
);
232257
}
233258
_ => {
234-
eprintln!("fail on macro_parse: (reason: {})", err);
259+
log::debug!("fail on macro_parse: (reason: {})", err);
235260
}
236261
}
237262
})

crates/ra_hir_expand/src/lib.rs

-7
Original file line numberDiff line numberDiff line change
@@ -157,13 +157,6 @@ impl HirFileId {
157157
}
158158
}
159159
}
160-
161-
pub fn macro_file(self) -> Option<MacroFile> {
162-
match self.0 {
163-
HirFileIdRepr::FileId(_) => None,
164-
HirFileIdRepr::MacroFile(m) => Some(m),
165-
}
166-
}
167160
}
168161

169162
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]

crates/ra_ide/src/completion/completion_context.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,15 @@ impl<'a> CompletionContext<'a> {
119119
{
120120
break;
121121
}
122+
let hypothetical_args = match macro_call_with_fake_ident.token_tree() {
123+
Some(tt) => tt,
124+
None => break,
125+
};
122126
if let (Some(actual_expansion), Some(hypothetical_expansion)) = (
123127
ctx.sema.expand(&actual_macro_call),
124128
ctx.sema.expand_hypothetical(
125129
&actual_macro_call,
126-
&macro_call_with_fake_ident,
130+
&hypothetical_args,
127131
fake_ident_token,
128132
),
129133
) {

0 commit comments

Comments
 (0)