diff options
author | Jonas Schievink <[email protected]> | 2021-05-06 22:23:50 +0100 |
---|---|---|
committer | Jonas Schievink <[email protected]> | 2021-05-06 22:23:50 +0100 |
commit | 20ae41c1a12963e938cb3bd4c7c84007412d6fa6 (patch) | |
tree | 361153338ec7c32866a5477b3e7681d05a4b0b7c /crates/hir_def | |
parent | c4f9cb9b53314b584f6451908ce40bbd65453116 (diff) |
Reuse database in LowerCtx
Diffstat (limited to 'crates/hir_def')
-rw-r--r-- | crates/hir_def/src/body.rs | 2 | ||||
-rw-r--r-- | crates/hir_def/src/body/lower.rs | 4 | ||||
-rw-r--r-- | crates/hir_def/src/path.rs | 6 | ||||
-rw-r--r-- | crates/hir_def/src/path/lower.rs | 14 |
4 files changed, 11 insertions, 15 deletions
diff --git a/crates/hir_def/src/body.rs b/crates/hir_def/src/body.rs index 9510a8575..8360426f1 100644 --- a/crates/hir_def/src/body.rs +++ b/crates/hir_def/src/body.rs | |||
@@ -194,7 +194,7 @@ impl Expander { | |||
194 | 194 | ||
195 | fn parse_path(&mut self, db: &dyn DefDatabase, path: ast::Path) -> Option<Path> { | 195 | fn parse_path(&mut self, db: &dyn DefDatabase, path: ast::Path) -> Option<Path> { |
196 | let ctx = LowerCtx::with_hygiene(db, &self.cfg_expander.hygiene); | 196 | let ctx = LowerCtx::with_hygiene(db, &self.cfg_expander.hygiene); |
197 | Path::from_src(db, path, &ctx) | 197 | Path::from_src(path, &ctx) |
198 | } | 198 | } |
199 | 199 | ||
200 | fn resolve_path_as_macro(&self, db: &dyn DefDatabase, path: &ModPath) -> Option<MacroDefId> { | 200 | fn resolve_path_as_macro(&self, db: &dyn DefDatabase, path: &ModPath) -> Option<MacroDefId> { |
diff --git a/crates/hir_def/src/body/lower.rs b/crates/hir_def/src/body/lower.rs index e4fa7f9c9..75dc19c11 100644 --- a/crates/hir_def/src/body/lower.rs +++ b/crates/hir_def/src/body/lower.rs | |||
@@ -41,7 +41,7 @@ use crate::{ | |||
41 | use super::{diagnostics::BodyDiagnostic, ExprSource, PatSource}; | 41 | use super::{diagnostics::BodyDiagnostic, ExprSource, PatSource}; |
42 | 42 | ||
43 | pub struct LowerCtx<'a> { | 43 | pub struct LowerCtx<'a> { |
44 | db: &'a dyn DefDatabase, | 44 | pub db: &'a dyn DefDatabase, |
45 | hygiene: Hygiene, | 45 | hygiene: Hygiene, |
46 | file_id: Option<HirFileId>, | 46 | file_id: Option<HirFileId>, |
47 | source_ast_id_map: Option<Arc<AstIdMap>>, | 47 | source_ast_id_map: Option<Arc<AstIdMap>>, |
@@ -70,7 +70,7 @@ impl<'a> LowerCtx<'a> { | |||
70 | } | 70 | } |
71 | 71 | ||
72 | pub(crate) fn lower_path(&self, ast: ast::Path) -> Option<Path> { | 72 | pub(crate) fn lower_path(&self, ast: ast::Path) -> Option<Path> { |
73 | Path::from_src(self.db, ast, self) | 73 | Path::from_src(ast, self) |
74 | } | 74 | } |
75 | 75 | ||
76 | pub(crate) fn ast_id<N: AstNode>(&self, item: &N) -> Option<FileAstId<N>> { | 76 | pub(crate) fn ast_id<N: AstNode>(&self, item: &N) -> Option<FileAstId<N>> { |
diff --git a/crates/hir_def/src/path.rs b/crates/hir_def/src/path.rs index 64bff318e..a43441b1c 100644 --- a/crates/hir_def/src/path.rs +++ b/crates/hir_def/src/path.rs | |||
@@ -49,7 +49,7 @@ pub enum ImportAlias { | |||
49 | impl ModPath { | 49 | impl ModPath { |
50 | pub fn from_src(db: &dyn DefDatabase, path: ast::Path, hygiene: &Hygiene) -> Option<ModPath> { | 50 | pub fn from_src(db: &dyn DefDatabase, path: ast::Path, hygiene: &Hygiene) -> Option<ModPath> { |
51 | let ctx = LowerCtx::with_hygiene(db, hygiene); | 51 | let ctx = LowerCtx::with_hygiene(db, hygiene); |
52 | lower::lower_path(db, path, &ctx).map(|it| (*it.mod_path).clone()) | 52 | lower::lower_path(path, &ctx).map(|it| (*it.mod_path).clone()) |
53 | } | 53 | } |
54 | 54 | ||
55 | pub fn from_segments(kind: PathKind, segments: impl IntoIterator<Item = Name>) -> ModPath { | 55 | pub fn from_segments(kind: PathKind, segments: impl IntoIterator<Item = Name>) -> ModPath { |
@@ -169,8 +169,8 @@ pub enum GenericArg { | |||
169 | impl Path { | 169 | impl Path { |
170 | /// Converts an `ast::Path` to `Path`. Works with use trees. | 170 | /// Converts an `ast::Path` to `Path`. Works with use trees. |
171 | /// It correctly handles `$crate` based path from macro call. | 171 | /// It correctly handles `$crate` based path from macro call. |
172 | pub fn from_src(db: &dyn DefDatabase, path: ast::Path, ctx: &LowerCtx) -> Option<Path> { | 172 | pub fn from_src(path: ast::Path, ctx: &LowerCtx) -> Option<Path> { |
173 | lower::lower_path(db, path, ctx) | 173 | lower::lower_path(path, ctx) |
174 | } | 174 | } |
175 | 175 | ||
176 | /// Converts a known mod path to `Path`. | 176 | /// Converts a known mod path to `Path`. |
diff --git a/crates/hir_def/src/path/lower.rs b/crates/hir_def/src/path/lower.rs index 3b3a3738f..a873325b2 100644 --- a/crates/hir_def/src/path/lower.rs +++ b/crates/hir_def/src/path/lower.rs | |||
@@ -2,7 +2,7 @@ | |||
2 | 2 | ||
3 | mod lower_use; | 3 | mod lower_use; |
4 | 4 | ||
5 | use crate::{db::DefDatabase, intern::Interned}; | 5 | use crate::intern::Interned; |
6 | use std::sync::Arc; | 6 | use std::sync::Arc; |
7 | 7 | ||
8 | use either::Either; | 8 | use either::Either; |
@@ -20,11 +20,7 @@ pub(super) use lower_use::lower_use_tree; | |||
20 | 20 | ||
21 | /// Converts an `ast::Path` to `Path`. Works with use trees. | 21 | /// Converts an `ast::Path` to `Path`. Works with use trees. |
22 | /// It correctly handles `$crate` based path from macro call. | 22 | /// It correctly handles `$crate` based path from macro call. |
23 | pub(super) fn lower_path( | 23 | pub(super) fn lower_path(mut path: ast::Path, ctx: &LowerCtx) -> Option<Path> { |
24 | db: &dyn DefDatabase, | ||
25 | mut path: ast::Path, | ||
26 | ctx: &LowerCtx, | ||
27 | ) -> Option<Path> { | ||
28 | let mut kind = PathKind::Plain; | 24 | let mut kind = PathKind::Plain; |
29 | let mut type_anchor = None; | 25 | let mut type_anchor = None; |
30 | let mut segments = Vec::new(); | 26 | let mut segments = Vec::new(); |
@@ -40,7 +36,7 @@ pub(super) fn lower_path( | |||
40 | match segment.kind()? { | 36 | match segment.kind()? { |
41 | ast::PathSegmentKind::Name(name_ref) => { | 37 | ast::PathSegmentKind::Name(name_ref) => { |
42 | // FIXME: this should just return name | 38 | // FIXME: this should just return name |
43 | match hygiene.name_ref_to_name(db.upcast(), name_ref) { | 39 | match hygiene.name_ref_to_name(ctx.db.upcast(), name_ref) { |
44 | Either::Left(name) => { | 40 | Either::Left(name) => { |
45 | let args = segment | 41 | let args = segment |
46 | .generic_arg_list() | 42 | .generic_arg_list() |
@@ -75,7 +71,7 @@ pub(super) fn lower_path( | |||
75 | } | 71 | } |
76 | // <T as Trait<A>>::Foo desugars to Trait<Self=T, A>::Foo | 72 | // <T as Trait<A>>::Foo desugars to Trait<Self=T, A>::Foo |
77 | Some(trait_ref) => { | 73 | Some(trait_ref) => { |
78 | let path = Path::from_src(db, trait_ref.path()?, ctx)?; | 74 | let path = Path::from_src(trait_ref.path()?, ctx)?; |
79 | let mod_path = (*path.mod_path).clone(); | 75 | let mod_path = (*path.mod_path).clone(); |
80 | let num_segments = path.mod_path.segments.len(); | 76 | let num_segments = path.mod_path.segments.len(); |
81 | kind = mod_path.kind; | 77 | kind = mod_path.kind; |
@@ -137,7 +133,7 @@ pub(super) fn lower_path( | |||
137 | // We follow what it did anyway :) | 133 | // We follow what it did anyway :) |
138 | if segments.len() == 1 && kind == PathKind::Plain { | 134 | if segments.len() == 1 && kind == PathKind::Plain { |
139 | if let Some(_macro_call) = path.syntax().parent().and_then(ast::MacroCall::cast) { | 135 | if let Some(_macro_call) = path.syntax().parent().and_then(ast::MacroCall::cast) { |
140 | if let Some(crate_id) = hygiene.local_inner_macros(db.upcast(), path) { | 136 | if let Some(crate_id) = hygiene.local_inner_macros(ctx.db.upcast(), path) { |
141 | kind = PathKind::DollarCrate(crate_id); | 137 | kind = PathKind::DollarCrate(crate_id); |
142 | } | 138 | } |
143 | } | 139 | } |