]> git.lizzy.rs Git - rust.git/commitdiff
Add `=` to pattern recovery
authorLukas Wirth <lukastw97@gmail.com>
Sat, 8 May 2021 21:14:08 +0000 (23:14 +0200)
committerLukas Wirth <lukastw97@gmail.com>
Sat, 8 May 2021 21:14:08 +0000 (23:14 +0200)
crates/ide_completion/src/context.rs
crates/parser/src/grammar/patterns.rs

index 62ef40818284004939f97b1d06791aa17395e172..787eb2fd3f36cdad3ca17d324e713df0d2c72793 100644 (file)
@@ -313,7 +313,8 @@ fn expected_type_and_name(&self) -> (Option<Type>, Option<NameOrNameRef>) {
                         cov_mark::hit!(expected_type_let_with_leading_char);
                         cov_mark::hit!(expected_type_let_without_leading_char);
                         let ty = it.pat()
-                            .and_then(|pat| self.sema.type_of_pat(&pat));
+                            .and_then(|pat| self.sema.type_of_pat(&pat))
+                            .or_else(|| it.initializer().and_then(|it| self.sema.type_of_expr(&it)));
                         let name = if let Some(ast::Pat::IdentPat(ident)) = it.pat() {
                             ident.name().map(NameOrNameRef::Name)
                         } else {
@@ -719,6 +720,26 @@ fn foo() {
         );
     }
 
+    #[test]
+    fn expected_type_let_pat() {
+        check_expected_type_and_name(
+            r#"
+fn foo() {
+    let x$0 = 0u32;
+}
+"#,
+            expect![[r#"ty: u32, name: ?"#]],
+        );
+        check_expected_type_and_name(
+            r#"
+fn foo() {
+    let $0 = 0u32;
+}
+"#,
+            expect![[r#"ty: u32, name: ?"#]],
+        );
+    }
+
     #[test]
     fn expected_type_fn_param_without_leading_char() {
         cov_mark::check!(expected_type_fn_param_without_leading_char);
index 3ab34783454de907d5c770fb5160f168f481da17..f1d1f9eaa60c6f77887a257d755c93780f1886a6 100644 (file)
@@ -83,7 +83,7 @@ fn pattern_single_r(p: &mut Parser, recovery_set: TokenSet) {
 }
 
 const PAT_RECOVERY_SET: TokenSet =
-    TokenSet::new(&[T![let], T![if], T![while], T![loop], T![match], T![')'], T![,]]);
+    TokenSet::new(&[T![let], T![if], T![while], T![loop], T![match], T![')'], T![,], T![=]]);
 
 fn atom_pat(p: &mut Parser, recovery_set: TokenSet) -> Option<CompletedMarker> {
     let m = match p.nth(0) {