diff --git a/grammar.ron b/grammar.ron index 0130b7b37d..41d48f7b24 100644 --- a/grammar.ron +++ b/grammar.ron @@ -101,6 +101,11 @@ Grammar( "IMPL_ITEM", "TYPE_ITEM", + "PAREN_TYPE", + "TUPLE_TYPE", + "NEVER_TYPE", + "PATH_TYPE", + "EXTERN_BLOCK", "ENUM_VARIANT", "NAMED_FIELD", diff --git a/src/parser/grammar/items/consts.rs b/src/parser/grammar/items/consts.rs index 8117af7060..5f3cf58c2a 100644 --- a/src/parser/grammar/items/consts.rs +++ b/src/parser/grammar/items/consts.rs @@ -14,7 +14,7 @@ fn const_or_static(p: &mut Parser, kw: SyntaxKind) { p.eat(MUT_KW); // TODO: validator to forbid const mut name(p); p.expect(COLON); - types::type_ref(p); + types::ty(p); p.expect(EQ); expressions::expr(p); p.expect(SEMI); diff --git a/src/parser/grammar/items/mod.rs b/src/parser/grammar/items/mod.rs index 8bb821fb6d..f1776e0e26 100644 --- a/src/parser/grammar/items/mod.rs +++ b/src/parser/grammar/items/mod.rs @@ -247,7 +247,7 @@ fn type_item(p: &mut Parser) { type_params::where_clause(p); p.expect(EQ); - types::type_ref(p); + types::ty(p); p.expect(SEMI); } diff --git a/src/parser/grammar/items/structs.rs b/src/parser/grammar/items/structs.rs index eca0d2e643..ad18fd2708 100644 --- a/src/parser/grammar/items/structs.rs +++ b/src/parser/grammar/items/structs.rs @@ -89,7 +89,7 @@ fn named_fields(p: &mut Parser) { if p.at(IDENT) { name(p); p.expect(COLON); - types::type_ref(p); + types::ty(p); field.complete(p, NAMED_FIELD); } else { field.abandon(p); @@ -105,7 +105,7 @@ fn pos_fields(p: &mut Parser) { while !p.at(R_PAREN) && !p.at(EOF) { let pos_field = p.start(); visibility(p); - types::type_ref(p); + types::ty(p); pos_field.complete(p, POS_FIELD); if !p.at(R_PAREN) { diff --git a/src/parser/grammar/type_params.rs b/src/parser/grammar/type_params.rs index 8f62a471cc..2462b260e0 100644 --- a/src/parser/grammar/type_params.rs +++ b/src/parser/grammar/type_params.rs @@ -62,7 +62,7 @@ pub(super) fn list(p: &mut Parser) { } } if p.at(EQ) { - types::type_ref(p) + types::ty(p) } m.complete(p, TYPE_PARAM); } diff --git a/src/parser/grammar/types.rs b/src/parser/grammar/types.rs index c798edd08a..71801d8efd 100644 --- a/src/parser/grammar/types.rs +++ b/src/parser/grammar/types.rs @@ -1,14 +1,51 @@ use super::*; -pub(super) fn type_ref(p: &mut Parser) { +pub(super) fn ty(p: &mut Parser) { match p.current() { - IDENT => p.bump(), - L_PAREN => { - p.bump(); - p.expect(R_PAREN); - } + L_PAREN => paren_or_tuple_ty(p), + IDENT => path_type(p), _ => { p.error("expected type"); } } } + +fn paren_or_tuple_ty(p: &mut Parser) { + assert!(p.at(L_PAREN)); + let m = p.start(); + p.bump(); + let mut n_types: u32 = 0; + let mut trailing_comma: bool = false; + while !p.at(EOF) && !p.at(R_PAREN) { + n_types += 1; + ty(p); + if p.eat(COMMA) { + trailing_comma = true; + } else { + trailing_comma = false; + break; + } + } + p.expect(R_PAREN); + + let kind = if n_types == 1 && !trailing_comma { + // test paren_type + // type T = (i32); + PAREN_TYPE + } else { + // test unit_type + // type T = (); + + // test singleton_tuple_type + // type T = (i32,); + TUPLE_TYPE + }; + m.complete(p, kind); +} + +fn path_type(p: &mut Parser) { + assert!(p.at(IDENT)); + let m = p.start(); + paths::type_path(p); + m.complete(p, PATH_TYPE); +} diff --git a/src/syntax_kinds.rs b/src/syntax_kinds.rs index 7450f9d6f2..630d3d2a56 100644 --- a/src/syntax_kinds.rs +++ b/src/syntax_kinds.rs @@ -99,6 +99,10 @@ pub enum SyntaxKind { TRAIT_ITEM, IMPL_ITEM, TYPE_ITEM, + PAREN_TYPE, + TUPLE_TYPE, + NEVER_TYPE, + PATH_TYPE, EXTERN_BLOCK, ENUM_VARIANT, NAMED_FIELD, @@ -224,6 +228,10 @@ impl SyntaxKind { TRAIT_ITEM => &SyntaxInfo { name: "TRAIT_ITEM" }, IMPL_ITEM => &SyntaxInfo { name: "IMPL_ITEM" }, TYPE_ITEM => &SyntaxInfo { name: "TYPE_ITEM" }, + PAREN_TYPE => &SyntaxInfo { name: "PAREN_TYPE" }, + TUPLE_TYPE => &SyntaxInfo { name: "TUPLE_TYPE" }, + NEVER_TYPE => &SyntaxInfo { name: "NEVER_TYPE" }, + PATH_TYPE => &SyntaxInfo { name: "PATH_TYPE" }, EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" }, ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" }, NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" }, 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 f1c772b8d7..5196fd7181 100644 --- a/tests/data/parser/err/0000_struct_field_missing_comma.txt +++ b/tests/data/parser/err/0000_struct_field_missing_comma.txt @@ -11,15 +11,23 @@ FILE@[0; 34) WHITESPACE@[10; 15) IDENT@[15; 16) "a" COLON@[16; 17) - WHITESPACE@[17; 18) - IDENT@[18; 21) "u32" - WHITESPACE@[21; 26) + PATH_TYPE@[17; 26) + PATH@[17; 26) + PATH_SEGMENT@[17; 26) + NAME_REF@[17; 26) + WHITESPACE@[17; 18) + IDENT@[18; 21) "u32" + WHITESPACE@[21; 26) err: `expected COMMA` NAMED_FIELD@[26; 33) NAME@[26; 27) IDENT@[26; 27) "b" COLON@[27; 28) - WHITESPACE@[28; 29) - IDENT@[29; 32) "u32" - WHITESPACE@[32; 33) + PATH_TYPE@[28; 33) + PATH@[28; 33) + PATH_SEGMENT@[28; 33) + NAME_REF@[28; 33) + WHITESPACE@[28; 29) + IDENT@[29; 32) "u32" + WHITESPACE@[32; 33) R_CURLY@[33; 34) diff --git a/tests/data/parser/err/0003_C++_semicolon.txt b/tests/data/parser/err/0003_C++_semicolon.txt index c835a14740..affe8fd09f 100644 --- a/tests/data/parser/err/0003_C++_semicolon.txt +++ b/tests/data/parser/err/0003_C++_semicolon.txt @@ -11,16 +11,24 @@ FILE@[0; 40) WHITESPACE@[10; 15) IDENT@[15; 16) "a" COLON@[16; 17) - WHITESPACE@[17; 18) - IDENT@[18; 21) "i32" + PATH_TYPE@[17; 21) + PATH@[17; 21) + PATH_SEGMENT@[17; 21) + NAME_REF@[17; 21) + WHITESPACE@[17; 18) + IDENT@[18; 21) "i32" COMMA@[21; 22) NAMED_FIELD@[22; 36) NAME@[22; 28) WHITESPACE@[22; 27) IDENT@[27; 28) "b" COLON@[28; 29) - WHITESPACE@[29; 30) - IDENT@[30; 36) "String" + PATH_TYPE@[29; 36) + PATH@[29; 36) + PATH_SEGMENT@[29; 36) + NAME_REF@[29; 36) + WHITESPACE@[29; 30) + IDENT@[30; 36) "String" COMMA@[36; 37) WHITESPACE@[37; 38) R_CURLY@[38; 39) diff --git a/tests/data/parser/err/0006_named_field_recovery.txt b/tests/data/parser/err/0006_named_field_recovery.txt index b772671e95..2dec748666 100644 --- a/tests/data/parser/err/0006_named_field_recovery.txt +++ b/tests/data/parser/err/0006_named_field_recovery.txt @@ -11,8 +11,12 @@ FILE@[0; 74) WHITESPACE@[10; 15) IDENT@[15; 16) "f" COLON@[16; 17) - WHITESPACE@[17; 18) - IDENT@[18; 21) "u32" + PATH_TYPE@[17; 21) + PATH@[17; 21) + PATH_SEGMENT@[17; 21) + NAME_REF@[17; 21) + WHITESPACE@[17; 18) + IDENT@[18; 21) "u32" COMMA@[21; 22) VISIBILITY@[22; 31) WHITESPACE@[22; 27) @@ -42,16 +46,24 @@ FILE@[0; 74) NAME@[52; 53) IDENT@[52; 53) "x" COLON@[53; 54) - WHITESPACE@[54; 55) - IDENT@[55; 58) "u32" + PATH_TYPE@[54; 58) + PATH@[54; 58) + PATH_SEGMENT@[54; 58) + NAME_REF@[54; 58) + WHITESPACE@[54; 55) + IDENT@[55; 58) "u32" COMMA@[58; 59) NAMED_FIELD@[59; 70) NAME@[59; 65) WHITESPACE@[59; 64) IDENT@[64; 65) "z" COLON@[65; 66) - WHITESPACE@[66; 67) - IDENT@[67; 70) "f64" + PATH_TYPE@[66; 70) + PATH@[66; 70) + PATH_SEGMENT@[66; 70) + NAME_REF@[66; 70) + WHITESPACE@[66; 67) + IDENT@[67; 70) "f64" COMMA@[70; 71) WHITESPACE@[71; 72) R_CURLY@[72; 73) diff --git a/tests/data/parser/inline/0014_type_item_type_params.txt b/tests/data/parser/inline/0014_type_item_type_params.txt index ca32faa42a..98a71414e1 100644 --- a/tests/data/parser/inline/0014_type_item_type_params.txt +++ b/tests/data/parser/inline/0014_type_item_type_params.txt @@ -11,8 +11,9 @@ FILE@[0; 21) R_ANGLE@[13; 14) WHITESPACE@[14; 15) EQ@[15; 16) - WHITESPACE@[16; 17) - L_PAREN@[17; 18) - R_PAREN@[18; 19) + TUPLE_TYPE@[16; 19) + WHITESPACE@[16; 17) + L_PAREN@[17; 18) + R_PAREN@[18; 19) SEMI@[19; 20) WHITESPACE@[20; 21) diff --git a/tests/data/parser/inline/0015_type_item.txt b/tests/data/parser/inline/0015_type_item.txt index 3818fe25db..602298546e 100644 --- a/tests/data/parser/inline/0015_type_item.txt +++ b/tests/data/parser/inline/0015_type_item.txt @@ -6,7 +6,11 @@ FILE@[0; 16) IDENT@[5; 8) "Foo" WHITESPACE@[8; 9) EQ@[9; 10) - WHITESPACE@[10; 11) - IDENT@[11; 14) "Bar" + PATH_TYPE@[10; 14) + PATH@[10; 14) + PATH_SEGMENT@[10; 14) + NAME_REF@[10; 14) + WHITESPACE@[10; 11) + IDENT@[11; 14) "Bar" SEMI@[14; 15) WHITESPACE@[15; 16) diff --git a/tests/data/parser/inline/0016_type_item_where_clause.txt b/tests/data/parser/inline/0016_type_item_where_clause.txt index 12bbc752ab..ff20c6255c 100644 --- a/tests/data/parser/inline/0016_type_item_where_clause.txt +++ b/tests/data/parser/inline/0016_type_item_where_clause.txt @@ -14,8 +14,9 @@ FILE@[0; 31) IDENT@[20; 24) "Copy" WHITESPACE@[24; 25) EQ@[25; 26) - WHITESPACE@[26; 27) - L_PAREN@[27; 28) - R_PAREN@[28; 29) + TUPLE_TYPE@[26; 29) + WHITESPACE@[26; 27) + L_PAREN@[27; 28) + R_PAREN@[28; 29) SEMI@[29; 30) WHITESPACE@[30; 31) diff --git a/tests/data/parser/inline/0017_paren_type.rs b/tests/data/parser/inline/0017_paren_type.rs new file mode 100644 index 0000000000..6e1b251012 --- /dev/null +++ b/tests/data/parser/inline/0017_paren_type.rs @@ -0,0 +1 @@ +type T = (i32); diff --git a/tests/data/parser/inline/0017_paren_type.txt b/tests/data/parser/inline/0017_paren_type.txt new file mode 100644 index 0000000000..6ef9c9190c --- /dev/null +++ b/tests/data/parser/inline/0017_paren_type.txt @@ -0,0 +1,19 @@ +FILE@[0; 16) + TYPE_ITEM@[0; 16) + TYPE_KW@[0; 4) + NAME@[4; 7) + WHITESPACE@[4; 5) + IDENT@[5; 6) "T" + WHITESPACE@[6; 7) + EQ@[7; 8) + PAREN_TYPE@[8; 14) + WHITESPACE@[8; 9) + L_PAREN@[9; 10) + PATH_TYPE@[10; 13) + PATH@[10; 13) + PATH_SEGMENT@[10; 13) + NAME_REF@[10; 13) + IDENT@[10; 13) "i32" + R_PAREN@[13; 14) + SEMI@[14; 15) + WHITESPACE@[15; 16) diff --git a/tests/data/parser/inline/0018_unit_type.rs b/tests/data/parser/inline/0018_unit_type.rs new file mode 100644 index 0000000000..c039cf7d32 --- /dev/null +++ b/tests/data/parser/inline/0018_unit_type.rs @@ -0,0 +1 @@ +type T = (); diff --git a/tests/data/parser/inline/0018_unit_type.txt b/tests/data/parser/inline/0018_unit_type.txt new file mode 100644 index 0000000000..707b6e53ed --- /dev/null +++ b/tests/data/parser/inline/0018_unit_type.txt @@ -0,0 +1,14 @@ +FILE@[0; 13) + TYPE_ITEM@[0; 13) + TYPE_KW@[0; 4) + NAME@[4; 7) + WHITESPACE@[4; 5) + IDENT@[5; 6) "T" + WHITESPACE@[6; 7) + EQ@[7; 8) + TUPLE_TYPE@[8; 11) + WHITESPACE@[8; 9) + L_PAREN@[9; 10) + R_PAREN@[10; 11) + SEMI@[11; 12) + WHITESPACE@[12; 13) diff --git a/tests/data/parser/inline/0019_singleton_tuple_type.rs b/tests/data/parser/inline/0019_singleton_tuple_type.rs new file mode 100644 index 0000000000..cb66bad247 --- /dev/null +++ b/tests/data/parser/inline/0019_singleton_tuple_type.rs @@ -0,0 +1 @@ +type T = (i32,); diff --git a/tests/data/parser/inline/0019_singleton_tuple_type.txt b/tests/data/parser/inline/0019_singleton_tuple_type.txt new file mode 100644 index 0000000000..cca96e7ea5 --- /dev/null +++ b/tests/data/parser/inline/0019_singleton_tuple_type.txt @@ -0,0 +1,20 @@ +FILE@[0; 17) + TYPE_ITEM@[0; 17) + TYPE_KW@[0; 4) + NAME@[4; 7) + WHITESPACE@[4; 5) + IDENT@[5; 6) "T" + WHITESPACE@[6; 7) + EQ@[7; 8) + TUPLE_TYPE@[8; 15) + WHITESPACE@[8; 9) + L_PAREN@[9; 10) + PATH_TYPE@[10; 13) + PATH@[10; 13) + PATH_SEGMENT@[10; 13) + NAME_REF@[10; 13) + IDENT@[10; 13) "i32" + COMMA@[13; 14) + R_PAREN@[14; 15) + SEMI@[15; 16) + WHITESPACE@[16; 17) diff --git a/tests/data/parser/ok/0002_struct_item_field.txt b/tests/data/parser/ok/0002_struct_item_field.txt index 31d3508dbc..7a395e14f8 100644 --- a/tests/data/parser/ok/0002_struct_item_field.txt +++ b/tests/data/parser/ok/0002_struct_item_field.txt @@ -11,7 +11,11 @@ FILE@[0; 25) WHITESPACE@[10; 15) IDENT@[15; 18) "foo" COLON@[18; 19) - WHITESPACE@[19; 20) - IDENT@[20; 23) "u32" - WHITESPACE@[23; 24) + PATH_TYPE@[19; 24) + PATH@[19; 24) + PATH_SEGMENT@[19; 24) + NAME_REF@[19; 24) + WHITESPACE@[19; 20) + IDENT@[20; 23) "u32" + WHITESPACE@[23; 24) R_CURLY@[24; 25) diff --git a/tests/data/parser/ok/0016_struct_flavors.txt b/tests/data/parser/ok/0016_struct_flavors.txt index 15462b9b93..b5101c87db 100644 --- a/tests/data/parser/ok/0016_struct_flavors.txt +++ b/tests/data/parser/ok/0016_struct_flavors.txt @@ -36,8 +36,12 @@ FILE@[0; 97) WHITESPACE@[45; 50) IDENT@[50; 51) "a" COLON@[51; 52) - WHITESPACE@[52; 53) - IDENT@[53; 56) "u32" + PATH_TYPE@[52; 56) + PATH@[52; 56) + PATH_SEGMENT@[52; 56) + NAME_REF@[52; 56) + WHITESPACE@[52; 53) + IDENT@[53; 56) "u32" COMMA@[56; 57) NAMED_FIELD@[57; 73) VISIBILITY@[57; 66) @@ -47,9 +51,13 @@ FILE@[0; 97) NAME@[66; 67) IDENT@[66; 67) "b" COLON@[67; 68) - WHITESPACE@[68; 69) - IDENT@[69; 72) "u32" - WHITESPACE@[72; 73) + PATH_TYPE@[68; 73) + PATH@[68; 73) + PATH_SEGMENT@[68; 73) + NAME_REF@[68; 73) + WHITESPACE@[68; 69) + IDENT@[69; 72) "u32" + WHITESPACE@[72; 73) R_CURLY@[73; 74) WHITESPACE@[74; 76) STRUCT_ITEM@[76; 97) @@ -62,11 +70,19 @@ FILE@[0; 97) VISIBILITY@[85; 89) PUB_KW@[85; 88) WHITESPACE@[88; 89) - IDENT@[89; 90) "x" + PATH_TYPE@[89; 90) + PATH@[89; 90) + PATH_SEGMENT@[89; 90) + NAME_REF@[89; 90) + IDENT@[89; 90) "x" COMMA@[90; 91) POS_FIELD@[91; 93) - WHITESPACE@[91; 92) - IDENT@[92; 93) "y" + PATH_TYPE@[91; 93) + PATH@[91; 93) + PATH_SEGMENT@[91; 93) + NAME_REF@[91; 93) + WHITESPACE@[91; 92) + IDENT@[92; 93) "y" COMMA@[93; 94) R_PAREN@[94; 95) SEMI@[95; 96) diff --git a/tests/data/parser/ok/0018_struct_type_params.txt b/tests/data/parser/ok/0018_struct_type_params.txt index fe14effceb..8e1feab38a 100644 --- a/tests/data/parser/ok/0018_struct_type_params.txt +++ b/tests/data/parser/ok/0018_struct_type_params.txt @@ -23,7 +23,11 @@ FILE@[0; 290) R_ANGLE@[25; 26) L_PAREN@[26; 27) POS_FIELD@[27; 30) - IDENT@[27; 30) "u32" + PATH_TYPE@[27; 30) + PATH@[27; 30) + PATH_SEGMENT@[27; 30) + NAME_REF@[27; 30) + IDENT@[27; 30) "u32" R_PAREN@[30; 31) SEMI@[31; 32) WHITESPACE@[32; 33) @@ -44,9 +48,13 @@ FILE@[0; 290) WHITESPACE@[47; 48) IDENT@[48; 49) "u" COLON@[49; 50) - WHITESPACE@[50; 51) - IDENT@[51; 54) "u32" - WHITESPACE@[54; 55) + PATH_TYPE@[50; 55) + PATH@[50; 55) + PATH_SEGMENT@[50; 55) + NAME_REF@[50; 55) + WHITESPACE@[50; 51) + IDENT@[51; 54) "u32" + WHITESPACE@[54; 55) R_CURLY@[55; 56) WHITESPACE@[56; 58) STRUCT_ITEM@[58; 71) diff --git a/tests/data/parser/ok/0019_enums.txt b/tests/data/parser/ok/0019_enums.txt index bad12bee39..09253dcea2 100644 --- a/tests/data/parser/ok/0019_enums.txt +++ b/tests/data/parser/ok/0019_enums.txt @@ -81,8 +81,12 @@ FILE@[0; 182) WHITESPACE@[104; 113) IDENT@[113; 114) "a" COLON@[114; 115) - WHITESPACE@[115; 116) - IDENT@[116; 119) "u32" + PATH_TYPE@[115; 119) + PATH@[115; 119) + PATH_SEGMENT@[115; 119) + NAME_REF@[115; 119) + WHITESPACE@[115; 116) + IDENT@[116; 119) "u32" COMMA@[119; 120) NAMED_FIELD@[120; 139) VISIBILITY@[120; 133) @@ -92,8 +96,12 @@ FILE@[0; 182) NAME@[133; 134) IDENT@[133; 134) "b" COLON@[134; 135) - WHITESPACE@[135; 136) - IDENT@[136; 139) "f64" + PATH_TYPE@[135; 139) + PATH@[135; 139) + PATH_SEGMENT@[135; 139) + NAME_REF@[135; 139) + WHITESPACE@[135; 136) + IDENT@[136; 139) "f64" COMMA@[139; 140) WHITESPACE@[140; 145) R_CURLY@[145; 146) @@ -110,7 +118,11 @@ FILE@[0; 182) IDENT@[162; 163) "D" L_PAREN@[163; 164) POS_FIELD@[164; 167) - IDENT@[164; 167) "u32" + PATH_TYPE@[164; 167) + PATH@[164; 167) + PATH_SEGMENT@[164; 167) + NAME_REF@[164; 167) + IDENT@[164; 167) "u32" COMMA@[167; 168) R_PAREN@[168; 169) COMMA@[169; 170) diff --git a/tests/data/parser/ok/0023_static_items.txt b/tests/data/parser/ok/0023_static_items.txt index 8872520c5d..c9ecfb920a 100644 --- a/tests/data/parser/ok/0023_static_items.txt +++ b/tests/data/parser/ok/0023_static_items.txt @@ -5,9 +5,13 @@ FILE@[0; 47) WHITESPACE@[6; 7) IDENT@[7; 10) "FOO" COLON@[10; 11) - WHITESPACE@[11; 12) - IDENT@[12; 15) "u32" - WHITESPACE@[15; 16) + PATH_TYPE@[11; 16) + PATH@[11; 16) + PATH_SEGMENT@[11; 16) + NAME_REF@[11; 16) + WHITESPACE@[11; 12) + IDENT@[12; 15) "u32" + WHITESPACE@[15; 16) EQ@[16; 17) LITERAL@[17; 19) WHITESPACE@[17; 18) @@ -22,9 +26,13 @@ FILE@[0; 47) WHITESPACE@[31; 32) IDENT@[32; 35) "BAR" COLON@[35; 36) - WHITESPACE@[36; 37) - IDENT@[37; 40) "i32" - WHITESPACE@[40; 41) + PATH_TYPE@[36; 41) + PATH@[36; 41) + PATH_SEGMENT@[36; 41) + NAME_REF@[36; 41) + WHITESPACE@[36; 37) + IDENT@[37; 40) "i32" + WHITESPACE@[40; 41) EQ@[41; 42) LITERAL@[42; 45) WHITESPACE@[42; 43) diff --git a/tests/data/parser/ok/0024_const_item.txt b/tests/data/parser/ok/0024_const_item.txt index 0f31d19d36..e37150ee44 100644 --- a/tests/data/parser/ok/0024_const_item.txt +++ b/tests/data/parser/ok/0024_const_item.txt @@ -5,9 +5,13 @@ FILE@[0; 46) WHITESPACE@[5; 6) IDENT@[6; 9) "FOO" COLON@[9; 10) - WHITESPACE@[10; 11) - IDENT@[11; 14) "u32" - WHITESPACE@[14; 15) + PATH_TYPE@[10; 15) + PATH@[10; 15) + PATH_SEGMENT@[10; 15) + NAME_REF@[10; 15) + WHITESPACE@[10; 11) + IDENT@[11; 14) "u32" + WHITESPACE@[14; 15) EQ@[15; 16) LITERAL@[16; 19) WHITESPACE@[16; 17) @@ -22,9 +26,13 @@ FILE@[0; 46) WHITESPACE@[30; 31) IDENT@[31; 34) "BAR" COLON@[34; 35) - WHITESPACE@[35; 36) - IDENT@[36; 39) "u32" - WHITESPACE@[39; 40) + PATH_TYPE@[35; 40) + PATH@[35; 40) + PATH_SEGMENT@[35; 40) + NAME_REF@[35; 40) + WHITESPACE@[35; 36) + IDENT@[36; 39) "u32" + WHITESPACE@[39; 40) EQ@[40; 41) LITERAL@[41; 44) WHITESPACE@[41; 42)