From dc40f1298a8d4dcb7a26d5af38c4fb7ef3d6c5df Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 24 Aug 2018 01:19:38 +0300 Subject: better self-types --- crates/libsyntax2/src/grammar/items/mod.rs | 2 +- crates/libsyntax2/src/grammar/items/use_item.rs | 2 +- crates/libsyntax2/src/grammar/mod.rs | 8 +-- crates/libsyntax2/src/grammar/params.rs | 8 +-- .../tests/data/parser/inline/0055_self_param.rs | 1 + .../tests/data/parser/inline/0055_self_param.txt | 27 ++++++++-- .../data/parser/inline/0104_arb_self_types.rs | 2 +- .../data/parser/inline/0104_arb_self_types.txt | 62 +++++++++++----------- 8 files changed, 67 insertions(+), 45 deletions(-) diff --git a/crates/libsyntax2/src/grammar/items/mod.rs b/crates/libsyntax2/src/grammar/items/mod.rs index c74266133..d460612b4 100644 --- a/crates/libsyntax2/src/grammar/items/mod.rs +++ b/crates/libsyntax2/src/grammar/items/mod.rs @@ -208,7 +208,7 @@ fn extern_crate_item(p: &mut Parser) { assert!(p.at(CRATE_KW)); p.bump(); name(p); - alias(p); + opt_alias(p); p.expect(SEMI); } diff --git a/crates/libsyntax2/src/grammar/items/use_item.rs b/crates/libsyntax2/src/grammar/items/use_item.rs index a3f7f0da8..3da40a629 100644 --- a/crates/libsyntax2/src/grammar/items/use_item.rs +++ b/crates/libsyntax2/src/grammar/items/use_item.rs @@ -26,7 +26,7 @@ fn use_tree(p: &mut Parser) { paths::use_path(p); match p.current() { AS_KW => { - alias(p); + opt_alias(p); } COLONCOLON => { p.bump(); diff --git a/crates/libsyntax2/src/grammar/mod.rs b/crates/libsyntax2/src/grammar/mod.rs index bbdc4f807..d09a9dc9c 100644 --- a/crates/libsyntax2/src/grammar/mod.rs +++ b/crates/libsyntax2/src/grammar/mod.rs @@ -92,14 +92,14 @@ fn opt_visibility(p: &mut Parser) { _ => (), } } -fn alias(p: &mut Parser) -> bool { + +fn opt_alias(p: &mut Parser) { if p.at(AS_KW) { - let alias = p.start(); + let m = p.start(); p.bump(); name(p); - alias.complete(p, ALIAS); + m.complete(p, ALIAS); } - true //FIXME: return false if three are errors } fn abi(p: &mut Parser) { diff --git a/crates/libsyntax2/src/grammar/params.rs b/crates/libsyntax2/src/grammar/params.rs index 7e58e8713..47567ec8a 100644 --- a/crates/libsyntax2/src/grammar/params.rs +++ b/crates/libsyntax2/src/grammar/params.rs @@ -92,16 +92,18 @@ fn value_parameter(p: &mut Parser, flavor: Flavor) { // fn b(&self,) {} // fn c(&'a self,) {} // fn d(&'a mut self, x: i32) {} +// fn e(mut self) {} // } fn self_param(p: &mut Parser) { let m; - if p.at(SELF_KW) { + if p.at(SELF_KW) || p.at(MUT_KW) && p.nth(1) == SELF_KW { m = p.start(); - p.bump(); + p.eat(MUT_KW); + p.eat(SELF_KW); // test arb_self_types // impl S { // fn a(self: &Self) {} - // fn b(self: Box) {} + // fn b(mut self: Box) {} // } if p.at(COLON) { types::ascription(p); diff --git a/crates/libsyntax2/tests/data/parser/inline/0055_self_param.rs b/crates/libsyntax2/tests/data/parser/inline/0055_self_param.rs index 7bb1ca50c..80c0a43f5 100644 --- a/crates/libsyntax2/tests/data/parser/inline/0055_self_param.rs +++ b/crates/libsyntax2/tests/data/parser/inline/0055_self_param.rs @@ -3,4 +3,5 @@ impl S { fn b(&self,) {} fn c(&'a self,) {} fn d(&'a mut self, x: i32) {} + fn e(mut self) {} } diff --git a/crates/libsyntax2/tests/data/parser/inline/0055_self_param.txt b/crates/libsyntax2/tests/data/parser/inline/0055_self_param.txt index 8b420909f..dd21dfe94 100644 --- a/crates/libsyntax2/tests/data/parser/inline/0055_self_param.txt +++ b/crates/libsyntax2/tests/data/parser/inline/0055_self_param.txt @@ -1,5 +1,5 @@ -FILE@[0; 106) - IMPL_ITEM@[0; 105) +FILE@[0; 128) + IMPL_ITEM@[0; 127) IMPL_KW@[0; 4) WHITESPACE@[4; 5) PATH_TYPE@[5; 6) @@ -93,6 +93,23 @@ FILE@[0; 106) BLOCK_EXPR@[101; 103) L_CURLY@[101; 102) R_CURLY@[102; 103) - WHITESPACE@[103; 104) - R_CURLY@[104; 105) - WHITESPACE@[105; 106) + WHITESPACE@[103; 108) + FN_DEF@[108; 125) + FN_KW@[108; 110) + WHITESPACE@[110; 111) + NAME@[111; 112) + IDENT@[111; 112) "e" + PARAM_LIST@[112; 122) + L_PAREN@[112; 113) + SELF_PARAM@[113; 121) + MUT_KW@[113; 116) + WHITESPACE@[116; 117) + SELF_KW@[117; 121) + R_PAREN@[121; 122) + WHITESPACE@[122; 123) + BLOCK_EXPR@[123; 125) + L_CURLY@[123; 124) + R_CURLY@[124; 125) + WHITESPACE@[125; 126) + R_CURLY@[126; 127) + WHITESPACE@[127; 128) diff --git a/crates/libsyntax2/tests/data/parser/inline/0104_arb_self_types.rs b/crates/libsyntax2/tests/data/parser/inline/0104_arb_self_types.rs index 2bf2a69f6..6a170d5ac 100644 --- a/crates/libsyntax2/tests/data/parser/inline/0104_arb_self_types.rs +++ b/crates/libsyntax2/tests/data/parser/inline/0104_arb_self_types.rs @@ -1,4 +1,4 @@ impl S { fn a(self: &Self) {} - fn b(self: Box) {} + fn b(mut self: Box) {} } diff --git a/crates/libsyntax2/tests/data/parser/inline/0104_arb_self_types.txt b/crates/libsyntax2/tests/data/parser/inline/0104_arb_self_types.txt index 41e3505fe..de94b4c63 100644 --- a/crates/libsyntax2/tests/data/parser/inline/0104_arb_self_types.txt +++ b/crates/libsyntax2/tests/data/parser/inline/0104_arb_self_types.txt @@ -1,5 +1,5 @@ -FILE@[0; 65) - IMPL_ITEM@[0; 64) +FILE@[0; 69) + IMPL_ITEM@[0; 68) IMPL_KW@[0; 4) WHITESPACE@[4; 5) PATH_TYPE@[5; 6) @@ -34,36 +34,38 @@ FILE@[0; 65) L_CURLY@[31; 32) R_CURLY@[32; 33) WHITESPACE@[33; 38) - FN_DEF@[38; 62) + FN_DEF@[38; 66) FN_KW@[38; 40) WHITESPACE@[40; 41) NAME@[41; 42) IDENT@[41; 42) "b" - PARAM_LIST@[42; 59) + PARAM_LIST@[42; 63) L_PAREN@[42; 43) - SELF_PARAM@[43; 58) - SELF_KW@[43; 47) - COLON@[47; 48) - WHITESPACE@[48; 49) - PATH_TYPE@[49; 58) - PATH@[49; 58) - PATH_SEGMENT@[49; 58) - NAME_REF@[49; 52) - IDENT@[49; 52) "Box" - TYPE_ARG_LIST@[52; 58) - L_ANGLE@[52; 53) - TYPE_ARG@[53; 57) - PATH_TYPE@[53; 57) - PATH@[53; 57) - PATH_SEGMENT@[53; 57) - NAME_REF@[53; 57) - IDENT@[53; 57) "Self" - R_ANGLE@[57; 58) - R_PAREN@[58; 59) - WHITESPACE@[59; 60) - BLOCK_EXPR@[60; 62) - L_CURLY@[60; 61) - R_CURLY@[61; 62) - WHITESPACE@[62; 63) - R_CURLY@[63; 64) - WHITESPACE@[64; 65) + SELF_PARAM@[43; 62) + MUT_KW@[43; 46) + WHITESPACE@[46; 47) + SELF_KW@[47; 51) + COLON@[51; 52) + WHITESPACE@[52; 53) + PATH_TYPE@[53; 62) + PATH@[53; 62) + PATH_SEGMENT@[53; 62) + NAME_REF@[53; 56) + IDENT@[53; 56) "Box" + TYPE_ARG_LIST@[56; 62) + L_ANGLE@[56; 57) + TYPE_ARG@[57; 61) + PATH_TYPE@[57; 61) + PATH@[57; 61) + PATH_SEGMENT@[57; 61) + NAME_REF@[57; 61) + IDENT@[57; 61) "Self" + R_ANGLE@[61; 62) + R_PAREN@[62; 63) + WHITESPACE@[63; 64) + BLOCK_EXPR@[64; 66) + L_CURLY@[64; 65) + R_CURLY@[65; 66) + WHITESPACE@[66; 67) + R_CURLY@[67; 68) + WHITESPACE@[68; 69) -- cgit v1.2.3