diff options
| author | bors <bors@rust-lang.org> | 2014-01-09 16:11:18 -0800 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-01-09 16:11:18 -0800 |
| commit | ff3d5d460399070f660f5a59855fbb4698c797ee (patch) | |
| tree | 6ec333e4e6eb9e153e79bc4a325c9a440ea4c2c2 /src/libsyntax | |
| parent | d28317d78f09d7658c8928b2ff27c6f2ce60b5a4 (diff) | |
| parent | e12711540a00ded4021250f7b2a31773fc4dc734 (diff) | |
| download | rust-ff3d5d460399070f660f5a59855fbb4698c797ee.tar.gz rust-ff3d5d460399070f660f5a59855fbb4698c797ee.zip | |
auto merge of #11055 : pcwalton/rust/placement-box, r=pcwalton
r? @nikomatsakis
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/fold.rs | 3 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 16 | ||||
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 7 | ||||
| -rw-r--r-- | src/libsyntax/visit.rs | 4 |
5 files changed, 31 insertions, 1 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 2458577aa86..ef348e52f6e 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -547,6 +547,8 @@ pub enum CallSugar { #[deriving(Clone, Eq, Encodable, Decodable, IterBytes)] pub enum Expr_ { ExprVstore(@Expr, ExprVstore), + // First expr is the place; second expr is the value. + ExprBox(@Expr, @Expr), ExprVec(~[@Expr], Mutability), ExprCall(@Expr, ~[@Expr], CallSugar), ExprMethodCall(NodeId, @Expr, Ident, ~[P<Ty>], ~[@Expr], CallSugar), diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index c73edb0bfcf..409368ce3df 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -714,6 +714,9 @@ pub fn noop_fold_expr<T: Folder>(e: @Expr, folder: &mut T) -> @Expr { ExprVstore(e, v) => { ExprVstore(folder.fold_expr(e), v) } + ExprBox(p, e) => { + ExprBox(folder.fold_expr(p), folder.fold_expr(e)) + } ExprVec(ref exprs, mutt) => { ExprVec(exprs.map(|&x| folder.fold_expr(x)), mutt) } diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 149b7c1cf18..0424c71dd59 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -23,7 +23,7 @@ use ast::{BlockCheckMode, UnBox}; use ast::{Crate, CrateConfig, Decl, DeclItem}; use ast::{DeclLocal, DefaultBlock, UnDeref, BiDiv, EMPTY_CTXT, EnumDef, ExplicitSelf}; use ast::{Expr, Expr_, ExprAddrOf, ExprMatch, ExprAgain}; -use ast::{ExprAssign, ExprAssignOp, ExprBinary, ExprBlock}; +use ast::{ExprAssign, ExprAssignOp, ExprBinary, ExprBlock, ExprBox}; use ast::{ExprBreak, ExprCall, ExprCast, ExprDoBody}; use ast::{ExprField, ExprFnBlock, ExprIf, ExprIndex}; use ast::{ExprLit, ExprLogLevel, ExprLoop, ExprMac}; @@ -2321,6 +2321,20 @@ impl Parser { token::IDENT(_, _) if self.is_keyword(keywords::Box) => { self.bump(); + // Check for a place: `box(PLACE) EXPR`. + if self.eat(&token::LPAREN) { + // Support `box() EXPR` as the default. + if !self.eat(&token::RPAREN) { + let place = self.parse_expr(); + self.expect(&token::RPAREN); + let subexpression = self.parse_prefix_expr(); + hi = subexpression.span.hi; + ex = ExprBox(place, subexpression); + return self.mk_expr(lo, hi, ex); + } + } + + // Otherwise, we use the unique pointer default. let subexpression = self.parse_prefix_expr(); hi = subexpression.span.hi; // HACK: turn `box [...]` into a boxed-evec diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 1e2e5dbc010..ea9f0907b7a 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -1148,6 +1148,13 @@ pub fn print_expr(s: &mut State, expr: &ast::Expr) { print_expr_vstore(s, v); print_expr(s, e); }, + ast::ExprBox(p, e) => { + word(&mut s.s, "box"); + word(&mut s.s, "("); + print_expr(s, p); + word_space(s, ")"); + print_expr(s, e); + } ast::ExprVec(ref exprs, mutbl) => { ibox(s, indent_unit); word(&mut s.s, "["); diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index 8e678a9bb73..1f0572a7785 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -614,6 +614,10 @@ pub fn walk_expr<E: Clone, V: Visitor<E>>(visitor: &mut V, expression: &Expr, en ExprVstore(subexpression, _) => { visitor.visit_expr(subexpression, env.clone()) } + ExprBox(place, subexpression) => { + visitor.visit_expr(place, env.clone()); + visitor.visit_expr(subexpression, env.clone()) + } ExprVec(ref subexpressions, _) => { walk_exprs(visitor, *subexpressions, env.clone()) } |
