methods with type params

This commit is contained in:
Aleksey Kladov 2018-08-05 16:15:40 +03:00
parent 1e1e2e83c4
commit ed96926df7
4 changed files with 48 additions and 34 deletions

View File

@ -35,7 +35,7 @@ struct Restrictions {
enum Op {
Simple,
Composite(SyntaxKind, u8)
Composite(SyntaxKind, u8),
}
// test expr_binding_power
@ -52,16 +52,16 @@ enum Op {
// }
fn current_op(p: &Parser) -> (u8, Op) {
if p.at_compound2(L_ANGLE, EQ) {
return (2, Op::Composite(LTEQ, 2))
return (2, Op::Composite(LTEQ, 2));
}
if p.at_compound2(R_ANGLE, EQ) {
return (2, Op::Composite(GTEQ, 2))
return (2, Op::Composite(GTEQ, 2));
}
if p.at_compound2(PLUS, EQ) {
return (1, Op::Composite(PLUSEQ, 2))
return (1, Op::Composite(PLUSEQ, 2));
}
if p.at_compound2(MINUS, EQ) {
return (1, Op::Composite(MINUSEQ, 2))
return (1, Op::Composite(MINUSEQ, 2));
}
let bp = match p.current() {
@ -90,7 +90,7 @@ fn expr_bp(p: &mut Parser, r: Restrictions, bp: u8) {
Op::Simple => p.bump(),
Op::Composite(kind, n) => {
p.bump_compound(kind, n);
},
}
}
lhs = bin_expr(p, r, lhs, op_bp);
}
@ -115,8 +115,7 @@ fn unary_expr(p: &mut Parser, r: Restrictions) -> Option<CompletedMarker> {
p.bump();
p.eat(MUT_KW);
REF_EXPR
},
}
// test deref_expr
// fn foo() {
// **&1;
@ -125,7 +124,7 @@ fn unary_expr(p: &mut Parser, r: Restrictions) -> Option<CompletedMarker> {
m = p.start();
p.bump();
DEREF_EXPR
},
}
// test not_expr
// fn foo() {
// !!true;
@ -134,10 +133,10 @@ fn unary_expr(p: &mut Parser, r: Restrictions) -> Option<CompletedMarker> {
m = p.start();
p.bump();
NOT_EXPR
},
}
_ => {
let lhs = atom::atom_expr(p, r)?;
return Some(postfix_expr(p, lhs))
return Some(postfix_expr(p, lhs));
}
};
unary_expr(p, r);
@ -148,7 +147,7 @@ fn postfix_expr(p: &mut Parser, mut lhs: CompletedMarker) -> CompletedMarker {
loop {
lhs = match p.current() {
L_PAREN => call_expr(p, lhs),
DOT if p.nth(1) == IDENT => if p.nth(2) == L_PAREN {
DOT if p.nth(1) == IDENT => if p.nth(2) == L_PAREN || p.nth(2) == COLONCOLON {
method_call_expr(p, lhs)
} else {
field_expr(p, lhs)
@ -176,13 +175,17 @@ fn call_expr(p: &mut Parser, lhs: CompletedMarker) -> CompletedMarker {
// test method_call_expr
// fn foo() {
// x.foo();
// y.bar(1, 2,);
// y.bar::<T>(1, 2,);
// }
fn method_call_expr(p: &mut Parser, lhs: CompletedMarker) -> CompletedMarker {
assert!(p.at(DOT) && p.nth(1) == IDENT && p.nth(2) == L_PAREN);
assert!(
p.at(DOT) && p.nth(1) == IDENT
&& (p.nth(2) == L_PAREN || p.nth(2) == COLONCOLON)
);
let m = lhs.precede(p);
p.bump();
name_ref(p);
type_args::type_arg_list(p, true);
arg_list(p);
m.complete(p, METHOD_CALL_EXPR)
}

View File

@ -1,4 +1,5 @@
use std::ptr;
use parking_lot::RwLock;
use {yellow::GreenNode, TextUnit};

View File

@ -1,4 +1,4 @@
fn foo() {
x.foo();
y.bar(1, 2,);
y.bar::<T>(1, 2,);
}

View File

@ -1,5 +1,5 @@
FILE@[0; 44)
FN_ITEM@[0; 44)
FILE@[0; 49)
FN_ITEM@[0; 49)
FN_KW@[0; 2)
NAME@[2; 6)
WHITESPACE@[2; 3)
@ -8,7 +8,7 @@ FILE@[0; 44)
L_PAREN@[6; 7)
R_PAREN@[7; 8)
WHITESPACE@[8; 9)
BLOCK_EXPR@[9; 44)
BLOCK_EXPR@[9; 49)
L_CURLY@[9; 10)
EXPR_STMT@[10; 28)
METHOD_CALL_EXPR@[10; 22)
@ -26,8 +26,8 @@ FILE@[0; 44)
R_PAREN@[21; 22)
SEMI@[22; 23)
WHITESPACE@[23; 28)
EXPR_STMT@[28; 42)
METHOD_CALL_EXPR@[28; 40)
EXPR_STMT@[28; 47)
METHOD_CALL_EXPR@[28; 45)
PATH_EXPR@[28; 29)
PATH@[28; 29)
PATH_SEGMENT@[28; 29)
@ -36,17 +36,27 @@ FILE@[0; 44)
DOT@[29; 30)
NAME_REF@[30; 33)
IDENT@[30; 33) "bar"
ARG_LIST@[33; 40)
L_PAREN@[33; 34)
LITERAL@[34; 35)
INT_NUMBER@[34; 35) "1"
COMMA@[35; 36)
LITERAL@[36; 38)
WHITESPACE@[36; 37)
INT_NUMBER@[37; 38) "2"
COMMA@[38; 39)
R_PAREN@[39; 40)
SEMI@[40; 41)
WHITESPACE@[41; 42)
R_CURLY@[42; 43)
WHITESPACE@[43; 44)
TYPE_ARG_LIST@[33; 38)
COLONCOLON@[33; 35)
L_ANGLE@[35; 36)
TYPE_ARG@[36; 37)
PATH_TYPE@[36; 37)
PATH@[36; 37)
PATH_SEGMENT@[36; 37)
NAME_REF@[36; 37)
IDENT@[36; 37) "T"
R_ANGLE@[37; 38)
ARG_LIST@[38; 45)
L_PAREN@[38; 39)
LITERAL@[39; 40)
INT_NUMBER@[39; 40) "1"
COMMA@[40; 41)
LITERAL@[41; 43)
WHITESPACE@[41; 42)
INT_NUMBER@[42; 43) "2"
COMMA@[43; 44)
R_PAREN@[44; 45)
SEMI@[45; 46)
WHITESPACE@[46; 47)
R_CURLY@[47; 48)
WHITESPACE@[48; 49)