diff options
| author | Marijn Haverbeke <marijnh@gmail.com> | 2011-12-19 10:21:31 +0100 |
|---|---|---|
| committer | Marijn Haverbeke <marijnh@gmail.com> | 2011-12-19 10:43:23 +0100 |
| commit | 60acae4df725f2e275e01d7b59cc7ecacefb5f2c (patch) | |
| tree | 3bc5fef7ff7a8fd22ae3d94e18c7c662af789121 /src/comp/syntax | |
| parent | 4d524b957ffbaadfee0491e740c78187c240cad0 (diff) | |
| download | rust-60acae4df725f2e275e01d7b59cc7ecacefb5f2c.tar.gz rust-60acae4df725f2e275e01d7b59cc7ecacefb5f2c.zip | |
Add type argument field to expr_path
This way, you can explicitly provide type parameters when calling a generic method. Issue #1227
Diffstat (limited to 'src/comp/syntax')
| -rw-r--r-- | src/comp/syntax/ast.rs | 2 | ||||
| -rw-r--r-- | src/comp/syntax/fold.rs | 5 | ||||
| -rw-r--r-- | src/comp/syntax/parse/parser.rs | 7 | ||||
| -rw-r--r-- | src/comp/syntax/print/pprust.rs | 7 | ||||
| -rw-r--r-- | src/comp/syntax/visit.rs | 5 |
5 files changed, 20 insertions, 6 deletions
diff --git a/src/comp/syntax/ast.rs b/src/comp/syntax/ast.rs index b7af23e9dd5..0b3a03c6b1a 100644 --- a/src/comp/syntax/ast.rs +++ b/src/comp/syntax/ast.rs @@ -238,7 +238,7 @@ tag expr_ { expr_assign(@expr, @expr); expr_swap(@expr, @expr); expr_assign_op(binop, @expr, @expr); - expr_field(@expr, ident); + expr_field(@expr, ident, [@ty]); expr_index(@expr, @expr); expr_path(@path); expr_fail(option::t<@expr>); diff --git a/src/comp/syntax/fold.rs b/src/comp/syntax/fold.rs index 5f4ebbf3da3..e55326dbdce 100644 --- a/src/comp/syntax/fold.rs +++ b/src/comp/syntax/fold.rs @@ -401,8 +401,9 @@ fn noop_fold_expr(e: expr_, fld: ast_fold) -> expr_ { expr_assign_op(op, el, er) { expr_assign_op(op, fld.fold_expr(el), fld.fold_expr(er)) } - expr_field(el, id) { - expr_field(fld.fold_expr(el), fld.fold_ident(id)) + expr_field(el, id, tys) { + expr_field(fld.fold_expr(el), fld.fold_ident(id), + vec::map(tys, fld.fold_ty)) } expr_index(el, er) { expr_index(fld.fold_expr(el), fld.fold_expr(er)) diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs index 752a433e953..f1db62e24e2 100644 --- a/src/comp/syntax/parse/parser.rs +++ b/src/comp/syntax/parse/parser.rs @@ -1025,7 +1025,12 @@ fn parse_dot_or_call_expr_with(p: parser, e: @ast::expr) -> @ast::expr { token::IDENT(i, _) { hi = p.get_hi_pos(); p.bump(); - e = mk_expr(p, lo, hi, ast::expr_field(e, p.get_str(i))); + let tys = if eat(p, token::MOD_SEP) { + expect(p, token::LT); + parse_seq_to_gt(some(token::COMMA), + {|p| parse_ty(p, false)}, p) + } else { [] }; + e = mk_expr(p, lo, hi, ast::expr_field(e, p.get_str(i), tys)); } t { unexpected(p, t); } } diff --git a/src/comp/syntax/print/pprust.rs b/src/comp/syntax/print/pprust.rs index 9b3d047d435..92a5d228c26 100644 --- a/src/comp/syntax/print/pprust.rs +++ b/src/comp/syntax/print/pprust.rs @@ -879,7 +879,7 @@ fn print_expr(s: ps, &&expr: @ast::expr) { word_space(s, "="); print_expr(s, rhs); } - ast::expr_field(expr, id) { + ast::expr_field(expr, id, tys) { // Deal with '10.x' if ends_in_lit_int(expr) { popen(s); print_expr(s, expr); pclose(s); @@ -888,6 +888,11 @@ fn print_expr(s: ps, &&expr: @ast::expr) { } word(s.s, "."); word(s.s, id); + if vec::len(tys) > 0u { + word(s.s, "::<"); + commasep(s, inconsistent, tys, print_type); + word(s.s, ">"); + } } ast::expr_index(expr, index) { print_expr_parens_if_not_bot(s, expr); diff --git a/src/comp/syntax/visit.rs b/src/comp/syntax/visit.rs index a1feec5bec9..7ca54272edf 100644 --- a/src/comp/syntax/visit.rs +++ b/src/comp/syntax/visit.rs @@ -295,7 +295,10 @@ fn visit_expr<E>(ex: @expr, e: E, v: vt<E>) { v.visit_expr(b, e, v); v.visit_expr(a, e, v); } - expr_field(x, _) { v.visit_expr(x, e, v); } + expr_field(x, _, tys) { + v.visit_expr(x, e, v); + for tp in tys { v.visit_ty(tp, e, v); } + } expr_index(a, b) { v.visit_expr(a, e, v); v.visit_expr(b, e, v); } expr_path(p) { visit_path(p, e, v); } expr_fail(eo) { visit_expr_opt(eo, e, v); } |
