about summary refs log tree commit diff
path: root/src/comp/syntax
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-12-19 10:21:31 +0100
committerMarijn Haverbeke <marijnh@gmail.com>2011-12-19 10:43:23 +0100
commit60acae4df725f2e275e01d7b59cc7ecacefb5f2c (patch)
tree3bc5fef7ff7a8fd22ae3d94e18c7c662af789121 /src/comp/syntax
parent4d524b957ffbaadfee0491e740c78187c240cad0 (diff)
downloadrust-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.rs2
-rw-r--r--src/comp/syntax/fold.rs5
-rw-r--r--src/comp/syntax/parse/parser.rs7
-rw-r--r--src/comp/syntax/print/pprust.rs7
-rw-r--r--src/comp/syntax/visit.rs5
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); }