diff --git a/grammar.ron b/grammar.ron
index 7c76d595d05..d7fea44fbe0 100644
--- a/grammar.ron
+++ b/grammar.ron
@@ -74,6 +74,8 @@ Grammar(
     nodes: [
         "FILE",
         "STRUCT_ITEM",
+        "ENUM_ITEM",
+        "ENUM_VARIANT",
         "NAMED_FIELD",
         "POS_FIELD",
         "FN_ITEM",
diff --git a/src/parser/event_parser/grammar/expressions.rs b/src/parser/event_parser/grammar/expressions.rs
index c81dc6c35fe..8caaf355389 100644
--- a/src/parser/event_parser/grammar/expressions.rs
+++ b/src/parser/event_parser/grammar/expressions.rs
@@ -12,3 +12,9 @@ pub(super) fn literal(p: &mut Parser) -> bool {
         _ => false,
     }
 }
+
+pub(super) fn expr(p: &mut Parser) {
+    if !literal(p) {
+        p.error().message("expected expression").emit();
+    }
+}
diff --git a/src/parser/event_parser/grammar/items/mod.rs b/src/parser/event_parser/grammar/items/mod.rs
index f10fb230b48..0a50fffc118 100644
--- a/src/parser/event_parser/grammar/items/mod.rs
+++ b/src/parser/event_parser/grammar/items/mod.rs
@@ -9,8 +9,9 @@ pub(super) fn mod_contents(p: &mut Parser, stop_on_r_curly: bool) {
     }
 }
 
