internal: more focused parsing tests
This commit is contained in:
@@ -245,29 +245,9 @@ fn opt_item_without_modifiers(p: &mut Parser, m: Marker) -> Result<(), Marker> {
|
|||||||
T![mod] => mod_item(p, m),
|
T![mod] => mod_item(p, m),
|
||||||
|
|
||||||
T![type] => type_alias(p, m),
|
T![type] => type_alias(p, m),
|
||||||
|
T![struct] => adt::strukt(p, m),
|
||||||
T![struct] => {
|
|
||||||
// test struct_items
|
|
||||||
// struct Foo;
|
|
||||||
// struct Foo {}
|
|
||||||
// struct Foo();
|
|
||||||
// struct Foo(String, usize);
|
|
||||||
// struct Foo {
|
|
||||||
// a: i32,
|
|
||||||
// b: f32,
|
|
||||||
// }
|
|
||||||
adt::strukt(p, m);
|
|
||||||
}
|
|
||||||
T![enum] => adt::enum_(p, m),
|
T![enum] => adt::enum_(p, m),
|
||||||
IDENT if p.at_contextual_kw("union") && p.nth(1) == IDENT => {
|
IDENT if p.at_contextual_kw("union") && p.nth(1) == IDENT => adt::union(p, m),
|
||||||
// test union_items
|
|
||||||
// union Foo {}
|
|
||||||
// union Foo {
|
|
||||||
// a: i32,
|
|
||||||
// b: f32,
|
|
||||||
// }
|
|
||||||
adt::union(p, m);
|
|
||||||
}
|
|
||||||
|
|
||||||
// test pub_macro_def
|
// test pub_macro_def
|
||||||
// pub macro m($:ident) {}
|
// pub macro m($:ident) {}
|
||||||
@@ -324,6 +304,31 @@ pub(crate) fn mod_item(p: &mut Parser, m: Marker) {
|
|||||||
m.complete(p, MODULE);
|
m.complete(p, MODULE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// test type_alias
|
||||||
|
// type Foo = Bar;
|
||||||
|
fn type_alias(p: &mut Parser, m: Marker) {
|
||||||
|
p.bump(T![type]);
|
||||||
|
|
||||||
|
name(p);
|
||||||
|
|
||||||
|
// test type_item_type_params
|
||||||
|
// type Result<T> = ();
|
||||||
|
type_params::opt_generic_param_list(p);
|
||||||
|
|
||||||
|
if p.at(T![:]) {
|
||||||
|
type_params::bounds(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
// test type_item_where_clause
|
||||||
|
// type Foo where Foo: Copy = ();
|
||||||
|
type_params::opt_where_clause(p);
|
||||||
|
if p.eat(T![=]) {
|
||||||
|
types::type_(p);
|
||||||
|
}
|
||||||
|
p.expect(T![;]);
|
||||||
|
m.complete(p, TYPE_ALIAS);
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn item_list(p: &mut Parser) {
|
pub(crate) fn item_list(p: &mut Parser) {
|
||||||
assert!(p.at(T!['{']));
|
assert!(p.at(T!['{']));
|
||||||
let m = p.start();
|
let m = p.start();
|
||||||
@@ -374,32 +379,6 @@ fn fn_(p: &mut Parser) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// test type_item
|
|
||||||
// type Foo = Bar;
|
|
||||||
fn type_alias(p: &mut Parser, m: Marker) {
|
|
||||||
assert!(p.at(T![type]));
|
|
||||||
p.bump(T![type]);
|
|
||||||
|
|
||||||
name(p);
|
|
||||||
|
|
||||||
// test type_item_type_params
|
|
||||||
// type Result<T> = ();
|
|
||||||
type_params::opt_generic_param_list(p);
|
|
||||||
|
|
||||||
if p.at(T![:]) {
|
|
||||||
type_params::bounds(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
// test type_item_where_clause
|
|
||||||
// type Foo where Foo: Copy = ();
|
|
||||||
type_params::opt_where_clause(p);
|
|
||||||
if p.eat(T![=]) {
|
|
||||||
types::type_(p);
|
|
||||||
}
|
|
||||||
p.expect(T![;]);
|
|
||||||
m.complete(p, TYPE_ALIAS);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn macro_rules(p: &mut Parser, m: Marker) {
|
fn macro_rules(p: &mut Parser, m: Marker) {
|
||||||
assert!(p.at_contextual_kw("macro_rules"));
|
assert!(p.at_contextual_kw("macro_rules"));
|
||||||
p.bump_remap(T![macro_rules]);
|
p.bump_remap(T![macro_rules]);
|
||||||
|
|||||||
@@ -1,18 +1,21 @@
|
|||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
// test struct_item
|
||||||
|
// struct S {}
|
||||||
pub(super) fn strukt(p: &mut Parser, m: Marker) {
|
pub(super) fn strukt(p: &mut Parser, m: Marker) {
|
||||||
assert!(p.at(T![struct]));
|
|
||||||
p.bump(T![struct]);
|
p.bump(T![struct]);
|
||||||
struct_or_union(p, m, T![struct], STRUCT);
|
struct_or_union(p, m, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// test union_item
|
||||||
|
// struct U { i: i32, f: f32 }
|
||||||
pub(super) fn union(p: &mut Parser, m: Marker) {
|
pub(super) fn union(p: &mut Parser, m: Marker) {
|
||||||
assert!(p.at_contextual_kw("union"));
|
assert!(p.at_contextual_kw("union"));
|
||||||
p.bump_remap(T![union]);
|
p.bump_remap(T![union]);
|
||||||
struct_or_union(p, m, T![union], UNION);
|
struct_or_union(p, m, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn struct_or_union(p: &mut Parser, m: Marker, kw: SyntaxKind, def: SyntaxKind) {
|
fn struct_or_union(p: &mut Parser, m: Marker, is_struct: bool) {
|
||||||
name_r(p, ITEM_RECOVERY_SET);
|
name_r(p, ITEM_RECOVERY_SET);
|
||||||
type_params::opt_generic_param_list(p);
|
type_params::opt_generic_param_list(p);
|
||||||
match p.current() {
|
match p.current() {
|
||||||
@@ -29,26 +32,24 @@ fn struct_or_union(p: &mut Parser, m: Marker, kw: SyntaxKind, def: SyntaxKind) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
T![;] if kw == T![struct] => {
|
T!['{'] => record_field_list(p),
|
||||||
|
// test unit_struct
|
||||||
|
// struct S;
|
||||||
|
T![;] if is_struct => {
|
||||||
p.bump(T![;]);
|
p.bump(T![;]);
|
||||||
}
|
}
|
||||||
T!['{'] => record_field_list(p),
|
// test tuple_struct
|
||||||
T!['('] if kw == T![struct] => {
|
// struct S(String, usize);
|
||||||
|
T!['('] if is_struct => {
|
||||||
tuple_field_list(p);
|
tuple_field_list(p);
|
||||||
// test tuple_struct_where
|
// test tuple_struct_where
|
||||||
// struct Test<T>(T) where T: Clone;
|
// struct S<T>(T) where T: Clone;
|
||||||
// struct Test<T>(T);
|
|
||||||
type_params::opt_where_clause(p);
|
type_params::opt_where_clause(p);
|
||||||
p.expect(T![;]);
|
p.expect(T![;]);
|
||||||
}
|
}
|
||||||
_ if kw == T![struct] => {
|
_ => p.error(if is_struct { "expected `;`, `{`, or `(`" } else { "expected `{`" }),
|
||||||
p.error("expected `;`, `{`, or `(`");
|
|
||||||
}
|
}
|
||||||
_ => {
|
m.complete(p, if is_struct { STRUCT } else { UNION });
|
||||||
p.error("expected `{`");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m.complete(p, def);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn enum_(p: &mut Parser, m: Marker) {
|
pub(super) fn enum_(p: &mut Parser, m: Marker) {
|
||||||
@@ -102,6 +103,8 @@ pub(crate) fn variant_list(p: &mut Parser) {
|
|||||||
m.complete(p, VARIANT_LIST);
|
m.complete(p, VARIANT_LIST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// test record_field_list
|
||||||
|
// struct S { a: i32, b: f32 }
|
||||||
pub(crate) fn record_field_list(p: &mut Parser) {
|
pub(crate) fn record_field_list(p: &mut Parser) {
|
||||||
assert!(p.at(T!['{']));
|
assert!(p.at(T!['{']));
|
||||||
let m = p.start();
|
let m = p.start();
|
||||||
|
|||||||
@@ -1,46 +0,0 @@
|
|||||||
SOURCE_FILE@0..51
|
|
||||||
UNION@0..12
|
|
||||||
UNION_KW@0..5 "union"
|
|
||||||
WHITESPACE@5..6 " "
|
|
||||||
NAME@6..9
|
|
||||||
IDENT@6..9 "Foo"
|
|
||||||
WHITESPACE@9..10 " "
|
|
||||||
RECORD_FIELD_LIST@10..12
|
|
||||||
L_CURLY@10..11 "{"
|
|
||||||
R_CURLY@11..12 "}"
|
|
||||||
WHITESPACE@12..13 "\n"
|
|
||||||
UNION@13..50
|
|
||||||
UNION_KW@13..18 "union"
|
|
||||||
WHITESPACE@18..19 " "
|
|
||||||
NAME@19..22
|
|
||||||
IDENT@19..22 "Foo"
|
|
||||||
WHITESPACE@22..23 " "
|
|
||||||
RECORD_FIELD_LIST@23..50
|
|
||||||
L_CURLY@23..24 "{"
|
|
||||||
WHITESPACE@24..29 "\n "
|
|
||||||
RECORD_FIELD@29..35
|
|
||||||
NAME@29..30
|
|
||||||
IDENT@29..30 "a"
|
|
||||||
COLON@30..31 ":"
|
|
||||||
WHITESPACE@31..32 " "
|
|
||||||
PATH_TYPE@32..35
|
|
||||||
PATH@32..35
|
|
||||||
PATH_SEGMENT@32..35
|
|
||||||
NAME_REF@32..35
|
|
||||||
IDENT@32..35 "i32"
|
|
||||||
COMMA@35..36 ","
|
|
||||||
WHITESPACE@36..41 "\n "
|
|
||||||
RECORD_FIELD@41..47
|
|
||||||
NAME@41..42
|
|
||||||
IDENT@41..42 "b"
|
|
||||||
COLON@42..43 ":"
|
|
||||||
WHITESPACE@43..44 " "
|
|
||||||
PATH_TYPE@44..47
|
|
||||||
PATH@44..47
|
|
||||||
PATH_SEGMENT@44..47
|
|
||||||
NAME_REF@44..47
|
|
||||||
IDENT@44..47 "f32"
|
|
||||||
COMMA@47..48 ","
|
|
||||||
WHITESPACE@48..49 "\n"
|
|
||||||
R_CURLY@49..50 "}"
|
|
||||||
WHITESPACE@50..51 "\n"
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
union Foo {}
|
|
||||||
union Foo {
|
|
||||||
a: i32,
|
|
||||||
b: f32,
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
struct Foo;
|
|
||||||
struct Foo {}
|
|
||||||
struct Foo();
|
|
||||||
struct Foo(String, usize);
|
|
||||||
struct Foo {
|
|
||||||
a: i32,
|
|
||||||
b: f32,
|
|
||||||
}
|
|
||||||
@@ -1,64 +1,42 @@
|
|||||||
SOURCE_FILE@0..53
|
SOURCE_FILE@0..31
|
||||||
STRUCT@0..33
|
STRUCT@0..30
|
||||||
STRUCT_KW@0..6 "struct"
|
STRUCT_KW@0..6 "struct"
|
||||||
WHITESPACE@6..7 " "
|
WHITESPACE@6..7 " "
|
||||||
NAME@7..11
|
NAME@7..8
|
||||||
IDENT@7..11 "Test"
|
IDENT@7..8 "S"
|
||||||
GENERIC_PARAM_LIST@11..14
|
GENERIC_PARAM_LIST@8..11
|
||||||
L_ANGLE@11..12 "<"
|
L_ANGLE@8..9 "<"
|
||||||
TYPE_PARAM@12..13
|
TYPE_PARAM@9..10
|
||||||
NAME@12..13
|
NAME@9..10
|
||||||
|
IDENT@9..10 "T"
|
||||||
|
R_ANGLE@10..11 ">"
|
||||||
|
TUPLE_FIELD_LIST@11..14
|
||||||
|
L_PAREN@11..12 "("
|
||||||
|
TUPLE_FIELD@12..13
|
||||||
|
PATH_TYPE@12..13
|
||||||
|
PATH@12..13
|
||||||
|
PATH_SEGMENT@12..13
|
||||||
|
NAME_REF@12..13
|
||||||
IDENT@12..13 "T"
|
IDENT@12..13 "T"
|
||||||
R_ANGLE@13..14 ">"
|
R_PAREN@13..14 ")"
|
||||||
TUPLE_FIELD_LIST@14..17
|
WHITESPACE@14..15 " "
|
||||||
L_PAREN@14..15 "("
|
WHERE_CLAUSE@15..29
|
||||||
TUPLE_FIELD@15..16
|
WHERE_KW@15..20 "where"
|
||||||
PATH_TYPE@15..16
|
WHITESPACE@20..21 " "
|
||||||
PATH@15..16
|
WHERE_PRED@21..29
|
||||||
PATH_SEGMENT@15..16
|
PATH_TYPE@21..22
|
||||||
NAME_REF@15..16
|
PATH@21..22
|
||||||
IDENT@15..16 "T"
|
PATH_SEGMENT@21..22
|
||||||
R_PAREN@16..17 ")"
|
NAME_REF@21..22
|
||||||
WHITESPACE@17..18 " "
|
IDENT@21..22 "T"
|
||||||
WHERE_CLAUSE@18..32
|
COLON@22..23 ":"
|
||||||
WHERE_KW@18..23 "where"
|
|
||||||
WHITESPACE@23..24 " "
|
WHITESPACE@23..24 " "
|
||||||
WHERE_PRED@24..32
|
TYPE_BOUND_LIST@24..29
|
||||||
PATH_TYPE@24..25
|
TYPE_BOUND@24..29
|
||||||
PATH@24..25
|
PATH_TYPE@24..29
|
||||||
PATH_SEGMENT@24..25
|
PATH@24..29
|
||||||
NAME_REF@24..25
|
PATH_SEGMENT@24..29
|
||||||
IDENT@24..25 "T"
|
NAME_REF@24..29
|
||||||
COLON@25..26 ":"
|
IDENT@24..29 "Clone"
|
||||||
WHITESPACE@26..27 " "
|
SEMICOLON@29..30 ";"
|
||||||
TYPE_BOUND_LIST@27..32
|
WHITESPACE@30..31 "\n"
|
||||||
TYPE_BOUND@27..32
|
|
||||||
PATH_TYPE@27..32
|
|
||||||
PATH@27..32
|
|
||||||
PATH_SEGMENT@27..32
|
|
||||||
NAME_REF@27..32
|
|
||||||
IDENT@27..32 "Clone"
|
|
||||||
SEMICOLON@32..33 ";"
|
|
||||||
WHITESPACE@33..34 "\n"
|
|
||||||
STRUCT@34..52
|
|
||||||
STRUCT_KW@34..40 "struct"
|
|
||||||
WHITESPACE@40..41 " "
|
|
||||||
NAME@41..45
|
|
||||||
IDENT@41..45 "Test"
|
|
||||||
GENERIC_PARAM_LIST@45..48
|
|
||||||
L_ANGLE@45..46 "<"
|
|
||||||
TYPE_PARAM@46..47
|
|
||||||
NAME@46..47
|
|
||||||
IDENT@46..47 "T"
|
|
||||||
R_ANGLE@47..48 ">"
|
|
||||||
TUPLE_FIELD_LIST@48..51
|
|
||||||
L_PAREN@48..49 "("
|
|
||||||
TUPLE_FIELD@49..50
|
|
||||||
PATH_TYPE@49..50
|
|
||||||
PATH@49..50
|
|
||||||
PATH_SEGMENT@49..50
|
|
||||||
NAME_REF@49..50
|
|
||||||
IDENT@49..50 "T"
|
|
||||||
R_PAREN@50..51 ")"
|
|
||||||
SEMICOLON@51..52 ";"
|
|
||||||
WHITESPACE@52..53 "\n"
|
|
||||||
|
|||||||
@@ -1,2 +1 @@
|
|||||||
struct Test<T>(T) where T: Clone;
|
struct S<T>(T) where T: Clone;
|
||||||
struct Test<T>(T);
|
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
SOURCE_FILE@0..25
|
||||||
|
STRUCT@0..24
|
||||||
|
STRUCT_KW@0..6 "struct"
|
||||||
|
WHITESPACE@6..7 " "
|
||||||
|
NAME@7..8
|
||||||
|
IDENT@7..8 "S"
|
||||||
|
TUPLE_FIELD_LIST@8..23
|
||||||
|
L_PAREN@8..9 "("
|
||||||
|
TUPLE_FIELD@9..15
|
||||||
|
PATH_TYPE@9..15
|
||||||
|
PATH@9..15
|
||||||
|
PATH_SEGMENT@9..15
|
||||||
|
NAME_REF@9..15
|
||||||
|
IDENT@9..15 "String"
|
||||||
|
COMMA@15..16 ","
|
||||||
|
WHITESPACE@16..17 " "
|
||||||
|
TUPLE_FIELD@17..22
|
||||||
|
PATH_TYPE@17..22
|
||||||
|
PATH@17..22
|
||||||
|
PATH_SEGMENT@17..22
|
||||||
|
NAME_REF@17..22
|
||||||
|
IDENT@17..22 "usize"
|
||||||
|
R_PAREN@22..23 ")"
|
||||||
|
SEMICOLON@23..24 ";"
|
||||||
|
WHITESPACE@24..25 "\n"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
struct S(String, usize);
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
SOURCE_FILE@0..12
|
||||||
|
STRUCT@0..11
|
||||||
|
STRUCT_KW@0..6 "struct"
|
||||||
|
WHITESPACE@6..7 " "
|
||||||
|
NAME@7..8
|
||||||
|
IDENT@7..8 "S"
|
||||||
|
WHITESPACE@8..9 " "
|
||||||
|
RECORD_FIELD_LIST@9..11
|
||||||
|
L_CURLY@9..10 "{"
|
||||||
|
R_CURLY@10..11 "}"
|
||||||
|
WHITESPACE@11..12 "\n"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
struct S {}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
SOURCE_FILE@0..28
|
||||||
|
STRUCT@0..27
|
||||||
|
STRUCT_KW@0..6 "struct"
|
||||||
|
WHITESPACE@6..7 " "
|
||||||
|
NAME@7..8
|
||||||
|
IDENT@7..8 "S"
|
||||||
|
WHITESPACE@8..9 " "
|
||||||
|
RECORD_FIELD_LIST@9..27
|
||||||
|
L_CURLY@9..10 "{"
|
||||||
|
WHITESPACE@10..11 " "
|
||||||
|
RECORD_FIELD@11..17
|
||||||
|
NAME@11..12
|
||||||
|
IDENT@11..12 "a"
|
||||||
|
COLON@12..13 ":"
|
||||||
|
WHITESPACE@13..14 " "
|
||||||
|
PATH_TYPE@14..17
|
||||||
|
PATH@14..17
|
||||||
|
PATH_SEGMENT@14..17
|
||||||
|
NAME_REF@14..17
|
||||||
|
IDENT@14..17 "i32"
|
||||||
|
COMMA@17..18 ","
|
||||||
|
WHITESPACE@18..19 " "
|
||||||
|
RECORD_FIELD@19..25
|
||||||
|
NAME@19..20
|
||||||
|
IDENT@19..20 "b"
|
||||||
|
COLON@20..21 ":"
|
||||||
|
WHITESPACE@21..22 " "
|
||||||
|
PATH_TYPE@22..25
|
||||||
|
PATH@22..25
|
||||||
|
PATH_SEGMENT@22..25
|
||||||
|
NAME_REF@22..25
|
||||||
|
IDENT@22..25 "f32"
|
||||||
|
WHITESPACE@25..26 " "
|
||||||
|
R_CURLY@26..27 "}"
|
||||||
|
WHITESPACE@27..28 "\n"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
struct S { a: i32, b: f32 }
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
SOURCE_FILE@0..28
|
||||||
|
STRUCT@0..27
|
||||||
|
STRUCT_KW@0..6 "struct"
|
||||||
|
WHITESPACE@6..7 " "
|
||||||
|
NAME@7..8
|
||||||
|
IDENT@7..8 "U"
|
||||||
|
WHITESPACE@8..9 " "
|
||||||
|
RECORD_FIELD_LIST@9..27
|
||||||
|
L_CURLY@9..10 "{"
|
||||||
|
WHITESPACE@10..11 " "
|
||||||
|
RECORD_FIELD@11..17
|
||||||
|
NAME@11..12
|
||||||
|
IDENT@11..12 "i"
|
||||||
|
COLON@12..13 ":"
|
||||||
|
WHITESPACE@13..14 " "
|
||||||
|
PATH_TYPE@14..17
|
||||||
|
PATH@14..17
|
||||||
|
PATH_SEGMENT@14..17
|
||||||
|
NAME_REF@14..17
|
||||||
|
IDENT@14..17 "i32"
|
||||||
|
COMMA@17..18 ","
|
||||||
|
WHITESPACE@18..19 " "
|
||||||
|
RECORD_FIELD@19..25
|
||||||
|
NAME@19..20
|
||||||
|
IDENT@19..20 "f"
|
||||||
|
COLON@20..21 ":"
|
||||||
|
WHITESPACE@21..22 " "
|
||||||
|
PATH_TYPE@22..25
|
||||||
|
PATH@22..25
|
||||||
|
PATH_SEGMENT@22..25
|
||||||
|
NAME_REF@22..25
|
||||||
|
IDENT@22..25 "f32"
|
||||||
|
WHITESPACE@25..26 " "
|
||||||
|
R_CURLY@26..27 "}"
|
||||||
|
WHITESPACE@27..28 "\n"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
struct U { i: i32, f: f32 }
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
SOURCE_FILE@0..10
|
||||||
|
STRUCT@0..9
|
||||||
|
STRUCT_KW@0..6 "struct"
|
||||||
|
WHITESPACE@6..7 " "
|
||||||
|
NAME@7..8
|
||||||
|
IDENT@7..8 "S"
|
||||||
|
SEMICOLON@8..9 ";"
|
||||||
|
WHITESPACE@9..10 "\n"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
struct S;
|
||||||
Reference in New Issue
Block a user