From cd814fdf8113bc801b735ed462ba142e98f1f81b Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 31 Jul 2018 18:24:30 +0300 Subject: trait bounds --- src/parser/grammar/items/mod.rs | 11 ++++ src/parser/grammar/items/traits.rs | 7 +++ src/parser/grammar/type_params.rs | 52 ++++++++++--------- tests/data/parser/inline/0055_self_param.txt | 77 ++++++++++++++++++++++++++++ tests/data/parser/inline/0056_trait_item.rs | 1 + tests/data/parser/inline/0056_trait_item.txt | 36 +++++++++++++ tests/data/parser/inline/0057_auto_trait.rs | 1 + tests/data/parser/inline/0057_auto_trait.txt | 12 +++++ 8 files changed, 174 insertions(+), 23 deletions(-) create mode 100644 tests/data/parser/inline/0055_self_param.txt create mode 100644 tests/data/parser/inline/0056_trait_item.rs create mode 100644 tests/data/parser/inline/0056_trait_item.txt create mode 100644 tests/data/parser/inline/0057_auto_trait.rs create mode 100644 tests/data/parser/inline/0057_auto_trait.txt diff --git a/src/parser/grammar/items/mod.rs b/src/parser/grammar/items/mod.rs index 12bcf7924..037cdca53 100644 --- a/src/parser/grammar/items/mod.rs +++ b/src/parser/grammar/items/mod.rs @@ -149,6 +149,17 @@ fn item(p: &mut Parser) { } } } + TRAIT_KW => { + traits::trait_item(p); + TRAIT_ITEM + } + // test auto_trait + // auto trait T {} + IDENT if p.at_contextual_kw("auto") && la == TRAIT_KW => { + p.bump_remap(AUTO_KW); + traits::trait_item(p); + TRAIT_ITEM + } IMPL_KW => { traits::impl_item(p); IMPL_ITEM diff --git a/src/parser/grammar/items/traits.rs b/src/parser/grammar/items/traits.rs index 7d657ced0..60158fe41 100644 --- a/src/parser/grammar/items/traits.rs +++ b/src/parser/grammar/items/traits.rs @@ -1,9 +1,16 @@ use super::*; +// test trait_item +// trait T: Hash + Clone where U: Copy {} pub(super) fn trait_item(p: &mut Parser) { assert!(p.at(TRAIT_KW)); p.bump(); name(p); + type_params::list(p); + if p.at(COLON) { + type_params::bounds(p); + } + type_params::where_clause(p); p.expect(L_CURLY); p.expect(R_CURLY); } diff --git a/src/parser/grammar/type_params.rs b/src/parser/grammar/type_params.rs index ba0d4bfe8..3648ab5f3 100644 --- a/src/parser/grammar/type_params.rs +++ b/src/parser/grammar/type_params.rs @@ -39,29 +39,8 @@ pub(super) fn list(p: &mut Parser) { assert!(p.at(IDENT)); let m = p.start(); p.bump(); - if p.eat(COLON) { - // test type_param_bounds - // struct S; - loop { - let has_paren = p.eat(L_PAREN); - p.eat(QUESTION); - if p.at(FOR_KW) { - //TODO - } - if p.at(LIFETIME) { - p.bump(); - } else if paths::is_path_start(p) { - paths::type_path(p); - } else { - break; - } - if has_paren { - p.expect(R_PAREN); - } - if !p.eat(PLUS) { - break; - } - } + if p.at(COLON) { + bounds(p); } // test type_param_default // struct S; @@ -73,6 +52,33 @@ pub(super) fn list(p: &mut Parser) { } } +// test type_param_bounds +// struct S; +pub(super) fn bounds(p: &mut Parser) { + assert!(p.at(COLON)); + p.bump(); + loop { + let has_paren = p.eat(L_PAREN); + p.eat(QUESTION); + if p.at(FOR_KW) { + //TODO + } + if p.at(LIFETIME) { + p.bump(); + } else if paths::is_path_start(p) { + paths::type_path(p); + } else { + break; + } + if has_paren { + p.expect(R_PAREN); + } + if !p.eat(PLUS) { + break; + } + } +} + pub(super) fn where_clause(p: &mut Parser) { if p.at(WHERE_KW) { let m = p.start(); diff --git a/tests/data/parser/inline/0055_self_param.txt b/tests/data/parser/inline/0055_self_param.txt new file mode 100644 index 000000000..70aa81207 --- /dev/null +++ b/tests/data/parser/inline/0055_self_param.txt @@ -0,0 +1,77 @@ +FILE@[0; 80) + IMPL_ITEM@[0; 80) + IMPL_KW@[0; 4) + PATH_TYPE@[4; 7) + PATH@[4; 7) + PATH_SEGMENT@[4; 7) + NAME_REF@[4; 7) + WHITESPACE@[4; 5) + IDENT@[5; 6) "S" + WHITESPACE@[6; 7) + L_CURLY@[7; 8) + FN_ITEM@[8; 31) + WHITESPACE@[8; 13) + FN_KW@[13; 15) + NAME@[15; 17) + WHITESPACE@[15; 16) + IDENT@[16; 17) "a" + PARAM_LIST@[17; 24) + L_PAREN@[17; 18) + SELF_PARAM@[18; 22) + SELF_KW@[18; 22) + R_PAREN@[22; 23) + WHITESPACE@[23; 24) + BLOCK@[24; 31) + L_CURLY@[24; 25) + R_CURLY@[25; 26) + WHITESPACE@[26; 31) + FN_ITEM@[31; 51) + FN_KW@[31; 33) + NAME@[33; 35) + WHITESPACE@[33; 34) + IDENT@[34; 35) "b" + PARAM_LIST@[35; 44) + L_PAREN@[35; 36) + SELF_PARAM@[36; 41) + AMPERSAND@[36; 37) + SELF_KW@[37; 41) + COMMA@[41; 42) + R_PAREN@[42; 43) + WHITESPACE@[43; 44) + BLOCK@[44; 51) + L_CURLY@[44; 45) + R_CURLY@[45; 46) + WHITESPACE@[46; 51) + FN_ITEM@[51; 78) + FN_KW@[51; 53) + NAME@[53; 55) + WHITESPACE@[53; 54) + IDENT@[54; 55) "c" + PARAM_LIST@[55; 75) + L_PAREN@[55; 56) + SELF_PARAM@[56; 65) + AMPERSAND@[56; 57) + MUT_KW@[57; 60) + WHITESPACE@[60; 61) + SELF_KW@[61; 65) + COMMA@[65; 66) + VALUE_PARAMETER@[66; 73) + BIND_PAT@[66; 68) + NAME@[66; 68) + WHITESPACE@[66; 67) + IDENT@[67; 68) "x" + COLON@[68; 69) + PATH_TYPE@[69; 73) + PATH@[69; 73) + PATH_SEGMENT@[69; 73) + NAME_REF@[69; 73) + WHITESPACE@[69; 70) + IDENT@[70; 73) "i32" + R_PAREN@[73; 74) + WHITESPACE@[74; 75) + BLOCK@[75; 78) + L_CURLY@[75; 76) + R_CURLY@[76; 77) + WHITESPACE@[77; 78) + R_CURLY@[78; 79) + WHITESPACE@[79; 80) diff --git a/tests/data/parser/inline/0056_trait_item.rs b/tests/data/parser/inline/0056_trait_item.rs new file mode 100644 index 000000000..4385afca9 --- /dev/null +++ b/tests/data/parser/inline/0056_trait_item.rs @@ -0,0 +1 @@ +trait T: Hash + Clone where U: Copy {} diff --git a/tests/data/parser/inline/0056_trait_item.txt b/tests/data/parser/inline/0056_trait_item.txt new file mode 100644 index 000000000..87efc78e9 --- /dev/null +++ b/tests/data/parser/inline/0056_trait_item.txt @@ -0,0 +1,36 @@ +FILE@[0; 42) + TRAIT_ITEM@[0; 42) + TRAIT_KW@[0; 5) + NAME@[5; 7) + WHITESPACE@[5; 6) + IDENT@[6; 7) "T" + TYPE_PARAM_LIST@[7; 10) + L_ANGLE@[7; 8) + TYPE_PARAM@[8; 9) + IDENT@[8; 9) "U" + R_ANGLE@[9; 10) + COLON@[10; 11) + PATH@[11; 17) + PATH_SEGMENT@[11; 17) + NAME_REF@[11; 17) + WHITESPACE@[11; 12) + IDENT@[12; 16) "Hash" + WHITESPACE@[16; 17) + PLUS@[17; 18) + PATH@[18; 25) + PATH_SEGMENT@[18; 25) + NAME_REF@[18; 25) + WHITESPACE@[18; 19) + IDENT@[19; 24) "Clone" + WHITESPACE@[24; 25) + WHERE_CLAUSE@[25; 39) + WHERE_KW@[25; 30) + WHITESPACE@[30; 31) + IDENT@[31; 32) "U" + COLON@[32; 33) + WHITESPACE@[33; 34) + IDENT@[34; 38) "Copy" + WHITESPACE@[38; 39) + L_CURLY@[39; 40) + R_CURLY@[40; 41) + WHITESPACE@[41; 42) diff --git a/tests/data/parser/inline/0057_auto_trait.rs b/tests/data/parser/inline/0057_auto_trait.rs new file mode 100644 index 000000000..72adf6035 --- /dev/null +++ b/tests/data/parser/inline/0057_auto_trait.rs @@ -0,0 +1 @@ +auto trait T {} diff --git a/tests/data/parser/inline/0057_auto_trait.txt b/tests/data/parser/inline/0057_auto_trait.txt new file mode 100644 index 000000000..9d098f10b --- /dev/null +++ b/tests/data/parser/inline/0057_auto_trait.txt @@ -0,0 +1,12 @@ +FILE@[0; 16) + TRAIT_ITEM@[0; 16) + AUTO_KW@[0; 4) + WHITESPACE@[4; 5) + TRAIT_KW@[5; 10) + NAME@[10; 13) + WHITESPACE@[10; 11) + IDENT@[11; 12) "T" + WHITESPACE@[12; 13) + L_CURLY@[13; 14) + R_CURLY@[14; 15) + WHITESPACE@[15; 16) -- cgit v1.2.3