aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_api/src/inlay_hints.rs
diff options
context:
space:
mode:
authorEkaterina Babshukova <[email protected]>2019-10-05 15:03:03 +0100
committerEkaterina Babshukova <[email protected]>2019-10-05 15:03:03 +0100
commit2fc22901730f35405d2bdfe33f88d7b3c6b14304 (patch)
treec3565f17b7db1625d3c8311432d0bed258b58ca5 /crates/ra_ide_api/src/inlay_hints.rs
parentdbf869b4d2dac09df17609edf6e67c1611b71dc5 (diff)
replace AST visitors with macro
Diffstat (limited to 'crates/ra_ide_api/src/inlay_hints.rs')
-rw-r--r--crates/ra_ide_api/src/inlay_hints.rs104
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 @@
3use crate::{db::RootDatabase, FileId}; 3use crate::{db::RootDatabase, FileId};
4use hir::{HirDisplay, SourceAnalyzer, Ty}; 4use hir::{HirDisplay, SourceAnalyzer, Ty};
5use ra_syntax::{ 5use 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
87fn get_pat_type_hints( 89fn get_pat_type_hints(