G: value_parameters, patterns & let statement

This commit is contained in:
Aleksey Kladov 2018-02-18 01:06:48 +03:00
parent 8c4c5b5b80
commit c6f4a06b42
31 changed files with 541 additions and 107 deletions

View file

@ -27,6 +27,8 @@ Grammar(
"mut",
"unsafe",
"type",
"ref",
"let",
],
contextual_keywords: [
"auto",
@ -113,6 +115,12 @@ Grammar(
"FN_POINTER_TYPE",
"FOR_TYPE",
"REF_PAT",
"BIND_PAT",
"PLACEHOLDER_PAT",
"TUPLE_EXPR",
"EXTERN_BLOCK",
"ENUM_VARIANT",
"NAMED_FIELD",
@ -132,5 +140,8 @@ Grammar(
"ABI",
"NAME",
"NAME_REF",
"VALUE_PARAMETER",
"BLOCK",
"LET_STMT",
]
)

View file

@ -14,7 +14,20 @@ pub(super) fn literal(p: &mut Parser) -> bool {
}
pub(super) fn expr(p: &mut Parser) {
if !literal(p) {
p.error("expected expression");
if literal(p) {
return;
}
match p.current() {
L_PAREN => tuple_expr(p),
_ => p.error("expected expression"),
}
}
fn tuple_expr(p: &mut Parser) {
assert!(p.at(L_PAREN));
let m = p.start();
p.expect(L_PAREN);
p.expect(R_PAREN);
m.complete(p, TUPLE_EXPR);
}

View file

@ -218,9 +218,33 @@ fn fn_item(p: &mut Parser) {
p.error("expected function arguments");
}
if p.at(L_CURLY) {
p.expect(L_CURLY);
block(p);
fn block(p: &mut Parser) {
if !p.at(L_CURLY) {
p.error("expected block");
}
let m = p.start();
p.bump();
while !p.at(EOF) && !p.at(R_CURLY) {
match p.current() {
LET_KW => let_stmt(p),
_ => p.err_and_bump("expected statement"),
}
}
p.expect(R_CURLY);
m.complete(p, BLOCK);
}
fn let_stmt(p: &mut Parser) {
assert!(p.at(LET_KW));
let m = p.start();
p.bump();
patterns::pattern(p);
p.expect(EQ);
expressions::expr(p);
p.expect(SEMI);
m.complete(p, LET_STMT);
}
}

View file

@ -30,6 +30,7 @@ mod items;
mod attributes;
mod expressions;
mod types;
mod patterns;
mod paths;
mod type_params;
@ -85,10 +86,29 @@ fn abi(p: &mut Parser) {
abi.complete(p, ABI);
}
// test fn_value_parameters
// fn a() {}
// fn b(x: i32) {}
// fn c(x: i32, ) {}
// fn d(x: i32, y: ()) {}
fn fn_value_parameters(p: &mut Parser) {
assert!(p.at(L_PAREN));
p.bump();
while !p.at(EOF) && !p.at(R_PAREN) {
value_parameter(p);
if !p.at(R_PAREN) {
p.expect(COMMA);
}
}
p.expect(R_PAREN);
fn value_parameter(p: &mut Parser) {
let m = p.start();
patterns::pattern(p);
p.expect(COLON);
types::type_(p);
m.complete(p, VALUE_PARAMETER);
}
}
fn fn_ret_type(p: &mut Parser) {

View file

@ -0,0 +1,52 @@
use super::*;
pub(super) fn pattern(p: &mut Parser) {
match p.current() {
UNDERSCORE => placeholder_pat(p),
AMPERSAND => ref_pat(p),
IDENT | REF_KW => bind_pat(p),
_ => p.err_and_bump("expected pattern"),
}
}
// test placeholder_pat
// fn main() { let _ = (); }
fn placeholder_pat(p: &mut Parser) {
assert!(p.at(UNDERSCORE));
let m = p.start();
p.bump();
m.complete(p, PLACEHOLDER_PAT);
}
// test ref_pat
// fn main() {
// let &a = ();
// let &mut b = ();
// }
fn ref_pat(p: &mut Parser) {
assert!(p.at(AMPERSAND));
let m = p.start();
p.bump();
p.eat(MUT_KW);
pattern(p);
m.complete(p, REF_PAT);
}
// test bind_pat
// fn main() {
// let a = ();
// let ref b = ();
// let ref mut c = ();
// let d @ _ = ();
// }
fn bind_pat(p: &mut Parser) {
let m = p.start();
if p.eat(REF_KW) {
p.eat(MUT_KW);
}
name(p);
if p.eat(AT) {
pattern(p);
}
m.complete(p, BIND_PAT);
}

View file

@ -84,6 +84,8 @@ pub enum SyntaxKind {
MUT_KW,
UNSAFE_KW,
TYPE_KW,
REF_KW,
LET_KW,
AUTO_KW,
DEFAULT_KW,
UNION_KW,
@ -110,6 +112,10 @@ pub enum SyntaxKind {
PLACEHOLDER_TYPE,
FN_POINTER_TYPE,
FOR_TYPE,
REF_PAT,
BIND_PAT,
PLACEHOLDER_PAT,
TUPLE_EXPR,
EXTERN_BLOCK,
ENUM_VARIANT,
NAMED_FIELD,
@ -129,6 +135,9 @@ pub enum SyntaxKind {
ABI,
NAME,
NAME_REF,
VALUE_PARAMETER,
BLOCK,
LET_STMT,
// Technical SyntaxKinds: they appear temporally during parsing,
// but never end up in the final tree
@ -220,6 +229,8 @@ impl SyntaxKind {
MUT_KW => &SyntaxInfo { name: "MUT_KW" },
UNSAFE_KW => &SyntaxInfo { name: "UNSAFE_KW" },
TYPE_KW => &SyntaxInfo { name: "TYPE_KW" },
REF_KW => &SyntaxInfo { name: "REF_KW" },
LET_KW => &SyntaxInfo { name: "LET_KW" },
AUTO_KW => &SyntaxInfo { name: "AUTO_KW" },
DEFAULT_KW => &SyntaxInfo { name: "DEFAULT_KW" },
UNION_KW => &SyntaxInfo { name: "UNION_KW" },
@ -246,6 +257,10 @@ impl SyntaxKind {
PLACEHOLDER_TYPE => &SyntaxInfo { name: "PLACEHOLDER_TYPE" },
FN_POINTER_TYPE => &SyntaxInfo { name: "FN_POINTER_TYPE" },
FOR_TYPE => &SyntaxInfo { name: "FOR_TYPE" },
REF_PAT => &SyntaxInfo { name: "REF_PAT" },
BIND_PAT => &SyntaxInfo { name: "BIND_PAT" },
PLACEHOLDER_PAT => &SyntaxInfo { name: "PLACEHOLDER_PAT" },
TUPLE_EXPR => &SyntaxInfo { name: "TUPLE_EXPR" },
EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" },
ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" },
NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" },
@ -265,6 +280,9 @@ impl SyntaxKind {
ABI => &SyntaxInfo { name: "ABI" },
NAME => &SyntaxInfo { name: "NAME" },
NAME_REF => &SyntaxInfo { name: "NAME_REF" },
VALUE_PARAMETER => &SyntaxInfo { name: "VALUE_PARAMETER" },
BLOCK => &SyntaxInfo { name: "BLOCK" },
LET_STMT => &SyntaxInfo { name: "LET_STMT" },
TOMBSTONE => &SyntaxInfo { name: "TOMBSTONE" },
EOF => &SyntaxInfo { name: "EOF" },
@ -301,6 +319,8 @@ pub(crate) fn ident_to_keyword(ident: &str) -> Option<SyntaxKind> {
"mut" => Some(MUT_KW),
"unsafe" => Some(UNSAFE_KW),
"type" => Some(TYPE_KW),
"ref" => Some(REF_KW),
"let" => Some(LET_KW),
_ => None,
}
}

View file

@ -1,3 +1,3 @@
fn use struct trait enum impl true false as extern crate
mod pub self super in where for loop while if match const
static mut type
static mut type ref let

View file

@ -49,4 +49,8 @@ WHITESPACE 1 " "
MUT_KW 3 "mut"
WHITESPACE 1 " "
TYPE_KW 4 "type"
WHITESPACE 1 " "
REF_KW 3 "ref"
WHITESPACE 1 " "
LET_KW 3 "let"
WHITESPACE 1 "\n"

View file

@ -28,11 +28,12 @@ FILE@[0; 54)
IDENT@[22; 25) "foo"
L_PAREN@[25; 26)
R_PAREN@[26; 27)
WHITESPACE@[27; 28)
L_CURLY@[28; 29)
WHITESPACE@[29; 30)
R_CURLY@[30; 31)
WHITESPACE@[31; 34)
BLOCK@[27; 34)
WHITESPACE@[27; 28)
L_CURLY@[28; 29)
WHITESPACE@[29; 30)
R_CURLY@[30; 31)
WHITESPACE@[31; 34)
FN_ITEM@[34; 54)
ATTR@[34; 41)
POUND@[34; 35)
@ -49,8 +50,9 @@ FILE@[0; 54)
IDENT@[44; 47) "foo"
L_PAREN@[47; 48)
R_PAREN@[48; 49)
WHITESPACE@[49; 50)
L_CURLY@[50; 51)
WHITESPACE@[51; 52)
R_CURLY@[52; 53)
WHITESPACE@[53; 54)
BLOCK@[49; 54)
WHITESPACE@[49; 50)
L_CURLY@[50; 51)
WHITESPACE@[51; 52)
R_CURLY@[52; 53)
WHITESPACE@[53; 54)

View file

@ -21,9 +21,10 @@ FILE@[0; 31)
IDENT@[20; 23) "foo"
L_PAREN@[23; 24)
R_PAREN@[24; 25)
L_CURLY@[25; 26)
R_CURLY@[26; 27)
WHITESPACE@[27; 29)
BLOCK@[25; 29)
L_CURLY@[25; 26)
R_CURLY@[26; 27)
WHITESPACE@[27; 29)
ERROR@[29; 31)
err: `expected item`
R_CURLY@[29; 30)

View file

@ -6,11 +6,12 @@ FILE@[0; 95)
IDENT@[3; 6) "foo"
L_PAREN@[6; 7)
R_PAREN@[7; 8)
WHITESPACE@[8; 9)
L_CURLY@[9; 10)
WHITESPACE@[10; 11)
R_CURLY@[11; 12)
WHITESPACE@[12; 14)
BLOCK@[8; 14)
WHITESPACE@[8; 9)
L_CURLY@[9; 10)
WHITESPACE@[10; 11)
R_CURLY@[11; 12)
WHITESPACE@[12; 14)
ERROR@[14; 17)
err: `expected item`
IDENT@[14; 17) "bar"
@ -56,8 +57,9 @@ FILE@[0; 95)
IDENT@[85; 88) "baz"
L_PAREN@[88; 89)
R_PAREN@[89; 90)
WHITESPACE@[90; 91)
L_CURLY@[91; 92)
WHITESPACE@[92; 93)
R_CURLY@[93; 94)
WHITESPACE@[94; 95)
BLOCK@[90; 95)
WHITESPACE@[90; 91)
L_CURLY@[91; 92)
WHITESPACE@[92; 93)
R_CURLY@[93; 94)
WHITESPACE@[94; 95)

View file

@ -10,7 +10,8 @@ FILE@[0; 25)
IDENT@[16; 19) "foo"
L_PAREN@[19; 20)
R_PAREN@[20; 21)
WHITESPACE@[21; 22)
L_CURLY@[22; 23)
R_CURLY@[23; 24)
WHITESPACE@[24; 25)
BLOCK@[21; 25)
WHITESPACE@[21; 22)
L_CURLY@[22; 23)
R_CURLY@[23; 24)
WHITESPACE@[24; 25)

View file

@ -8,7 +8,8 @@ FILE@[0; 18)
IDENT@[9; 12) "foo"
L_PAREN@[12; 13)
R_PAREN@[13; 14)
WHITESPACE@[14; 15)
L_CURLY@[15; 16)
R_CURLY@[16; 17)
WHITESPACE@[17; 18)
BLOCK@[14; 18)
WHITESPACE@[14; 15)
L_CURLY@[15; 16)
R_CURLY@[16; 17)
WHITESPACE@[17; 18)

View file

@ -9,7 +9,8 @@ FILE@[0; 19)
IDENT@[10; 13) "foo"
L_PAREN@[13; 14)
R_PAREN@[14; 15)
WHITESPACE@[15; 16)
L_CURLY@[16; 17)
R_CURLY@[17; 18)
WHITESPACE@[18; 19)
BLOCK@[15; 19)
WHITESPACE@[15; 16)
L_CURLY@[16; 17)
R_CURLY@[17; 18)
WHITESPACE@[18; 19)

View file

@ -8,7 +8,8 @@ FILE@[0; 19)
IDENT@[10; 13) "foo"
L_PAREN@[13; 14)
R_PAREN@[14; 15)
WHITESPACE@[15; 16)
L_CURLY@[16; 17)
R_CURLY@[17; 18)
WHITESPACE@[18; 19)
BLOCK@[15; 19)
WHITESPACE@[15; 16)
L_CURLY@[16; 17)
R_CURLY@[17; 18)
WHITESPACE@[18; 19)

View file

@ -13,7 +13,8 @@ FILE@[0; 30)
IDENT@[21; 24) "foo"
L_PAREN@[24; 25)
R_PAREN@[25; 26)
WHITESPACE@[26; 27)
L_CURLY@[27; 28)
R_CURLY@[28; 29)
WHITESPACE@[29; 30)
BLOCK@[26; 30)
WHITESPACE@[26; 27)
L_CURLY@[27; 28)
R_CURLY@[28; 29)
WHITESPACE@[29; 30)

View file

@ -6,9 +6,10 @@ FILE@[0; 33)
IDENT@[3; 6) "foo"
L_PAREN@[6; 7)
R_PAREN@[7; 8)
L_CURLY@[8; 9)
R_CURLY@[9; 10)
WHITESPACE@[10; 11)
BLOCK@[8; 11)
L_CURLY@[8; 9)
R_CURLY@[9; 10)
WHITESPACE@[10; 11)
UNSAFE_KW@[11; 17)
ERROR@[17; 22)
err: `expected `trait`, `impl` or `fn``
@ -24,6 +25,7 @@ FILE@[0; 33)
IDENT@[25; 28) "bar"
L_PAREN@[28; 29)
R_PAREN@[29; 30)
L_CURLY@[30; 31)
R_CURLY@[31; 32)
WHITESPACE@[32; 33)
BLOCK@[30; 33)
L_CURLY@[30; 31)
R_CURLY@[31; 32)
WHITESPACE@[32; 33)

View file

@ -0,0 +1,4 @@
fn a() {}
fn b(x: i32) {}
fn c(x: i32, ) {}
fn d(x: i32, y: ()) {}

View file

@ -0,0 +1,95 @@
FILE@[0; 67)
FN_ITEM@[0; 10)
FN_KW@[0; 2)
NAME@[2; 4)
WHITESPACE@[2; 3)
IDENT@[3; 4) "a"
L_PAREN@[4; 5)
R_PAREN@[5; 6)
BLOCK@[6; 10)
WHITESPACE@[6; 7)
L_CURLY@[7; 8)
R_CURLY@[8; 9)
WHITESPACE@[9; 10)
FN_ITEM@[10; 26)
FN_KW@[10; 12)
NAME@[12; 14)
WHITESPACE@[12; 13)
IDENT@[13; 14) "b"
L_PAREN@[14; 15)
VALUE_PARAMETER@[15; 21)
BIND_PAT@[15; 16)
NAME@[15; 16)
IDENT@[15; 16) "x"
COLON@[16; 17)
PATH_TYPE@[17; 21)
PATH@[17; 21)
PATH_SEGMENT@[17; 21)
NAME_REF@[17; 21)
WHITESPACE@[17; 18)
IDENT@[18; 21) "i32"
R_PAREN@[21; 22)
BLOCK@[22; 26)
WHITESPACE@[22; 23)
L_CURLY@[23; 24)
R_CURLY@[24; 25)
WHITESPACE@[25; 26)
FN_ITEM@[26; 44)
FN_KW@[26; 28)
NAME@[28; 30)
WHITESPACE@[28; 29)
IDENT@[29; 30) "c"
L_PAREN@[30; 31)
VALUE_PARAMETER@[31; 37)
BIND_PAT@[31; 32)
NAME@[31; 32)
IDENT@[31; 32) "x"
COLON@[32; 33)
PATH_TYPE@[33; 37)
PATH@[33; 37)
PATH_SEGMENT@[33; 37)
NAME_REF@[33; 37)
WHITESPACE@[33; 34)
IDENT@[34; 37) "i32"
COMMA@[37; 38)
WHITESPACE@[38; 39)
R_PAREN@[39; 40)
BLOCK@[40; 44)
WHITESPACE@[40; 41)
L_CURLY@[41; 42)
R_CURLY@[42; 43)
WHITESPACE@[43; 44)
FN_ITEM@[44; 67)
FN_KW@[44; 46)
NAME@[46; 48)
WHITESPACE@[46; 47)
IDENT@[47; 48) "d"
L_PAREN@[48; 49)
VALUE_PARAMETER@[49; 55)
BIND_PAT@[49; 50)
NAME@[49; 50)
IDENT@[49; 50) "x"
COLON@[50; 51)
PATH_TYPE@[51; 55)
PATH@[51; 55)
PATH_SEGMENT@[51; 55)
NAME_REF@[51; 55)
WHITESPACE@[51; 52)
IDENT@[52; 55) "i32"
COMMA@[55; 56)
VALUE_PARAMETER@[56; 62)
BIND_PAT@[56; 58)
NAME@[56; 58)
WHITESPACE@[56; 57)
IDENT@[57; 58) "y"
COLON@[58; 59)
TUPLE_TYPE@[59; 62)
WHITESPACE@[59; 60)
L_PAREN@[60; 61)
R_PAREN@[61; 62)
R_PAREN@[62; 63)
BLOCK@[63; 67)
WHITESPACE@[63; 64)
L_CURLY@[64; 65)
R_CURLY@[65; 66)
WHITESPACE@[66; 67)

View file

@ -0,0 +1,6 @@
fn main() {
let a = ();
let ref b = ();
let ref mut c = ();
let d @ _ = ();
}

View file

@ -0,0 +1,81 @@
FILE@[0; 94)
FN_ITEM@[0; 94)
FN_KW@[0; 2)
NAME@[2; 7)
WHITESPACE@[2; 3)
IDENT@[3; 7) "main"
L_PAREN@[7; 8)
R_PAREN@[8; 9)
BLOCK@[9; 94)
WHITESPACE@[9; 10)
L_CURLY@[10; 11)
LET_STMT@[11; 32)
WHITESPACE@[11; 16)
LET_KW@[16; 19)
BIND_PAT@[19; 22)
NAME@[19; 22)
WHITESPACE@[19; 20)
IDENT@[20; 21) "a"
WHITESPACE@[21; 22)
EQ@[22; 23)
TUPLE_EXPR@[23; 26)
WHITESPACE@[23; 24)
L_PAREN@[24; 25)
R_PAREN@[25; 26)
SEMI@[26; 27)
WHITESPACE@[27; 32)
LET_STMT@[32; 52)
LET_KW@[32; 35)
BIND_PAT@[35; 42)
WHITESPACE@[35; 36)
REF_KW@[36; 39)
NAME@[39; 42)
WHITESPACE@[39; 40)
IDENT@[40; 41) "b"
WHITESPACE@[41; 42)
EQ@[42; 43)
TUPLE_EXPR@[43; 46)
WHITESPACE@[43; 44)
L_PAREN@[44; 45)
R_PAREN@[45; 46)
SEMI@[46; 47)
WHITESPACE@[47; 52)
LET_STMT@[52; 76)
LET_KW@[52; 55)
BIND_PAT@[55; 66)
WHITESPACE@[55; 56)
REF_KW@[56; 59)
WHITESPACE@[59; 60)
MUT_KW@[60; 63)
NAME@[63; 66)
WHITESPACE@[63; 64)
IDENT@[64; 65) "c"
WHITESPACE@[65; 66)
EQ@[66; 67)
TUPLE_EXPR@[67; 70)
WHITESPACE@[67; 68)
L_PAREN@[68; 69)
R_PAREN@[69; 70)
SEMI@[70; 71)
WHITESPACE@[71; 76)
LET_STMT@[76; 92)
LET_KW@[76; 79)
BIND_PAT@[79; 86)
NAME@[79; 82)
WHITESPACE@[79; 80)
IDENT@[80; 81) "d"
WHITESPACE@[81; 82)
AT@[82; 83)
PLACEHOLDER_PAT@[83; 86)
WHITESPACE@[83; 84)
UNDERSCORE@[84; 85)
WHITESPACE@[85; 86)
EQ@[86; 87)
TUPLE_EXPR@[87; 90)
WHITESPACE@[87; 88)
L_PAREN@[88; 89)
R_PAREN@[89; 90)
SEMI@[90; 91)
WHITESPACE@[91; 92)
R_CURLY@[92; 93)
WHITESPACE@[93; 94)

View file

@ -0,0 +1,4 @@
fn main() {
let &a = ();
let &mut b = ();
}

View file

@ -0,0 +1,48 @@
FILE@[0; 52)
FN_ITEM@[0; 52)
FN_KW@[0; 2)
NAME@[2; 7)
WHITESPACE@[2; 3)
IDENT@[3; 7) "main"
L_PAREN@[7; 8)
R_PAREN@[8; 9)
BLOCK@[9; 52)
WHITESPACE@[9; 10)
L_CURLY@[10; 11)
LET_STMT@[11; 33)
WHITESPACE@[11; 16)
LET_KW@[16; 19)
REF_PAT@[19; 23)
WHITESPACE@[19; 20)
AMPERSAND@[20; 21)
BIND_PAT@[21; 23)
NAME@[21; 23)
IDENT@[21; 22) "a"
WHITESPACE@[22; 23)
EQ@[23; 24)
TUPLE_EXPR@[24; 27)
WHITESPACE@[24; 25)
L_PAREN@[25; 26)
R_PAREN@[26; 27)
SEMI@[27; 28)
WHITESPACE@[28; 33)
LET_STMT@[33; 50)
LET_KW@[33; 36)
REF_PAT@[36; 44)
WHITESPACE@[36; 37)
AMPERSAND@[37; 38)
MUT_KW@[38; 41)
BIND_PAT@[41; 44)
NAME@[41; 44)
WHITESPACE@[41; 42)
IDENT@[42; 43) "b"
WHITESPACE@[43; 44)
EQ@[44; 45)
TUPLE_EXPR@[45; 48)
WHITESPACE@[45; 46)
L_PAREN@[46; 47)
R_PAREN@[47; 48)
SEMI@[48; 49)
WHITESPACE@[49; 50)
R_CURLY@[50; 51)
WHITESPACE@[51; 52)

View file

@ -0,0 +1 @@
fn main() { let _ = (); }

View file

@ -0,0 +1,27 @@
FILE@[0; 26)
FN_ITEM@[0; 26)
FN_KW@[0; 2)
NAME@[2; 7)
WHITESPACE@[2; 3)
IDENT@[3; 7) "main"
L_PAREN@[7; 8)
R_PAREN@[8; 9)
BLOCK@[9; 26)
WHITESPACE@[9; 10)
L_CURLY@[10; 11)
LET_STMT@[11; 24)
WHITESPACE@[11; 12)
LET_KW@[12; 15)
PLACEHOLDER_PAT@[15; 18)
WHITESPACE@[15; 16)
UNDERSCORE@[16; 17)
WHITESPACE@[17; 18)
EQ@[18; 19)
TUPLE_EXPR@[19; 22)
WHITESPACE@[19; 20)
L_PAREN@[20; 21)
R_PAREN@[21; 22)
SEMI@[22; 23)
WHITESPACE@[23; 24)
R_CURLY@[24; 25)
WHITESPACE@[25; 26)

View file

@ -6,8 +6,9 @@ FILE@[0; 13)
IDENT@[3; 6) "foo"
L_PAREN@[6; 7)
R_PAREN@[7; 8)
WHITESPACE@[8; 9)
L_CURLY@[9; 10)
WHITESPACE@[10; 11)
R_CURLY@[11; 12)
WHITESPACE@[12; 13)
BLOCK@[8; 13)
WHITESPACE@[8; 9)
L_CURLY@[9; 10)
WHITESPACE@[10; 11)
R_CURLY@[11; 12)
WHITESPACE@[12; 13)

View file

@ -31,11 +31,12 @@ FILE@[0; 118)
IDENT@[34; 37) "foo"
L_PAREN@[37; 38)
R_PAREN@[38; 39)
WHITESPACE@[39; 40)
L_CURLY@[40; 41)
WHITESPACE@[41; 46)
R_CURLY@[46; 47)
WHITESPACE@[47; 52)
BLOCK@[39; 52)
WHITESPACE@[39; 40)
L_CURLY@[40; 41)
WHITESPACE@[41; 46)
R_CURLY@[46; 47)
WHITESPACE@[47; 52)
STRUCT_ITEM@[52; 64)
STRUCT_KW@[52; 58)
NAME@[58; 61)

View file

@ -24,7 +24,8 @@ FILE@[0; 35)
IDENT@[26; 29) "foo"
L_PAREN@[29; 30)
R_PAREN@[30; 31)
WHITESPACE@[31; 32)
L_CURLY@[32; 33)
R_CURLY@[33; 34)
WHITESPACE@[34; 35)
BLOCK@[31; 35)
WHITESPACE@[31; 32)
L_CURLY@[32; 33)
R_CURLY@[33; 34)
WHITESPACE@[34; 35)

View file

@ -6,10 +6,11 @@ FILE@[0; 98)
IDENT@[3; 4) "a"
L_PAREN@[4; 5)
R_PAREN@[5; 6)
WHITESPACE@[6; 7)
L_CURLY@[7; 8)
R_CURLY@[8; 9)
WHITESPACE@[9; 10)
BLOCK@[6; 10)
WHITESPACE@[6; 7)
L_CURLY@[7; 8)
R_CURLY@[8; 9)
WHITESPACE@[9; 10)
FN_ITEM@[10; 24)
VISIBILITY@[10; 14)
PUB_KW@[10; 13)
@ -20,10 +21,11 @@ FILE@[0; 98)
IDENT@[17; 18) "b"
L_PAREN@[18; 19)
R_PAREN@[19; 20)
WHITESPACE@[20; 21)
L_CURLY@[21; 22)
R_CURLY@[22; 23)
WHITESPACE@[23; 24)
BLOCK@[20; 24)
WHITESPACE@[20; 21)
L_CURLY@[21; 22)
R_CURLY@[22; 23)
WHITESPACE@[23; 24)
FN_ITEM@[24; 45)
VISIBILITY@[24; 35)
PUB_KW@[24; 27)
@ -37,10 +39,11 @@ FILE@[0; 98)
IDENT@[38; 39) "c"
L_PAREN@[39; 40)
R_PAREN@[40; 41)
WHITESPACE@[41; 42)
L_CURLY@[42; 43)
R_CURLY@[43; 44)
WHITESPACE@[44; 45)
BLOCK@[41; 45)
WHITESPACE@[41; 42)
L_CURLY@[42; 43)
R_CURLY@[43; 44)
WHITESPACE@[44; 45)
FN_ITEM@[45; 66)
VISIBILITY@[45; 56)
PUB_KW@[45; 48)
@ -54,10 +57,11 @@ FILE@[0; 98)
IDENT@[59; 60) "d"
L_PAREN@[60; 61)
R_PAREN@[61; 62)
WHITESPACE@[62; 63)
L_CURLY@[63; 64)
R_CURLY@[64; 65)
WHITESPACE@[65; 66)
BLOCK@[62; 66)
WHITESPACE@[62; 63)
L_CURLY@[63; 64)
R_CURLY@[64; 65)
WHITESPACE@[65; 66)
FN_ITEM@[66; 98)
VISIBILITY@[66; 88)
PUB_KW@[66; 69)
@ -86,7 +90,8 @@ FILE@[0; 98)
IDENT@[91; 92) "e"
L_PAREN@[92; 93)
R_PAREN@[93; 94)
WHITESPACE@[94; 95)
L_CURLY@[95; 96)
R_CURLY@[96; 97)
WHITESPACE@[97; 98)
BLOCK@[94; 98)
WHITESPACE@[94; 95)
L_CURLY@[95; 96)
R_CURLY@[96; 97)
WHITESPACE@[97; 98)

View file

@ -18,7 +18,8 @@ FILE@[0; 23)
IDENT@[14; 17) "foo"
L_PAREN@[17; 18)
R_PAREN@[18; 19)
WHITESPACE@[19; 20)
L_CURLY@[20; 21)
R_CURLY@[21; 22)
WHITESPACE@[22; 23)
BLOCK@[19; 23)
WHITESPACE@[19; 20)
L_CURLY@[20; 21)
R_CURLY@[21; 22)
WHITESPACE@[22; 23)

View file

@ -9,11 +9,12 @@ FILE@[0; 71)
IDENT@[10; 13) "foo"
L_PAREN@[13; 14)
R_PAREN@[14; 15)
WHITESPACE@[15; 16)
L_CURLY@[16; 17)
WHITESPACE@[17; 18)
R_CURLY@[18; 19)
WHITESPACE@[19; 21)
BLOCK@[15; 21)
WHITESPACE@[15; 16)
L_CURLY@[16; 17)
WHITESPACE@[17; 18)
R_CURLY@[18; 19)
WHITESPACE@[19; 21)
FN_ITEM@[21; 46)
ABI@[21; 32)
EXTERN_KW@[21; 27)
@ -26,11 +27,12 @@ FILE@[0; 71)
IDENT@[35; 38) "bar"
L_PAREN@[38; 39)
R_PAREN@[39; 40)
WHITESPACE@[40; 41)
L_CURLY@[41; 42)
WHITESPACE@[42; 43)
R_CURLY@[43; 44)
WHITESPACE@[44; 46)
BLOCK@[40; 46)
WHITESPACE@[40; 41)
L_CURLY@[41; 42)
WHITESPACE@[42; 43)
R_CURLY@[43; 44)
WHITESPACE@[44; 46)
FN_ITEM@[46; 71)
ABI@[46; 58)
EXTERN_KW@[46; 52)
@ -43,8 +45,9 @@ FILE@[0; 71)
IDENT@[61; 64) "baz"
L_PAREN@[64; 65)
R_PAREN@[65; 66)
WHITESPACE@[66; 67)
L_CURLY@[67; 68)
WHITESPACE@[68; 69)
R_CURLY@[69; 70)
WHITESPACE@[70; 71)
BLOCK@[66; 71)
WHITESPACE@[66; 67)
L_CURLY@[67; 68)
WHITESPACE@[68; 69)
R_CURLY@[69; 70)
WHITESPACE@[70; 71)