aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir')
-rw-r--r--crates/ra_hir/src/expr.rs31
-rw-r--r--crates/ra_hir/src/function/scope.rs12
-rw-r--r--crates/ra_hir/src/source_binder.rs10
3 files changed, 27 insertions, 26 deletions
diff --git a/crates/ra_hir/src/expr.rs b/crates/ra_hir/src/expr.rs
index 5cf0f5e3f..6866fc2ac 100644
--- a/crates/ra_hir/src/expr.rs
+++ b/crates/ra_hir/src/expr.rs
@@ -1,3 +1,4 @@
1use std::ops::Index;
1use std::sync::Arc; 2use std::sync::Arc;
2 3
3use rustc_hash::FxHashMap; 4use rustc_hash::FxHashMap;
@@ -44,14 +45,6 @@ pub struct BodySyntaxMapping {
44} 45}
45 46
46impl Body { 47impl Body {
47 pub fn expr(&self, expr: ExprId) -> &Expr {
48 &self.exprs[expr]
49 }
50
51 pub fn pat(&self, pat: PatId) -> &Pat {
52 &self.pats[pat]
53 }
54
55 pub fn args(&self) -> &[PatId] { 48 pub fn args(&self) -> &[PatId] {
56 &self.args 49 &self.args
57 } 50 }
@@ -61,6 +54,22 @@ impl Body {
61 } 54 }
62} 55}
63 56
57impl Index<ExprId> for Body {
58 type Output = Expr;
59
60 fn index(&self, expr: ExprId) -> &Expr {
61 &self.exprs[expr]
62 }
63}
64
65impl Index<PatId> for Body {
66 type Output = Pat;
67
68 fn index(&self, pat: PatId) -> &Pat {
69 &self.pats[pat]
70 }
71}
72
64impl BodySyntaxMapping { 73impl BodySyntaxMapping {
65 pub fn expr_syntax(&self, expr: ExprId) -> Option<LocalSyntaxPtr> { 74 pub fn expr_syntax(&self, expr: ExprId) -> Option<LocalSyntaxPtr> {
66 self.expr_syntax_mapping_back.get(&expr).cloned() 75 self.expr_syntax_mapping_back.get(&expr).cloned()
@@ -377,11 +386,7 @@ impl ExprCollector {
377 syntax_ptr, 386 syntax_ptr,
378 ) 387 )
379 } else { 388 } else {
380 let condition = if let Some(condition) = e.condition() { 389 let condition = self.collect_expr_opt(e.condition().and_then(|c| c.expr()));
381 self.collect_expr_opt(condition.expr())
382 } else {
383 self.exprs.alloc(Expr::Missing)
384 };
385 let then_branch = self.collect_block_opt(e.then_branch()); 390 let then_branch = self.collect_block_opt(e.then_branch());
386 let else_branch = e.else_branch().map(|e| self.collect_block(e)); 391 let else_branch = e.else_branch().map(|e| self.collect_block(e));
387 self.alloc_expr( 392 self.alloc_expr(
diff --git a/crates/ra_hir/src/function/scope.rs b/crates/ra_hir/src/function/scope.rs
index 0607a99cb..0a12f0b35 100644
--- a/crates/ra_hir/src/function/scope.rs
+++ b/crates/ra_hir/src/function/scope.rs
@@ -66,8 +66,7 @@ impl FnScopes {
66 .scope_chain_for(context_expr) 66 .scope_chain_for(context_expr)
67 .flat_map(|scope| self.entries(scope).iter()) 67 .flat_map(|scope| self.entries(scope).iter())
68 .filter(|entry| shadowed.insert(entry.name())) 68 .filter(|entry| shadowed.insert(entry.name()))
69 .filter(|entry| entry.name() == &name) 69 .find(|entry| entry.name() == &name);
70 .nth(0);
71 ret 70 ret
72 } 71 }
73 72
@@ -84,7 +83,7 @@ impl FnScopes {
84 }) 83 })
85 } 84 }
86 fn add_bindings(&mut self, body: &Body, scope: ScopeId, pat: PatId) { 85 fn add_bindings(&mut self, body: &Body, scope: ScopeId, pat: PatId) {
87 match body.pat(pat) { 86 match &body[pat] {
88 Pat::Bind { name } => self.scopes[scope].entries.push(ScopeEntry { 87 Pat::Bind { name } => self.scopes[scope].entries.push(ScopeEntry {
89 name: name.clone(), 88 name: name.clone(),
90 pat, 89 pat,
@@ -96,7 +95,7 @@ impl FnScopes {
96 let body = Arc::clone(&self.body); 95 let body = Arc::clone(&self.body);
97 params 96 params
98 .into_iter() 97 .into_iter()
99 .for_each(|it| self.add_bindings(&body, scope, *it)); 98 .for_each(|pat| self.add_bindings(&body, scope, *pat));
100 } 99 }
101 fn set_scope(&mut self, node: ExprId, scope: ScopeId) { 100 fn set_scope(&mut self, node: ExprId, scope: ScopeId) {
102 self.scope_for.insert(node, scope); 101 self.scope_for.insert(node, scope);
@@ -218,8 +217,7 @@ impl ScopesWithSyntaxMapping {
218 node.ancestors() 217 node.ancestors()
219 .map(LocalSyntaxPtr::new) 218 .map(LocalSyntaxPtr::new)
220 .filter_map(|ptr| self.syntax_mapping.syntax_expr(ptr)) 219 .filter_map(|ptr| self.syntax_mapping.syntax_expr(ptr))
221 .filter_map(|it| self.scopes.scope_for(it)) 220 .find_map(|it| self.scopes.scope_for(it))
222 .next()
223 } 221 }
224} 222}
225 223
@@ -264,7 +262,7 @@ fn compute_block_scopes(
264 262
265fn compute_expr_scopes(expr: ExprId, body: &Body, scopes: &mut FnScopes, scope: ScopeId) { 263fn compute_expr_scopes(expr: ExprId, body: &Body, scopes: &mut FnScopes, scope: ScopeId) {
266 scopes.set_scope(expr, scope); 264 scopes.set_scope(expr, scope);
267 match body.expr(expr) { 265 match &body[expr] {
268 Expr::Block { statements, tail } => { 266 Expr::Block { statements, tail } => {
269 compute_block_scopes(&statements, *tail, body, scopes, scope); 267 compute_block_scopes(&statements, *tail, body, scopes, scope);
270 } 268 }
diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs
index 551f44d4e..29a3960e9 100644
--- a/crates/ra_hir/src/source_binder.rs
+++ b/crates/ra_hir/src/source_binder.rs
@@ -92,12 +92,10 @@ pub fn function_from_position(
92 position: FilePosition, 92 position: FilePosition,
93) -> Cancelable<Option<Function>> { 93) -> Cancelable<Option<Function>> {
94 let file = db.source_file(position.file_id); 94 let file = db.source_file(position.file_id);
95 let fn_def = if let Some(f) = find_node_at_offset::<ast::FnDef>(file.syntax(), position.offset) 95 let fn_def = ctry!(find_node_at_offset::<ast::FnDef>(
96 { 96 file.syntax(),
97 f 97 position.offset
98 } else { 98 ));
99 return Ok(None);
100 };
101 function_from_source(db, position.file_id, fn_def) 99 function_from_source(db, position.file_id, fn_def)
102} 100}
103 101