trait bounds

This commit is contained in:
Aleksey Kladov 2018-07-31 18:24:30 +03:00
parent 892acc5b36
commit cd814fdf81
8 changed files with 174 additions and 23 deletions

View file

@ -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 => { IMPL_KW => {
traits::impl_item(p); traits::impl_item(p);
IMPL_ITEM IMPL_ITEM

View file

@ -1,9 +1,16 @@
use super::*; use super::*;
// test trait_item
// trait T<U>: Hash + Clone where U: Copy {}
pub(super) fn trait_item(p: &mut Parser) { pub(super) fn trait_item(p: &mut Parser) {
assert!(p.at(TRAIT_KW)); assert!(p.at(TRAIT_KW));
p.bump(); p.bump();
name(p); 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(L_CURLY);
p.expect(R_CURLY); p.expect(R_CURLY);
} }

View file

@ -39,29 +39,8 @@ pub(super) fn list(p: &mut Parser) {
assert!(p.at(IDENT)); assert!(p.at(IDENT));
let m = p.start(); let m = p.start();
p.bump(); p.bump();
if p.eat(COLON) { if p.at(COLON) {
// test type_param_bounds bounds(p);
// struct S<T: 'a + ?Sized + (Copy)>;
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;
}
}
} }
// test type_param_default // test type_param_default
// struct S<T = i32>; // struct S<T = i32>;
@ -73,6 +52,33 @@ pub(super) fn list(p: &mut Parser) {
} }
} }
// test type_param_bounds
// struct S<T: 'a + ?Sized + (Copy)>;
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) { pub(super) fn where_clause(p: &mut Parser) {
if p.at(WHERE_KW) { if p.at(WHERE_KW) {
let m = p.start(); let m = p.start();

View file

@ -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)

View file

@ -0,0 +1 @@
trait T<U>: Hash + Clone where U: Copy {}

View file

@ -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)

View file

@ -0,0 +1 @@
auto trait T {}

View file

@ -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)