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.rs | 69 |
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); |