diff options
author | Florian Diebold <[email protected]> | 2019-01-06 15:47:59 +0000 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2019-01-06 23:05:19 +0000 |
commit | 6210e82041849bad6129331b9e45ac0bae6fe569 (patch) | |
tree | 43656452729519e45f4aa036372526b2934a230c /crates/ra_analysis/src | |
parent | 3c945ceb5e0dc287139de0589cc9a4b285911f17 (diff) |
Use HIR Expr for type inference
Now we can reuse the type inference inside a function when typing whitespace
etc. :)
Diffstat (limited to 'crates/ra_analysis/src')
-rw-r--r-- | crates/ra_analysis/src/completion/complete_dot.rs | 14 | ||||
-rw-r--r-- | crates/ra_analysis/src/hover.rs | 9 |
2 files changed, 17 insertions, 6 deletions
diff --git a/crates/ra_analysis/src/completion/complete_dot.rs b/crates/ra_analysis/src/completion/complete_dot.rs index 031d8b98f..ef3f4271b 100644 --- a/crates/ra_analysis/src/completion/complete_dot.rs +++ b/crates/ra_analysis/src/completion/complete_dot.rs | |||
@@ -1,3 +1,4 @@ | |||
1 | use ra_db::LocalSyntaxPtr; | ||
1 | use ra_syntax::ast::AstNode; | 2 | use ra_syntax::ast::AstNode; |
2 | use hir::{Ty, Def}; | 3 | use hir::{Ty, Def}; |
3 | 4 | ||
@@ -11,11 +12,14 @@ pub(super) fn complete_dot(acc: &mut Completions, ctx: &CompletionContext) -> Ca | |||
11 | _ => return Ok(()), | 12 | _ => return Ok(()), |
12 | }; | 13 | }; |
13 | let infer_result = function.infer(ctx.db)?; | 14 | let infer_result = function.infer(ctx.db)?; |
14 | let receiver_ty = if let Some(ty) = infer_result.type_of_node(receiver.syntax()) { | 15 | let syntax_mapping = function.body_syntax_mapping(ctx.db)?; |
15 | ty | 16 | let expr = |
16 | } else { | 17 | if let Some(expr) = syntax_mapping.syntax_expr(LocalSyntaxPtr::new(receiver.syntax())) { |
17 | return Ok(()); | 18 | expr |
18 | }; | 19 | } else { |
20 | return Ok(()); | ||
21 | }; | ||
22 | let receiver_ty = infer_result[expr].clone(); | ||
19 | if !ctx.is_method_call { | 23 | if !ctx.is_method_call { |
20 | complete_fields(acc, ctx, receiver_ty)?; | 24 | complete_fields(acc, ctx, receiver_ty)?; |
21 | } | 25 | } |
diff --git a/crates/ra_analysis/src/hover.rs b/crates/ra_analysis/src/hover.rs index ba1fb9beb..067e5c12d 100644 --- a/crates/ra_analysis/src/hover.rs +++ b/crates/ra_analysis/src/hover.rs | |||
@@ -64,7 +64,14 @@ pub(crate) fn type_of(db: &RootDatabase, frange: FileRange) -> Cancelable<Option | |||
64 | parent_fn | 64 | parent_fn |
65 | )?); | 65 | )?); |
66 | let infer = function.infer(db)?; | 66 | let infer = function.infer(db)?; |
67 | Ok(infer.type_of_node(node).map(|t| t.to_string())) | 67 | let syntax_mapping = function.body_syntax_mapping(db)?; |
68 | if let Some(expr) = syntax_mapping.node_expr(node) { | ||
69 | Ok(Some(infer[expr].to_string())) | ||
70 | } else if let Some(pat) = syntax_mapping.node_pat(node) { | ||
71 | Ok(Some(infer[pat].to_string())) | ||
72 | } else { | ||
73 | Ok(None) | ||
74 | } | ||
68 | } | 75 | } |
69 | 76 | ||
70 | // FIXME: this should not really use navigation target. Rather, approximatelly | 77 | // FIXME: this should not really use navigation target. Rather, approximatelly |