G: more types

This commit is contained in:
Aleksey Kladov 2018-02-11 00:46:17 +03:00
parent b814d93151
commit b097090690
25 changed files with 263 additions and 67 deletions

View file

@ -101,6 +101,11 @@ Grammar(
"IMPL_ITEM",
"TYPE_ITEM",
"PAREN_TYPE",
"TUPLE_TYPE",
"NEVER_TYPE",
"PATH_TYPE",
"EXTERN_BLOCK",
"ENUM_VARIANT",
"NAMED_FIELD",

View file

@ -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);

View file

@ -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);
}

View file

@ -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) {

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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" },

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -0,0 +1 @@
type T = (i32);

View file

@ -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)

View file

@ -0,0 +1 @@
type T = ();

View file

@ -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)

View file

@ -0,0 +1 @@
type T = (i32,);

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)