From bf274bc18bcbfea1377c5c64ae0cc099b03d9beb Mon Sep 17 00:00:00 2001 From: P1start Date: Sun, 10 Aug 2014 15:54:33 +1200 Subject: Implement tuple and tuple struct indexing This allows code to access the fields of tuples and tuple structs: let x = (1i, 2i); assert_eq!(x.1, 2); struct Point(int, int); let origin = Point(0, 0); assert_eq!(origin.0, 0); assert_eq!(origin.1, 0); --- src/libsyntax/parse/parser.rs | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'src/libsyntax/parse') diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 6aff1152f7e..718d75aad89 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -23,7 +23,7 @@ use ast::{DeclLocal, DefaultBlock, UnDeref, BiDiv, EMPTY_CTXT, EnumDef, Explicit use ast::{Expr, Expr_, ExprAddrOf, ExprMatch, ExprAgain}; use ast::{ExprAssign, ExprAssignOp, ExprBinary, ExprBlock, ExprBox}; use ast::{ExprBreak, ExprCall, ExprCast}; -use ast::{ExprField, ExprFnBlock, ExprIf, ExprIndex}; +use ast::{ExprField, ExprTupField, ExprFnBlock, ExprIf, ExprIndex}; use ast::{ExprLit, ExprLoop, ExprMac}; use ast::{ExprMethodCall, ExprParen, ExprPath, ExprProc}; use ast::{ExprRepeat, ExprRet, ExprStruct, ExprTup, ExprUnary, ExprUnboxedFn}; @@ -1937,6 +1937,11 @@ impl<'a> Parser<'a> { ExprField(expr, ident, tys) } + pub fn mk_tup_field(&mut self, expr: Gc, idx: codemap::Spanned, + tys: Vec>) -> ast::Expr_ { + ExprTupField(expr, idx, tys) + } + pub fn mk_assign_op(&mut self, binop: ast::BinOp, lhs: Gc, rhs: Gc) -> ast::Expr_ { ExprAssignOp(binop, lhs, rhs) @@ -2286,6 +2291,41 @@ impl<'a> Parser<'a> { } } } + token::LIT_INTEGER(n) => { + let index = n.as_str(); + let dot = self.last_span.hi; + hi = self.span.hi; + self.bump(); + let (_, tys) = if self.eat(&token::MOD_SEP) { + self.expect_lt(); + self.parse_generic_values_after_lt() + } else { + (Vec::new(), Vec::new()) + }; + + let num = from_str::(index); + match num { + Some(n) => { + let id = spanned(dot, hi, n); + let field = self.mk_tup_field(e, id, tys); + e = self.mk_expr(lo, hi, field); + } + None => { + let last_span = self.last_span; + self.span_err(last_span, "invalid tuple or tuple struct index"); + } + } + } + token::LIT_FLOAT(n) => { + self.bump(); + let last_span = self.last_span; + self.span_err(last_span, + format!("unexpected token: `{}`", n.as_str()).as_slice()); + self.span_note(last_span, + "try parenthesizing the first index; e.g., `(foo.0).1`"); + self.abort_if_errors(); + + } _ => self.unexpected() } continue; -- cgit 1.4.1-3-g733a5