Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-expand/src/eager.rs')
-rw-r--r--crates/hir-expand/src/eager.rs69
1 files changed, 45 insertions, 24 deletions
diff --git a/crates/hir-expand/src/eager.rs b/crates/hir-expand/src/eager.rs
index f476d1b564..28d3fcdab9 100644
--- a/crates/hir-expand/src/eager.rs
+++ b/crates/hir-expand/src/eager.rs
@@ -18,28 +18,34 @@
//!
//!
//! See the full discussion : <https://rust-lang.zulipchat.com/#narrow/stream/131828-t-compiler/topic/Eager.20expansion.20of.20built-in.20macros>
-use base_db::CrateId;
-use span::SyntaxContextId;
-use syntax::{ted, Parse, SyntaxElement, SyntaxNode, TextSize, WalkEvent};
+use base_db::Crate;
+use span::SyntaxContext;
+use syntax::{AstPtr, Parse, SyntaxElement, SyntaxNode, TextSize, WalkEvent, ted};
use syntax_bridge::DocCommentDesugarMode;
use triomphe::Arc;
use crate::{
+ AstId, EagerCallInfo, ExpandError, ExpandResult, ExpandTo, ExpansionSpanMap, InFile,
+ MacroCallId, MacroCallKind, MacroCallLoc, MacroDefId, MacroDefKind,
ast::{self, AstNode},
db::ExpandDatabase,
mod_path::ModPath,
- AstId, EagerCallInfo, ExpandError, ExpandResult, ExpandTo, ExpansionSpanMap, InFile, Intern,
- MacroCallId, MacroCallKind, MacroCallLoc, MacroDefId, MacroDefKind,
};
+pub type EagerCallBackFn<'a> = &'a mut dyn FnMut(
+ InFile<(syntax::AstPtr<ast::MacroCall>, span::FileAstId<ast::MacroCall>)>,
+ MacroCallId,
+);
+
pub fn expand_eager_macro_input(
db: &dyn ExpandDatabase,
- krate: CrateId,
+ krate: Crate,
macro_call: &ast::MacroCall,
ast_id: AstId<ast::MacroCall>,
def: MacroDefId,
- call_site: SyntaxContextId,
+ call_site: SyntaxContext,
resolver: &dyn Fn(&ModPath) -> Option<MacroDefId>,
+ eager_callback: EagerCallBackFn<'_>,
) -> ExpandResult<Option<MacroCallId>> {
let expand_to = ExpandTo::from_call_site(macro_call);
@@ -47,17 +53,17 @@ pub fn expand_eager_macro_input(
// When `lazy_expand` is called, its *parent* file must already exist.
// Here we store an eager macro id for the argument expanded subtree
// for that purpose.
- let arg_id = MacroCallLoc {
+ let loc = MacroCallLoc {
def,
krate,
kind: MacroCallKind::FnLike { ast_id, expand_to: ExpandTo::Expr, eager: None },
ctxt: call_site,
- }
- .intern(db);
+ };
+ let arg_id = db.intern_macro_call(loc);
#[allow(deprecated)] // builtin eager macros are never derives
let (_, _, span) = db.macro_arg(arg_id);
let ExpandResult { value: (arg_exp, arg_exp_map), err: parse_err } =
- db.parse_macro_expansion(arg_id.as_macro_file());
+ db.parse_macro_expansion(arg_id);
let mut arg_map = ExpansionSpanMap::empty();
@@ -67,10 +73,11 @@ pub fn expand_eager_macro_input(
&arg_exp_map,
&mut arg_map,
TextSize::new(0),
- InFile::new(arg_id.as_file(), arg_exp.syntax_node()),
+ InFile::new(arg_id.into(), arg_exp.syntax_node()),
krate,
call_site,
resolver,
+ eager_callback,
)
};
let err = parse_err.or(err);
@@ -107,7 +114,7 @@ pub fn expand_eager_macro_input(
ctxt: call_site,
};
- ExpandResult { value: Some(loc.intern(db)), err }
+ ExpandResult { value: Some(db.intern_macro_call(loc)), err }
}
fn lazy_expand(
@@ -115,8 +122,9 @@ fn lazy_expand(
def: &MacroDefId,
macro_call: &ast::MacroCall,
ast_id: AstId<ast::MacroCall>,
- krate: CrateId,
- call_site: SyntaxContextId,
+ krate: Crate,
+ call_site: SyntaxContext,
+ eager_callback: EagerCallBackFn<'_>,
) -> ExpandResult<(InFile<Parse<SyntaxNode>>, Arc<ExpansionSpanMap>)> {
let expand_to = ExpandTo::from_call_site(macro_call);
let id = def.make_call(
@@ -125,10 +133,9 @@ fn lazy_expand(
MacroCallKind::FnLike { ast_id, expand_to, eager: None },
call_site,
);
- let macro_file = id.as_macro_file();
+ eager_callback(ast_id.map(|ast_id| (AstPtr::new(macro_call), ast_id)), id);
- db.parse_macro_expansion(macro_file)
- .map(|parse| (InFile::new(macro_file.into(), parse.0), parse.1))
+ db.parse_macro_expansion(id).map(|parse| (InFile::new(id.into(), parse.0), parse.1))
}
fn eager_macro_recur(
@@ -137,9 +144,10 @@ fn eager_macro_recur(
expanded_map: &mut ExpansionSpanMap,
mut offset: TextSize,
curr: InFile<SyntaxNode>,
- krate: CrateId,
- call_site: SyntaxContextId,
+ krate: Crate,
+ call_site: SyntaxContext,
macro_resolver: &dyn Fn(&ModPath) -> Option<MacroDefId>,
+ eager_callback: EagerCallBackFn<'_>,
) -> ExpandResult<Option<(SyntaxNode, TextSize)>> {
let original = curr.value.clone_for_update();
@@ -176,7 +184,7 @@ fn eager_macro_recur(
Some(path) => match macro_resolver(&path) {
Some(def) => def,
None => {
- let edition = db.crate_graph()[krate].edition;
+ let edition = krate.data(db).edition;
error = Some(ExpandError::other(
span_map.span_at(call.syntax().text_range().start()),
format!("unresolved macro {}", path.display(db, edition)),
@@ -205,11 +213,16 @@ fn eager_macro_recur(
def,
call_site,
macro_resolver,
+ eager_callback,
);
match value {
Some(call_id) => {
+ eager_callback(
+ curr.with_value(ast_id).map(|ast_id| (AstPtr::new(&call), ast_id)),
+ call_id,
+ );
let ExpandResult { value: (parse, map), err: err2 } =
- db.parse_macro_expansion(call_id.as_macro_file());
+ db.parse_macro_expansion(call_id);
map.iter().for_each(|(o, span)| expanded_map.push(o + offset, span));
@@ -230,8 +243,15 @@ fn eager_macro_recur(
| MacroDefKind::BuiltInAttr(..)
| MacroDefKind::BuiltInDerive(..)
| MacroDefKind::ProcMacro(..) => {
- let ExpandResult { value: (parse, tm), err } =
- lazy_expand(db, &def, &call, curr.with_value(ast_id), krate, call_site);
+ let ExpandResult { value: (parse, tm), err } = lazy_expand(
+ db,
+ &def,
+ &call,
+ curr.with_value(ast_id),
+ krate,
+ call_site,
+ eager_callback,
+ );
// replace macro inside
let ExpandResult { value, err: error } = eager_macro_recur(
@@ -244,6 +264,7 @@ fn eager_macro_recur(
krate,
call_site,
macro_resolver,
+ eager_callback,
);
let err = err.or(error);