Add function parameters attributes

This commit is contained in:
Evgenii P 2019-08-07 23:42:28 +07:00
parent 9ea4ae680a
commit 3fb58c620c
15 changed files with 505 additions and 21 deletions

View File

@ -5,12 +5,15 @@ use super::*;
// fn b(x: i32) {}
// fn c(x: i32, ) {}
// fn d(x: i32, y: ()) {}
// fn g1(#[attr1] #[attr2] pat: Type) {}
// fn g2(#[attr1] x: u8) {}
pub(super) fn param_list(p: &mut Parser) {
list_(p, Flavor::Normal)
}
// test param_list_opt_patterns
// fn foo<F: FnMut(&mut Foo<'a>)>(){}
// fn foo<F: FnMut(#[attr] &mut Foo<'a>)>(){}
pub(super) fn param_list_opt_patterns(p: &mut Parser) {
list_(p, Flavor::OptionalPattern)
}
@ -41,9 +44,12 @@ fn list_(p: &mut Parser, flavor: Flavor) {
let m = p.start();
p.bump();
if flavor.type_required() {
attributes::outer_attributes(p);
opt_self_param(p);
}
while !p.at(EOF) && !p.at(ket) && !(flavor.type_required() && p.at(T![...])) {
attributes::outer_attributes(p);
if !p.at_ts(VALUE_PARAMETER_FIRST) {
p.error("expected value parameter");
break;
@ -55,6 +61,7 @@ fn list_(p: &mut Parser, flavor: Flavor) {
}
// test param_list_vararg
// extern "C" { fn printf(format: *const i8, ...) -> i32; }
// extern "C" { fn printf(#[attr] format: *const i8, ...) -> i32; }
if flavor.type_required() {
p.eat(T![...]);
}
@ -84,6 +91,7 @@ fn value_parameter(p: &mut Parser, flavor: Flavor) {
// test trait_fn_placeholder_parameter
// trait Foo {
// fn bar(_: u64, mut x: i32);
// fn bar(#[attr] _: u64, #[attr] mut x: i32);
// }
if (la0 == IDENT || la0 == T![_]) && la1 == T![:]
|| la0 == T![mut] && la1 == IDENT && la2 == T![:]
@ -107,6 +115,12 @@ fn value_parameter(p: &mut Parser, flavor: Flavor) {
// fn c(&'a self,) {}
// fn d(&'a mut self, x: i32) {}
// fn e(mut self) {}
// fn f(#[must_use] self) {}
// fn g1(#[attr] self) {}
// fn g2(#[attr] &self) {}
// fn g3<'a>(#[attr] &mut self) {}
// fn g4<'a>(#[attr] &'a self) {}
// fn g5<'a>(#[attr] &'a mut self) {}
// }
fn opt_self_param(p: &mut Parser) {
let m;
@ -118,6 +132,8 @@ fn opt_self_param(p: &mut Parser) {
// impl S {
// fn a(self: &Self) {}
// fn b(mut self: Box<Self>) {}
// fn c(#[attr] self: Self) {}
// fn d(#[attr] self: Rc<Self>) {}
// }
if p.at(T![:]) {
types::ascription(p);

View File

@ -2013,6 +2013,7 @@ impl AstNode for Param {
impl ast::TypeAscriptionOwner for Param {}
impl ast::AttrsOwner for Param {}
impl Param {
pub fn pat(&self) -> Option<Pat> {
super::child_opt(self)
@ -2667,6 +2668,7 @@ impl AstNode for SelfParam {
impl ast::TypeAscriptionOwner for SelfParam {}
impl ast::AttrsOwner for SelfParam {}
impl SelfParam {}
// SlicePat

View File

@ -642,12 +642,14 @@ Grammar(
"SelfParam": (
traits: [
"TypeAscriptionOwner",
"AttrsOwner",
]
),
"Param": (
options: [ "Pat" ],
traits: [
"TypeAscriptionOwner",
"AttrsOwner",
]
),
"UseItem": (

View File

@ -4,4 +4,10 @@ impl S {
fn c(&'a self,) {}
fn d(&'a mut self, x: i32) {}
fn e(mut self) {}
fn f(#[must_use] self) {}
fn g1(#[attr] self) {}
fn g2(#[attr] &self) {}
fn g3<'a>(#[attr] &mut self) {}
fn g4<'a>(#[attr] &'a self) {}
fn g5<'a>(#[attr] &'a mut self) {}
}

View File

@ -1,5 +1,5 @@
SOURCE_FILE@[0; 128)
IMPL_BLOCK@[0; 127)
SOURCE_FILE@[0; 323)
IMPL_BLOCK@[0; 322)
IMPL_KW@[0; 4) "impl"
WHITESPACE@[4; 5) " "
PATH_TYPE@[5; 6)
@ -8,7 +8,7 @@ SOURCE_FILE@[0; 128)
NAME_REF@[5; 6)
IDENT@[5; 6) "S"
WHITESPACE@[6; 7) " "
ITEM_LIST@[7; 127)
ITEM_LIST@[7; 322)
L_CURLY@[7; 8) "{"
WHITESPACE@[8; 13) "\n "
FN_DEF@[13; 26)
@ -111,6 +111,165 @@ SOURCE_FILE@[0; 128)
BLOCK@[123; 125)
L_CURLY@[123; 124) "{"
R_CURLY@[124; 125) "}"
WHITESPACE@[125; 126) "\n"
R_CURLY@[126; 127) "}"
WHITESPACE@[127; 128) "\n"
WHITESPACE@[125; 130) "\n "
FN_DEF@[130; 155)
FN_KW@[130; 132) "fn"
WHITESPACE@[132; 133) " "
NAME@[133; 134)
IDENT@[133; 134) "f"
PARAM_LIST@[134; 152)
L_PAREN@[134; 135) "("
ATTR@[135; 146)
POUND@[135; 136) "#"
TOKEN_TREE@[136; 146)
L_BRACK@[136; 137) "["
IDENT@[137; 145) "must_use"
R_BRACK@[145; 146) "]"
WHITESPACE@[146; 147) " "
SELF_PARAM@[147; 151)
SELF_KW@[147; 151) "self"
R_PAREN@[151; 152) ")"
WHITESPACE@[152; 153) " "
BLOCK@[153; 155)
L_CURLY@[153; 154) "{"
R_CURLY@[154; 155) "}"
WHITESPACE@[155; 160) "\n "
FN_DEF@[160; 182)
FN_KW@[160; 162) "fn"
WHITESPACE@[162; 163) " "
NAME@[163; 165)
IDENT@[163; 165) "g1"
PARAM_LIST@[165; 179)
L_PAREN@[165; 166) "("
ATTR@[166; 173)
POUND@[166; 167) "#"
TOKEN_TREE@[167; 173)
L_BRACK@[167; 168) "["
IDENT@[168; 172) "attr"
R_BRACK@[172; 173) "]"
WHITESPACE@[173; 174) " "
SELF_PARAM@[174; 178)
SELF_KW@[174; 178) "self"
R_PAREN@[178; 179) ")"
WHITESPACE@[179; 180) " "
BLOCK@[180; 182)
L_CURLY@[180; 181) "{"
R_CURLY@[181; 182) "}"
WHITESPACE@[182; 187) "\n "
FN_DEF@[187; 210)
FN_KW@[187; 189) "fn"
WHITESPACE@[189; 190) " "
NAME@[190; 192)
IDENT@[190; 192) "g2"
PARAM_LIST@[192; 207)
L_PAREN@[192; 193) "("
ATTR@[193; 200)
POUND@[193; 194) "#"
TOKEN_TREE@[194; 200)
L_BRACK@[194; 195) "["
IDENT@[195; 199) "attr"
R_BRACK@[199; 200) "]"
WHITESPACE@[200; 201) " "
SELF_PARAM@[201; 206)
AMP@[201; 202) "&"
SELF_KW@[202; 206) "self"
R_PAREN@[206; 207) ")"
WHITESPACE@[207; 208) " "
BLOCK@[208; 210)
L_CURLY@[208; 209) "{"
R_CURLY@[209; 210) "}"
WHITESPACE@[210; 215) "\n "
FN_DEF@[215; 246)
FN_KW@[215; 217) "fn"
WHITESPACE@[217; 218) " "
NAME@[218; 220)
IDENT@[218; 220) "g3"
TYPE_PARAM_LIST@[220; 224)
L_ANGLE@[220; 221) "<"
LIFETIME_PARAM@[221; 223)
LIFETIME@[221; 223) "\'a"
R_ANGLE@[223; 224) ">"
PARAM_LIST@[224; 243)
L_PAREN@[224; 225) "("
ATTR@[225; 232)
POUND@[225; 226) "#"
TOKEN_TREE@[226; 232)
L_BRACK@[226; 227) "["
IDENT@[227; 231) "attr"
R_BRACK@[231; 232) "]"
WHITESPACE@[232; 233) " "
SELF_PARAM@[233; 242)
AMP@[233; 234) "&"
MUT_KW@[234; 237) "mut"
WHITESPACE@[237; 238) " "
SELF_KW@[238; 242) "self"
R_PAREN@[242; 243) ")"
WHITESPACE@[243; 244) " "
BLOCK@[244; 246)
L_CURLY@[244; 245) "{"
R_CURLY@[245; 246) "}"
WHITESPACE@[246; 251) "\n "
FN_DEF@[251; 281)
FN_KW@[251; 253) "fn"
WHITESPACE@[253; 254) " "
NAME@[254; 256)
IDENT@[254; 256) "g4"
TYPE_PARAM_LIST@[256; 260)
L_ANGLE@[256; 257) "<"
LIFETIME_PARAM@[257; 259)
LIFETIME@[257; 259) "\'a"
R_ANGLE@[259; 260) ">"
PARAM_LIST@[260; 278)
L_PAREN@[260; 261) "("
ATTR@[261; 268)
POUND@[261; 262) "#"
TOKEN_TREE@[262; 268)
L_BRACK@[262; 263) "["
IDENT@[263; 267) "attr"
R_BRACK@[267; 268) "]"
WHITESPACE@[268; 269) " "
SELF_PARAM@[269; 277)
AMP@[269; 270) "&"
LIFETIME@[270; 272) "\'a"
WHITESPACE@[272; 273) " "
SELF_KW@[273; 277) "self"
R_PAREN@[277; 278) ")"
WHITESPACE@[278; 279) " "
BLOCK@[279; 281)
L_CURLY@[279; 280) "{"
R_CURLY@[280; 281) "}"
WHITESPACE@[281; 286) "\n "
FN_DEF@[286; 320)
FN_KW@[286; 288) "fn"
WHITESPACE@[288; 289) " "
NAME@[289; 291)
IDENT@[289; 291) "g5"
TYPE_PARAM_LIST@[291; 295)
L_ANGLE@[291; 292) "<"
LIFETIME_PARAM@[292; 294)
LIFETIME@[292; 294) "\'a"
R_ANGLE@[294; 295) ">"
PARAM_LIST@[295; 317)
L_PAREN@[295; 296) "("
ATTR@[296; 303)
POUND@[296; 297) "#"
TOKEN_TREE@[297; 303)
L_BRACK@[297; 298) "["
IDENT@[298; 302) "attr"
R_BRACK@[302; 303) "]"
WHITESPACE@[303; 304) " "
SELF_PARAM@[304; 316)
AMP@[304; 305) "&"
LIFETIME@[305; 307) "\'a"
WHITESPACE@[307; 308) " "
MUT_KW@[308; 311) "mut"
WHITESPACE@[311; 312) " "
SELF_KW@[312; 316) "self"
R_PAREN@[316; 317) ")"
WHITESPACE@[317; 318) " "
BLOCK@[318; 320)
L_CURLY@[318; 319) "{"
R_CURLY@[319; 320) "}"
WHITESPACE@[320; 321) "\n"
R_CURLY@[321; 322) "}"
WHITESPACE@[322; 323) "\n"

View File

@ -1,4 +1,6 @@
impl S {
fn a(self: &Self) {}
fn b(mut self: Box<Self>) {}
fn c(#[attr] self: Self) {}
fn d(#[attr] self: Rc<Self>) {}
}

View File

@ -1,5 +1,5 @@
SOURCE_FILE@[0; 69)
IMPL_BLOCK@[0; 68)
SOURCE_FILE@[0; 137)
IMPL_BLOCK@[0; 136)
IMPL_KW@[0; 4) "impl"
WHITESPACE@[4; 5) " "
PATH_TYPE@[5; 6)
@ -8,7 +8,7 @@ SOURCE_FILE@[0; 69)
NAME_REF@[5; 6)
IDENT@[5; 6) "S"
WHITESPACE@[6; 7) " "
ITEM_LIST@[7; 68)
ITEM_LIST@[7; 136)
L_CURLY@[7; 8) "{"
WHITESPACE@[8; 13) "\n "
FN_DEF@[13; 33)
@ -67,6 +67,73 @@ SOURCE_FILE@[0; 69)
BLOCK@[64; 66)
L_CURLY@[64; 65) "{"
R_CURLY@[65; 66) "}"
WHITESPACE@[66; 67) "\n"
R_CURLY@[67; 68) "}"
WHITESPACE@[68; 69) "\n"
WHITESPACE@[66; 71) "\n "
FN_DEF@[71; 98)
FN_KW@[71; 73) "fn"
WHITESPACE@[73; 74) " "
NAME@[74; 75)
IDENT@[74; 75) "c"
PARAM_LIST@[75; 95)
L_PAREN@[75; 76) "("
ATTR@[76; 83)
POUND@[76; 77) "#"
TOKEN_TREE@[77; 83)
L_BRACK@[77; 78) "["
IDENT@[78; 82) "attr"
R_BRACK@[82; 83) "]"
WHITESPACE@[83; 84) " "
SELF_PARAM@[84; 94)
SELF_KW@[84; 88) "self"
COLON@[88; 89) ":"
WHITESPACE@[89; 90) " "
PATH_TYPE@[90; 94)
PATH@[90; 94)
PATH_SEGMENT@[90; 94)
NAME_REF@[90; 94)
IDENT@[90; 94) "Self"
R_PAREN@[94; 95) ")"
WHITESPACE@[95; 96) " "
BLOCK@[96; 98)
L_CURLY@[96; 97) "{"
R_CURLY@[97; 98) "}"
WHITESPACE@[98; 103) "\n "
FN_DEF@[103; 134)
FN_KW@[103; 105) "fn"
WHITESPACE@[105; 106) " "
NAME@[106; 107)
IDENT@[106; 107) "d"
PARAM_LIST@[107; 131)
L_PAREN@[107; 108) "("
ATTR@[108; 115)
POUND@[108; 109) "#"
TOKEN_TREE@[109; 115)
L_BRACK@[109; 110) "["
IDENT@[110; 114) "attr"
R_BRACK@[114; 115) "]"
WHITESPACE@[115; 116) " "
SELF_PARAM@[116; 130)
SELF_KW@[116; 120) "self"
COLON@[120; 121) ":"
WHITESPACE@[121; 122) " "
PATH_TYPE@[122; 130)
PATH@[122; 130)
PATH_SEGMENT@[122; 130)
NAME_REF@[122; 124)
IDENT@[122; 124) "Rc"
TYPE_ARG_LIST@[124; 130)
L_ANGLE@[124; 125) "<"
TYPE_ARG@[125; 129)
PATH_TYPE@[125; 129)
PATH@[125; 129)
PATH_SEGMENT@[125; 129)
NAME_REF@[125; 129)
IDENT@[125; 129) "Self"
R_ANGLE@[129; 130) ">"
R_PAREN@[130; 131) ")"
WHITESPACE@[131; 132) " "
BLOCK@[132; 134)
L_CURLY@[132; 133) "{"
R_CURLY@[133; 134) "}"
WHITESPACE@[134; 135) "\n"
R_CURLY@[135; 136) "}"
WHITESPACE@[136; 137) "\n"

View File

@ -1 +1,2 @@
fn foo<F: FnMut(&mut Foo<'a>)>(){}
fn foo<F: FnMut(#[attr] &mut Foo<'a>)>(){}

View File

@ -1,4 +1,4 @@
SOURCE_FILE@[0; 35)
SOURCE_FILE@[0; 78)
FN_DEF@[0; 34)
FN_KW@[0; 2) "fn"
WHITESPACE@[2; 3) " "
@ -44,3 +44,55 @@ SOURCE_FILE@[0; 35)
L_CURLY@[32; 33) "{"
R_CURLY@[33; 34) "}"
WHITESPACE@[34; 35) "\n"
FN_DEF@[35; 77)
FN_KW@[35; 37) "fn"
WHITESPACE@[37; 38) " "
NAME@[38; 41)
IDENT@[38; 41) "foo"
TYPE_PARAM_LIST@[41; 73)
L_ANGLE@[41; 42) "<"
TYPE_PARAM@[42; 72)
NAME@[42; 43)
IDENT@[42; 43) "F"
COLON@[43; 44) ":"
WHITESPACE@[44; 45) " "
TYPE_BOUND_LIST@[45; 72)
TYPE_BOUND@[45; 72)
PATH_TYPE@[45; 72)
PATH@[45; 72)
PATH_SEGMENT@[45; 72)
NAME_REF@[45; 50)
IDENT@[45; 50) "FnMut"
PARAM_LIST@[50; 72)
L_PAREN@[50; 51) "("
ATTR@[51; 58)
POUND@[51; 52) "#"
TOKEN_TREE@[52; 58)
L_BRACK@[52; 53) "["
IDENT@[53; 57) "attr"
R_BRACK@[57; 58) "]"
WHITESPACE@[58; 59) " "
PARAM@[59; 71)
REFERENCE_TYPE@[59; 71)
AMP@[59; 60) "&"
MUT_KW@[60; 63) "mut"
WHITESPACE@[63; 64) " "
PATH_TYPE@[64; 71)
PATH@[64; 71)
PATH_SEGMENT@[64; 71)
NAME_REF@[64; 67)
IDENT@[64; 67) "Foo"
TYPE_ARG_LIST@[67; 71)
L_ANGLE@[67; 68) "<"
LIFETIME_ARG@[68; 70)
LIFETIME@[68; 70) "\'a"
R_ANGLE@[70; 71) ">"
R_PAREN@[71; 72) ")"
R_ANGLE@[72; 73) ">"
PARAM_LIST@[73; 75)
L_PAREN@[73; 74) "("
R_PAREN@[74; 75) ")"
BLOCK@[75; 77)
L_CURLY@[75; 76) "{"
R_CURLY@[76; 77) "}"
WHITESPACE@[77; 78) "\n"

View File

@ -2,3 +2,5 @@ fn a() {}
fn b(x: i32) {}
fn c(x: i32, ) {}
fn d(x: i32, y: ()) {}
fn g1(#[attr1] #[attr2] pat: Type) {}
fn g2(#[attr1] x: u8) {}

View File

@ -1,4 +1,4 @@
SOURCE_FILE@[0; 67)
SOURCE_FILE@[0; 130)
FN_DEF@[0; 9)
FN_KW@[0; 2) "fn"
WHITESPACE@[2; 3) " "
@ -97,3 +97,72 @@ SOURCE_FILE@[0; 67)
L_CURLY@[64; 65) "{"
R_CURLY@[65; 66) "}"
WHITESPACE@[66; 67) "\n"
FN_DEF@[67; 104)
FN_KW@[67; 69) "fn"
WHITESPACE@[69; 70) " "
NAME@[70; 72)
IDENT@[70; 72) "g1"
PARAM_LIST@[72; 101)
L_PAREN@[72; 73) "("
ATTR@[73; 81)
POUND@[73; 74) "#"
TOKEN_TREE@[74; 81)
L_BRACK@[74; 75) "["
IDENT@[75; 80) "attr1"
R_BRACK@[80; 81) "]"
WHITESPACE@[81; 82) " "
ATTR@[82; 90)
POUND@[82; 83) "#"
TOKEN_TREE@[83; 90)
L_BRACK@[83; 84) "["
IDENT@[84; 89) "attr2"
R_BRACK@[89; 90) "]"
WHITESPACE@[90; 91) " "
PARAM@[91; 100)
BIND_PAT@[91; 94)
NAME@[91; 94)
IDENT@[91; 94) "pat"
COLON@[94; 95) ":"
WHITESPACE@[95; 96) " "
PATH_TYPE@[96; 100)
PATH@[96; 100)
PATH_SEGMENT@[96; 100)
NAME_REF@[96; 100)
IDENT@[96; 100) "Type"
R_PAREN@[100; 101) ")"
WHITESPACE@[101; 102) " "
BLOCK@[102; 104)
L_CURLY@[102; 103) "{"
R_CURLY@[103; 104) "}"
WHITESPACE@[104; 105) "\n"
FN_DEF@[105; 129)
FN_KW@[105; 107) "fn"
WHITESPACE@[107; 108) " "
NAME@[108; 110)
IDENT@[108; 110) "g2"
PARAM_LIST@[110; 126)
L_PAREN@[110; 111) "("
ATTR@[111; 119)
POUND@[111; 112) "#"
TOKEN_TREE@[112; 119)
L_BRACK@[112; 113) "["
IDENT@[113; 118) "attr1"
R_BRACK@[118; 119) "]"
WHITESPACE@[119; 120) " "
PARAM@[120; 125)
BIND_PAT@[120; 121)
NAME@[120; 121)
IDENT@[120; 121) "x"
COLON@[121; 122) ":"
WHITESPACE@[122; 123) " "
PATH_TYPE@[123; 125)
PATH@[123; 125)
PATH_SEGMENT@[123; 125)
NAME_REF@[123; 125)
IDENT@[123; 125) "u8"
R_PAREN@[125; 126) ")"
WHITESPACE@[126; 127) " "
BLOCK@[127; 129)
L_CURLY@[127; 128) "{"
R_CURLY@[128; 129) "}"
WHITESPACE@[129; 130) "\n"

View File

@ -1,3 +1,4 @@
trait Foo {
fn bar(_: u64, mut x: i32);
fn bar(#[attr] _: u64, #[attr] mut x: i32);
}

View File

@ -1,11 +1,11 @@
SOURCE_FILE@[0; 46)
TRAIT_DEF@[0; 45)
SOURCE_FILE@[0; 94)
TRAIT_DEF@[0; 93)
TRAIT_KW@[0; 5) "trait"
WHITESPACE@[5; 6) " "
NAME@[6; 9)
IDENT@[6; 9) "Foo"
WHITESPACE@[9; 10) " "
ITEM_LIST@[10; 45)
ITEM_LIST@[10; 93)
L_CURLY@[10; 11) "{"
WHITESPACE@[11; 16) "\n "
FN_DEF@[16; 43)
@ -42,6 +42,55 @@ SOURCE_FILE@[0; 46)
IDENT@[38; 41) "i32"
R_PAREN@[41; 42) ")"
SEMI@[42; 43) ";"
WHITESPACE@[43; 44) "\n"
R_CURLY@[44; 45) "}"
WHITESPACE@[45; 46) "\n"
WHITESPACE@[43; 48) "\n "
FN_DEF@[48; 91)
FN_KW@[48; 50) "fn"
WHITESPACE@[50; 51) " "
NAME@[51; 54)
IDENT@[51; 54) "bar"
PARAM_LIST@[54; 90)
L_PAREN@[54; 55) "("
ATTR@[55; 62)
POUND@[55; 56) "#"
TOKEN_TREE@[56; 62)
L_BRACK@[56; 57) "["
IDENT@[57; 61) "attr"
R_BRACK@[61; 62) "]"
WHITESPACE@[62; 63) " "
PARAM@[63; 69)
PLACEHOLDER_PAT@[63; 64)
UNDERSCORE@[63; 64) "_"
COLON@[64; 65) ":"
WHITESPACE@[65; 66) " "
PATH_TYPE@[66; 69)
PATH@[66; 69)
PATH_SEGMENT@[66; 69)
NAME_REF@[66; 69)
IDENT@[66; 69) "u64"
COMMA@[69; 70) ","
WHITESPACE@[70; 71) " "
ATTR@[71; 78)
POUND@[71; 72) "#"
TOKEN_TREE@[72; 78)
L_BRACK@[72; 73) "["
IDENT@[73; 77) "attr"
R_BRACK@[77; 78) "]"
WHITESPACE@[78; 79) " "
PARAM@[79; 89)
BIND_PAT@[79; 84)
MUT_KW@[79; 82) "mut"
WHITESPACE@[82; 83) " "
NAME@[83; 84)
IDENT@[83; 84) "x"
COLON@[84; 85) ":"
WHITESPACE@[85; 86) " "
PATH_TYPE@[86; 89)
PATH@[86; 89)
PATH_SEGMENT@[86; 89)
NAME_REF@[86; 89)
IDENT@[86; 89) "i32"
R_PAREN@[89; 90) ")"
SEMI@[90; 91) ";"
WHITESPACE@[91; 92) "\n"
R_CURLY@[92; 93) "}"
WHITESPACE@[93; 94) "\n"

View File

@ -1 +1,2 @@
extern "C" { fn printf(format: *const i8, ...) -> i32; }
extern "C" { fn printf(#[attr] format: *const i8, ...) -> i32; }

View File

@ -1,4 +1,4 @@
SOURCE_FILE@[0; 57)
SOURCE_FILE@[0; 122)
EXTERN_BLOCK@[0; 56)
ABI@[0; 10)
EXTERN_KW@[0; 6) "extern"
@ -47,3 +47,58 @@ SOURCE_FILE@[0; 57)
WHITESPACE@[54; 55) " "
R_CURLY@[55; 56) "}"
WHITESPACE@[56; 57) "\n"
EXTERN_BLOCK@[57; 121)
ABI@[57; 67)
EXTERN_KW@[57; 63) "extern"
WHITESPACE@[63; 64) " "
STRING@[64; 67) "\"C\""
WHITESPACE@[67; 68) " "
EXTERN_ITEM_LIST@[68; 121)
L_CURLY@[68; 69) "{"
WHITESPACE@[69; 70) " "
FN_DEF@[70; 119)
FN_KW@[70; 72) "fn"
WHITESPACE@[72; 73) " "
NAME@[73; 79)
IDENT@[73; 79) "printf"
PARAM_LIST@[79; 111)
L_PAREN@[79; 80) "("
ATTR@[80; 87)
POUND@[80; 81) "#"
TOKEN_TREE@[81; 87)
L_BRACK@[81; 82) "["
IDENT@[82; 86) "attr"
R_BRACK@[86; 87) "]"
WHITESPACE@[87; 88) " "
PARAM@[88; 105)
BIND_PAT@[88; 94)
NAME@[88; 94)
IDENT@[88; 94) "format"
COLON@[94; 95) ":"
WHITESPACE@[95; 96) " "
POINTER_TYPE@[96; 105)
STAR@[96; 97) "*"
CONST_KW@[97; 102) "const"
WHITESPACE@[102; 103) " "
PATH_TYPE@[103; 105)
PATH@[103; 105)
PATH_SEGMENT@[103; 105)
NAME_REF@[103; 105)
IDENT@[103; 105) "i8"
COMMA@[105; 106) ","
WHITESPACE@[106; 107) " "
DOTDOTDOT@[107; 110) "..."
R_PAREN@[110; 111) ")"
WHITESPACE@[111; 112) " "
RET_TYPE@[112; 118)
THIN_ARROW@[112; 114) "->"
WHITESPACE@[114; 115) " "
PATH_TYPE@[115; 118)
PATH@[115; 118)
PATH_SEGMENT@[115; 118)
NAME_REF@[115; 118)
IDENT@[115; 118) "i32"
SEMI@[118; 119) ";"
WHITESPACE@[119; 120) " "
R_CURLY@[120; 121) "}"
WHITESPACE@[121; 122) "\n"