diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-11-15 23:12:59 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2019-11-15 23:12:59 +0000 |
commit | d9d99369b2765eaef7f49cd519990769191c3381 (patch) | |
tree | 5685e9db16e4a35c7ff3158d5c09becf9a45b31d /crates/ra_hir/src/source_binder.rs | |
parent | 69f3b01dc5dd70d9bdf6de4d859ad593a689395d (diff) | |
parent | d898ecb8f2c19eb041bcb27c7ce9edd9d891f2c2 (diff) |
Merge #2271
2271: Force passing Source when creating a SourceAnalyzer r=matklad a=matklad
Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates/ra_hir/src/source_binder.rs')
-rw-r--r-- | crates/ra_hir/src/source_binder.rs | 51 |
1 files changed, 20 insertions, 31 deletions
diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 540ddd0b5..5764dc26d 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs | |||
@@ -12,7 +12,6 @@ use hir_def::{ | |||
12 | path::known, | 12 | path::known, |
13 | }; | 13 | }; |
14 | use hir_expand::{name::AsName, Source}; | 14 | use hir_expand::{name::AsName, Source}; |
15 | use ra_db::FileId; | ||
16 | use ra_syntax::{ | 15 | use ra_syntax::{ |
17 | ast::{self, AstNode}, | 16 | ast::{self, AstNode}, |
18 | match_ast, AstPtr, | 17 | match_ast, AstPtr, |
@@ -30,38 +29,32 @@ use crate::{ | |||
30 | HirFileId, Local, MacroDef, Module, Name, Path, Resolver, Static, Struct, Ty, | 29 | HirFileId, Local, MacroDef, Module, Name, Path, Resolver, Static, Struct, Ty, |
31 | }; | 30 | }; |
32 | 31 | ||
33 | fn try_get_resolver_for_node( | 32 | fn try_get_resolver_for_node(db: &impl HirDatabase, node: Source<&SyntaxNode>) -> Option<Resolver> { |
34 | db: &impl HirDatabase, | ||
35 | file_id: FileId, | ||
36 | node: &SyntaxNode, | ||
37 | ) -> Option<Resolver> { | ||
38 | match_ast! { | 33 | match_ast! { |
39 | match node { | 34 | match (node.ast) { |
40 | ast::Module(it) => { | 35 | ast::Module(it) => { |
41 | let src = crate::Source { file_id: file_id.into(), ast: it }; | 36 | let src = node.with_ast(it); |
42 | Some(crate::Module::from_declaration(db, src)?.resolver(db)) | 37 | Some(crate::Module::from_declaration(db, src)?.resolver(db)) |
43 | }, | 38 | }, |
44 | ast::SourceFile(it) => { | 39 | ast::SourceFile(it) => { |
45 | let src = | 40 | let src = node.with_ast(crate::ModuleSource::SourceFile(it)); |
46 | crate::Source { file_id: file_id.into(), ast: crate::ModuleSource::SourceFile(it) }; | ||
47 | Some(crate::Module::from_definition(db, src)?.resolver(db)) | 41 | Some(crate::Module::from_definition(db, src)?.resolver(db)) |
48 | }, | 42 | }, |
49 | ast::StructDef(it) => { | 43 | ast::StructDef(it) => { |
50 | let src = crate::Source { file_id: file_id.into(), ast: it }; | 44 | let src = node.with_ast(it); |
51 | Some(Struct::from_source(db, src)?.resolver(db)) | 45 | Some(Struct::from_source(db, src)?.resolver(db)) |
52 | }, | 46 | }, |
53 | ast::EnumDef(it) => { | 47 | ast::EnumDef(it) => { |
54 | let src = crate::Source { file_id: file_id.into(), ast: it }; | 48 | let src = node.with_ast(it); |
55 | Some(Enum::from_source(db, src)?.resolver(db)) | 49 | Some(Enum::from_source(db, src)?.resolver(db)) |
56 | }, | 50 | }, |
57 | _ => { | 51 | _ => match node.ast.kind() { |
58 | if node.kind() == FN_DEF || node.kind() == CONST_DEF || node.kind() == STATIC_DEF { | 52 | FN_DEF | CONST_DEF | STATIC_DEF => { |
59 | Some(def_with_body_from_child_node(db, Source::new(file_id.into(), node))?.resolver(db)) | 53 | Some(def_with_body_from_child_node(db, node)?.resolver(db)) |
60 | } else { | ||
61 | // FIXME add missing cases | ||
62 | None | ||
63 | } | 54 | } |
64 | }, | 55 | // FIXME add missing cases |
56 | _ => None | ||
57 | } | ||
65 | } | 58 | } |
66 | } | 59 | } |
67 | } | 60 | } |
@@ -90,7 +83,6 @@ fn def_with_body_from_child_node( | |||
90 | /// original source files. It should not be used inside the HIR itself. | 83 | /// original source files. It should not be used inside the HIR itself. |
91 | #[derive(Debug)] | 84 | #[derive(Debug)] |
92 | pub struct SourceAnalyzer { | 85 | pub struct SourceAnalyzer { |
93 | // FIXME: this doesn't handle macros at all | ||
94 | file_id: HirFileId, | 86 | file_id: HirFileId, |
95 | resolver: Resolver, | 87 | resolver: Resolver, |
96 | body_owner: Option<DefWithBody>, | 88 | body_owner: Option<DefWithBody>, |
@@ -137,20 +129,16 @@ pub struct ReferenceDescriptor { | |||
137 | impl SourceAnalyzer { | 129 | impl SourceAnalyzer { |
138 | pub fn new( | 130 | pub fn new( |
139 | db: &impl HirDatabase, | 131 | db: &impl HirDatabase, |
140 | file_id: FileId, | 132 | node: Source<&SyntaxNode>, |
141 | node: &SyntaxNode, | ||
142 | offset: Option<TextUnit>, | 133 | offset: Option<TextUnit>, |
143 | ) -> SourceAnalyzer { | 134 | ) -> SourceAnalyzer { |
144 | let node_source = Source::new(file_id.into(), node); | 135 | let def_with_body = def_with_body_from_child_node(db, node); |
145 | let def_with_body = def_with_body_from_child_node(db, node_source); | ||
146 | if let Some(def) = def_with_body { | 136 | if let Some(def) = def_with_body { |
147 | let source_map = def.body_source_map(db); | 137 | let source_map = def.body_source_map(db); |
148 | let scopes = def.expr_scopes(db); | 138 | let scopes = def.expr_scopes(db); |
149 | let scope = match offset { | 139 | let scope = match offset { |
150 | None => scope_for(&scopes, &source_map, node_source), | 140 | None => scope_for(&scopes, &source_map, node), |
151 | Some(offset) => { | 141 | Some(offset) => scope_for_offset(&scopes, &source_map, node.with_ast(offset)), |
152 | scope_for_offset(&scopes, &source_map, Source::new(file_id.into(), offset)) | ||
153 | } | ||
154 | }; | 142 | }; |
155 | let resolver = expr::resolver_for_scope(db, def, scope); | 143 | let resolver = expr::resolver_for_scope(db, def, scope); |
156 | SourceAnalyzer { | 144 | SourceAnalyzer { |
@@ -159,19 +147,20 @@ impl SourceAnalyzer { | |||
159 | body_source_map: Some(source_map), | 147 | body_source_map: Some(source_map), |
160 | infer: Some(def.infer(db)), | 148 | infer: Some(def.infer(db)), |
161 | scopes: Some(scopes), | 149 | scopes: Some(scopes), |
162 | file_id: file_id.into(), | 150 | file_id: node.file_id, |
163 | } | 151 | } |
164 | } else { | 152 | } else { |
165 | SourceAnalyzer { | 153 | SourceAnalyzer { |
166 | resolver: node | 154 | resolver: node |
155 | .ast | ||
167 | .ancestors() | 156 | .ancestors() |
168 | .find_map(|node| try_get_resolver_for_node(db, file_id, &node)) | 157 | .find_map(|it| try_get_resolver_for_node(db, node.with_ast(&it))) |
169 | .unwrap_or_default(), | 158 | .unwrap_or_default(), |
170 | body_owner: None, | 159 | body_owner: None, |
171 | body_source_map: None, | 160 | body_source_map: None, |
172 | infer: None, | 161 | infer: None, |
173 | scopes: None, | 162 | scopes: None, |
174 | file_id: file_id.into(), | 163 | file_id: node.file_id, |
175 | } | 164 | } |
176 | } | 165 | } |
177 | } | 166 | } |