Unnamed repository; edit this file 'description' to name the repository.
turn queries into methods on `HirFileId`
39 files changed, 175 insertions, 182 deletions
diff --git a/crates/hir-def/src/attrs/docs.rs b/crates/hir-def/src/attrs/docs.rs index cb91f08af3..69eac7b3c9 100644 --- a/crates/hir-def/src/attrs/docs.rs +++ b/crates/hir-def/src/attrs/docs.rs @@ -401,7 +401,7 @@ fn expand_doc_macro_call<'db>( let new_source_ctx = DocExprSourceCtx { resolver: source_ctx.resolver.clone(), file_id: expansion_file_id, - ast_id_map: expander.db.ast_id_map(expansion_file_id), + ast_id_map: expansion_file_id.ast_id_map(expander.db), span_map: expander.db.span_map(expansion_file_id), }; Some((expr, new_source_ctx)) @@ -456,7 +456,7 @@ fn extend_with_attrs<'a, 'db>( DocExprSourceCtx { resolver, file_id, - ast_id_map: db.ast_id_map(file_id), + ast_id_map: file_id.ast_id_map(db), span_map: db.span_map(file_id), }, ) diff --git a/crates/hir-def/src/expr_store/expander.rs b/crates/hir-def/src/expr_store/expander.rs index 35cf1c9681..fbe7bab457 100644 --- a/crates/hir-def/src/expr_store/expander.rs +++ b/crates/hir-def/src/expr_store/expander.rs @@ -47,7 +47,7 @@ impl<'db> Expander<'db> { recursion_depth: 0, recursion_limit, span_map: db.span_map(current_file_id), - ast_id_map: db.ast_id_map(current_file_id), + ast_id_map: current_file_id.ast_id_map(db), } } @@ -201,7 +201,7 @@ impl<'db> Expander<'db> { let old_span_map = std::mem::replace(&mut self.span_map, SpanMap::ExpansionSpanMap(&res.value.1)); let prev_ast_id_map = - mem::replace(&mut self.ast_id_map, db.ast_id_map(self.current_file_id)); + mem::replace(&mut self.ast_id_map, self.current_file_id.ast_id_map(db)); let mark = Mark { file_id: old_file_id, span_map: old_span_map, diff --git a/crates/hir-def/src/item_tree.rs b/crates/hir-def/src/item_tree.rs index 4b50161c04..ffd89e41ff 100644 --- a/crates/hir-def/src/item_tree.rs +++ b/crates/hir-def/src/item_tree.rs @@ -146,7 +146,7 @@ fn file_item_tree_query( let _p = tracing::info_span!("file_item_tree_query", ?file_id).entered(); let ctx = lower::Ctx::new(db, file_id, krate); - let syntax = db.parse_or_expand(file_id); + let syntax = file_id.parse_or_expand(db); let mut item_tree = match_ast! { match syntax { ast::SourceFile(file) => { diff --git a/crates/hir-def/src/item_tree/lower.rs b/crates/hir-def/src/item_tree/lower.rs index 91c2e60fd7..b0d9d960d8 100644 --- a/crates/hir-def/src/item_tree/lower.rs +++ b/crates/hir-def/src/item_tree/lower.rs @@ -40,7 +40,7 @@ impl<'db> Ctx<'db> { Self { db, tree: ItemTree::default(), - source_ast_id_map: db.ast_id_map(file), + source_ast_id_map: file.ast_id_map(db), file, cfg_options: OnceCell::new(), span_map: OnceCell::new(), diff --git a/crates/hir-def/src/macro_expansion_tests/mod.rs b/crates/hir-def/src/macro_expansion_tests/mod.rs index 88f41274e4..c53a7321e8 100644 --- a/crates/hir-def/src/macro_expansion_tests/mod.rs +++ b/crates/hir-def/src/macro_expansion_tests/mod.rs @@ -75,7 +75,7 @@ fn check_errors(#[rust_analyzer::rust_fixture] ra_fixture: &str, expect: Expect) ast_id.file_id.file_id().expect("macros inside macros are not supported"); let ast = editioned_file_id.parse(&db).syntax_node(); - let ast_id_map = db.ast_id_map(ast_id.file_id); + let ast_id_map = ast_id.file_id.ast_id_map(&db); let node = ast_id_map.get_erased(ast_id.value).to_node(&ast); Some((node.text_range(), errors)) }) @@ -120,7 +120,7 @@ pub fn identity_when_valid(_attr: TokenStream, item: TokenStream) -> TokenStream let mut expansions = Vec::new(); for macro_call_node in source_file.syntax().descendants().filter_map(ast::MacroCall::cast) { - let ast_id = db.ast_id_map(source.file_id).ast_id(¯o_call_node); + let ast_id = source.file_id.ast_id_map(&db).ast_id(¯o_call_node); let ast_id = InFile::new(source.file_id, ast_id); let ptr = InFile::new(source.file_id, AstPtr::new(¯o_call_node)); let macro_call_id = resolve_macro_call_id(&db, def_map, ast_id, ptr) @@ -476,7 +476,7 @@ m!(g); .collect(); for macro_call_node in source_file.syntax().descendants().filter_map(ast::MacroCall::cast) { - let ast_id = db.ast_id_map(source.file_id).ast_id(¯o_call_node); + let ast_id = source.file_id.ast_id_map(&db).ast_id(¯o_call_node); let ast_id = InFile::new(source.file_id, ast_id); let ptr = InFile::new(source.file_id, AstPtr::new(¯o_call_node)); let macro_call_id = resolve_macro_call_id(&db, def_map, ast_id, ptr) diff --git a/crates/hir-def/src/nameres/assoc.rs b/crates/hir-def/src/nameres/assoc.rs index cc88d21fbf..8bac83c369 100644 --- a/crates/hir-def/src/nameres/assoc.rs +++ b/crates/hir-def/src/nameres/assoc.rs @@ -51,7 +51,7 @@ impl TraitItems { tr: TraitId, ) -> (TraitItems, DefDiagnostics) { let ItemLoc { container: module_id, id: ast_id } = *tr.lookup(db); - let ast_id_map = db.ast_id_map(ast_id.file_id); + let ast_id_map = ast_id.file_id.ast_id_map(db); let source = ast_id.with_value(ast_id_map.get(ast_id.value)).to_node(db); if source.eq_token().is_some() { // FIXME(trait-alias) probably needs special handling here @@ -162,7 +162,7 @@ impl<'db> AssocItemCollector<'db> { module_id, def_map, local_def_map, - ast_id_map: db.ast_id_map(file_id), + ast_id_map: file_id.ast_id_map(db), span_map: db.span_map(file_id), cfg_options: module_id.krate(db).cfg_options(db), file_id, @@ -358,7 +358,7 @@ impl<'db> AssocItemCollector<'db> { let (syntax, span_map) = ¯o_call_id.parse_macro_expansion(self.db).value; let old_file_id = mem::replace(&mut self.file_id, macro_call_id.into()); - let old_ast_id_map = mem::replace(&mut self.ast_id_map, self.db.ast_id_map(self.file_id)); + let old_ast_id_map = mem::replace(&mut self.ast_id_map, self.file_id.ast_id_map(self.db)); let old_span_map = mem::replace(&mut self.span_map, SpanMap::ExpansionSpanMap(span_map)); self.depth += 1; diff --git a/crates/hir-def/src/nameres/tests/incremental.rs b/crates/hir-def/src/nameres/tests/incremental.rs index e7aa994c07..8e339fa973 100644 --- a/crates/hir-def/src/nameres/tests/incremental.rs +++ b/crates/hir-def/src/nameres/tests/incremental.rs @@ -166,15 +166,15 @@ fn no() {} [ "crate_local_def_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "EnumVariants::of_", @@ -183,7 +183,7 @@ fn no() {} expect![[r#" [ "parse", - "ast_id_map", + "HirFileId::ast_id_map_", "file_item_tree_query", "real_span_map", "EnumVariants::of_", @@ -224,21 +224,21 @@ pub struct S {} [ "crate_local_def_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "DeclarativeMacroExpander::expander_", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "macro_def_shim", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "MacroCallId::parse_macro_expansion_", "MacroCallId::macro_arg_", ] @@ -246,12 +246,12 @@ pub struct S {} expect![[r#" [ "parse", - "ast_id_map", + "HirFileId::ast_id_map_", "file_item_tree_query", "real_span_map", "MacroCallId::macro_arg_", "MacroCallId::parse_macro_expansion_", - "ast_id_map", + "HirFileId::ast_id_map_", "file_item_tree_query", ] "#]], @@ -282,26 +282,26 @@ fn f() { foo } [ "crate_local_def_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "crate_local_def_map", "ProcMacros::get_for_crate_", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "macro_def_shim", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "MacroCallId::parse_macro_expansion_", "MacroCallId::expand_proc_macro_", "MacroCallId::macro_arg_", @@ -311,13 +311,13 @@ fn f() { foo } expect![[r#" [ "parse", - "ast_id_map", + "HirFileId::ast_id_map_", "file_item_tree_query", "real_span_map", "MacroCallId::macro_arg_", "MacroCallId::expand_proc_macro_", "MacroCallId::parse_macro_expansion_", - "ast_id_map", + "HirFileId::ast_id_map_", "file_item_tree_query", ] "#]], @@ -406,38 +406,38 @@ pub struct S {} [ "crate_local_def_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "crate_local_def_map", "ProcMacros::get_for_crate_", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "DeclarativeMacroExpander::expander_", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "macro_def_shim", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "MacroCallId::parse_macro_expansion_", "MacroCallId::macro_arg_", "DeclarativeMacroExpander::expander_", "macro_def_shim", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "MacroCallId::parse_macro_expansion_", "MacroCallId::macro_arg_", "macro_def_shim", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "MacroCallId::parse_macro_expansion_", "MacroCallId::expand_proc_macro_", "MacroCallId::macro_arg_", @@ -447,7 +447,7 @@ pub struct S {} expect![[r#" [ "parse", - "ast_id_map", + "HirFileId::ast_id_map_", "file_item_tree_query", "real_span_map", "MacroCallId::macro_arg_", @@ -523,29 +523,29 @@ m!(Z); [ "crate_local_def_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "DeclarativeMacroExpander::expander_", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "macro_def_shim", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "MacroCallId::parse_macro_expansion_", "MacroCallId::macro_arg_", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "MacroCallId::parse_macro_expansion_", "MacroCallId::macro_arg_", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "MacroCallId::parse_macro_expansion_", "MacroCallId::macro_arg_", ] @@ -572,7 +572,7 @@ m!(Z); expect![[r#" [ "parse", - "ast_id_map", + "HirFileId::ast_id_map_", "file_item_tree_query", "real_span_map", "MacroCallId::macro_arg_", @@ -610,7 +610,7 @@ pub type Ty = (); expect![[r#" [ "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", ] @@ -630,7 +630,7 @@ pub type Ty = (); expect![[r#" [ "parse", - "ast_id_map", + "HirFileId::ast_id_map_", "file_item_tree_query", "real_span_map", ] diff --git a/crates/hir-def/src/signatures.rs b/crates/hir-def/src/signatures.rs index e9307a1255..5a4f78cfbc 100644 --- a/crates/hir-def/src/signatures.rs +++ b/crates/hir-def/src/signatures.rs @@ -1068,7 +1068,7 @@ impl EnumVariants { ) -> (EnumVariants, ThinVec<InactiveEnumVariantCode>) { let loc = e.lookup(db); let source = loc.source(db); - let ast_id_map = db.ast_id_map(source.file_id); + let ast_id_map = source.file_id.ast_id_map(db); let mut diagnostics = ThinVec::new(); let cfg_options = loc.container.krate(db).cfg_options(db); diff --git a/crates/hir-def/src/src.rs b/crates/hir-def/src/src.rs index e33fd95908..6d60030798 100644 --- a/crates/hir-def/src/src.rs +++ b/crates/hir-def/src/src.rs @@ -14,7 +14,7 @@ pub trait HasSource { type Value: AstNode; fn source(&self, db: &dyn DefDatabase) -> InFile<Self::Value> { let InFile { file_id, value } = self.ast_ptr(db); - InFile::new(file_id, value.to_node(&db.parse_or_expand(file_id))) + InFile::new(file_id, value.to_node(&file_id.parse_or_expand(db))) } fn ast_ptr(&self, db: &dyn DefDatabase) -> InFile<AstPtr<Self::Value>>; } @@ -26,7 +26,7 @@ where type Value = T::Ast; fn ast_ptr(&self, db: &dyn DefDatabase) -> InFile<AstPtr<Self::Value>> { let id = self.ast_id(); - let ast_id_map = db.ast_id_map(id.file_id); + let ast_id_map = id.file_id.ast_id_map(db); InFile::new(id.file_id, ast_id_map.get(id.value)) } } diff --git a/crates/hir-expand/src/db.rs b/crates/hir-expand/src/db.rs index c8a8be4311..69c8ffe609 100644 --- a/crates/hir-expand/src/db.rs +++ b/crates/hir-expand/src/db.rs @@ -1,8 +1,8 @@ //! Defines database & queries for macro expansion. use base_db::{Crate, SourceDatabase}; -use span::{AstIdMap, Span}; -use syntax::{AstNode, Parse, SyntaxNode, SyntaxToken, ast}; +use span::Span; +use syntax::{AstNode, SyntaxNode, SyntaxToken, ast}; use syntax_bridge::{DocCommentDesugarMode, syntax_node_to_token_tree}; use crate::{ @@ -37,23 +37,17 @@ pub enum TokenExpander<'db> { #[query_group::query_group] pub trait ExpandDatabase: SourceDatabase { - #[salsa::invoke(ast_id_map)] - #[salsa::transparent] - fn ast_id_map(&self, file_id: HirFileId) -> &AstIdMap; - #[salsa::transparent] fn resolve_span(&self, span: Span) -> FileRange; #[salsa::transparent] - fn parse_or_expand(&self, file_id: HirFileId) -> SyntaxNode; - - #[salsa::transparent] #[salsa::invoke(SpanMap::new)] fn span_map(&self, file_id: HirFileId) -> SpanMap<'_>; #[salsa::transparent] #[salsa::invoke(crate::span_map::expansion_span_map)] fn expansion_span_map(&self, file_id: MacroCallId) -> &ExpansionSpanMap; + #[salsa::invoke(crate::span_map::real_span_map)] #[salsa::transparent] fn real_span_map(&self, file_id: EditionedFileId) -> &RealSpanMap; @@ -76,7 +70,7 @@ pub trait ExpandDatabase: SourceDatabase { fn resolve_span(db: &dyn ExpandDatabase, Span { range, anchor, ctx: _ }: Span) -> FileRange { let file_id = EditionedFileId::from_span_file_id(db, anchor.file_id); let anchor_offset = - db.ast_id_map(file_id.into()).get_erased(anchor.ast_id).text_range().start(); + HirFileId::from(file_id).ast_id_map(db).get_erased(anchor.ast_id).text_range().start(); FileRange { file_id, range: range + anchor_offset } } @@ -255,37 +249,6 @@ pub fn expand_speculative( Some((node.syntax_node(), token)) } -#[salsa::tracked(lru = 1024, returns(ref))] -fn ast_id_map(db: &dyn ExpandDatabase, file_id: HirFileId) -> AstIdMap { - AstIdMap::from_source(&db.parse_or_expand(file_id)) -} - -/// Main public API -- parses a hir file, not caring whether it's a real -/// file or a macro expansion. -fn parse_or_expand(db: &dyn ExpandDatabase, file_id: HirFileId) -> SyntaxNode { - match file_id { - HirFileId::FileId(file_id) => file_id.parse(db).syntax_node(), - HirFileId::MacroFile(macro_file) => { - macro_file.parse_macro_expansion(db).value.0.syntax_node() - } - } -} - -pub(crate) fn parse_with_map( - db: &dyn ExpandDatabase, - file_id: HirFileId, -) -> (Parse<SyntaxNode>, SpanMap<'_>) { - match file_id { - HirFileId::FileId(file_id) => { - (file_id.parse(db).to_syntax(), SpanMap::RealSpanMap(db.real_span_map(file_id))) - } - HirFileId::MacroFile(macro_file) => { - let (parse, map) = ¯o_file.parse_macro_expansion(db).value; - (parse.clone(), SpanMap::ExpansionSpanMap(map)) - } - } -} - impl<'db> TokenExpander<'db> { fn macro_expander(db: &'db dyn ExpandDatabase, id: MacroDefId) -> TokenExpander<'db> { match id.kind { diff --git a/crates/hir-expand/src/declarative.rs b/crates/hir-expand/src/declarative.rs index 107014164e..5ba30f1256 100644 --- a/crates/hir-expand/src/declarative.rs +++ b/crates/hir-expand/src/declarative.rs @@ -87,7 +87,8 @@ impl DeclarativeMacroExpander { def_crate: Crate, id: AstId<ast::Macro>, ) -> DeclarativeMacroExpander { - let (root, map) = crate::db::parse_with_map(db, id.file_id); + let (root, map) = id.file_id.parse_with_map(db); + let root = root.syntax_node(); let transparency = |node: ast::AnyHasAttrs| { diff --git a/crates/hir-expand/src/eager.rs b/crates/hir-expand/src/eager.rs index 30e9624b2b..16053840b7 100644 --- a/crates/hir-expand/src/eager.rs +++ b/crates/hir-expand/src/eager.rs @@ -206,7 +206,7 @@ fn eager_macro_recur( continue; } }; - let ast_id = db.ast_id_map(curr.file_id).ast_id(&call); + let ast_id = curr.file_id.ast_id_map(db).ast_id(&call); let ExpandResult { value, err } = match def.kind { MacroDefKind::BuiltInEager(..) => { let ExpandResult { value, err } = expand_eager_macro_input( diff --git a/crates/hir-expand/src/files.rs b/crates/hir-expand/src/files.rs index 5f03e1b6b3..a5e2433880 100644 --- a/crates/hir-expand/src/files.rs +++ b/crates/hir-expand/src/files.rs @@ -94,16 +94,16 @@ pub type AstId<N> = crate::InFile<FileAstId<N>>; impl<N: AstNode> AstId<N> { pub fn to_node(&self, db: &dyn ExpandDatabase) -> N { - self.to_ptr(db).to_node(&db.parse_or_expand(self.file_id)) + self.to_ptr(db).to_node(&self.file_id.parse_or_expand(db)) } pub fn to_range(&self, db: &dyn ExpandDatabase) -> TextRange { self.to_ptr(db).text_range() } pub fn to_in_file_node(&self, db: &dyn ExpandDatabase) -> crate::InFile<N> { - crate::InFile::new(self.file_id, self.to_ptr(db).to_node(&db.parse_or_expand(self.file_id))) + crate::InFile::new(self.file_id, self.to_ptr(db).to_node(&self.file_id.parse_or_expand(db))) } pub fn to_ptr(&self, db: &dyn ExpandDatabase) -> AstPtr<N> { - db.ast_id_map(self.file_id).get(self.value) + self.file_id.ast_id_map(db).get(self.value) } pub fn erase(&self) -> ErasedAstId { crate::InFile::new(self.file_id, self.value.erase()) @@ -124,7 +124,7 @@ impl ErasedAstId { self.to_ptr(db).text_range() } pub fn to_ptr(&self, db: &dyn ExpandDatabase) -> SyntaxNodePtr { - db.ast_id_map(self.file_id).get_erased(self.value) + self.file_id.ast_id_map(db).get_erased(self.value) } } @@ -218,7 +218,7 @@ impl FileIdToSyntax for MacroCallId { } impl FileIdToSyntax for HirFileId { fn file_syntax(self, db: &dyn db::ExpandDatabase) -> SyntaxNode { - db.parse_or_expand(self) + self.parse_or_expand(db) } } diff --git a/crates/hir-expand/src/lib.rs b/crates/hir-expand/src/lib.rs index 73647d0ece..719a38edf4 100644 --- a/crates/hir-expand/src/lib.rs +++ b/crates/hir-expand/src/lib.rs @@ -39,7 +39,8 @@ use base_db::Crate; use either::Either; use mbe::MatchedArmIndex; use span::{ - Edition, ErasedFileAstId, FileAstId, NO_DOWNMAP_ERASED_FILE_AST_ID_MARKER, Span, SyntaxContext, + AstIdMap, Edition, ErasedFileAstId, FileAstId, NO_DOWNMAP_ERASED_FILE_AST_ID_MARKER, Span, + SyntaxContext, }; use syntax::{ Parse, SyntaxError, SyntaxNode, SyntaxToken, T, TextRange, TextSize, @@ -486,7 +487,7 @@ impl MacroCallId { #[salsa::tracked] impl MacroCallId { - /// Implementation of [`crate::db::parse_or_expand`] for the macro case. + /// Implementation of [`HirFileId::parse_or_expand`] for the macro case. // FIXME: We should verify that the parsed node is one of the many macro node variants we expect // instead of having it be untyped #[salsa::tracked(returns(ref), lru = 512)] @@ -550,7 +551,7 @@ impl MacroCallId { return (eager.arg.clone(), SyntaxFixupUndoInfo::NONE, eager.span); } - let (parse, map) = crate::db::parse_with_map(db, loc.kind.file_id()); + let (parse, map) = loc.kind.file_id().parse_with_map(db); let root = parse.syntax_node(); let (is_derive, censor_item_tree_attr_ids, item_node, span) = match &loc.kind { @@ -790,8 +791,8 @@ fn expand_unimplemented_builtin_macro(span: Span) -> ExpandResult<tt::TopSubtree fn proc_macro_span(db: &dyn ExpandDatabase, ast: AstId<ast::Fn>) -> Span { #[salsa::tracked] fn proc_macro_span(db: &dyn ExpandDatabase, ast: AstId<ast::Fn>, _: ()) -> Span { - let root = db.parse_or_expand(ast.file_id); - let ast_id_map = db.ast_id_map(ast.file_id); + let root = ast.file_id.parse_or_expand(db); + let ast_id_map = ast.file_id.ast_id_map(db); let span_map = db.span_map(ast.file_id); let node = ast_id_map.get(ast.value).to_node(&root); @@ -854,10 +855,10 @@ impl MacroDefId { | MacroDefKind::BuiltInDerive(id, _) | MacroDefKind::BuiltInEager(id, _) | MacroDefKind::UnimplementedBuiltIn(id) => { - id.with_value(db.ast_id_map(id.file_id).get(id.value).text_range()) + id.with_value(id.file_id.ast_id_map(db).get(id.value).text_range()) } MacroDefKind::ProcMacro(id, _, _) => { - id.with_value(db.ast_id_map(id.file_id).get(id.value).text_range()) + id.with_value(id.file_id.ast_id_map(db).get(id.value).text_range()) } } } @@ -1513,4 +1514,38 @@ impl HirFileId { }; Some(attr.with_value(ast::Attr::cast(attr.value.clone())?)) } + + /// Main public API -- parses a hir file, not caring whether it's a real + /// file or a macro expansion. + pub fn parse_or_expand(self, db: &dyn ExpandDatabase) -> SyntaxNode { + match self { + HirFileId::FileId(file_id) => file_id.parse(db).syntax_node(), + HirFileId::MacroFile(macro_file) => { + macro_file.parse_macro_expansion(db).value.0.syntax_node() + } + } + } + + pub(crate) fn parse_with_map( + self, + db: &dyn ExpandDatabase, + ) -> (Parse<SyntaxNode>, SpanMap<'_>) { + match self { + HirFileId::FileId(file_id) => { + (file_id.parse(db).to_syntax(), SpanMap::RealSpanMap(db.real_span_map(file_id))) + } + HirFileId::MacroFile(macro_file) => { + let (parse, map) = ¯o_file.parse_macro_expansion(db).value; + (parse.clone(), SpanMap::ExpansionSpanMap(map)) + } + } + } +} + +#[salsa::tracked] +impl HirFileId { + #[salsa::tracked(lru = 1024, returns(ref))] + pub fn ast_id_map(self, db: &dyn ExpandDatabase) -> AstIdMap { + AstIdMap::from_source(&self.parse_or_expand(db)) + } } diff --git a/crates/hir-expand/src/span_map.rs b/crates/hir-expand/src/span_map.rs index d19eead4a8..1b588a8425 100644 --- a/crates/hir-expand/src/span_map.rs +++ b/crates/hir-expand/src/span_map.rs @@ -54,7 +54,7 @@ pub(crate) fn real_span_map( ) -> RealSpanMap { use syntax::ast::HasModuleItem; let mut pairs = vec![(syntax::TextSize::new(0), span::ROOT_ERASED_FILE_AST_ID)]; - let ast_id_map = db.ast_id_map(editioned_file_id.into()); + let ast_id_map = HirFileId::from(editioned_file_id).ast_id_map(db); let tree = editioned_file_id.parse(db).tree(); // This is an incrementality layer. Basically we can't use absolute ranges for our spans as that diff --git a/crates/hir-ty/src/tests.rs b/crates/hir-ty/src/tests.rs index 9ffe38e749..febd2a833a 100644 --- a/crates/hir-ty/src/tests.rs +++ b/crates/hir-ty/src/tests.rs @@ -25,7 +25,7 @@ use hir_def::{ src::HasSource, type_ref::TypeRefId, }; -use hir_expand::{FileRange, InFile, db::ExpandDatabase}; +use hir_expand::{FileRange, InFile}; use itertools::Itertools; use rustc_hash::FxHashMap; use stdx::format_to; @@ -278,7 +278,7 @@ fn expr_node( ) -> Option<InFile<SyntaxNode>> { Some(match body_source_map.expr_syntax(expr) { Ok(sp) => { - let root = db.parse_or_expand(sp.file_id); + let root = sp.file_id.parse_or_expand(db); sp.map(|ptr| ptr.to_node(&root).syntax().clone()) } Err(SyntheticSyntax) => return None, @@ -292,7 +292,7 @@ fn pat_node( ) -> Option<InFile<SyntaxNode>> { Some(match body_source_map.pat_syntax(pat) { Ok(sp) => { - let root = db.parse_or_expand(sp.file_id); + let root = sp.file_id.parse_or_expand(db); sp.map(|ptr| ptr.to_node(&root).syntax().clone()) } Err(SyntheticSyntax) => return None, @@ -306,7 +306,7 @@ fn type_node( ) -> Option<InFile<SyntaxNode>> { Some(match body_source_map.type_syntax(type_ref) { Ok(sp) => { - let root = db.parse_or_expand(sp.file_id); + let root = sp.file_id.parse_or_expand(db); sp.map(|ptr| ptr.to_node(&root).syntax().clone()) } Err(SyntheticSyntax) => return None, @@ -349,7 +349,7 @@ fn infer_with_mismatches(content: &str, include_mismatches: bool) -> String { if let Some((binding_id, syntax_ptr)) = self_param { let ty = &inference_result.type_of_binding[binding_id]; if let Some(syntax_ptr) = syntax_ptr { - let root = db.parse_or_expand(syntax_ptr.file_id); + let root = syntax_ptr.file_id.parse_or_expand(&db); let node = syntax_ptr.map(|ptr| ptr.to_node(&root).syntax().clone()); types.push((node, ty.as_ref())); } @@ -361,7 +361,7 @@ fn infer_with_mismatches(content: &str, include_mismatches: bool) -> String { } let node = match source_map.pat_syntax(pat) { Ok(sp) => { - let root = db.parse_or_expand(sp.file_id); + let root = sp.file_id.parse_or_expand(&db); sp.map(|ptr| ptr.to_node(&root).syntax().clone()) } Err(SyntheticSyntax) => continue, @@ -375,7 +375,7 @@ fn infer_with_mismatches(content: &str, include_mismatches: bool) -> String { for (expr, ty) in inference_result.type_of_expr.iter() { let node = match source_map.expr_syntax(expr) { Ok(sp) => { - let root = db.parse_or_expand(sp.file_id); + let root = sp.file_id.parse_or_expand(&db); sp.map(|ptr| ptr.to_node(&root).syntax().clone()) } Err(SyntheticSyntax) => continue, diff --git a/crates/hir-ty/src/tests/incremental.rs b/crates/hir-ty/src/tests/incremental.rs index 4c26b19120..3432d47b2f 100644 --- a/crates/hir-ty/src/tests/incremental.rs +++ b/crates/hir-ty/src/tests/incremental.rs @@ -34,7 +34,7 @@ fn foo() -> i32 { "source_root_crates", "crate_local_def_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "InferenceResult::for_body_", @@ -78,7 +78,7 @@ fn foo() -> i32 { expect_test::expect![[r#" [ "parse", - "ast_id_map", + "HirFileId::ast_id_map_", "file_item_tree_query", "real_span_map", "AttrFlags::query_", @@ -123,7 +123,7 @@ fn baz() -> i32 { "source_root_crates", "crate_local_def_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "InferenceResult::for_body_", @@ -194,7 +194,7 @@ fn baz() -> i32 { expect_test::expect![[r#" [ "parse", - "ast_id_map", + "HirFileId::ast_id_map_", "file_item_tree_query", "real_span_map", "AttrFlags::query_", @@ -247,7 +247,7 @@ $0", "source_root_crates", "crate_local_def_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "TraitImpls::for_crate_", @@ -284,7 +284,7 @@ pub struct NewStruct { expect_test::expect![[r#" [ "parse", - "ast_id_map", + "HirFileId::ast_id_map_", "file_item_tree_query", "real_span_map", "crate_local_def_map", @@ -322,7 +322,7 @@ $0", "source_root_crates", "crate_local_def_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "TraitImpls::for_crate_", @@ -360,7 +360,7 @@ pub enum SomeEnum { expect_test::expect![[r#" [ "parse", - "ast_id_map", + "HirFileId::ast_id_map_", "file_item_tree_query", "real_span_map", "crate_local_def_map", @@ -398,7 +398,7 @@ $0", "source_root_crates", "crate_local_def_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "TraitImpls::for_crate_", @@ -433,7 +433,7 @@ fn bar() -> f32 { expect_test::expect![[r#" [ "parse", - "ast_id_map", + "HirFileId::ast_id_map_", "file_item_tree_query", "real_span_map", "crate_local_def_map", @@ -475,7 +475,7 @@ $0", "source_root_crates", "crate_local_def_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "TraitImpls::for_crate_", @@ -518,7 +518,7 @@ impl SomeStruct { expect_test::expect![[r#" [ "parse", - "ast_id_map", + "HirFileId::ast_id_map_", "file_item_tree_query", "real_span_map", "crate_local_def_map", @@ -576,7 +576,7 @@ fn main() { "source_root_crates", "crate_local_def_map", "file_item_tree_query", - "ast_id_map", + "HirFileId::ast_id_map_", "parse", "real_span_map", "TraitItems::query_with_diagnostics_", @@ -671,7 +671,7 @@ fn main() { expect_test::expect![[r#" [ "parse", - "ast_id_map", + "HirFileId::ast_id_map_", "file_item_tree_query", "real_span_map", "crate_local_def_map", diff --git a/crates/hir/src/diagnostics.rs b/crates/hir/src/diagnostics.rs index d99ed37d7e..33a46a3e17 100644 --- a/crates/hir/src/diagnostics.rs +++ b/crates/hir/src/diagnostics.rs @@ -993,7 +993,7 @@ impl<'db> AnyDiagnostic<'db> { } InferenceDiagnostic::PathDiagnostic { node, diag } => { let source = expr_or_pat_syntax(*node)?; - let syntax = source.value.to_node(&db.parse_or_expand(source.file_id)); + let syntax = source.value.to_node(&source.file_id.parse_or_expand(db)); let path = match_ast! { match (syntax.syntax()) { ast::RecordExpr(it) => it.path()?, @@ -1296,7 +1296,7 @@ impl<'db> AnyDiagnostic<'db> { Some(match diag { TyLoweringDiagnostic::PathDiagnostic { source, diag } => { let source = Self::type_syntax(*source, source_map)?; - let syntax = source.value.to_node(&db.parse_or_expand(source.file_id)); + let syntax = source.value.to_node(&source.file_id.parse_or_expand(db)); let ast::Type::PathType(syntax) = syntax else { return None }; Self::path_diagnostic(diag, source.with_value(syntax.path()?))? } diff --git a/crates/hir/src/has_source.rs b/crates/hir/src/has_source.rs index 9bff8bda3a..9248aaec02 100644 --- a/crates/hir/src/has_source.rs +++ b/crates/hir/src/has_source.rs @@ -297,7 +297,7 @@ impl HasSource for Param<'_> { let (_, source_map) = ExpressionStore::with_source_map(db, owner.expression_store_owner(db)); let ast @ InFile { file_id, value } = source_map.expr_syntax(expr_id).ok()?; - let root = db.parse_or_expand(file_id); + let root = file_id.parse_or_expand(db); match value.to_node(&root) { Either::Left(ast::Expr::ClosureExpr(it)) => it .param_list()? diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index ceac3f0876..a78ce2a2ab 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -813,7 +813,7 @@ impl Module { expr_store_diagnostics(db, acc, source_map); let (variants, diagnostics) = e.id.enum_variants_with_diagnostics(db); let file = e.id.lookup(db).id.file_id; - let ast_id_map = db.ast_id_map(file); + let ast_id_map = file.ast_id_map(db); for diag in diagnostics { acc.push( InactiveCode { @@ -883,7 +883,7 @@ impl Module { .iter() .for_each(|&(_ast, call_id)| macro_call_diagnostics(db, call_id, acc)); - let ast_id_map = db.ast_id_map(file_id); + let ast_id_map = file_id.ast_id_map(db); for diag in impl_id.impl_items_with_diagnostics(db).1.iter() { emit_def_diagnostic(db, acc, diag, edition, loc.container.krate(db)); @@ -1170,7 +1170,7 @@ fn macro_call_diagnostics<'db>( let RenderedExpandError { message, error, kind } = err.render_to_string(db); if Some(err.span().anchor.file_id) == file_id.file_id().map(|it| it.span_file_id(db)) { range.value = err.span().range - + db.ast_id_map(file_id).get_erased(err.span().anchor.ast_id).text_range().start(); + + file_id.ast_id_map(db).get_erased(err.span().anchor.ast_id).text_range().start(); } acc.push(MacroError { range, message, error, kind }.into()); } @@ -1260,7 +1260,7 @@ fn emit_def_diagnostic_<'db>( } DefDiagnosticKind::UnconfiguredCode { ast_id, cfg, opts } => { - let ast_id_map = db.ast_id_map(ast_id.file_id); + let ast_id_map = ast_id.file_id.ast_id_map(db); let ptr = ast_id_map.get_erased(ast_id.value); acc.push( InactiveCode { diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs index 8fc08abef1..c696ebcf18 100644 --- a/crates/hir/src/semantics.rs +++ b/crates/hir/src/semantics.rs @@ -550,7 +550,7 @@ impl<'db> SemanticsImpl<'db> { } pub fn parse_or_expand(&self, file_id: HirFileId) -> SyntaxNode { - let node = self.db.parse_or_expand(file_id); + let node = file_id.parse_or_expand(self.db); self.cache(node.clone(), file_id); node } @@ -690,7 +690,7 @@ impl<'db> SemanticsImpl<'db> { pub fn derive_helpers_in_scope(&self, adt: &ast::Adt) -> Option<Vec<(Symbol, Symbol)>> { let sa = self.analyze_no_infer(adt.syntax())?; - let id = self.db.ast_id_map(sa.file_id).ast_id(adt); + let id = sa.file_id.ast_id_map(self.db).ast_id(adt); let result = sa .resolver .def_map() @@ -713,7 +713,7 @@ impl<'db> SemanticsImpl<'db> { })?; let attr_name = attr.path().and_then(|it| it.as_single_name_ref())?.as_name(); let sa = self.analyze_no_infer(adt.syntax())?; - let id = self.db.ast_id_map(sa.file_id).ast_id(&adt); + let id = sa.file_id.ast_id_map(self.db).ast_id(&adt); let res: Vec<_> = sa .resolver .def_map() @@ -1498,7 +1498,7 @@ impl<'db> SemanticsImpl<'db> { self.analyze_impl(InFile::new(expansion, &parent), None, false) })? .resolver; - let id = db.ast_id_map(expansion).ast_id(&adt); + let id = expansion.ast_id_map(db).ast_id(&adt); let helpers = resolver .def_map() .derive_helpers_in_scope(InFile::new(expansion, id))?; diff --git a/crates/hir/src/semantics/child_by_source.rs b/crates/hir/src/semantics/child_by_source.rs index 97c5a451ab..d9c98c920e 100644 --- a/crates/hir/src/semantics/child_by_source.rs +++ b/crates/hir/src/semantics/child_by_source.rs @@ -200,7 +200,7 @@ impl ChildBySource for EnumId { return; } - let ast_id_map = db.ast_id_map(loc.id.file_id); + let ast_id_map = loc.id.file_id.ast_id_map(db); self.enum_variants(db).variants.values().for_each(|&(variant, _)| { res[keys::ENUM_VARIANT].insert(ast_id_map.get(variant.lookup(db).id.value), variant); diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs index fc03f82135..59d029b1e2 100644 --- a/crates/hir/src/source_analyzer.rs +++ b/crates/hir/src/source_analyzer.rs @@ -1366,7 +1366,7 @@ impl<'db> SourceAnalyzer<'db> { }, ); if let Some(adt) = adt { - let ast_id = db.ast_id_map(self.file_id).ast_id(&adt); + let ast_id = self.file_id.ast_id_map(db).ast_id(&adt); if let Some(helpers) = self .resolver .def_map() diff --git a/crates/ide-diagnostics/src/handlers/incorrect_case.rs b/crates/ide-diagnostics/src/handlers/incorrect_case.rs index bda3f9bf0a..888f55cea7 100644 --- a/crates/ide-diagnostics/src/handlers/incorrect_case.rs +++ b/crates/ide-diagnostics/src/handlers/incorrect_case.rs @@ -1,4 +1,4 @@ -use hir::{CaseType, InFile, db::ExpandDatabase}; +use hir::{CaseType, InFile}; use ide_db::{assists::Assist, defs::NameClass, rename::RenameDefinition}; use syntax::AstNode; @@ -37,7 +37,7 @@ pub(crate) fn incorrect_case( } fn fixes(ctx: &DiagnosticsContext<'_, '_>, d: &hir::IncorrectCase) -> Option<Vec<Assist>> { - let root = ctx.sema.db.parse_or_expand(d.file); + let root = d.file.parse_or_expand(ctx.sema.db); let name_node = d.ident.to_node(&root); let def = NameClass::classify(&ctx.sema, &name_node)?.defined()?; diff --git a/crates/ide-diagnostics/src/handlers/missing_fields.rs b/crates/ide-diagnostics/src/handlers/missing_fields.rs index fe71707f07..2030be4368 100644 --- a/crates/ide-diagnostics/src/handlers/missing_fields.rs +++ b/crates/ide-diagnostics/src/handlers/missing_fields.rs @@ -1,8 +1,6 @@ use either::Either; use hir::{ - AssocItem, FindPathConfig, HasVisibility, HirDisplay, InFile, Type, - db::{ExpandDatabase, HirDatabase}, - sym, + AssocItem, FindPathConfig, HasVisibility, HirDisplay, InFile, Type, db::HirDatabase, sym, }; use ide_db::{ FxHashMap, @@ -65,7 +63,7 @@ fn fixes(ctx: &DiagnosticsContext<'_, '_>, d: &hir::MissingFields) -> Option<Vec return None; } - let root = ctx.sema.db.parse_or_expand(d.file); + let root = d.file.parse_or_expand(ctx.sema.db); let current_module = ctx.sema.scope(d.field_list_parent.to_node(&root).syntax()).map(|it| it.module()); diff --git a/crates/ide-diagnostics/src/handlers/missing_unsafe.rs b/crates/ide-diagnostics/src/handlers/missing_unsafe.rs index d279e9b4e8..808b76e082 100644 --- a/crates/ide-diagnostics/src/handlers/missing_unsafe.rs +++ b/crates/ide-diagnostics/src/handlers/missing_unsafe.rs @@ -1,4 +1,3 @@ -use hir::db::ExpandDatabase; use hir::{UnsafeLint, UnsafetyReason}; use ide_db::text_edit::TextEdit; use ide_db::{assists::Assist, source_change::SourceChange}; @@ -47,7 +46,7 @@ fn fixes(ctx: &DiagnosticsContext<'_, '_>, d: &hir::MissingUnsafe) -> Option<Vec return None; } - let root = ctx.sema.db.parse_or_expand(d.node.file_id); + let root = d.node.file_id.parse_or_expand(ctx.sema.db); let node = d.node.value.to_node(&root); let expr = node.syntax().ancestors().find_map(ast::Expr::cast)?; diff --git a/crates/ide-diagnostics/src/handlers/mutability_errors.rs b/crates/ide-diagnostics/src/handlers/mutability_errors.rs index 49aa6d7bd9..e4ee066653 100644 --- a/crates/ide-diagnostics/src/handlers/mutability_errors.rs +++ b/crates/ide-diagnostics/src/handlers/mutability_errors.rs @@ -1,4 +1,3 @@ -use hir::db::ExpandDatabase; use ide_db::source_change::SourceChange; use ide_db::text_edit::TextEdit; use syntax::{AstNode, SyntaxKind, SyntaxNode, SyntaxNodePtr, SyntaxToken, T, ast}; @@ -9,7 +8,7 @@ use crate::{Diagnostic, DiagnosticCode, DiagnosticsContext, fix}; // // This diagnostic is triggered on mutating an immutable variable. pub(crate) fn need_mut(ctx: &DiagnosticsContext<'_, '_>, d: &hir::NeedMut) -> Option<Diagnostic> { - let root = ctx.sema.db.parse_or_expand(d.span.file_id); + let root = d.span.file_id.parse_or_expand(ctx.sema.db); let node = d.span.value.to_node(&root); let mut span = d.span; if let Some(parent) = node.parent() diff --git a/crates/ide-diagnostics/src/handlers/no_such_field.rs b/crates/ide-diagnostics/src/handlers/no_such_field.rs index 3dd6744b05..f6fe83177f 100644 --- a/crates/ide-diagnostics/src/handlers/no_such_field.rs +++ b/crates/ide-diagnostics/src/handlers/no_such_field.rs @@ -1,5 +1,5 @@ use either::Either; -use hir::{HasSource, HirDisplay, Semantics, VariantId, db::ExpandDatabase}; +use hir::{HasSource, HirDisplay, Semantics, VariantId}; use ide_db::text_edit::TextEdit; use ide_db::{EditionedFileId, RootDatabase, source_change::SourceChange}; use syntax::{ @@ -32,7 +32,7 @@ pub(crate) fn no_such_field(ctx: &DiagnosticsContext<'_, '_>, d: &hir::NoSuchFie fn fixes(ctx: &DiagnosticsContext<'_, '_>, d: &hir::NoSuchField) -> Option<Vec<Assist>> { // FIXME: quickfix for pattern - let root = ctx.sema.db.parse_or_expand(d.field.file_id); + let root = d.field.file_id.parse_or_expand(ctx.sema.db); match &d.field.value.to_node(&root) { Either::Left(node) => { if let Some(private_field) = d.private { diff --git a/crates/ide-diagnostics/src/handlers/remove_trailing_return.rs b/crates/ide-diagnostics/src/handlers/remove_trailing_return.rs index b5a47e508e..7e431f3ff4 100644 --- a/crates/ide-diagnostics/src/handlers/remove_trailing_return.rs +++ b/crates/ide-diagnostics/src/handlers/remove_trailing_return.rs @@ -1,4 +1,4 @@ -use hir::{FileRange, db::ExpandDatabase, diagnostics::RemoveTrailingReturn}; +use hir::{FileRange, diagnostics::RemoveTrailingReturn}; use ide_db::text_edit::TextEdit; use ide_db::{assists::Assist, source_change::SourceChange}; use syntax::{AstNode, ast}; @@ -37,7 +37,7 @@ pub(crate) fn remove_trailing_return( } fn fixes(ctx: &DiagnosticsContext<'_, '_>, d: &RemoveTrailingReturn) -> Option<Vec<Assist>> { - let root = ctx.sema.db.parse_or_expand(d.return_expr.file_id); + let root = d.return_expr.file_id.parse_or_expand(ctx.sema.db); let return_expr = d.return_expr.value.to_node(&root); let stmt = return_expr.syntax().parent().and_then(ast::ExprStmt::cast); diff --git a/crates/ide-diagnostics/src/handlers/remove_unnecessary_else.rs b/crates/ide-diagnostics/src/handlers/remove_unnecessary_else.rs index aa7b57e292..337b05e21f 100644 --- a/crates/ide-diagnostics/src/handlers/remove_unnecessary_else.rs +++ b/crates/ide-diagnostics/src/handlers/remove_unnecessary_else.rs @@ -1,4 +1,4 @@ -use hir::{db::ExpandDatabase, diagnostics::RemoveUnnecessaryElse}; +use hir::diagnostics::RemoveUnnecessaryElse; use ide_db::text_edit::TextEdit; use ide_db::{assists::Assist, source_change::SourceChange}; use itertools::Itertools; @@ -41,7 +41,7 @@ pub(crate) fn remove_unnecessary_else( } fn fixes(ctx: &DiagnosticsContext<'_, '_>, d: &RemoveUnnecessaryElse) -> Option<Vec<Assist>> { - let root = ctx.sema.db.parse_or_expand(d.if_expr.file_id); + let root = d.if_expr.file_id.parse_or_expand(ctx.sema.db); let if_expr = d.if_expr.value.to_node(&root); let if_expr = ctx.sema.original_ast_node(if_expr)?; diff --git a/crates/ide-diagnostics/src/handlers/replace_filter_map_next_with_find_map.rs b/crates/ide-diagnostics/src/handlers/replace_filter_map_next_with_find_map.rs index f974c55023..e67d86b8a2 100644 --- a/crates/ide-diagnostics/src/handlers/replace_filter_map_next_with_find_map.rs +++ b/crates/ide-diagnostics/src/handlers/replace_filter_map_next_with_find_map.rs @@ -1,4 +1,4 @@ -use hir::{InFile, db::ExpandDatabase}; +use hir::InFile; use ide_db::source_change::SourceChange; use ide_db::text_edit::TextEdit; use syntax::{ @@ -29,7 +29,7 @@ fn fixes( ctx: &DiagnosticsContext<'_, '_>, d: &hir::ReplaceFilterMapNextWithFindMap, ) -> Option<Vec<Assist>> { - let root = ctx.sema.db.parse_or_expand(d.file); + let root = d.file.parse_or_expand(ctx.sema.db); let next_expr = d.next_expr.to_node(&root); let next_call = ast::MethodCallExpr::cast(next_expr.syntax().clone())?; diff --git a/crates/ide-diagnostics/src/handlers/trait_impl_redundant_assoc_item.rs b/crates/ide-diagnostics/src/handlers/trait_impl_redundant_assoc_item.rs index ee972f2d1d..9374688d0e 100644 --- a/crates/ide-diagnostics/src/handlers/trait_impl_redundant_assoc_item.rs +++ b/crates/ide-diagnostics/src/handlers/trait_impl_redundant_assoc_item.rs @@ -1,4 +1,4 @@ -use hir::{HasSource, HirDisplay, db::ExpandDatabase}; +use hir::{HasSource, HirDisplay}; use ide_db::text_edit::TextRange; use ide_db::{ assists::{Assist, AssistId}, @@ -82,7 +82,7 @@ fn quickfix_for_redundant_assoc_item( let file_id = d.file_id.file_id()?; let add_assoc_item_def = |builder: &mut SourceChangeBuilder| -> Option<()> { let db = ctx.sema.db; - let root = db.parse_or_expand(d.file_id); + let root = d.file_id.parse_or_expand(db); // don't modify trait def in outer crate let impl_def = d.impl_.to_node(&root); let current_crate = ctx.sema.scope(impl_def.syntax())?.krate(); diff --git a/crates/ide-diagnostics/src/handlers/type_mismatch.rs b/crates/ide-diagnostics/src/handlers/type_mismatch.rs index da6fc20c3e..8950850d4a 100644 --- a/crates/ide-diagnostics/src/handlers/type_mismatch.rs +++ b/crates/ide-diagnostics/src/handlers/type_mismatch.rs @@ -1,5 +1,5 @@ use either::Either; -use hir::{CallableKind, ClosureStyle, HirDisplay, InFile, db::ExpandDatabase}; +use hir::{CallableKind, ClosureStyle, HirDisplay, InFile}; use ide_db::{ famous_defs::FamousDefs, source_change::{SourceChange, SourceChangeBuilder}, @@ -151,7 +151,7 @@ fn add_missing_ok_or_some( expr_ptr: &InFile<AstPtr<ast::Expr>>, acc: &mut Vec<Assist>, ) -> Option<()> { - let root = ctx.db().parse_or_expand(expr_ptr.file_id); + let root = expr_ptr.file_id.parse_or_expand(ctx.db()); let expr = expr_ptr.value.to_node(&root); let hir::FileRange { file_id, range: expr_range } = ctx.sema.original_range_opt(expr.syntax())?; @@ -246,7 +246,7 @@ fn remove_unnecessary_wrapper( acc: &mut Vec<Assist>, ) -> Option<()> { let db = ctx.db(); - let root = db.parse_or_expand(expr_ptr.file_id); + let root = expr_ptr.file_id.parse_or_expand(db); let expr = expr_ptr.value.to_node(&root); // FIXME: support inside MacroCall? let expr = ctx.sema.original_ast_node(expr)?; @@ -327,7 +327,7 @@ fn remove_semicolon( expr_ptr: &InFile<AstPtr<ast::Expr>>, acc: &mut Vec<Assist>, ) -> Option<()> { - let root = ctx.db().parse_or_expand(expr_ptr.file_id); + let root = expr_ptr.file_id.parse_or_expand(ctx.db()); let expr = expr_ptr.value.to_node(&root); if !d.actual.is_unit() { return None; @@ -365,7 +365,7 @@ fn str_ref_to_owned( return None; } - let root = ctx.db().parse_or_expand(expr_ptr.file_id); + let root = expr_ptr.file_id.parse_or_expand(ctx.db()); let expr = expr_ptr.value.to_node(&root); let hir::FileRange { file_id, range } = ctx.sema.original_range_opt(expr.syntax())?; @@ -391,7 +391,7 @@ fn add_await( return None; } - let root = ctx.db().parse_or_expand(expr_ptr.file_id); + let root = expr_ptr.file_id.parse_or_expand(ctx.db()); let expr = expr_ptr.value.to_node(&root); let hir::FileRange { file_id, range } = ctx.sema.original_range_opt(expr.syntax())?; diff --git a/crates/ide-diagnostics/src/handlers/typed_hole.rs b/crates/ide-diagnostics/src/handlers/typed_hole.rs index e000d6388a..4c59482961 100644 --- a/crates/ide-diagnostics/src/handlers/typed_hole.rs +++ b/crates/ide-diagnostics/src/handlers/typed_hole.rs @@ -2,7 +2,6 @@ use std::ops::Not; use hir::{ ClosureStyle, FindPathConfig, HirDisplay, - db::ExpandDatabase, term_search::{TermSearchConfig, TermSearchCtx, term_search}, }; use ide_db::text_edit::TextEdit; @@ -46,7 +45,7 @@ pub(crate) fn typed_hole<'db>( fn fixes<'db>(ctx: &DiagnosticsContext<'_, 'db>, d: &hir::TypedHole<'db>) -> Option<Vec<Assist>> { let db = ctx.sema.db; - let root = db.parse_or_expand(d.expr.file_id); + let root = d.expr.file_id.parse_or_expand(db); let (original_range, _) = d.expr.as_ref().map(|it| it.to_node(&root)).syntax().original_file_range_opt(db)?; let scope = ctx.sema.scope(d.expr.value.to_node(&root).syntax())?; diff --git a/crates/ide-diagnostics/src/handlers/unresolved_field.rs b/crates/ide-diagnostics/src/handlers/unresolved_field.rs index 78e13677cf..682a8130a8 100644 --- a/crates/ide-diagnostics/src/handlers/unresolved_field.rs +++ b/crates/ide-diagnostics/src/handlers/unresolved_field.rs @@ -1,5 +1,5 @@ use either::Either; -use hir::{Adt, FileRange, HasSource, HirDisplay, InFile, Struct, Union, db::ExpandDatabase}; +use hir::{Adt, FileRange, HasSource, HirDisplay, InFile, Struct, Union}; use ide_db::text_edit::TextEdit; use ide_db::{ assists::{Assist, AssistId}, @@ -64,7 +64,7 @@ fn fixes(ctx: &DiagnosticsContext<'_, '_>, d: &hir::UnresolvedField<'_>) -> Opti // FIXME: Add Snippet Support fn field_fix(ctx: &DiagnosticsContext<'_, '_>, d: &hir::UnresolvedField<'_>) -> Option<Assist> { // Get the FileRange of the invalid field access - let root = ctx.sema.db.parse_or_expand(d.expr.file_id); + let root = d.expr.file_id.parse_or_expand(ctx.sema.db); let expr = d.expr.value.to_node(&root).left()?; let error_range = ctx.sema.original_range_opt(expr.syntax())?; @@ -266,7 +266,7 @@ fn method_fix( ctx: &DiagnosticsContext<'_, '_>, expr_ptr: &InFile<AstPtr<Either<ast::Expr, ast::Pat>>>, ) -> Option<Assist> { - let root = ctx.sema.db.parse_or_expand(expr_ptr.file_id); + let root = expr_ptr.file_id.parse_or_expand(ctx.sema.db); let expr = expr_ptr.value.to_node(&root); let FileRange { range, file_id } = ctx.sema.original_range_opt(expr.syntax())?; Some(Assist { diff --git a/crates/ide-diagnostics/src/handlers/unresolved_method.rs b/crates/ide-diagnostics/src/handlers/unresolved_method.rs index 01929a5144..853e9d9f56 100644 --- a/crates/ide-diagnostics/src/handlers/unresolved_method.rs +++ b/crates/ide-diagnostics/src/handlers/unresolved_method.rs @@ -1,4 +1,4 @@ -use hir::{FileRange, HirDisplay, InFile, db::ExpandDatabase}; +use hir::{FileRange, HirDisplay, InFile}; use ide_db::text_edit::TextEdit; use ide_db::{ assists::{Assist, AssistId}, @@ -82,7 +82,7 @@ fn field_fix( return None; } let expr_ptr = &d.expr; - let root = ctx.sema.db.parse_or_expand(expr_ptr.file_id); + let root = expr_ptr.file_id.parse_or_expand(ctx.sema.db); let expr = expr_ptr.value.to_node(&root); let (file_id, range) = match expr.left()? { ast::Expr::MethodCallExpr(mcall) => { @@ -118,7 +118,7 @@ fn assoc_func_fix( let db = ctx.sema.db; let expr_ptr = &d.expr; - let root = db.parse_or_expand(expr_ptr.file_id); + let root = expr_ptr.file_id.parse_or_expand(db); let expr: ast::Expr = expr_ptr.value.to_node(&root).left()?; let call = ast::MethodCallExpr::cast(expr.syntax().clone())?; diff --git a/crates/ide-diagnostics/src/handlers/unresolved_module.rs b/crates/ide-diagnostics/src/handlers/unresolved_module.rs index 1e0e9105d8..d5f2697bd2 100644 --- a/crates/ide-diagnostics/src/handlers/unresolved_module.rs +++ b/crates/ide-diagnostics/src/handlers/unresolved_module.rs @@ -1,4 +1,3 @@ -use hir::db::ExpandDatabase; use ide_db::{assists::Assist, base_db::AnchoredPathBuf, source_change::FileSystemEdit}; use itertools::Itertools; use syntax::AstNode; @@ -33,7 +32,7 @@ pub(crate) fn unresolved_module( } fn fixes(ctx: &DiagnosticsContext<'_, '_>, d: &hir::UnresolvedModule) -> Option<Vec<Assist>> { - let root = ctx.sema.db.parse_or_expand(d.decl.file_id); + let root = d.decl.file_id.parse_or_expand(ctx.sema.db); let unresolved_module = d.decl.value.to_node(&root); Some( d.candidates diff --git a/crates/load-cargo/src/lib.rs b/crates/load-cargo/src/lib.rs index 96c95ec277..4a97a5f05e 100644 --- a/crates/load-cargo/src/lib.rs +++ b/crates/load-cargo/src/lib.rs @@ -705,8 +705,8 @@ impl ProcMacroExpander for Expander { let call_site_ast_id = macro_call_loc.kind.erased_ast_id(); if let Some(editioned_file_id) = call_site_file.file_id() { - let range = db - .ast_id_map(editioned_file_id.into()) + let range = hir_expand::HirFileId::from(editioned_file_id) + .ast_id_map(db) .get_erased(call_site_ast_id) .text_range(); diff --git a/crates/rust-analyzer/src/cli/analysis_stats.rs b/crates/rust-analyzer/src/cli/analysis_stats.rs index 1a036c3b99..f53512e5ec 100644 --- a/crates/rust-analyzer/src/cli/analysis_stats.rs +++ b/crates/rust-analyzer/src/cli/analysis_stats.rs @@ -13,7 +13,7 @@ use cfg::{CfgAtom, CfgDiff}; use hir::{ Adt, AssocItem, Crate, DefWithBody, FindPathConfig, GenericDef, HasCrate, HasSource, HirDisplay, ModuleDef, Name, Variant, crate_lang_items, - db::{DefDatabase, ExpandDatabase, HirDatabase}, + db::{DefDatabase, HirDatabase}, }; use hir_def::{ DefWithBodyId, ExpressionStoreOwnerId, GenericDefId, SyntheticSyntax, @@ -1503,7 +1503,7 @@ fn location_csv_expr(db: &RootDatabase, vfs: &Vfs, sm: &BodySourceMap, expr_id: Ok(s) => s, Err(SyntheticSyntax) => return "synthetic,,".to_owned(), }; - let root = db.parse_or_expand(src.file_id); + let root = src.file_id.parse_or_expand(db); let node = src.map(|e| e.to_node(&root).syntax().clone()); let original_range = node.as_ref().original_file_range_rooted(db); let path = vfs.file_path(original_range.file_id.file_id(db)); @@ -1519,7 +1519,7 @@ fn location_csv_pat(db: &RootDatabase, vfs: &Vfs, sm: &BodySourceMap, pat_id: Pa Ok(s) => s, Err(SyntheticSyntax) => return "synthetic,,".to_owned(), }; - let root = db.parse_or_expand(src.file_id); + let root = src.file_id.parse_or_expand(db); let node = src.map(|e| e.to_node(&root).syntax().clone()); let original_range = node.as_ref().original_file_range_rooted(db); let path = vfs.file_path(original_range.file_id.file_id(db)); @@ -1538,7 +1538,7 @@ fn expr_syntax_range<'a>( ) -> Option<(&'a VfsPath, LineCol, LineCol)> { let src = sm.expr_syntax(expr_id); if let Ok(src) = src { - let root = db.parse_or_expand(src.file_id); + let root = src.file_id.parse_or_expand(db); let node = src.map(|e| e.to_node(&root).syntax().clone()); let original_range = node.as_ref().original_file_range_rooted(db); let path = vfs.file_path(original_range.file_id.file_id(db)); @@ -1559,7 +1559,7 @@ fn pat_syntax_range<'a>( ) -> Option<(&'a VfsPath, LineCol, LineCol)> { let src = sm.pat_syntax(pat_id); if let Ok(src) = src { - let root = db.parse_or_expand(src.file_id); + let root = src.file_id.parse_or_expand(db); let node = src.map(|e| e.to_node(&root).syntax().clone()); let original_range = node.as_ref().original_file_range_rooted(db); let path = vfs.file_path(original_range.file_id.file_id(db)); |