mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
trait bounds
This commit is contained in:
parent
892acc5b36
commit
cd814fdf81
8 changed files with 174 additions and 23 deletions
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
77
tests/data/parser/inline/0055_self_param.txt
Normal file
77
tests/data/parser/inline/0055_self_param.txt
Normal 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)
|
1
tests/data/parser/inline/0056_trait_item.rs
Normal file
1
tests/data/parser/inline/0056_trait_item.rs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
trait T<U>: Hash + Clone where U: Copy {}
|
36
tests/data/parser/inline/0056_trait_item.txt
Normal file
36
tests/data/parser/inline/0056_trait_item.txt
Normal 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)
|
1
tests/data/parser/inline/0057_auto_trait.rs
Normal file
1
tests/data/parser/inline/0057_auto_trait.rs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
auto trait T {}
|
12
tests/data/parser/inline/0057_auto_trait.txt
Normal file
12
tests/data/parser/inline/0057_auto_trait.txt
Normal 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)
|
Loading…
Reference in a new issue