diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-10-05 15:54:25 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2019-10-05 15:54:25 +0100 |
commit | d3872964f88a0d751c428c150bb40d8b4f4c89a9 (patch) | |
tree | 14b7045119a1918118c18857cc094c914284705c /crates/ra_ide_api/src/inlay_hints.rs | |
parent | ae6305b90c80eb919cfde985cba66975b6222ed2 (diff) | |
parent | 311dbb854536dd526cdbcadc6d270f9a37e4b816 (diff) |
Merge #1960
1960: Replace AST visitors with macro r=viorina a=viorina
Fixes #1672.
Co-authored-by: Ekaterina Babshukova <[email protected]>
Diffstat (limited to 'crates/ra_ide_api/src/inlay_hints.rs')
-rw-r--r-- | crates/ra_ide_api/src/inlay_hints.rs | 104 |
1 files changed, 53 insertions, 51 deletions
diff --git a/crates/ra_ide_api/src/inlay_hints.rs b/crates/ra_ide_api/src/inlay_hints.rs index 9b45575f8..f1c0dc164 100644 --- a/crates/ra_ide_api/src/inlay_hints.rs +++ b/crates/ra_ide_api/src/inlay_hints.rs | |||
@@ -3,9 +3,8 @@ | |||
3 | use crate::{db::RootDatabase, FileId}; | 3 | use crate::{db::RootDatabase, FileId}; |
4 | use hir::{HirDisplay, SourceAnalyzer, Ty}; | 4 | use hir::{HirDisplay, SourceAnalyzer, Ty}; |
5 | use ra_syntax::{ | 5 | use ra_syntax::{ |
6 | algo::visit::{visitor, Visitor}, | ||
7 | ast::{self, AstNode, TypeAscriptionOwner}, | 6 | ast::{self, AstNode, TypeAscriptionOwner}, |
8 | SmolStr, SourceFile, SyntaxKind, SyntaxNode, TextRange, | 7 | match_ast, SmolStr, SourceFile, SyntaxKind, SyntaxNode, TextRange, |
9 | }; | 8 | }; |
10 | 9 | ||
11 | #[derive(Debug, PartialEq, Eq)] | 10 | #[derive(Debug, PartialEq, Eq)] |
@@ -33,55 +32,58 @@ fn get_inlay_hints( | |||
33 | file_id: FileId, | 32 | file_id: FileId, |
34 | node: &SyntaxNode, | 33 | node: &SyntaxNode, |
35 | ) -> Option<Vec<InlayHint>> { | 34 | ) -> Option<Vec<InlayHint>> { |
36 | visitor() | 35 | match_ast! { |
37 | .visit(|let_statement: ast::LetStmt| { | 36 | match node { |
38 | if let_statement.ascribed_type().is_some() { | 37 | ast::LetStmt(it) => { |
39 | return None; | 38 | if it.ascribed_type().is_some() { |
40 | } | 39 | return None; |
41 | let pat = let_statement.pat()?; | 40 | } |
42 | let analyzer = SourceAnalyzer::new(db, file_id, let_statement.syntax(), None); | 41 | let pat = it.pat()?; |
43 | Some(get_pat_type_hints(db, &analyzer, pat, false)) | 42 | let analyzer = SourceAnalyzer::new(db, file_id, it.syntax(), None); |
44 | }) | 43 | Some(get_pat_type_hints(db, &analyzer, pat, false)) |
45 | .visit(|closure_parameter: ast::LambdaExpr| { | 44 | }, |
46 | let analyzer = SourceAnalyzer::new(db, file_id, closure_parameter.syntax(), None); | 45 | ast::LambdaExpr(it) => { |
47 | closure_parameter.param_list().map(|param_list| { | 46 | let analyzer = SourceAnalyzer::new(db, file_id, it.syntax(), None); |
48 | param_list | 47 | it.param_list().map(|param_list| { |
49 | .params() | 48 | param_list |
50 | .filter(|closure_param| closure_param.ascribed_type().is_none()) | 49 | .params() |
51 | .filter_map(|closure_param| closure_param.pat()) | 50 | .filter(|closure_param| closure_param.ascribed_type().is_none()) |
52 | .map(|root_pat| get_pat_type_hints(db, &analyzer, root_pat, false)) | 51 | .filter_map(|closure_param| closure_param.pat()) |
53 | .flatten() | 52 | .map(|root_pat| get_pat_type_hints(db, &analyzer, root_pat, false)) |
54 | .collect() | 53 | .flatten() |
55 | }) | 54 | .collect() |
56 | }) | 55 | }) |
57 | .visit(|for_expression: ast::ForExpr| { | 56 | }, |
58 | let pat = for_expression.pat()?; | 57 | ast::ForExpr(it) => { |
59 | let analyzer = SourceAnalyzer::new(db, file_id, for_expression.syntax(), None); | 58 | let pat = it.pat()?; |
60 | Some(get_pat_type_hints(db, &analyzer, pat, false)) | 59 | let analyzer = SourceAnalyzer::new(db, file_id, it.syntax(), None); |
61 | }) | 60 | Some(get_pat_type_hints(db, &analyzer, pat, false)) |
62 | .visit(|if_expr: ast::IfExpr| { | 61 | }, |
63 | let pat = if_expr.condition()?.pat()?; | 62 | ast::IfExpr(it) => { |
64 | let analyzer = SourceAnalyzer::new(db, file_id, if_expr.syntax(), None); | 63 | let pat = it.condition()?.pat()?; |
65 | Some(get_pat_type_hints(db, &analyzer, pat, true)) | 64 | let analyzer = SourceAnalyzer::new(db, file_id, it.syntax(), None); |
66 | }) | 65 | Some(get_pat_type_hints(db, &analyzer, pat, true)) |
67 | .visit(|while_expr: ast::WhileExpr| { | 66 | }, |
68 | let pat = while_expr.condition()?.pat()?; | 67 | ast::WhileExpr(it) => { |
69 | let analyzer = SourceAnalyzer::new(db, file_id, while_expr.syntax(), None); | 68 | let pat = it.condition()?.pat()?; |
70 | Some(get_pat_type_hints(db, &analyzer, pat, true)) | 69 | let analyzer = SourceAnalyzer::new(db, file_id, it.syntax(), None); |
71 | }) | 70 | Some(get_pat_type_hints(db, &analyzer, pat, true)) |
72 | .visit(|match_arm_list: ast::MatchArmList| { | 71 | }, |
73 | let analyzer = SourceAnalyzer::new(db, file_id, match_arm_list.syntax(), None); | 72 | ast::MatchArmList(it) => { |
74 | Some( | 73 | let analyzer = SourceAnalyzer::new(db, file_id, it.syntax(), None); |
75 | match_arm_list | 74 | Some( |
76 | .arms() | 75 | it |
77 | .map(|match_arm| match_arm.pats()) | 76 | .arms() |
78 | .flatten() | 77 | .map(|match_arm| match_arm.pats()) |
79 | .map(|root_pat| get_pat_type_hints(db, &analyzer, root_pat, true)) | 78 | .flatten() |
80 | .flatten() | 79 | .map(|root_pat| get_pat_type_hints(db, &analyzer, root_pat, true)) |
81 | .collect(), | 80 | .flatten() |
82 | ) | 81 | .collect(), |
83 | }) | 82 | ) |
84 | .accept(&node)? | 83 | }, |
84 | _ => None, | ||
85 | } | ||
86 | } | ||
85 | } | 87 | } |
86 | 88 | ||
87 | fn get_pat_type_hints( | 89 | fn get_pat_type_hints( |