]> git.lizzy.rs Git - rust.git/commitdiff
parse impl type
authorcsmoe <35686186+csmoe@users.noreply.github.com>
Tue, 25 Sep 2018 14:00:43 +0000 (22:00 +0800)
committercsmoe <35686186+csmoe@users.noreply.github.com>
Tue, 25 Sep 2018 14:21:16 +0000 (22:21 +0800)
crates/ra_syntax/src/grammar/items/traits.rs
crates/ra_syntax/tests/data/parser/err/0026_imp_recovery.rs
crates/ra_syntax/tests/data/parser/err/0026_imp_recovery.txt

index 25b6cb66b3d29e550ed43948cf9960b6c6dabebf..62ab877fce1f3c604b9dda22ff47e8fcdde56373 100644 (file)
@@ -54,16 +54,8 @@ pub(super) fn impl_item(p: &mut Parser) {
 
     // test impl_item_neg
     // impl !Send for X {}
-    if p.at(IMPL_KW) {
-        p.error("expected type");
-    } else {
-        p.eat(EXCL);
-        if p.at(IMPL_KW) {
-            p.error("expected type");
-        } else {
-            types::type_(p);
-        }
-    }
+    p.eat(EXCL);
+    impl_type(p);
     if p.eat(FOR_KW) {
         types::type_(p);
     }
@@ -123,3 +115,17 @@ fn choose_type_params_over_qpath(p: &Parser) -> bool {
     (p.nth(1) == LIFETIME || p.nth(1) == IDENT)
         && (p.nth(2) == R_ANGLE || p.nth(2) == COMMA || p.nth(2) == COLON || p.nth(2) == EQ)
 }
+
+// impl Type {}
+//      ^^^^
+// impl Trait for T {}
+//      ^^^^^
+pub(crate) fn impl_type(p: &mut Parser) {
+    if p.at(IMPL_KW) {
+        p.error("expected trait or type");
+        return;
+    }
+    types::type_(p);
+}
+
+
index c4f5eca87c8610257b1a67c91502b9dfcee593ff..eac922109b8091a97a64a4a374234bf93b0f134f 100644 (file)
@@ -1,4 +1,3 @@
 impl<T: Clone>
-impl<T:Clone>
-!impl<T> OnceCell<T> {
+impl<T> OnceCell<T> {
 }
index 60b65bce50682342a9232a03b04a8536b7d169f3..60337d6de17f948d516eb3a701c4da2ffe5021f2 100644 (file)
@@ -1,4 +1,4 @@
-ROOT@[0; 54)
+ROOT@[0; 39)
   IMPL_ITEM@[0; 14)
     IMPL_KW@[0; 4)
     TYPE_PARAM_LIST@[4; 14)
@@ -14,53 +14,35 @@ ROOT@[0; 54)
               NAME_REF@[8; 13)
                 IDENT@[8; 13) "Clone"
       R_ANGLE@[13; 14)
-      err: `expected type`
+      err: `expected trait or type`
       err: `expected `{``
   WHITESPACE@[14; 15)
-  IMPL_ITEM@[15; 30)
+  IMPL_ITEM@[15; 38)
     IMPL_KW@[15; 19)
-    TYPE_PARAM_LIST@[19; 28)
+    TYPE_PARAM_LIST@[19; 22)
       L_ANGLE@[19; 20)
-      TYPE_PARAM@[20; 27)
+      TYPE_PARAM@[20; 21)
         NAME@[20; 21)
           IDENT@[20; 21) "T"
-        COLON@[21; 22)
-        PATH_TYPE@[22; 27)
-          PATH@[22; 27)
-            PATH_SEGMENT@[22; 27)
-              NAME_REF@[22; 27)
-                IDENT@[22; 27) "Clone"
-      R_ANGLE@[27; 28)
-    WHITESPACE@[28; 29)
-    EXCL@[29; 30)
-    err: `expected type`
-    err: `expected `{``
-  IMPL_ITEM@[30; 53)
-    IMPL_KW@[30; 34)
-    TYPE_PARAM_LIST@[34; 37)
-      L_ANGLE@[34; 35)
-      TYPE_PARAM@[35; 36)
-        NAME@[35; 36)
-          IDENT@[35; 36) "T"
-      R_ANGLE@[36; 37)
-    WHITESPACE@[37; 38)
-    PATH_TYPE@[38; 49)
-      PATH@[38; 49)
-        PATH_SEGMENT@[38; 49)
-          NAME_REF@[38; 46)
-            IDENT@[38; 46) "OnceCell"
-          TYPE_ARG_LIST@[46; 49)
-            L_ANGLE@[46; 47)
-            TYPE_ARG@[47; 48)
-              PATH_TYPE@[47; 48)
-                PATH@[47; 48)
-                  PATH_SEGMENT@[47; 48)
-                    NAME_REF@[47; 48)
-                      IDENT@[47; 48) "T"
-            R_ANGLE@[48; 49)
-    WHITESPACE@[49; 50)
-    ITEM_LIST@[50; 53)
-      L_CURLY@[50; 51)
-      WHITESPACE@[51; 52)
-      R_CURLY@[52; 53)
-  WHITESPACE@[53; 54)
+      R_ANGLE@[21; 22)
+    WHITESPACE@[22; 23)
+    PATH_TYPE@[23; 34)
+      PATH@[23; 34)
+        PATH_SEGMENT@[23; 34)
+          NAME_REF@[23; 31)
+            IDENT@[23; 31) "OnceCell"
+          TYPE_ARG_LIST@[31; 34)
+            L_ANGLE@[31; 32)
+            TYPE_ARG@[32; 33)
+              PATH_TYPE@[32; 33)
+                PATH@[32; 33)
+                  PATH_SEGMENT@[32; 33)
+                    NAME_REF@[32; 33)
+                      IDENT@[32; 33) "T"
+            R_ANGLE@[33; 34)
+    WHITESPACE@[34; 35)
+    ITEM_LIST@[35; 38)
+      L_CURLY@[35; 36)
+      WHITESPACE@[36; 37)
+      R_CURLY@[37; 38)
+  WHITESPACE@[38; 39)