-pub(super) const ITEM_FIRST: TokenSet =
-    token_set![EXTERN_KW, MOD_KW, USE_KW, STRUCT_KW, FN_KW, PUB_KW, POUND,];
+pub(super) const ITEM_FIRST: TokenSet = token_set![
+    EXTERN_KW, MOD_KW, USE_KW, STRUCT_KW, ENUM_KW, FN_KW, PUB_KW, POUND
+];
 
 fn item(p: &mut Parser) {
     let item = p.start();
@@ -34,6 +35,10 @@ fn item(p: &mut Parser) {
             structs::struct_item(p);
             STRUCT_ITEM
         }
+        ENUM_KW => {
+            structs::enum_item(p);
+            ENUM_ITEM
+        }
         FN_KW => {
             fn_item(p);
             FN_ITEM
diff --git a/src/parser/event_parser/grammar/items/structs.rs b/src/parser/event_parser/grammar/items/structs.rs
index 0934f3d2840..6e438413b6b 100644
--- a/src/parser/event_parser/grammar/items/structs.rs
+++ b/src/parser/event_parser/grammar/items/structs.rs
@@ -40,6 +40,40 @@ pub(super) fn struct_item(p: &mut Parser) {
     }
 }
 
+pub(super) fn enum_item(p: &mut Parser) {
+    assert!(p.at(ENUM_KW));
+    p.bump();
+    p.expect(IDENT);
+    type_param_list(p);
+    where_clause(p);
+    if p.expect(L_CURLY) {
+        while !p.at(EOF) && !p.at(R_CURLY) {
+            let var = p.start();
+            attributes::outer_attributes(p);
+            if p.at(IDENT) {
+                p.bump();
+                match p.current() {
+                    L_CURLY => named_fields(p),
+                    L_PAREN => pos_fields(p),
+                    EQ => {
+                        p.bump();
+                        expressions::expr(p);
+                    }
+                    _ => (),
+                }
+                var.complete(p, ENUM_VARIANT);
+            } else {
+                var.abandon(p);
+                p.err_and_bump("expected enum variant");
+            }
+            if !p.at(R_CURLY) {
+                p.expect(COMMA);
+            }
+        }
+        p.expect(R_CURLY);
+    }
+}
+
 fn named_fields(p: &mut Parser) {
     assert!(p.at(L_CURLY));
     p.bump();
diff --git a/src/syntax_kinds.rs b/src/syntax_kinds.rs
index b6c281cd56b..519326f48ae 100644
--- a/src/syntax_kinds.rs
+++ b/src/syntax_kinds.rs
@@ -76,6 +76,8 @@ pub enum SyntaxKind {
     SHEBANG,
     FILE,
     STRUCT_ITEM,
+    ENUM_ITEM,
+    ENUM_VARIANT,
     NAMED_FIELD,
     POS_FIELD,
     FN_ITEM,
@@ -176,6 +178,8 @@ impl SyntaxKind {
             SHEBANG => &SyntaxInfo { name: "SHEBANG" },
             FILE => &SyntaxInfo { name: "FILE" },
             STRUCT_ITEM => &SyntaxInfo { name: "STRUCT_ITEM" },
+            ENUM_ITEM => &SyntaxInfo { name: "ENUM_ITEM" },
+            ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" },
             NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" },
             POS_FIELD => &SyntaxInfo { name: "POS_FIELD" },
             FN_ITEM => &SyntaxInfo { name: "FN_ITEM" },
diff --git a/src/tree/mod.rs b/src/tree/mod.rs
index 795f23f4293..9ed0504c7f7 100644
--- a/src/tree/mod.rs
+++ b/src/tree/mod.rs
@@ -106,7 +106,19 @@ impl<'f> Node<'f> {
 
 impl<'f> fmt::Debug for Node<'f> {
     fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
-        write!(fmt, "{:?}@{:?}", self.kind(), self.range())
+        write!(fmt, "{:?}@{:?}", self.kind(), self.range())?;
+        if has_short_text(self.kind()) {
+            write!(fmt, " \"{}\"", self.text())?;
+        }
+        Ok(())
+    }
+}
+
+fn has_short_text(kind: SyntaxKind) -> bool {
+    use syntax_kinds::*;
+    match kind {
+        IDENT | LIFETIME => true,
+        _ => false,
     }
 }
 
diff --git a/tests/data/parser/err/0000_struct_field_missing_comma.txt b/tests/data/parser/err/0000_struct_field_missing_comma.txt
index f59205f55c7..d94b4fd9e57 100644
--- a/tests/data/parser/err/0000_struct_field_missing_comma.txt
+++ b/tests/data/parser/err/0000_struct_field_missing_comma.txt
@@ -2,21 +2,21 @@ FILE@[0; 34)
   STRUCT_ITEM@[0; 34)
     STRUCT_KW@[0; 6)
     WHITESPACE@[6; 7)
-    IDENT@[7; 8)
+    IDENT@[7; 8) "S"
     WHITESPACE@[8; 9)
     L_CURLY@[9; 10)
     NAMED_FIELD@[10; 26)
       WHITESPACE@[10; 15)
-      IDENT@[15; 16)
+      IDENT@[15; 16) "a"
       COLON@[16; 17)
       WHITESPACE@[17; 18)
-      IDENT@[18; 21)
+      IDENT@[18; 21) "u32"
       WHITESPACE@[21; 26)
     err: `expected COMMA`
     NAMED_FIELD@[26; 33)
-      IDENT@[26; 27)
+      IDENT@[26; 27) "b"
       COLON@[27; 28)
       WHITESPACE@[28; 29)
-      IDENT@[29; 32)
+      IDENT@[29; 32) "u32"
       WHITESPACE@[32; 33)
     R_CURLY@[33; 34)
diff --git a/tests/data/parser/err/0001_item_recovery_in_file.txt b/tests/data/parser/err/0001_item_recovery_in_file.txt
index 0ac741aa85a..ac076069573 100644
--- a/tests/data/parser/err/0001_item_recovery_in_file.txt
+++ b/tests/data/parser/err/0001_item_recovery_in_file.txt
@@ -1,16 +1,16 @@
 FILE@[0; 21)
   ERROR@[0; 3)
   err: `expected item`
-    IDENT@[0; 2)
+    IDENT@[0; 2) "if"
     WHITESPACE@[2; 3)
   ERROR@[3; 10)
   err: `expected item`
-    IDENT@[3; 8)
+    IDENT@[3; 8) "match"
     WHITESPACE@[8; 10)
   STRUCT_ITEM@[10; 21)
     STRUCT_KW@[10; 16)
     WHITESPACE@[16; 17)
-    IDENT@[17; 18)
+    IDENT@[17; 18) "S"
     WHITESPACE@[18; 19)
     L_CURLY@[19; 20)
     R_CURLY@[20; 21)
diff --git a/tests/data/parser/err/0003_C++_semicolon.txt b/tests/data/parser/err/0003_C++_semicolon.txt
index 8dd45d2e5ca..d77c06378d0 100644
--- a/tests/data/parser/err/0003_C++_semicolon.txt
+++ b/tests/data/parser/err/0003_C++_semicolon.txt
@@ -2,22 +2,22 @@ FILE@[0; 40)
   STRUCT_ITEM@[0; 39)
     STRUCT_KW@[0; 6)
     WHITESPACE@[6; 7)
-    IDENT@[7; 8)
+    IDENT@[7; 8) "S"
     WHITESPACE@[8; 9)
     L_CURLY@[9; 10)
     NAMED_FIELD@[10; 21)
       WHITESPACE@[10; 15)
-      IDENT@[15; 16)
+      IDENT@[15; 16) "a"
       COLON@[16; 17)
       WHITESPACE@[17; 18)
-      IDENT@[18; 21)
+      IDENT@[18; 21) "i32"
     COMMA@[21; 22)
     NAMED_FIELD@[22; 36)
       WHITESPACE@[22; 27)
-      IDENT@[27; 28)
+      IDENT@[27; 28) "b"
       COLON@[28; 29)
       WHITESPACE@[29; 30)
-      IDENT@[30; 36)
+      IDENT@[30; 36) "String"
     COMMA@[36; 37)
     WHITESPACE@[37; 38)
     R_CURLY@[38; 39)
diff --git a/tests/data/parser/err/0004_use_path_bad_segment.txt b/tests/data/parser/err/0004_use_path_bad_segment.txt
index adc0496832d..7f43611ebda 100644
--- a/tests/data/parser/err/0004_use_path_bad_segment.txt
+++ b/tests/data/parser/err/0004_use_path_bad_segment.txt
@@ -6,7 +6,7 @@ FILE@[0; 12)
         PATH@[3; 7)
           PATH_SEGMENT@[3; 7)
             WHITESPACE@[3; 4)
-            IDENT@[4; 7)
+            IDENT@[4; 7) "foo"
         COLONCOLON@[7; 9)
         PATH_SEGMENT@[9; 9)
         err: `expected identifier`
diff --git a/tests/data/parser/err/0005_attribute_recover.txt b/tests/data/parser/err/0005_attribute_recover.txt
index 10f7b2da3af..00a534af170 100644
--- a/tests/data/parser/err/0005_attribute_recover.txt
+++ b/tests/data/parser/err/0005_attribute_recover.txt
@@ -4,10 +4,10 @@ FILE@[0; 54)
       POUND@[0; 1)
       L_BRACK@[1; 2)
       META_ITEM@[2; 17)
-        IDENT@[2; 5)
+        IDENT@[2; 5) "foo"
         L_PAREN@[5; 6)
         META_ITEM@[6; 9)
-          IDENT@[6; 9)
+          IDENT@[6; 9) "foo"
         COMMA@[9; 10)
         ERROR@[10; 12)
         err: `expected attribute`
@@ -24,7 +24,7 @@ FILE@[0; 54)
       WHITESPACE@[18; 19)
     FN_KW@[19; 21)
     WHITESPACE@[21; 22)
-    IDENT@[22; 25)
+    IDENT@[22; 25) "foo"
     L_PAREN@[25; 26)
     R_PAREN@[26; 27)
     WHITESPACE@[27; 28)
@@ -37,14 +37,14 @@ FILE@[0; 54)
       POUND@[34; 35)
       L_BRACK@[35; 36)
       META_ITEM@[36; 41)
-        IDENT@[36; 39)
+        IDENT@[36; 39) "foo"
         L_PAREN@[39; 40)
         err: `expected attribute`
         WHITESPACE@[40; 41)
       err: `expected R_BRACK`
     FN_KW@[41; 43)
     WHITESPACE@[43; 44)
-    IDENT@[44; 47)
+    IDENT@[44; 47) "foo"
     L_PAREN@[47; 48)
     R_PAREN@[48; 49)
     WHITESPACE@[49; 50)
diff --git a/tests/data/parser/err/0006_named_field_recovery.txt b/tests/data/parser/err/0006_named_field_recovery.txt
index d3815102bf4..0437bf2e7df 100644
--- a/tests/data/parser/err/0006_named_field_recovery.txt
+++ b/tests/data/parser/err/0006_named_field_recovery.txt
@@ -2,15 +2,15 @@ FILE@[0; 74)
   STRUCT_ITEM@[0; 74)
     STRUCT_KW@[0; 6)
     WHITESPACE@[6; 7)
-    IDENT@[7; 8)
+    IDENT@[7; 8) "S"
     WHITESPACE@[8; 9)
     L_CURLY@[9; 10)
     NAMED_FIELD@[10; 21)
       WHITESPACE@[10; 15)
-      IDENT@[15; 16)
+      IDENT@[15; 16) "f"
       COLON@[16; 17)
       WHITESPACE@[17; 18)
-      IDENT@[18; 21)
+      IDENT@[18; 21) "u32"
     COMMA@[21; 22)
     VISIBILITY@[22; 31)
       WHITESPACE@[22; 27)
@@ -37,17 +37,17 @@ FILE@[0; 74)
       VISIBILITY@[48; 52)
         PUB_KW@[48; 51)
         WHITESPACE@[51; 52)
-      IDENT@[52; 53)
+      IDENT@[52; 53) "x"
       COLON@[53; 54)
       WHITESPACE@[54; 55)
-      IDENT@[55; 58)
+      IDENT@[55; 58) "u32"
     COMMA@[58; 59)
     NAMED_FIELD@[59; 70)
       WHITESPACE@[59; 64)
-      IDENT@[64; 65)
+      IDENT@[64; 65) "z"
       COLON@[65; 66)
       WHITESPACE@[66; 67)
-      IDENT@[67; 70)
+      IDENT@[67; 70) "f64"
     COMMA@[70; 71)
     WHITESPACE@[71; 72)
     R_CURLY@[72; 73)
diff --git a/tests/data/parser/err/0007_stray_curly_in_file.txt b/tests/data/parser/err/0007_stray_curly_in_file.txt
index 04bf17bc77e..b4da4464db0 100644
--- a/tests/data/parser/err/0007_stray_curly_in_file.txt
+++ b/tests/data/parser/err/0007_stray_curly_in_file.txt
@@ -6,7 +6,7 @@ FILE@[0; 31)
   STRUCT_ITEM@[3; 14)
     STRUCT_KW@[3; 9)
     WHITESPACE@[9; 10)
-    IDENT@[10; 11)
+    IDENT@[10; 11) "S"
     SEMI@[11; 12)
     WHITESPACE@[12; 14)
   ERROR@[14; 17)
@@ -16,7 +16,7 @@ FILE@[0; 31)
   FN_ITEM@[17; 29)
     FN_KW@[17; 19)
     WHITESPACE@[19; 20)
-    IDENT@[20; 23)
+    IDENT@[20; 23) "foo"
     L_PAREN@[23; 24)
     R_PAREN@[24; 25)
     L_CURLY@[25; 26)
diff --git a/tests/data/parser/err/0008_item_block_recovery.txt b/tests/data/parser/err/0008_item_block_recovery.txt
index 4bb66f56a12..df6a952cd1b 100644
--- a/tests/data/parser/err/0008_item_block_recovery.txt
+++ b/tests/data/parser/err/0008_item_block_recovery.txt
@@ -2,7 +2,7 @@ FILE@[0; 95)
   FN_ITEM@[0; 14)
     FN_KW@[0; 2)
     WHITESPACE@[2; 3)
-    IDENT@[3; 6)
+    IDENT@[3; 6) "foo"
     L_PAREN@[6; 7)
     R_PAREN@[7; 8)
     WHITESPACE@[8; 9)
@@ -12,7 +12,7 @@ FILE@[0; 95)
     WHITESPACE@[12; 14)
   ERROR@[14; 17)
   err: `expected item`
-    IDENT@[14; 17)
+    IDENT@[14; 17) "bar"
   ERROR@[17; 18)
   err: `expected item`
     L_PAREN@[17; 18)
@@ -24,7 +24,7 @@ FILE@[0; 95)
   err: `expected item`
     L_CURLY@[20; 21)
     WHITESPACE@[21; 26)
-    IDENT@[26; 28)
+    IDENT@[26; 28) "if"
     WHITESPACE@[28; 29)
     TRUE_KW@[29; 33)
     WHITESPACE@[33; 34)
@@ -34,7 +34,7 @@ FILE@[0; 95)
     WHITESPACE@[45; 50)
     R_CURLY@[50; 51)
     WHITESPACE@[51; 52)
-    IDENT@[52; 56)
+    IDENT@[52; 56) "else"
     WHITESPACE@[56; 57)
     L_CURLY@[57; 58)
     WHITESPACE@[58; 67)
@@ -51,7 +51,7 @@ FILE@[0; 95)
   FN_ITEM@[82; 95)
     FN_KW@[82; 84)
     WHITESPACE@[84; 85)
-    IDENT@[85; 88)
+    IDENT@[85; 88) "baz"
     L_PAREN@[88; 89)
     R_PAREN@[89; 90)
     WHITESPACE@[90; 91)
diff --git a/tests/data/parser/err/0009_broken_struct_type_parameter.txt b/tests/data/parser/err/0009_broken_struct_type_parameter.txt
index c6b1adb0c41..f329735b66d 100644
--- a/tests/data/parser/err/0009_broken_struct_type_parameter.txt
+++ b/tests/data/parser/err/0009_broken_struct_type_parameter.txt
@@ -2,7 +2,7 @@ FILE@[0; 43)
   STRUCT_ITEM@[0; 12)
     STRUCT_KW@[0; 6)
     WHITESPACE@[6; 7)
-    IDENT@[7; 8)
+    IDENT@[7; 8) "S"
     TYPE_PARAM_LIST@[8; 12)
       L_ANGLE@[8; 9)
       ERROR@[9; 12)
@@ -27,16 +27,16 @@ FILE@[0; 43)
   err: `expected item`
     L_CURLY@[17; 18)
     WHITESPACE@[18; 23)
-    IDENT@[23; 24)
+    IDENT@[23; 24) "f"
     COLON@[24; 25)
     WHITESPACE@[25; 26)
-    IDENT@[26; 29)
+    IDENT@[26; 29) "u32"
     WHITESPACE@[29; 30)
     R_CURLY@[30; 31)
     WHITESPACE@[31; 33)
   STRUCT_ITEM@[33; 43)
     STRUCT_KW@[33; 39)
     WHITESPACE@[39; 40)
-    IDENT@[40; 41)
+    IDENT@[40; 41) "T"
     SEMI@[41; 42)
     WHITESPACE@[42; 43)
diff --git a/tests/data/parser/ok/0001_struct_item.txt b/tests/data/parser/ok/0001_struct_item.txt
index f599e9d2c5d..c280a434fa1 100644
--- a/tests/data/parser/ok/0001_struct_item.txt
+++ b/tests/data/parser/ok/0001_struct_item.txt
@@ -2,7 +2,7 @@ FILE@[0; 13)
   STRUCT_ITEM@[0; 13)
     STRUCT_KW@[0; 6)
     WHITESPACE@[6; 7)
-    IDENT@[7; 8)
+    IDENT@[7; 8) "S"
     WHITESPACE@[8; 9)
     L_CURLY@[9; 10)
     WHITESPACE@[10; 12)
diff --git a/tests/data/parser/ok/0002_struct_item_field.txt b/tests/data/parser/ok/0002_struct_item_field.txt
index 58042f6a7de..5a7bfbaec56 100644
--- a/tests/data/parser/ok/0002_struct_item_field.txt
+++ b/tests/data/parser/ok/0002_struct_item_field.txt
@@ -2,14 +2,14 @@ FILE@[0; 25)
   STRUCT_ITEM@[0; 25)
     STRUCT_KW@[0; 6)
     WHITESPACE@[6; 7)
-    IDENT@[7; 8)
+    IDENT@[7; 8) "S"
     WHITESPACE@[8; 9)
     L_CURLY@[9; 10)
     NAMED_FIELD@[10; 24)
       WHITESPACE@[10; 15)
-      IDENT@[15; 18)
+      IDENT@[15; 18) "foo"
       COLON@[18; 19)
       WHITESPACE@[19; 20)
-      IDENT@[20; 23)
+      IDENT@[20; 23) "u32"
       WHITESPACE@[23; 24)
     R_CURLY@[24; 25)
diff --git a/tests/data/parser/ok/0005_fn_item.txt b/tests/data/parser/ok/0005_fn_item.txt
index e37129ff154..11335935177 100644
--- a/tests/data/parser/ok/0005_fn_item.txt
+++ b/tests/data/parser/ok/0005_fn_item.txt
@@ -2,7 +2,7 @@ FILE@[0; 13)
   FN_ITEM@[0; 13)
     FN_KW@[0; 2)
     WHITESPACE@[2; 3)
-    IDENT@[3; 6)
+    IDENT@[3; 6) "foo"
     L_PAREN@[6; 7)
     R_PAREN@[7; 8)
     WHITESPACE@[8; 9)
diff --git a/tests/data/parser/ok/0006_inner_attributes.txt b/tests/data/parser/ok/0006_inner_attributes.txt
index d826fb379ab..7d824d1d891 100644
--- a/tests/data/parser/ok/0006_inner_attributes.txt
+++ b/tests/data/parser/ok/0006_inner_attributes.txt
@@ -4,7 +4,7 @@ FILE@[0; 236)
     EXCL@[1; 2)
     L_BRACK@[2; 3)
     META_ITEM@[3; 7)
-      IDENT@[3; 7)
+      IDENT@[3; 7) "attr"
     R_BRACK@[7; 8)
     WHITESPACE@[8; 9)
   ATTR@[9; 24)
@@ -12,7 +12,7 @@ FILE@[0; 236)
     EXCL@[10; 11)
     L_BRACK@[11; 12)
     META_ITEM@[12; 22)
-      IDENT@[12; 16)
+      IDENT@[12; 16) "attr"
       L_PAREN@[16; 17)
       LITERAL@[17; 21)
         TRUE_KW@[17; 21)
@@ -24,10 +24,10 @@ FILE@[0; 236)
     EXCL@[25; 26)
     L_BRACK@[26; 27)
     META_ITEM@[27; 38)
-      IDENT@[27; 31)
+      IDENT@[27; 31) "attr"
       L_PAREN@[31; 32)
       META_ITEM@[32; 37)
-        IDENT@[32; 37)
+        IDENT@[32; 37) "ident"
       R_PAREN@[37; 38)
     R_BRACK@[38; 39)
     WHITESPACE@[39; 40)
@@ -36,10 +36,10 @@ FILE@[0; 236)
     EXCL@[41; 42)
     L_BRACK@[42; 43)
     META_ITEM@[43; 115)
-      IDENT@[43; 47)
+      IDENT@[43; 47) "attr"
       L_PAREN@[47; 48)
       META_ITEM@[48; 53)
-        IDENT@[48; 53)
+        IDENT@[48; 53) "ident"
       COMMA@[53; 54)
       LITERAL@[54; 58)
         WHITESPACE@[54; 55)
@@ -55,7 +55,7 @@ FILE@[0; 236)
       COMMA@[72; 73)
       META_ITEM@[73; 85)
         WHITESPACE@[73; 74)
-        IDENT@[74; 79)
+        IDENT@[74; 79) "ident"
         WHITESPACE@[79; 80)
         EQ@[80; 81)
         LITERAL@[81; 85)
@@ -64,7 +64,7 @@ FILE@[0; 236)
       COMMA@[85; 86)
       META_ITEM@[86; 102)
         WHITESPACE@[86; 87)
-        IDENT@[87; 92)
+        IDENT@[87; 92) "ident"
         WHITESPACE@[92; 93)
         EQ@[93; 94)
         LITERAL@[94; 102)
@@ -73,7 +73,7 @@ FILE@[0; 236)
       COMMA@[102; 103)
       META_ITEM@[103; 114)
         WHITESPACE@[103; 104)
-        IDENT@[104; 109)
+        IDENT@[104; 109) "ident"
         L_PAREN@[109; 110)
         LITERAL@[110; 113)
           INT_NUMBER@[110; 113)
@@ -86,7 +86,7 @@ FILE@[0; 236)
     EXCL@[118; 119)
     L_BRACK@[119; 120)
     META_ITEM@[120; 129)
-      IDENT@[120; 124)
+      IDENT@[120; 124) "attr"
       L_PAREN@[124; 125)
       LITERAL@[125; 128)
         INT_NUMBER@[125; 128)
@@ -98,10 +98,10 @@ FILE@[0; 236)
     EXCL@[132; 133)
     L_BRACK@[133; 134)
     META_ITEM@[134; 154)
-      IDENT@[134; 138)
+      IDENT@[134; 138) "attr"
       L_PAREN@[138; 139)
       META_ITEM@[139; 153)
-        IDENT@[139; 146)
+        IDENT@[139; 146) "enabled"
         WHITESPACE@[146; 147)
         EQ@[147; 148)
         LITERAL@[148; 153)
@@ -115,7 +115,7 @@ FILE@[0; 236)
     EXCL@[157; 158)
     L_BRACK@[158; 159)
     META_ITEM@[159; 172)
-      IDENT@[159; 166)
+      IDENT@[159; 166) "enabled"
       L_PAREN@[166; 167)
       LITERAL@[167; 171)
         TRUE_KW@[167; 171)
@@ -127,7 +127,7 @@ FILE@[0; 236)
     EXCL@[175; 176)
     L_BRACK@[176; 177)
     META_ITEM@[177; 190)
-      IDENT@[177; 181)
+      IDENT@[177; 181) "attr"
       L_PAREN@[181; 182)
       LITERAL@[182; 189)
         STRING@[182; 189)
@@ -139,14 +139,14 @@ FILE@[0; 236)
     EXCL@[193; 194)
     L_BRACK@[194; 195)
     META_ITEM@[195; 213)
-      IDENT@[195; 199)
+      IDENT@[195; 199) "repr"
       L_PAREN@[199; 200)
       META_ITEM@[200; 201)
-        IDENT@[200; 201)
+        IDENT@[200; 201) "C"
       COMMA@[201; 202)
       META_ITEM@[202; 212)
         WHITESPACE@[202; 203)
-        IDENT@[203; 208)
+        IDENT@[203; 208) "align"
         WHITESPACE@[208; 209)
         EQ@[209; 210)
         LITERAL@[210; 212)
@@ -160,14 +160,14 @@ FILE@[0; 236)
     EXCL@[216; 217)
     L_BRACK@[217; 218)
     META_ITEM@[218; 235)
-      IDENT@[218; 222)
+      IDENT@[218; 222) "repr"
       L_PAREN@[222; 223)
       META_ITEM@[223; 224)
-        IDENT@[223; 224)
+        IDENT@[223; 224) "C"
       COMMA@[224; 225)
       META_ITEM@[225; 234)
         WHITESPACE@[225; 226)
-        IDENT@[226; 231)
+        IDENT@[226; 231) "align"
         L_PAREN@[231; 232)
         LITERAL@[232; 233)
           INT_NUMBER@[232; 233)
diff --git a/tests/data/parser/ok/0007_extern_crate.txt b/tests/data/parser/ok/0007_extern_crate.txt
index 902c80f7dbc..aff70131b1c 100644
--- a/tests/data/parser/ok/0007_extern_crate.txt
+++ b/tests/data/parser/ok/0007_extern_crate.txt
@@ -4,7 +4,7 @@ FILE@[0; 43)
     WHITESPACE@[6; 7)
     CRATE_KW@[7; 12)
     WHITESPACE@[12; 13)
-    IDENT@[13; 16)
+    IDENT@[13; 16) "foo"
     SEMI@[16; 17)
     WHITESPACE@[17; 18)
   EXTERN_CRATE_ITEM@[18; 43)
@@ -12,11 +12,11 @@ FILE@[0; 43)
     WHITESPACE@[24; 25)
     CRATE_KW@[25; 30)
     WHITESPACE@[30; 31)
-    IDENT@[31; 34)
+    IDENT@[31; 34) "foo"
     ALIAS@[34; 41)
       WHITESPACE@[34; 35)
       AS_KW@[35; 37)
       WHITESPACE@[37; 38)
-      IDENT@[38; 41)
+      IDENT@[38; 41) "bar"
     SEMI@[41; 42)
     WHITESPACE@[42; 43)
diff --git a/tests/data/parser/ok/0008_mod_item.txt b/tests/data/parser/ok/0008_mod_item.txt
index 425e3344c74..06e11807d6a 100644
--- a/tests/data/parser/ok/0008_mod_item.txt
+++ b/tests/data/parser/ok/0008_mod_item.txt
@@ -2,13 +2,13 @@ FILE@[0; 118)
   MOD_ITEM@[0; 8)
     MOD_KW@[0; 3)
     WHITESPACE@[3; 4)
-    IDENT@[4; 5)
+    IDENT@[4; 5) "a"
     SEMI@[5; 6)
     WHITESPACE@[6; 8)
   MOD_ITEM@[8; 19)
     MOD_KW@[8; 11)
     WHITESPACE@[11; 12)
-    IDENT@[12; 13)
+    IDENT@[12; 13) "b"
     WHITESPACE@[13; 14)
     L_CURLY@[14; 15)
     WHITESPACE@[15; 16)
@@ -17,14 +17,14 @@ FILE@[0; 118)
   MOD_ITEM@[19; 67)
     MOD_KW@[19; 22)
     WHITESPACE@[22; 23)
-    IDENT@[23; 24)
+    IDENT@[23; 24) "c"
     WHITESPACE@[24; 25)
     L_CURLY@[25; 26)
     FN_ITEM@[26; 52)
       WHITESPACE@[26; 31)
       FN_KW@[31; 33)
       WHITESPACE@[33; 34)
-      IDENT@[34; 37)
+      IDENT@[34; 37) "foo"
       L_PAREN@[37; 38)
       R_PAREN@[38; 39)
       WHITESPACE@[39; 40)
@@ -35,7 +35,7 @@ FILE@[0; 118)
     STRUCT_ITEM@[52; 64)
       STRUCT_KW@[52; 58)
       WHITESPACE@[58; 59)
-      IDENT@[59; 60)
+      IDENT@[59; 60) "S"
       WHITESPACE@[60; 61)
       L_CURLY@[61; 62)
       R_CURLY@[62; 63)
@@ -45,7 +45,7 @@ FILE@[0; 118)
   MOD_ITEM@[67; 118)
     MOD_KW@[67; 70)
     WHITESPACE@[70; 71)
-    IDENT@[71; 72)
+    IDENT@[71; 72) "d"
     WHITESPACE@[72; 73)
     L_CURLY@[73; 74)
     ATTR@[74; 92)
@@ -54,19 +54,19 @@ FILE@[0; 118)
       EXCL@[80; 81)
       L_BRACK@[81; 82)
       META_ITEM@[82; 86)
-        IDENT@[82; 86)
+        IDENT@[82; 86) "attr"
       R_BRACK@[86; 87)
       WHITESPACE@[87; 92)
     MOD_ITEM@[92; 103)
       MOD_KW@[92; 95)
       WHITESPACE@[95; 96)
-      IDENT@[96; 97)
+      IDENT@[96; 97) "e"
       SEMI@[97; 98)
       WHITESPACE@[98; 103)
     MOD_ITEM@[103; 117)
       MOD_KW@[103; 106)
       WHITESPACE@[106; 107)
-      IDENT@[107; 108)
+      IDENT@[107; 108) "f"
       WHITESPACE@[108; 109)
       L_CURLY@[109; 110)
       WHITESPACE@[110; 115)
diff --git a/tests/data/parser/ok/0009_use_item.txt b/tests/data/parser/ok/0009_use_item.txt
index 63274125de7..08ae990d9f3 100644
--- a/tests/data/parser/ok/0009_use_item.txt
+++ b/tests/data/parser/ok/0009_use_item.txt
@@ -5,7 +5,7 @@ FILE@[0; 19)
       PATH@[3; 7)
         PATH_SEGMENT@[3; 7)
           WHITESPACE@[3; 4)
-          IDENT@[4; 7)
+          IDENT@[4; 7) "foo"
     SEMI@[7; 8)
     WHITESPACE@[8; 9)
   USE_ITEM@[9; 19)
@@ -15,5 +15,5 @@ FILE@[0; 19)
         PATH_SEGMENT@[12; 18)
           WHITESPACE@[12; 13)
           COLONCOLON@[13; 15)
-          IDENT@[15; 18)
+          IDENT@[15; 18) "bar"
     SEMI@[18; 19)
diff --git a/tests/data/parser/ok/0010_use_path_segments.txt b/tests/data/parser/ok/0010_use_path_segments.txt
index d0f2033cef4..37e3dfdbf07 100644
--- a/tests/data/parser/ok/0010_use_path_segments.txt
+++ b/tests/data/parser/ok/0010_use_path_segments.txt
@@ -8,13 +8,13 @@ FILE@[0; 40)
             PATH_SEGMENT@[3; 9)
               WHITESPACE@[3; 4)
               COLONCOLON@[4; 6)
-              IDENT@[6; 9)
+              IDENT@[6; 9) "foo"
           COLONCOLON@[9; 11)
           PATH_SEGMENT@[11; 14)
-            IDENT@[11; 14)
+            IDENT@[11; 14) "bar"
         COLONCOLON@[14; 16)
         PATH_SEGMENT@[16; 19)
-          IDENT@[16; 19)
+          IDENT@[16; 19) "baz"
     SEMI@[19; 20)
     WHITESPACE@[20; 21)
   USE_ITEM@[21; 40)
@@ -25,12 +25,12 @@ FILE@[0; 40)
           PATH@[24; 28)
             PATH_SEGMENT@[24; 28)
               WHITESPACE@[24; 25)
-              IDENT@[25; 28)
+              IDENT@[25; 28) "foo"
           COLONCOLON@[28; 30)
           PATH_SEGMENT@[30; 33)
-            IDENT@[30; 33)
+            IDENT@[30; 33) "bar"
         COLONCOLON@[33; 35)
         PATH_SEGMENT@[35; 38)
-          IDENT@[35; 38)
+          IDENT@[35; 38) "baz"
     SEMI@[38; 39)
     WHITESPACE@[39; 40)
diff --git a/tests/data/parser/ok/0011_outer_attribute.txt b/tests/data/parser/ok/0011_outer_attribute.txt
index 0f69b1f6687..4839d8e6712 100644
--- a/tests/data/parser/ok/0011_outer_attribute.txt
+++ b/tests/data/parser/ok/0011_outer_attribute.txt
@@ -4,10 +4,10 @@ FILE@[0; 35)
       POUND@[0; 1)
       L_BRACK@[1; 2)
       META_ITEM@[2; 11)
-        IDENT@[2; 5)
+        IDENT@[2; 5) "cfg"
         L_PAREN@[5; 6)
         META_ITEM@[6; 10)
-          IDENT@[6; 10)
+          IDENT@[6; 10) "test"
         R_PAREN@[10; 11)
       R_BRACK@[11; 12)
       WHITESPACE@[12; 13)
@@ -15,12 +15,12 @@ FILE@[0; 35)
       POUND@[13; 14)
       L_BRACK@[14; 15)
       META_ITEM@[15; 21)
-        IDENT@[15; 21)
+        IDENT@[15; 21) "ignore"
       R_BRACK@[21; 22)
       WHITESPACE@[22; 23)
     FN_KW@[23; 25)
     WHITESPACE@[25; 26)
-    IDENT@[26; 29)
+    IDENT@[26; 29) "foo"
     L_PAREN@[29; 30)
     R_PAREN@[30; 31)
     WHITESPACE@[31; 32)
diff --git a/tests/data/parser/ok/0012_visibility.txt b/tests/data/parser/ok/0012_visibility.txt
index 0e091724da8..ed22b265bf5 100644
--- a/tests/data/parser/ok/0012_visibility.txt
+++ b/tests/data/parser/ok/0012_visibility.txt
@@ -2,7 +2,7 @@ FILE@[0; 98)
   FN_ITEM@[0; 10)
     FN_KW@[0; 2)
     WHITESPACE@[2; 3)
-    IDENT@[3; 4)
+    IDENT@[3; 4) "a"
     L_PAREN@[4; 5)
     R_PAREN@[5; 6)
     WHITESPACE@[6; 7)
@@ -15,7 +15,7 @@ FILE@[0; 98)
       WHITESPACE@[13; 14)
     FN_KW@[14; 16)
     WHITESPACE@[16; 17)
-    IDENT@[17; 18)
+    IDENT@[17; 18) "b"
     L_PAREN@[18; 19)
     R_PAREN@[19; 20)
     WHITESPACE@[20; 21)
@@ -31,7 +31,7 @@ FILE@[0; 98)
       WHITESPACE@[34; 35)
     FN_KW@[35; 37)
     WHITESPACE@[37; 38)
-    IDENT@[38; 39)
+    IDENT@[38; 39) "c"
     L_PAREN@[39; 40)
     R_PAREN@[40; 41)
     WHITESPACE@[41; 42)
@@ -47,7 +47,7 @@ FILE@[0; 98)
       WHITESPACE@[55; 56)
     FN_KW@[56; 58)
     WHITESPACE@[58; 59)
-    IDENT@[59; 60)
+    IDENT@[59; 60) "d"
     L_PAREN@[60; 61)
     R_PAREN@[61; 62)
     WHITESPACE@[62; 63)
@@ -64,18 +64,18 @@ FILE@[0; 98)
           PATH@[72; 76)
             PATH_SEGMENT@[72; 76)
               WHITESPACE@[72; 73)
-              IDENT@[73; 76)
+              IDENT@[73; 76) "foo"
           COLONCOLON@[76; 78)
           PATH_SEGMENT@[78; 81)
-            IDENT@[78; 81)
+            IDENT@[78; 81) "bar"
         COLONCOLON@[81; 83)
         PATH_SEGMENT@[83; 86)
-          IDENT@[83; 86)
+          IDENT@[83; 86) "baz"
       R_PAREN@[86; 87)
       WHITESPACE@[87; 88)
     FN_KW@[88; 90)
     WHITESPACE@[90; 91)
-    IDENT@[91; 92)
+    IDENT@[91; 92) "e"
     L_PAREN@[92; 93)
     R_PAREN@[93; 94)
     WHITESPACE@[94; 95)
diff --git a/tests/data/parser/ok/0013_use_path_self_super.txt b/tests/data/parser/ok/0013_use_path_self_super.txt
index 2b0934e97b4..f3dfaba4bba 100644
--- a/tests/data/parser/ok/0013_use_path_self_super.txt
+++ b/tests/data/parser/ok/0013_use_path_self_super.txt
@@ -9,7 +9,7 @@ FILE@[0; 65)
             SELF_KW@[4; 8)
         COLONCOLON@[8; 10)
         PATH_SEGMENT@[10; 13)
-          IDENT@[10; 13)
+          IDENT@[10; 13) "foo"
     SEMI@[13; 14)
     WHITESPACE@[14; 15)
   USE_ITEM@[15; 38)
@@ -26,7 +26,7 @@ FILE@[0; 65)
             SUPER_KW@[26; 31)
         COLONCOLON@[31; 33)
         PATH_SEGMENT@[33; 36)
-          IDENT@[33; 36)
+          IDENT@[33; 36) "bar"
     SEMI@[36; 37)
     WHITESPACE@[37; 38)
   USE_ITEM@[38; 65)
@@ -42,12 +42,12 @@ FILE@[0; 65)
                 SELF_KW@[44; 48)
             COLONCOLON@[48; 50)
             PATH_SEGMENT@[50; 51)
-              IDENT@[50; 51)
+              IDENT@[50; 51) "a"
           COLONCOLON@[51; 53)
           PATH_SEGMENT@[53; 58)
             SUPER_KW@[53; 58)
         COLONCOLON@[58; 60)
         PATH_SEGMENT@[60; 63)
-          IDENT@[60; 63)
+          IDENT@[60; 63) "bar"
     SEMI@[63; 64)
     WHITESPACE@[64; 65)
diff --git a/tests/data/parser/ok/0014_use_tree.txt b/tests/data/parser/ok/0014_use_tree.txt
index ca91e63e19c..cddaa546280 100644
--- a/tests/data/parser/ok/0014_use_tree.txt
+++ b/tests/data/parser/ok/0014_use_tree.txt
@@ -37,7 +37,7 @@ FILE@[0; 81)
       PATH@[37; 41)
         PATH_SEGMENT@[37; 41)
           WHITESPACE@[37; 38)
-          IDENT@[38; 41)
+          IDENT@[38; 41) "foo"
       COLONCOLON@[41; 43)
       STAR@[43; 44)
     SEMI@[44; 45)
@@ -48,7 +48,7 @@ FILE@[0; 81)
       PATH@[49; 53)
         PATH_SEGMENT@[49; 53)
           WHITESPACE@[49; 50)
-          IDENT@[50; 53)
+          IDENT@[50; 53) "foo"
       COLONCOLON@[53; 55)
       L_CURLY@[55; 56)
       R_CURLY@[56; 57)
@@ -61,25 +61,25 @@ FILE@[0; 81)
         PATH_SEGMENT@[62; 68)
           WHITESPACE@[62; 63)
           COLONCOLON@[63; 65)
-          IDENT@[65; 68)
+          IDENT@[65; 68) "foo"
       COLONCOLON@[68; 70)
       L_CURLY@[70; 71)
       USE_TREE@[71; 72)
         PATH@[71; 72)
           PATH_SEGMENT@[71; 72)
-            IDENT@[71; 72)
+            IDENT@[71; 72) "a"
       COMMA@[72; 73)
       USE_TREE@[73; 75)
         PATH@[73; 75)
           PATH_SEGMENT@[73; 75)
             WHITESPACE@[73; 74)
-            IDENT@[74; 75)
+            IDENT@[74; 75) "b"
       COMMA@[75; 76)
       USE_TREE@[76; 78)
         PATH@[76; 78)
           PATH_SEGMENT@[76; 78)
             WHITESPACE@[76; 77)
-            IDENT@[77; 78)
+            IDENT@[77; 78) "c"
       R_CURLY@[78; 79)
     SEMI@[79; 80)
     WHITESPACE@[80; 81)
diff --git a/tests/data/parser/ok/0015_use_tree.txt b/tests/data/parser/ok/0015_use_tree.txt
index c1975f6cb5d..10bdef5fe35 100644
--- a/tests/data/parser/ok/0015_use_tree.txt
+++ b/tests/data/parser/ok/0015_use_tree.txt
@@ -5,12 +5,12 @@ FILE@[0; 55)
       PATH@[3; 8)
         PATH_SEGMENT@[3; 8)
           WHITESPACE@[3; 4)
-          IDENT@[4; 7)
+          IDENT@[4; 7) "foo"
           WHITESPACE@[7; 8)
       ALIAS@[8; 14)
         AS_KW@[8; 10)
         WHITESPACE@[10; 11)
-        IDENT@[11; 14)
+        IDENT@[11; 14) "bar"
     SEMI@[14; 15)
     WHITESPACE@[15; 16)
   USE_ITEM@[16; 55)
@@ -19,18 +19,18 @@ FILE@[0; 55)
       PATH@[19; 23)
         PATH_SEGMENT@[19; 23)
           WHITESPACE@[19; 20)
-          IDENT@[20; 23)
+          IDENT@[20; 23) "foo"
       COLONCOLON@[23; 25)
       L_CURLY@[25; 26)
       USE_TREE@[26; 32)
         PATH@[26; 28)
           PATH_SEGMENT@[26; 28)
-            IDENT@[26; 27)
+            IDENT@[26; 27) "a"
             WHITESPACE@[27; 28)
         ALIAS@[28; 32)
           AS_KW@[28; 30)
           WHITESPACE@[30; 31)
-          IDENT@[31; 32)
+          IDENT@[31; 32) "b"
       COMMA@[32; 33)
       USE_TREE@[33; 35)
         WHITESPACE@[33; 34)
@@ -46,12 +46,12 @@ FILE@[0; 55)
           PATH_SEGMENT@[41; 48)
             WHITESPACE@[41; 42)
             COLONCOLON@[42; 44)
-            IDENT@[44; 47)
+            IDENT@[44; 47) "foo"
             WHITESPACE@[47; 48)
         ALIAS@[48; 52)
           AS_KW@[48; 50)
           WHITESPACE@[50; 51)
-          IDENT@[51; 52)
+          IDENT@[51; 52) "x"
       R_CURLY@[52; 53)
     SEMI@[53; 54)
     WHITESPACE@[54; 55)
diff --git a/tests/data/parser/ok/0016_struct_flavors.txt b/tests/data/parser/ok/0016_struct_flavors.txt
index 93b16e1b9c2..d5d3a0183b1 100644
--- a/tests/data/parser/ok/0016_struct_flavors.txt
+++ b/tests/data/parser/ok/0016_struct_flavors.txt
@@ -2,13 +2,13 @@ FILE@[0; 97)
   STRUCT_ITEM@[0; 10)
     STRUCT_KW@[0; 6)
     WHITESPACE@[6; 7)
-    IDENT@[7; 8)
+    IDENT@[7; 8) "A"
     SEMI@[8; 9)
     WHITESPACE@[9; 10)
   STRUCT_ITEM@[10; 22)
     STRUCT_KW@[10; 16)
     WHITESPACE@[16; 17)
-    IDENT@[17; 18)
+    IDENT@[17; 18) "B"
     WHITESPACE@[18; 19)
     L_CURLY@[19; 20)
     R_CURLY@[20; 21)
@@ -16,7 +16,7 @@ FILE@[0; 97)
   STRUCT_ITEM@[22; 35)
     STRUCT_KW@[22; 28)
     WHITESPACE@[28; 29)
-    IDENT@[29; 30)
+    IDENT@[29; 30) "C"
     L_PAREN@[30; 31)
     R_PAREN@[31; 32)
     SEMI@[32; 33)
@@ -24,42 +24,42 @@ FILE@[0; 97)
   STRUCT_ITEM@[35; 76)
     STRUCT_KW@[35; 41)
     WHITESPACE@[41; 42)
-    IDENT@[42; 43)
+    IDENT@[42; 43) "D"
     WHITESPACE@[43; 44)
     L_CURLY@[44; 45)
     NAMED_FIELD@[45; 56)
       WHITESPACE@[45; 50)
-      IDENT@[50; 51)
+      IDENT@[50; 51) "a"
       COLON@[51; 52)
       WHITESPACE@[52; 53)
-      IDENT@[53; 56)
+      IDENT@[53; 56) "u32"
     COMMA@[56; 57)
     NAMED_FIELD@[57; 73)
       VISIBILITY@[57; 66)
         WHITESPACE@[57; 62)
         PUB_KW@[62; 65)
         WHITESPACE@[65; 66)
-      IDENT@[66; 67)
+      IDENT@[66; 67) "b"
       COLON@[67; 68)
       WHITESPACE@[68; 69)
-      IDENT@[69; 72)
+      IDENT@[69; 72) "u32"
       WHITESPACE@[72; 73)
     R_CURLY@[73; 74)
     WHITESPACE@[74; 76)
   STRUCT_ITEM@[76; 97)
     STRUCT_KW@[76; 82)
     WHITESPACE@[82; 83)
-    IDENT@[83; 84)
+    IDENT@[83; 84) "E"
     L_PAREN@[84; 85)
     POS_FIELD@[85; 90)
       VISIBILITY@[85; 89)
         PUB_KW@[85; 88)
         WHITESPACE@[88; 89)
-      IDENT@[89; 90)
+      IDENT@[89; 90) "x"
     COMMA@[90; 91)
     POS_FIELD@[91; 93)
       WHITESPACE@[91; 92)
-      IDENT@[92; 93)
+      IDENT@[92; 93) "y"
     COMMA@[93; 94)
     R_PAREN@[94; 95)
     SEMI@[95; 96)
diff --git a/tests/data/parser/ok/0017_attr_trailing_comma.txt b/tests/data/parser/ok/0017_attr_trailing_comma.txt
index 1b99d7ffdf9..304417ed9f3 100644
--- a/tests/data/parser/ok/0017_attr_trailing_comma.txt
+++ b/tests/data/parser/ok/0017_attr_trailing_comma.txt
@@ -4,17 +4,17 @@ FILE@[0; 23)
       POUND@[0; 1)
       L_BRACK@[1; 2)
       META_ITEM@[2; 9)
-        IDENT@[2; 5)
+        IDENT@[2; 5) "foo"
         L_PAREN@[5; 6)
         META_ITEM@[6; 7)
-          IDENT@[6; 7)
+          IDENT@[6; 7) "a"
         COMMA@[7; 8)
         R_PAREN@[8; 9)
       R_BRACK@[9; 10)
       WHITESPACE@[10; 11)
     FN_KW@[11; 13)
     WHITESPACE@[13; 14)
-    IDENT@[14; 17)
+    IDENT@[14; 17) "foo"
     L_PAREN@[17; 18)
     R_PAREN@[18; 19)
     WHITESPACE@[19; 20)
diff --git a/tests/data/parser/ok/0018_struct_type_params.txt b/tests/data/parser/ok/0018_struct_type_params.txt
index b2e7ef9d755..6df786f4286 100644
--- a/tests/data/parser/ok/0018_struct_type_params.txt
+++ b/tests/data/parser/ok/0018_struct_type_params.txt
@@ -2,53 +2,53 @@ FILE@[0; 290)
   STRUCT_ITEM@[0; 14)
     STRUCT_KW@[0; 6)
     WHITESPACE@[6; 7)
-    IDENT@[7; 9)
+    IDENT@[7; 9) "S1"
     TYPE_PARAM_LIST@[9; 12)
       L_ANGLE@[9; 10)
       TYPE_PARAM@[10; 11)
-        IDENT@[10; 11)
+        IDENT@[10; 11) "T"
       R_ANGLE@[11; 12)
     SEMI@[12; 13)
     WHITESPACE@[13; 14)
   STRUCT_ITEM@[14; 33)
     STRUCT_KW@[14; 20)
     WHITESPACE@[20; 21)
-    IDENT@[21; 23)
+    IDENT@[21; 23) "S2"
     TYPE_PARAM_LIST@[23; 26)
       L_ANGLE@[23; 24)
       TYPE_PARAM@[24; 25)
-        IDENT@[24; 25)
+        IDENT@[24; 25) "T"
       R_ANGLE@[25; 26)
     L_PAREN@[26; 27)
     POS_FIELD@[27; 30)
-      IDENT@[27; 30)
+      IDENT@[27; 30) "u32"
     R_PAREN@[30; 31)
     SEMI@[31; 32)
     WHITESPACE@[32; 33)
   STRUCT_ITEM@[33; 58)
     STRUCT_KW@[33; 39)
     WHITESPACE@[39; 40)
-    IDENT@[40; 42)
+    IDENT@[40; 42) "S3"
     TYPE_PARAM_LIST@[42; 46)
       L_ANGLE@[42; 43)
       TYPE_PARAM@[43; 44)
-        IDENT@[43; 44)
+        IDENT@[43; 44) "T"
       R_ANGLE@[44; 45)
       WHITESPACE@[45; 46)
     L_CURLY@[46; 47)
     NAMED_FIELD@[47; 55)
       WHITESPACE@[47; 48)
-      IDENT@[48; 49)
+      IDENT@[48; 49) "u"
       COLON@[49; 50)
       WHITESPACE@[50; 51)
-      IDENT@[51; 54)
+      IDENT@[51; 54) "u32"
       WHITESPACE@[54; 55)
     R_CURLY@[55; 56)
     WHITESPACE@[56; 58)
   STRUCT_ITEM@[58; 71)
     STRUCT_KW@[58; 64)
     WHITESPACE@[64; 65)
-    IDENT@[65; 67)
+    IDENT@[65; 67) "S4"
     TYPE_PARAM_LIST@[67; 69)
       L_ANGLE@[67; 68)
       R_ANGLE@[68; 69)
@@ -57,22 +57,22 @@ FILE@[0; 290)
   STRUCT_ITEM@[71; 86)
     STRUCT_KW@[71; 77)
     WHITESPACE@[77; 78)
-    IDENT@[78; 80)
+    IDENT@[78; 80) "S5"
     TYPE_PARAM_LIST@[80; 84)
       L_ANGLE@[80; 81)
       LIFETIME_PARAM@[81; 83)
-        LIFETIME@[81; 83)
+        LIFETIME@[81; 83) "'a"
       R_ANGLE@[83; 84)
     SEMI@[84; 85)
     WHITESPACE@[85; 86)
   STRUCT_ITEM@[86; 102)
     STRUCT_KW@[86; 92)
     WHITESPACE@[92; 93)
-    IDENT@[93; 95)
+    IDENT@[93; 95) "S6"
     TYPE_PARAM_LIST@[95; 100)
       L_ANGLE@[95; 96)
       LIFETIME_PARAM@[96; 99)
-        LIFETIME@[96; 98)
+        LIFETIME@[96; 98) "'a"
         COLON@[98; 99)
       R_ANGLE@[99; 100)
     SEMI@[100; 101)
@@ -80,28 +80,28 @@ FILE@[0; 290)
   STRUCT_ITEM@[102; 121)
     STRUCT_KW@[102; 108)
     WHITESPACE@[108; 109)
-    IDENT@[109; 111)
+    IDENT@[109; 111) "S7"
     TYPE_PARAM_LIST@[111; 119)
       L_ANGLE@[111; 112)
       LIFETIME_PARAM@[112; 118)
-        LIFETIME@[112; 114)
+        LIFETIME@[112; 114) "'a"
         COLON@[114; 115)
         WHITESPACE@[115; 116)
-        LIFETIME@[116; 118)
+        LIFETIME@[116; 118) "'b"
       R_ANGLE@[118; 119)
     SEMI@[119; 120)
     WHITESPACE@[120; 121)
   STRUCT_ITEM@[121; 143)
     STRUCT_KW@[121; 127)
     WHITESPACE@[127; 128)
-    IDENT@[128; 130)
+    IDENT@[128; 130) "S8"
     TYPE_PARAM_LIST@[130; 141)
       L_ANGLE@[130; 131)
       LIFETIME_PARAM@[131; 140)
-        LIFETIME@[131; 133)
+        LIFETIME@[131; 133) "'a"
         COLON@[133; 134)
         WHITESPACE@[134; 135)
-        LIFETIME@[135; 137)
+        LIFETIME@[135; 137) "'b"
         WHITESPACE@[137; 138)
         PLUS@[138; 139)
         WHITESPACE@[139; 140)
@@ -111,29 +111,29 @@ FILE@[0; 290)
   STRUCT_ITEM@[143; 167)
     STRUCT_KW@[143; 149)
     WHITESPACE@[149; 150)
-    IDENT@[150; 152)
+    IDENT@[150; 152) "S9"
     TYPE_PARAM_LIST@[152; 165)
       L_ANGLE@[152; 153)
       LIFETIME_PARAM@[153; 164)
-        LIFETIME@[153; 155)
+        LIFETIME@[153; 155) "'a"
         COLON@[155; 156)
         WHITESPACE@[156; 157)
-        LIFETIME@[157; 159)
+        LIFETIME@[157; 159) "'b"
         WHITESPACE@[159; 160)
         PLUS@[160; 161)
         WHITESPACE@[161; 162)
-        LIFETIME@[162; 164)
+        LIFETIME@[162; 164) "'c"
       R_ANGLE@[164; 165)
     SEMI@[165; 166)
     WHITESPACE@[166; 167)
   STRUCT_ITEM@[167; 184)
     STRUCT_KW@[167; 173)
     WHITESPACE@[173; 174)
-    IDENT@[174; 177)
+    IDENT@[174; 177) "S10"
     TYPE_PARAM_LIST@[177; 182)
       L_ANGLE@[177; 178)
       LIFETIME_PARAM@[178; 180)
-        LIFETIME@[178; 180)
+        LIFETIME@[178; 180) "'a"
       COMMA@[180; 181)
       R_ANGLE@[181; 182)
     SEMI@[182; 183)
@@ -141,37 +141,37 @@ FILE@[0; 290)
   STRUCT_ITEM@[184; 204)
     STRUCT_KW@[184; 190)
     WHITESPACE@[190; 191)
-    IDENT@[191; 194)
+    IDENT@[191; 194) "S11"
     TYPE_PARAM_LIST@[194; 202)
       L_ANGLE@[194; 195)
       LIFETIME_PARAM@[195; 197)
-        LIFETIME@[195; 197)
+        LIFETIME@[195; 197) "'a"
       COMMA@[197; 198)
       LIFETIME_PARAM@[198; 201)
         WHITESPACE@[198; 199)
-        LIFETIME@[199; 201)
+        LIFETIME@[199; 201) "'b"
       R_ANGLE@[201; 202)
     SEMI@[202; 203)
     WHITESPACE@[203; 204)
   STRUCT_ITEM@[204; 235)
     STRUCT_KW@[204; 210)
     WHITESPACE@[210; 211)
-    IDENT@[211; 214)
+    IDENT@[211; 214) "S12"
     TYPE_PARAM_LIST@[214; 232)
       L_ANGLE@[214; 215)
       LIFETIME_PARAM@[215; 222)
-        LIFETIME@[215; 217)
+        LIFETIME@[215; 217) "'a"
         COLON@[217; 218)
         WHITESPACE@[218; 219)
-        LIFETIME@[219; 221)
+        LIFETIME@[219; 221) "'b"
         PLUS@[221; 222)
       COMMA@[222; 223)
       LIFETIME_PARAM@[223; 230)
         WHITESPACE@[223; 224)
-        LIFETIME@[224; 226)
+        LIFETIME@[224; 226) "'b"
         COLON@[226; 227)
         WHITESPACE@[227; 228)
-        LIFETIME@[228; 230)
+        LIFETIME@[228; 230) "'c"
       COMMA@[230; 231)
       R_ANGLE@[231; 232)
     SEMI@[232; 233)
@@ -179,45 +179,45 @@ FILE@[0; 290)
   STRUCT_ITEM@[235; 250)
     STRUCT_KW@[235; 241)
     WHITESPACE@[241; 242)
-    IDENT@[242; 245)
+    IDENT@[242; 245) "S13"
     TYPE_PARAM_LIST@[245; 248)
       L_ANGLE@[245; 246)
       TYPE_PARAM@[246; 247)
-        IDENT@[246; 247)
+        IDENT@[246; 247) "T"
       R_ANGLE@[247; 248)
     SEMI@[248; 249)
     WHITESPACE@[249; 250)
   STRUCT_ITEM@[250; 268)
     STRUCT_KW@[250; 256)
     WHITESPACE@[256; 257)
-    IDENT@[257; 260)
+    IDENT@[257; 260) "S14"
     TYPE_PARAM_LIST@[260; 266)
       L_ANGLE@[260; 261)
       TYPE_PARAM@[261; 262)
-        IDENT@[261; 262)
+        IDENT@[261; 262) "T"
       COMMA@[262; 263)
       TYPE_PARAM@[263; 265)
         WHITESPACE@[263; 264)
-        IDENT@[264; 265)
+        IDENT@[264; 265) "U"
       R_ANGLE@[265; 266)
     SEMI@[266; 267)
     WHITESPACE@[267; 268)
   STRUCT_ITEM@[268; 290)
     STRUCT_KW@[268; 274)
     WHITESPACE@[274; 275)
-    IDENT@[275; 278)
+    IDENT@[275; 278) "S15"
     TYPE_PARAM_LIST@[278; 288)
       L_ANGLE@[278; 279)
       LIFETIME_PARAM@[279; 281)
-        LIFETIME@[279; 281)
+        LIFETIME@[279; 281) "'a"
       COMMA@[281; 282)
       TYPE_PARAM@[282; 284)
         WHITESPACE@[282; 283)
-        IDENT@[283; 284)
+        IDENT@[283; 284) "T"
       COMMA@[284; 285)
       TYPE_PARAM@[285; 287)
         WHITESPACE@[285; 286)
-        IDENT@[286; 287)
+        IDENT@[286; 287) "U"
       R_ANGLE@[287; 288)
     SEMI@[288; 289)
     WHITESPACE@[289; 290)
diff --git a/tests/data/parser/ok/0019_enums.rs b/tests/data/parser/ok/0019_enums.rs
new file mode 100644
index 00000000000..7a1afa0e62f
--- /dev/null
+++ b/tests/data/parser/ok/0019_enums.rs
@@ -0,0 +1,25 @@
+enum E1 {
+}
+
+enum E2<T> {
+}
+
+enum E3 {
+    X
+}
+
+enum E4 {
+    X,
+}
+
+enum E5 {
+    A,
+    B = 92,
+    C {
+        a: u32,
+        pub b: f64,
+    },
+    F {},
+    D(u32,),
+    E(),
+}
diff --git a/tests/data/parser/ok/0019_enums.txt b/tests/data/parser/ok/0019_enums.txt
new file mode 100644
index 00000000000..dfb8e1f0c3d
--- /dev/null
+++ b/tests/data/parser/ok/0019_enums.txt
@@ -0,0 +1,118 @@
+FILE@[0; 182)
+  ENUM_ITEM@[0; 13)
+    ENUM_KW@[0; 4)
+    WHITESPACE@[4; 5)
+    IDENT@[5; 7) "E1"
+    WHITESPACE@[7; 8)
+    L_CURLY@[8; 9)
+    WHITESPACE@[9; 10)
+    R_CURLY@[10; 11)
+    WHITESPACE@[11; 13)
+  ENUM_ITEM@[13; 29)
+    ENUM_KW@[13; 17)
+    WHITESPACE@[17; 18)
+    IDENT@[18; 20) "E2"
+    TYPE_PARAM_LIST@[20; 24)
+      L_ANGLE@[20; 21)
+      TYPE_PARAM@[21; 22)
+        IDENT@[21; 22) "T"
+      R_ANGLE@[22; 23)
+      WHITESPACE@[23; 24)
+    L_CURLY@[24; 25)
+    WHITESPACE@[25; 26)
+    R_CURLY@[26; 27)
+    WHITESPACE@[27; 29)
+  ENUM_ITEM@[29; 48)
+    ENUM_KW@[29; 33)
+    WHITESPACE@[33; 34)
+    IDENT@[34; 36) "E3"
+    WHITESPACE@[36; 37)
+    L_CURLY@[37; 38)
+    ENUM_VARIANT@[38; 45)
+      WHITESPACE@[38; 43)
+      IDENT@[43; 44) "X"
+      WHITESPACE@[44; 45)
+    R_CURLY@[45; 46)
+    WHITESPACE@[46; 48)
+  ENUM_ITEM@[48; 68)
+    ENUM_KW@[48; 52)
+    WHITESPACE@[52; 53)
+    IDENT@[53; 55) "E4"
+    WHITESPACE@[55; 56)
+    L_CURLY@[56; 57)
+    ENUM_VARIANT@[57; 63)
+      WHITESPACE@[57; 62)
+      IDENT@[62; 63) "X"
+    COMMA@[63; 64)
+    WHITESPACE@[64; 65)
+    R_CURLY@[65; 66)
+    WHITESPACE@[66; 68)
+  ENUM_ITEM@[68; 182)
+    ENUM_KW@[68; 72)
+    WHITESPACE@[72; 73)
+    IDENT@[73; 75) "E5"
+    WHITESPACE@[75; 76)
+    L_CURLY@[76; 77)
+    ENUM_VARIANT@[77; 83)
+      WHITESPACE@[77; 82)
+      IDENT@[82; 83) "A"
+    COMMA@[83; 84)
+    ENUM_VARIANT@[84; 95)
+      WHITESPACE@[84; 89)
+      IDENT@[89; 90) "B"
+      WHITESPACE@[90; 91)
+      EQ@[91; 92)
+      LITERAL@[92; 95)
+        WHITESPACE@[92; 93)
+        INT_NUMBER@[93; 95)
+    COMMA@[95; 96)
+    ENUM_VARIANT@[96; 146)
+      WHITESPACE@[96; 101)
+      IDENT@[101; 102) "C"
+      WHITESPACE@[102; 103)
+      L_CURLY@[103; 104)
+      NAMED_FIELD@[104; 119)
+        WHITESPACE@[104; 113)
+        IDENT@[113; 114) "a"
+        COLON@[114; 115)
+        WHITESPACE@[115; 116)
+        IDENT@[116; 119) "u32"
+      COMMA@[119; 120)
+      NAMED_FIELD@[120; 139)
+        VISIBILITY@[120; 133)
+          WHITESPACE@[120; 129)
+          PUB_KW@[129; 132)
+          WHITESPACE@[132; 133)
+        IDENT@[133; 134) "b"
+        COLON@[134; 135)
+        WHITESPACE@[135; 136)
+        IDENT@[136; 139) "f64"
+      COMMA@[139; 140)
+      WHITESPACE@[140; 145)
+      R_CURLY@[145; 146)
+    COMMA@[146; 147)
+    ENUM_VARIANT@[147; 156)
+      WHITESPACE@[147; 152)
+      IDENT@[152; 153) "F"
+      WHITESPACE@[153; 154)
+      L_CURLY@[154; 155)
+      R_CURLY@[155; 156)
+    COMMA@[156; 157)
+    ENUM_VARIANT@[157; 169)
+      WHITESPACE@[157; 162)
+      IDENT@[162; 163) "D"
+      L_PAREN@[163; 164)
+      POS_FIELD@[164; 167)
+        IDENT@[164; 167) "u32"
+      COMMA@[167; 168)
+      R_PAREN@[168; 169)
+    COMMA@[169; 170)
+    ENUM_VARIANT@[170; 178)
+      WHITESPACE@[170; 175)
+      IDENT@[175; 176) "E"
+      L_PAREN@[176; 177)
+      R_PAREN@[177; 178)
+    COMMA@[178; 179)
+    WHITESPACE@[179; 180)
+    R_CURLY@[180; 181)
+    WHITESPACE@[181; 182)