Implement type ascription.
This commit is contained in:
committed by
Vadim Petrochenkov
parent
ce7bc51933
commit
b8157cc67f
@@ -943,6 +943,7 @@ pub enum Expr_ {
|
||||
ExprLit(P<Lit>),
|
||||
/// A cast (`foo as f64`)
|
||||
ExprCast(P<Expr>, P<Ty>),
|
||||
ExprType(P<Expr>, P<Ty>),
|
||||
/// An `if` block, with an optional else block
|
||||
///
|
||||
/// `if expr { block } else { expr }`
|
||||
|
||||
@@ -1203,6 +1203,9 @@ pub fn noop_fold_expr<T: Folder>(Expr {id, node, span, attrs}: Expr, folder: &mu
|
||||
ExprCast(expr, ty) => {
|
||||
ExprCast(folder.fold_expr(expr), folder.fold_ty(ty))
|
||||
}
|
||||
ExprType(expr, ty) => {
|
||||
ExprType(folder.fold_expr(expr), folder.fold_ty(ty))
|
||||
}
|
||||
ExprAddrOf(m, ohs) => ExprAddrOf(m, folder.fold_expr(ohs)),
|
||||
ExprIf(cond, tr, fl) => {
|
||||
ExprIf(folder.fold_expr(cond),
|
||||
|
||||
@@ -26,7 +26,7 @@ use ast::{ExprBreak, ExprCall, ExprCast, ExprInPlace};
|
||||
use ast::{ExprField, ExprTupField, ExprClosure, ExprIf, ExprIfLet, ExprIndex};
|
||||
use ast::{ExprLit, ExprLoop, ExprMac, ExprRange};
|
||||
use ast::{ExprMethodCall, ExprParen, ExprPath};
|
||||
use ast::{ExprRepeat, ExprRet, ExprStruct, ExprTup, ExprUnary};
|
||||
use ast::{ExprRepeat, ExprRet, ExprStruct, ExprTup, ExprType, ExprUnary};
|
||||
use ast::{ExprVec, ExprWhile, ExprWhileLet, ExprForLoop, Field, FnDecl};
|
||||
use ast::{ForeignItem, ForeignItemStatic, ForeignItemFn, ForeignMod, FunctionRetTy};
|
||||
use ast::{Ident, Inherited, ImplItem, Item, Item_, ItemStatic};
|
||||
@@ -2811,7 +2811,6 @@ impl<'a> Parser<'a> {
|
||||
break
|
||||
}
|
||||
|
||||
|
||||
let rhs = try!(match op.fixity() {
|
||||
Fixity::Right => self.with_res(restrictions, |this|{
|
||||
this.parse_assoc_expr_with(op.precedence(), LhsExpr::NotYetParsed)
|
||||
|
||||
@@ -445,7 +445,7 @@ fn needs_parentheses(expr: &ast::Expr) -> bool {
|
||||
ast::ExprAssign(..) | ast::ExprBinary(..) |
|
||||
ast::ExprClosure(..) |
|
||||
ast::ExprAssignOp(..) | ast::ExprCast(..) |
|
||||
ast::ExprInPlace(..) => true,
|
||||
ast::ExprInPlace(..) | ast::ExprType(..) => true,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
@@ -2036,6 +2036,11 @@ impl<'a> State<'a> {
|
||||
try!(self.word_space("as"));
|
||||
try!(self.print_type(&**ty));
|
||||
}
|
||||
ast::ExprType(ref expr, ref ty) => {
|
||||
try!(self.print_expr(&**expr));
|
||||
try!(self.word_space(":"));
|
||||
try!(self.print_type(&**ty));
|
||||
}
|
||||
ast::ExprIf(ref test, ref blk, ref elseopt) => {
|
||||
try!(self.print_if(&**test, &**blk, elseopt.as_ref().map(|e| &**e)));
|
||||
}
|
||||
|
||||
@@ -697,6 +697,10 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) {
|
||||
visitor.visit_expr(subexpression);
|
||||
visitor.visit_ty(typ)
|
||||
}
|
||||
ExprType(ref subexpression, ref typ) => {
|
||||
visitor.visit_expr(&**subexpression);
|
||||
visitor.visit_ty(&**typ)
|
||||
}
|
||||
ExprIf(ref head_expression, ref if_block, ref optional_else) => {
|
||||
visitor.visit_expr(head_expression);
|
||||
visitor.visit_block(if_block);
|
||||
|
||||
Reference in New Issue
Block a user