| // Copyright 2012 The Rust Project Developers. See the COPYRIGHT |
| // file at the top-level directory of this distribution and at |
| // http://rust-lang.org/COPYRIGHT. |
| // |
| // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or |
| // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license |
| // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your |
| // option. This file may not be copied, modified, or distributed |
| // except according to those terms. |
| |
| /* |
| Predicates on exprs and stmts that the pretty-printer and parser use |
| */ |
| |
| use ast; |
| |
| // does this expression require a semicolon to be treated |
| // as a statement? The negation of this: 'can this expression |
| // be used as a statement without a semicolon' -- is used |
| // as an early-bail-out in the parser so that, for instance, |
| // 'if true {...} else {...} |
| // |x| 5 ' |
| // isn't parsed as (if true {...} else {...} | x) | 5 |
| pub fn expr_requires_semi_to_be_stmt(e: @ast::Expr) -> bool { |
| match e.node { |
| ast::ExprIf(*) |
| | ast::ExprMatch(*) |
| | ast::ExprBlock(_) |
| | ast::ExprWhile(*) |
| | ast::ExprLoop(*) |
| | ast::ExprForLoop(*) |
| | ast::ExprCall(_, _, ast::DoSugar) |
| | ast::ExprCall(_, _, ast::ForSugar) |
| | ast::ExprMethodCall(_, _, _, _, _, ast::DoSugar) |
| | ast::ExprMethodCall(_, _, _, _, _, ast::ForSugar) => false, |
| _ => true |
| } |
| } |
| |
| pub fn expr_is_simple_block(e: @ast::Expr) -> bool { |
| match e.node { |
| ast::ExprBlock( |
| ast::Block { rules: ast::DefaultBlock, _ } |
| ) => true, |
| _ => false |
| } |
| } |
| |
| // this statement requires a semicolon after it. |
| // note that in one case (stmt_semi), we've already |
| // seen the semicolon, and thus don't need another. |
| pub fn stmt_ends_with_semi(stmt: &ast::Stmt) -> bool { |
| return match stmt.node { |
| ast::StmtDecl(d, _) => { |
| match d.node { |
| ast::DeclLocal(_) => true, |
| ast::DeclItem(_) => false |
| } |
| } |
| ast::StmtExpr(e, _) => { expr_requires_semi_to_be_stmt(e) } |
| ast::StmtSemi(*) => { false } |
| ast::StmtMac(*) => { false } |
| } |
| } |