mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-12 21:28:51 +00:00
Support for unions
This commit is contained in:
parent
b6f8037a6f
commit
100968b689
4 changed files with 161 additions and 7 deletions
|
@ -181,7 +181,16 @@ fn items_without_modifiers(p: &mut Parser) -> Option<SyntaxKind> {
|
|||
MODULE
|
||||
}
|
||||
STRUCT_KW => {
|
||||
nominal::struct_def(p);
|
||||
// test struct_items
|
||||
// struct Foo;
|
||||
// struct Foo {}
|
||||
// struct Foo();
|
||||
// struct Foo(String, usize);
|
||||
// struct Foo {
|
||||
// a: i32,
|
||||
// b: f32,
|
||||
// }
|
||||
nominal::struct_def(p, STRUCT_KW);
|
||||
if p.at(SEMI) {
|
||||
p.err_and_bump(
|
||||
"expected item, found `;`\n\
|
||||
|
@ -190,6 +199,16 @@ fn items_without_modifiers(p: &mut Parser) -> Option<SyntaxKind> {
|
|||
}
|
||||
STRUCT_DEF
|
||||
}
|
||||
IDENT if p.at_contextual_kw("union") => {
|
||||
// test union_items
|
||||
// union Foo {}
|
||||
// union Foo {
|
||||
// a: i32,
|
||||
// b: f32,
|
||||
// }
|
||||
nominal::struct_def(p, UNION_KW);
|
||||
STRUCT_DEF
|
||||
}
|
||||
ENUM_KW => {
|
||||
nominal::enum_def(p);
|
||||
ENUM_DEF
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
use super::*;
|
||||
|
||||
pub(super) fn struct_def(p: &mut Parser) {
|
||||
assert!(p.at(STRUCT_KW));
|
||||
p.bump();
|
||||
pub(super) fn struct_def(p: &mut Parser, kind: SyntaxKind) {
|
||||
assert!(p.at(STRUCT_KW) || p.at_contextual_kw("union"));
|
||||
p.bump_remap(kind);
|
||||
|
||||
name_r(p, ITEM_RECOVERY_SET);
|
||||
type_params::opt_type_param_list(p);
|
||||
|
@ -22,19 +22,23 @@ pub(super) fn struct_def(p: &mut Parser) {
|
|||
}
|
||||
}
|
||||
}
|
||||
SEMI => {
|
||||
SEMI if kind == STRUCT_KW => {
|
||||
p.bump();
|
||||
return;
|
||||
}
|
||||
L_CURLY => named_field_def_list(p),
|
||||
L_PAREN => {
|
||||
L_PAREN if kind == STRUCT_KW => {
|
||||
pos_field_list(p);
|
||||
p.expect(SEMI);
|
||||
}
|
||||
_ => {
|
||||
_ if kind == STRUCT_KW => {
|
||||
p.error("expected `;`, `{`, or `(`");
|
||||
return;
|
||||
}
|
||||
_ => {
|
||||
p.error("expected `{`");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,86 @@
|
|||
ROOT@[0; 105)
|
||||
STRUCT_DEF@[0; 11)
|
||||
STRUCT_KW@[0; 6)
|
||||
WHITESPACE@[6; 7)
|
||||
NAME@[7; 10)
|
||||
IDENT@[7; 10) "Foo"
|
||||
SEMI@[10; 11)
|
||||
WHITESPACE@[11; 12)
|
||||
STRUCT_DEF@[12; 25)
|
||||
STRUCT_KW@[12; 18)
|
||||
WHITESPACE@[18; 19)
|
||||
NAME@[19; 22)
|
||||
IDENT@[19; 22) "Foo"
|
||||
WHITESPACE@[22; 23)
|
||||
NAMED_FIELD_DEF_LIST@[23; 25)
|
||||
L_CURLY@[23; 24)
|
||||
R_CURLY@[24; 25)
|
||||
WHITESPACE@[25; 26)
|
||||
STRUCT_DEF@[26; 39)
|
||||
STRUCT_KW@[26; 32)
|
||||
WHITESPACE@[32; 33)
|
||||
NAME@[33; 36)
|
||||
IDENT@[33; 36) "Foo"
|
||||
POS_FIELD_LIST@[36; 38)
|
||||
L_PAREN@[36; 37)
|
||||
R_PAREN@[37; 38)
|
||||
SEMI@[38; 39)
|
||||
WHITESPACE@[39; 40)
|
||||
STRUCT_DEF@[40; 66)
|
||||
STRUCT_KW@[40; 46)
|
||||
WHITESPACE@[46; 47)
|
||||
NAME@[47; 50)
|
||||
IDENT@[47; 50) "Foo"
|
||||
POS_FIELD_LIST@[50; 65)
|
||||
L_PAREN@[50; 51)
|
||||
POS_FIELD@[51; 57)
|
||||
PATH_TYPE@[51; 57)
|
||||
PATH@[51; 57)
|
||||
PATH_SEGMENT@[51; 57)
|
||||
NAME_REF@[51; 57)
|
||||
IDENT@[51; 57) "String"
|
||||
COMMA@[57; 58)
|
||||
WHITESPACE@[58; 59)
|
||||
POS_FIELD@[59; 64)
|
||||
PATH_TYPE@[59; 64)
|
||||
PATH@[59; 64)
|
||||
PATH_SEGMENT@[59; 64)
|
||||
NAME_REF@[59; 64)
|
||||
IDENT@[59; 64) "usize"
|
||||
R_PAREN@[64; 65)
|
||||
SEMI@[65; 66)
|
||||
WHITESPACE@[66; 67)
|
||||
STRUCT_DEF@[67; 105)
|
||||
STRUCT_KW@[67; 73)
|
||||
WHITESPACE@[73; 74)
|
||||
NAME@[74; 77)
|
||||
IDENT@[74; 77) "Foo"
|
||||
WHITESPACE@[77; 78)
|
||||
NAMED_FIELD_DEF_LIST@[78; 105)
|
||||
L_CURLY@[78; 79)
|
||||
WHITESPACE@[79; 84)
|
||||
NAMED_FIELD_DEF@[84; 90)
|
||||
NAME@[84; 85)
|
||||
IDENT@[84; 85) "a"
|
||||
COLON@[85; 86)
|
||||
WHITESPACE@[86; 87)
|
||||
PATH_TYPE@[87; 90)
|
||||
PATH@[87; 90)
|
||||
PATH_SEGMENT@[87; 90)
|
||||
NAME_REF@[87; 90)
|
||||
IDENT@[87; 90) "i32"
|
||||
COMMA@[90; 91)
|
||||
WHITESPACE@[91; 96)
|
||||
NAMED_FIELD_DEF@[96; 102)
|
||||
NAME@[96; 97)
|
||||
IDENT@[96; 97) "b"
|
||||
COLON@[97; 98)
|
||||
WHITESPACE@[98; 99)
|
||||
PATH_TYPE@[99; 102)
|
||||
PATH@[99; 102)
|
||||
PATH_SEGMENT@[99; 102)
|
||||
NAME_REF@[99; 102)
|
||||
IDENT@[99; 102) "f32"
|
||||
COMMA@[102; 103)
|
||||
WHITESPACE@[103; 104)
|
||||
R_CURLY@[104; 105)
|
|
@ -0,0 +1,45 @@
|
|||
ROOT@[0; 50)
|
||||
STRUCT_DEF@[0; 12)
|
||||
UNION_KW@[0; 5)
|
||||
WHITESPACE@[5; 6)
|
||||
NAME@[6; 9)
|
||||
IDENT@[6; 9) "Foo"
|
||||
WHITESPACE@[9; 10)
|
||||
NAMED_FIELD_DEF_LIST@[10; 12)
|
||||
L_CURLY@[10; 11)
|
||||
R_CURLY@[11; 12)
|
||||
WHITESPACE@[12; 13)
|
||||
STRUCT_DEF@[13; 50)
|
||||
UNION_KW@[13; 18)
|
||||
WHITESPACE@[18; 19)
|
||||
NAME@[19; 22)
|
||||
IDENT@[19; 22) "Foo"
|
||||
WHITESPACE@[22; 23)
|
||||
NAMED_FIELD_DEF_LIST@[23; 50)
|
||||
L_CURLY@[23; 24)
|
||||
WHITESPACE@[24; 29)
|
||||
NAMED_FIELD_DEF@[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)
|
||||
NAMED_FIELD_DEF@[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)
|
||||
R_CURLY@[49; 50)
|
Loading…
Reference in a new issue