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", "IMPL_ITEM",
"TYPE_ITEM", "TYPE_ITEM",
"PAREN_TYPE",
"TUPLE_TYPE",
"NEVER_TYPE",
"PATH_TYPE",
"EXTERN_BLOCK", "EXTERN_BLOCK",
"ENUM_VARIANT", "ENUM_VARIANT",
"NAMED_FIELD", "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 p.eat(MUT_KW); // TODO: validator to forbid const mut
name(p); name(p);
p.expect(COLON); p.expect(COLON);
types::type_ref(p); types::ty(p);
p.expect(EQ); p.expect(EQ);
expressions::expr(p); expressions::expr(p);
p.expect(SEMI); p.expect(SEMI);

View file

@ -247,7 +247,7 @@ fn type_item(p: &mut Parser) {
type_params::where_clause(p); type_params::where_clause(p);
p.expect(EQ); p.expect(EQ);
types::type_ref(p); types::ty(p);
p.expect(SEMI); p.expect(SEMI);
} }

View file

@ -89,7 +89,7 @@ fn named_fields(p: &mut Parser) {
if p.at(IDENT) { if p.at(IDENT) {
name(p); name(p);
p.expect(COLON); p.expect(COLON);
types::type_ref(p); types::ty(p);
field.complete(p, NAMED_FIELD); field.complete(p, NAMED_FIELD);
} else { } else {
field.abandon(p); field.abandon(p);
@ -105,7 +105,7 @@ fn pos_fields(p: &mut Parser) {
while !p.at(R_PAREN) && !p.at(EOF) { while !p.at(R_PAREN) && !p.at(EOF) {
let pos_field = p.start(); let pos_field = p.start();
visibility(p); visibility(p);
types::type_ref(p); types::ty(p);
pos_field.complete(p, POS_FIELD); pos_field.complete(p, POS_FIELD);
if !p.at(R_PAREN) { if !p.at(R_PAREN) {

View file

@ -62,7 +62,7 @@ pub(super) fn list(p: &mut Parser) {
} }
} }
if p.at(EQ) { if p.at(EQ) {
types::type_ref(p) types::ty(p)
} }
m.complete(p, TYPE_PARAM); m.complete(p, TYPE_PARAM);
} }

View file

@ -1,14 +1,51 @@
use super::*; use super::*;
pub(super) fn type_ref(p: &mut Parser) { pub(super) fn ty(p: &mut Parser) {
match p.current() { match p.current() {
IDENT => p.bump(), L_PAREN => paren_or_tuple_ty(p),
L_PAREN => { IDENT => path_type(p),
p.bump();
p.expect(R_PAREN);
}
_ => { _ => {
p.error("expected type"); 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, TRAIT_ITEM,
IMPL_ITEM, IMPL_ITEM,
TYPE_ITEM, TYPE_ITEM,
PAREN_TYPE,
TUPLE_TYPE,
NEVER_TYPE,
PATH_TYPE,
EXTERN_BLOCK, EXTERN_BLOCK,
ENUM_VARIANT, ENUM_VARIANT,
NAMED_FIELD, NAMED_FIELD,
@ -224,6 +228,10 @@ impl SyntaxKind {
TRAIT_ITEM => &SyntaxInfo { name: "TRAIT_ITEM" }, TRAIT_ITEM => &SyntaxInfo { name: "TRAIT_ITEM" },
IMPL_ITEM => &SyntaxInfo { name: "IMPL_ITEM" }, IMPL_ITEM => &SyntaxInfo { name: "IMPL_ITEM" },
TYPE_ITEM => &SyntaxInfo { name: "TYPE_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" }, EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" },
ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" }, ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" },
NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" }, NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" },

View file

@ -11,6 +11,10 @@ FILE@[0; 34)
WHITESPACE@[10; 15) WHITESPACE@[10; 15)
IDENT@[15; 16) "a" IDENT@[15; 16) "a"
COLON@[16; 17) COLON@[16; 17)
PATH_TYPE@[17; 26)
PATH@[17; 26)
PATH_SEGMENT@[17; 26)
NAME_REF@[17; 26)
WHITESPACE@[17; 18) WHITESPACE@[17; 18)
IDENT@[18; 21) "u32" IDENT@[18; 21) "u32"
WHITESPACE@[21; 26) WHITESPACE@[21; 26)
@ -19,6 +23,10 @@ FILE@[0; 34)
NAME@[26; 27) NAME@[26; 27)
IDENT@[26; 27) "b" IDENT@[26; 27) "b"
COLON@[27; 28) COLON@[27; 28)
PATH_TYPE@[28; 33)
PATH@[28; 33)
PATH_SEGMENT@[28; 33)
NAME_REF@[28; 33)
WHITESPACE@[28; 29) WHITESPACE@[28; 29)
IDENT@[29; 32) "u32" IDENT@[29; 32) "u32"
WHITESPACE@[32; 33) WHITESPACE@[32; 33)

View file

@ -11,6 +11,10 @@ FILE@[0; 40)
WHITESPACE@[10; 15) WHITESPACE@[10; 15)
IDENT@[15; 16) "a" IDENT@[15; 16) "a"
COLON@[16; 17) COLON@[16; 17)
PATH_TYPE@[17; 21)
PATH@[17; 21)
PATH_SEGMENT@[17; 21)
NAME_REF@[17; 21)
WHITESPACE@[17; 18) WHITESPACE@[17; 18)
IDENT@[18; 21) "i32" IDENT@[18; 21) "i32"
COMMA@[21; 22) COMMA@[21; 22)
@ -19,6 +23,10 @@ FILE@[0; 40)
WHITESPACE@[22; 27) WHITESPACE@[22; 27)
IDENT@[27; 28) "b" IDENT@[27; 28) "b"
COLON@[28; 29) COLON@[28; 29)
PATH_TYPE@[29; 36)
PATH@[29; 36)
PATH_SEGMENT@[29; 36)
NAME_REF@[29; 36)
WHITESPACE@[29; 30) WHITESPACE@[29; 30)
IDENT@[30; 36) "String" IDENT@[30; 36) "String"
COMMA@[36; 37) COMMA@[36; 37)

View file

@ -11,6 +11,10 @@ FILE@[0; 74)
WHITESPACE@[10; 15) WHITESPACE@[10; 15)
IDENT@[15; 16) "f" IDENT@[15; 16) "f"
COLON@[16; 17) COLON@[16; 17)
PATH_TYPE@[17; 21)
PATH@[17; 21)
PATH_SEGMENT@[17; 21)
NAME_REF@[17; 21)
WHITESPACE@[17; 18) WHITESPACE@[17; 18)
IDENT@[18; 21) "u32" IDENT@[18; 21) "u32"
COMMA@[21; 22) COMMA@[21; 22)
@ -42,6 +46,10 @@ FILE@[0; 74)
NAME@[52; 53) NAME@[52; 53)
IDENT@[52; 53) "x" IDENT@[52; 53) "x"
COLON@[53; 54) COLON@[53; 54)
PATH_TYPE@[54; 58)
PATH@[54; 58)
PATH_SEGMENT@[54; 58)
NAME_REF@[54; 58)
WHITESPACE@[54; 55) WHITESPACE@[54; 55)
IDENT@[55; 58) "u32" IDENT@[55; 58) "u32"
COMMA@[58; 59) COMMA@[58; 59)
@ -50,6 +58,10 @@ FILE@[0; 74)
WHITESPACE@[59; 64) WHITESPACE@[59; 64)
IDENT@[64; 65) "z" IDENT@[64; 65) "z"
COLON@[65; 66) COLON@[65; 66)
PATH_TYPE@[66; 70)
PATH@[66; 70)
PATH_SEGMENT@[66; 70)
NAME_REF@[66; 70)
WHITESPACE@[66; 67) WHITESPACE@[66; 67)
IDENT@[67; 70) "f64" IDENT@[67; 70) "f64"
COMMA@[70; 71) COMMA@[70; 71)

View file

@ -11,6 +11,7 @@ FILE@[0; 21)
R_ANGLE@[13; 14) R_ANGLE@[13; 14)
WHITESPACE@[14; 15) WHITESPACE@[14; 15)
EQ@[15; 16) EQ@[15; 16)
TUPLE_TYPE@[16; 19)
WHITESPACE@[16; 17) WHITESPACE@[16; 17)
L_PAREN@[17; 18) L_PAREN@[17; 18)
R_PAREN@[18; 19) R_PAREN@[18; 19)

View file

@ -6,6 +6,10 @@ FILE@[0; 16)
IDENT@[5; 8) "Foo" IDENT@[5; 8) "Foo"
WHITESPACE@[8; 9) WHITESPACE@[8; 9)
EQ@[9; 10) EQ@[9; 10)
PATH_TYPE@[10; 14)
PATH@[10; 14)
PATH_SEGMENT@[10; 14)
NAME_REF@[10; 14)
WHITESPACE@[10; 11) WHITESPACE@[10; 11)
IDENT@[11; 14) "Bar" IDENT@[11; 14) "Bar"
SEMI@[14; 15) SEMI@[14; 15)

View file

@ -14,6 +14,7 @@ FILE@[0; 31)
IDENT@[20; 24) "Copy" IDENT@[20; 24) "Copy"
WHITESPACE@[24; 25) WHITESPACE@[24; 25)
EQ@[25; 26) EQ@[25; 26)
TUPLE_TYPE@[26; 29)
WHITESPACE@[26; 27) WHITESPACE@[26; 27)
L_PAREN@[27; 28) L_PAREN@[27; 28)
R_PAREN@[28; 29) R_PAREN@[28; 29)

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,6 +11,10 @@ FILE@[0; 25)
WHITESPACE@[10; 15) WHITESPACE@[10; 15)
IDENT@[15; 18) "foo" IDENT@[15; 18) "foo"
COLON@[18; 19) COLON@[18; 19)
PATH_TYPE@[19; 24)
PATH@[19; 24)
PATH_SEGMENT@[19; 24)
NAME_REF@[19; 24)
WHITESPACE@[19; 20) WHITESPACE@[19; 20)
IDENT@[20; 23) "u32" IDENT@[20; 23) "u32"
WHITESPACE@[23; 24) WHITESPACE@[23; 24)

View file

@ -36,6 +36,10 @@ FILE@[0; 97)
WHITESPACE@[45; 50) WHITESPACE@[45; 50)
IDENT@[50; 51) "a" IDENT@[50; 51) "a"
COLON@[51; 52) COLON@[51; 52)
PATH_TYPE@[52; 56)
PATH@[52; 56)
PATH_SEGMENT@[52; 56)
NAME_REF@[52; 56)
WHITESPACE@[52; 53) WHITESPACE@[52; 53)
IDENT@[53; 56) "u32" IDENT@[53; 56) "u32"
COMMA@[56; 57) COMMA@[56; 57)
@ -47,6 +51,10 @@ FILE@[0; 97)
NAME@[66; 67) NAME@[66; 67)
IDENT@[66; 67) "b" IDENT@[66; 67) "b"
COLON@[67; 68) COLON@[67; 68)
PATH_TYPE@[68; 73)
PATH@[68; 73)
PATH_SEGMENT@[68; 73)
NAME_REF@[68; 73)
WHITESPACE@[68; 69) WHITESPACE@[68; 69)
IDENT@[69; 72) "u32" IDENT@[69; 72) "u32"
WHITESPACE@[72; 73) WHITESPACE@[72; 73)
@ -62,9 +70,17 @@ FILE@[0; 97)
VISIBILITY@[85; 89) VISIBILITY@[85; 89)
PUB_KW@[85; 88) PUB_KW@[85; 88)
WHITESPACE@[88; 89) WHITESPACE@[88; 89)
PATH_TYPE@[89; 90)
PATH@[89; 90)
PATH_SEGMENT@[89; 90)
NAME_REF@[89; 90)
IDENT@[89; 90) "x" IDENT@[89; 90) "x"
COMMA@[90; 91) COMMA@[90; 91)
POS_FIELD@[91; 93) POS_FIELD@[91; 93)
PATH_TYPE@[91; 93)
PATH@[91; 93)
PATH_SEGMENT@[91; 93)
NAME_REF@[91; 93)
WHITESPACE@[91; 92) WHITESPACE@[91; 92)
IDENT@[92; 93) "y" IDENT@[92; 93) "y"
COMMA@[93; 94) COMMA@[93; 94)

View file

@ -23,6 +23,10 @@ FILE@[0; 290)
R_ANGLE@[25; 26) R_ANGLE@[25; 26)
L_PAREN@[26; 27) L_PAREN@[26; 27)
POS_FIELD@[27; 30) POS_FIELD@[27; 30)
PATH_TYPE@[27; 30)
PATH@[27; 30)
PATH_SEGMENT@[27; 30)
NAME_REF@[27; 30)
IDENT@[27; 30) "u32" IDENT@[27; 30) "u32"
R_PAREN@[30; 31) R_PAREN@[30; 31)
SEMI@[31; 32) SEMI@[31; 32)
@ -44,6 +48,10 @@ FILE@[0; 290)
WHITESPACE@[47; 48) WHITESPACE@[47; 48)
IDENT@[48; 49) "u" IDENT@[48; 49) "u"
COLON@[49; 50) COLON@[49; 50)
PATH_TYPE@[50; 55)
PATH@[50; 55)
PATH_SEGMENT@[50; 55)
NAME_REF@[50; 55)
WHITESPACE@[50; 51) WHITESPACE@[50; 51)
IDENT@[51; 54) "u32" IDENT@[51; 54) "u32"
WHITESPACE@[54; 55) WHITESPACE@[54; 55)

View file

@ -81,6 +81,10 @@ FILE@[0; 182)
WHITESPACE@[104; 113) WHITESPACE@[104; 113)
IDENT@[113; 114) "a" IDENT@[113; 114) "a"
COLON@[114; 115) COLON@[114; 115)
PATH_TYPE@[115; 119)
PATH@[115; 119)
PATH_SEGMENT@[115; 119)
NAME_REF@[115; 119)
WHITESPACE@[115; 116) WHITESPACE@[115; 116)
IDENT@[116; 119) "u32" IDENT@[116; 119) "u32"
COMMA@[119; 120) COMMA@[119; 120)
@ -92,6 +96,10 @@ FILE@[0; 182)
NAME@[133; 134) NAME@[133; 134)
IDENT@[133; 134) "b" IDENT@[133; 134) "b"
COLON@[134; 135) COLON@[134; 135)
PATH_TYPE@[135; 139)
PATH@[135; 139)
PATH_SEGMENT@[135; 139)
NAME_REF@[135; 139)
WHITESPACE@[135; 136) WHITESPACE@[135; 136)
IDENT@[136; 139) "f64" IDENT@[136; 139) "f64"
COMMA@[139; 140) COMMA@[139; 140)
@ -110,6 +118,10 @@ FILE@[0; 182)
IDENT@[162; 163) "D" IDENT@[162; 163) "D"
L_PAREN@[163; 164) L_PAREN@[163; 164)
POS_FIELD@[164; 167) POS_FIELD@[164; 167)
PATH_TYPE@[164; 167)
PATH@[164; 167)
PATH_SEGMENT@[164; 167)
NAME_REF@[164; 167)
IDENT@[164; 167) "u32" IDENT@[164; 167) "u32"
COMMA@[167; 168) COMMA@[167; 168)
R_PAREN@[168; 169) R_PAREN@[168; 169)

View file

@ -5,6 +5,10 @@ FILE@[0; 47)
WHITESPACE@[6; 7) WHITESPACE@[6; 7)
IDENT@[7; 10) "FOO" IDENT@[7; 10) "FOO"
COLON@[10; 11) COLON@[10; 11)
PATH_TYPE@[11; 16)
PATH@[11; 16)
PATH_SEGMENT@[11; 16)
NAME_REF@[11; 16)
WHITESPACE@[11; 12) WHITESPACE@[11; 12)
IDENT@[12; 15) "u32" IDENT@[12; 15) "u32"
WHITESPACE@[15; 16) WHITESPACE@[15; 16)
@ -22,6 +26,10 @@ FILE@[0; 47)
WHITESPACE@[31; 32) WHITESPACE@[31; 32)
IDENT@[32; 35) "BAR" IDENT@[32; 35) "BAR"
COLON@[35; 36) COLON@[35; 36)
PATH_TYPE@[36; 41)
PATH@[36; 41)
PATH_SEGMENT@[36; 41)
NAME_REF@[36; 41)
WHITESPACE@[36; 37) WHITESPACE@[36; 37)
IDENT@[37; 40) "i32" IDENT@[37; 40) "i32"
WHITESPACE@[40; 41) WHITESPACE@[40; 41)

View file

@ -5,6 +5,10 @@ FILE@[0; 46)
WHITESPACE@[5; 6) WHITESPACE@[5; 6)
IDENT@[6; 9) "FOO" IDENT@[6; 9) "FOO"
COLON@[9; 10) COLON@[9; 10)
PATH_TYPE@[10; 15)
PATH@[10; 15)
PATH_SEGMENT@[10; 15)
NAME_REF@[10; 15)
WHITESPACE@[10; 11) WHITESPACE@[10; 11)
IDENT@[11; 14) "u32" IDENT@[11; 14) "u32"
WHITESPACE@[14; 15) WHITESPACE@[14; 15)
@ -22,6 +26,10 @@ FILE@[0; 46)
WHITESPACE@[30; 31) WHITESPACE@[30; 31)
IDENT@[31; 34) "BAR" IDENT@[31; 34) "BAR"
COLON@[34; 35) COLON@[34; 35)
PATH_TYPE@[35; 40)
PATH@[35; 40)
PATH_SEGMENT@[35; 40)
NAME_REF@[35; 40)
WHITESPACE@[35; 36) WHITESPACE@[35; 36)
IDENT@[36; 39) "u32" IDENT@[36; 39) "u32"
WHITESPACE@[39; 40) WHITESPACE@[39; 40)