aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/source_binder.rs
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2019-11-15 23:12:59 +0000
committerGitHub <[email protected]>2019-11-15 23:12:59 +0000
commitd9d99369b2765eaef7f49cd519990769191c3381 (patch)
tree5685e9db16e4a35c7ff3158d5c09becf9a45b31d /crates/ra_hir/src/source_binder.rs
parent69f3b01dc5dd70d9bdf6de4d859ad593a689395d (diff)
parentd898ecb8f2c19eb041bcb27c7ce9edd9d891f2c2 (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.rs51
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};
14use hir_expand::{name::AsName, Source}; 14use hir_expand::{name::AsName, Source};
15use ra_db::FileId;
16use ra_syntax::{ 15use 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
33fn try_get_resolver_for_node( 32fn 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)]
92pub struct SourceAnalyzer { 85pub 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 {
137impl SourceAnalyzer { 129impl 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 }