diff options
| author | bors <bors@rust-lang.org> | 2015-01-26 04:49:37 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-01-26 04:49:37 +0000 |
| commit | 9252525196505f33b1986c78068d63e567c31c43 (patch) | |
| tree | 40f5fe5305c7eab10c51bb964de2cd5c1ffb5ad4 /src/libsyntax | |
| parent | 47621db62cf9ffa82624576059b6af5e54d935a5 (diff) | |
| parent | 9690be5ece5960d0bd8ecb68750b577b0835b6ba (diff) | |
Auto merge of #21598 - eddyb:there-are-no-boxed-closures, r=brson
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast.rs | 38 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 35 | ||||
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 111 |
3 files changed, 41 insertions, 143 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 25a30b5e8e2..4f6cd8ad356 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -35,7 +35,6 @@ pub use self::MacStmtStyle::*; pub use self::MetaItem_::*; pub use self::Method_::*; pub use self::Mutability::*; -pub use self::Onceness::*; pub use self::Pat_::*; pub use self::PathListItem_::*; pub use self::PatWildKind::*; @@ -49,7 +48,7 @@ pub use self::TraitItem::*; pub use self::Ty_::*; pub use self::TyParamBound::*; pub use self::UintTy::*; -pub use self::UnboxedClosureKind::*; +pub use self::ClosureKind::*; pub use self::UnOp::*; pub use self::UnsafeSource::*; pub use self::VariantKind::*; @@ -734,7 +733,7 @@ pub enum Expr_ { // FIXME #6993: change to Option<Name> ... or not, if these are hygienic. ExprLoop(P<Block>, Option<Ident>), ExprMatch(P<Expr>, Vec<Arm>, MatchSource), - ExprClosure(CaptureClause, Option<UnboxedClosureKind>, P<FnDecl>, P<Block>), + ExprClosure(CaptureClause, Option<ClosureKind>, P<FnDecl>, P<Block>), ExprBlock(P<Block>), ExprAssign(P<Expr>, P<Expr>), @@ -1222,31 +1221,6 @@ pub enum PrimTy { TyChar } -#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Copy, Show)] -pub enum Onceness { - Once, - Many -} - -impl fmt::Display for Onceness { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - fmt::Display::fmt(match *self { - Once => "once", - Many => "many", - }, f) - } -} - -/// Represents the type of a closure -#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Show)] -pub struct ClosureTy { - pub lifetimes: Vec<LifetimeDef>, - pub unsafety: Unsafety, - pub onceness: Onceness, - pub decl: P<FnDecl>, - pub bounds: TyParamBounds, -} - #[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Show)] pub struct BareFnTy { pub unsafety: Unsafety, @@ -1710,10 +1684,10 @@ impl ForeignItem_ { } #[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Show, Copy)] -pub enum UnboxedClosureKind { - FnUnboxedClosureKind, - FnMutUnboxedClosureKind, - FnOnceUnboxedClosureKind, +pub enum ClosureKind { + FnClosureKind, + FnMutClosureKind, + FnOnceClosureKind, } /// The data we save and restore about an inlined item or method. This is not diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 759e5e8229a..eab24574bb1 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -28,8 +28,8 @@ use ast::{ExprLit, ExprLoop, ExprMac, ExprRange}; use ast::{ExprMethodCall, ExprParen, ExprPath, ExprQPath}; use ast::{ExprRepeat, ExprRet, ExprStruct, ExprTup, ExprUnary}; use ast::{ExprVec, ExprWhile, ExprWhileLet, ExprForLoop, Field, FnDecl}; -use ast::{FnUnboxedClosureKind, FnMutUnboxedClosureKind}; -use ast::{FnOnceUnboxedClosureKind}; +use ast::{FnClosureKind, FnMutClosureKind}; +use ast::{FnOnceClosureKind}; use ast::{ForeignItem, ForeignItemStatic, ForeignItemFn, ForeignMod, FunctionRetTy}; use ast::{Ident, Inherited, ImplItem, Item, Item_, ItemStatic}; use ast::{ItemEnum, ItemFn, ItemForeignMod, ItemImpl, ItemConst}; @@ -57,7 +57,7 @@ use ast::{TyFixedLengthVec, TyBareFn}; use ast::{TyTypeof, TyInfer, TypeMethod}; use ast::{TyParam, TyParamBound, TyParen, TyPath, TyPolyTraitRef, TyPtr, TyQPath}; use ast::{TyRptr, TyTup, TyU32, TyVec, UnUniq}; -use ast::{TypeImplItem, TypeTraitItem, Typedef, UnboxedClosureKind}; +use ast::{TypeImplItem, TypeTraitItem, Typedef, ClosureKind}; use ast::{UnnamedField, UnsafeBlock}; use ast::{ViewPath, ViewPathGlob, ViewPathList, ViewPathSimple}; use ast::{Visibility, WhereClause}; @@ -1133,27 +1133,26 @@ impl<'a> Parser<'a> { TyInfer } - /// Parses an optional unboxed closure kind (`&:`, `&mut:`, or `:`). - pub fn parse_optional_unboxed_closure_kind(&mut self) - -> Option<UnboxedClosureKind> { + /// Parses an optional closure kind (`&:`, `&mut:`, or `:`). + pub fn parse_optional_closure_kind(&mut self) -> Option<ClosureKind> { if self.check(&token::BinOp(token::And)) && self.look_ahead(1, |t| t.is_keyword(keywords::Mut)) && self.look_ahead(2, |t| *t == token::Colon) { self.bump(); self.bump(); self.bump(); - return Some(FnMutUnboxedClosureKind) + return Some(FnMutClosureKind) } if self.token == token::BinOp(token::And) && self.look_ahead(1, |t| *t == token::Colon) { self.bump(); self.bump(); - return Some(FnUnboxedClosureKind) + return Some(FnClosureKind) } if self.eat(&token::Colon) { - return Some(FnOnceUnboxedClosureKind) + return Some(FnOnceClosureKind) } return None @@ -3023,8 +3022,7 @@ impl<'a> Parser<'a> { -> P<Expr> { let lo = self.span.lo; - let (decl, optional_unboxed_closure_kind) = - self.parse_fn_block_decl(); + let (decl, optional_closure_kind) = self.parse_fn_block_decl(); let body = self.parse_expr(); let fakeblock = P(ast::Block { id: ast::DUMMY_NODE_ID, @@ -3037,7 +3035,7 @@ impl<'a> Parser<'a> { self.mk_expr( lo, fakeblock.span.hi, - ExprClosure(capture_clause, optional_unboxed_closure_kind, decl, fakeblock)) + ExprClosure(capture_clause, optional_closure_kind, decl, fakeblock)) } pub fn parse_else_expr(&mut self) -> P<Expr> { @@ -4506,22 +4504,21 @@ impl<'a> Parser<'a> { } // parse the |arg, arg| header on a lambda - fn parse_fn_block_decl(&mut self) - -> (P<FnDecl>, Option<UnboxedClosureKind>) { - let (optional_unboxed_closure_kind, inputs_captures) = { + fn parse_fn_block_decl(&mut self) -> (P<FnDecl>, Option<ClosureKind>) { + let (optional_closure_kind, inputs_captures) = { if self.eat(&token::OrOr) { (None, Vec::new()) } else { self.expect(&token::BinOp(token::Or)); - let optional_unboxed_closure_kind = - self.parse_optional_unboxed_closure_kind(); + let optional_closure_kind = + self.parse_optional_closure_kind(); let args = self.parse_seq_to_before_end( &token::BinOp(token::Or), seq_sep_trailing_allowed(token::Comma), |p| p.parse_fn_block_arg() ); self.bump(); - (optional_unboxed_closure_kind, args) + (optional_closure_kind, args) } }; let output = self.parse_ret_ty(); @@ -4530,7 +4527,7 @@ impl<'a> Parser<'a> { inputs: inputs_captures, output: output, variadic: false - }), optional_unboxed_closure_kind) + }), optional_closure_kind) } /// Parses the `(arg, arg) -> return_type` header on a procedure. diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 699b4f43b14..d06ac50920e 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -11,11 +11,11 @@ pub use self::AnnNode::*; use abi; -use ast::{self, FnUnboxedClosureKind, FnMutUnboxedClosureKind}; -use ast::{FnOnceUnboxedClosureKind}; +use ast::{self, FnClosureKind, FnMutClosureKind}; +use ast::{FnOnceClosureKind}; use ast::{MethodImplItem, RegionTyParamBound, TraitTyParamBound, TraitBoundModifier}; use ast::{RequiredMethod, ProvidedMethod, TypeImplItem, TypeTraitItem}; -use ast::{UnboxedClosureKind}; +use ast::{ClosureKind}; use ast_util; use owned_slice::OwnedSlice; use attr::{AttrMetaMethods, AttributeMethods}; @@ -703,14 +703,11 @@ impl<'a> State<'a> { predicates: Vec::new(), }, }; - try!(self.print_ty_fn(Some(f.abi), - None, + try!(self.print_ty_fn(f.abi, f.unsafety, - ast::Many, &*f.decl, None, - &OwnedSlice::empty(), - Some(&generics), + &generics, None)); } ast::TyPath(ref path, _) => { @@ -1215,14 +1212,11 @@ impl<'a> State<'a> { try!(self.hardbreak_if_not_bol()); try!(self.maybe_print_comment(m.span.lo)); try!(self.print_outer_attributes(&m.attrs[])); - try!(self.print_ty_fn(None, - None, + try!(self.print_ty_fn(m.abi, m.unsafety, - ast::Many, &*m.decl, Some(m.ident), - &OwnedSlice::empty(), - Some(&m.generics), + &m.generics, Some(&m.explicit_self.node))); word(&mut self.s, ";") } @@ -2300,7 +2294,7 @@ impl<'a> State<'a> { opt_explicit_self: Option<&ast::ExplicitSelf_>, vis: ast::Visibility) -> IoResult<()> { try!(self.head("")); - try!(self.print_fn_header_info(opt_explicit_self, unsafety, abi, vis)); + try!(self.print_fn_header_info(unsafety, abi, vis)); try!(self.nbsp()); try!(self.print_ident(name)); try!(self.print_generics(generics)); @@ -2357,14 +2351,14 @@ impl<'a> State<'a> { pub fn print_fn_block_args( &mut self, decl: &ast::FnDecl, - unboxed_closure_kind: Option<UnboxedClosureKind>) + closure_kind: Option<ClosureKind>) -> IoResult<()> { try!(word(&mut self.s, "|")); - match unboxed_closure_kind { + match closure_kind { None => {} - Some(FnUnboxedClosureKind) => try!(self.word_space("&:")), - Some(FnMutUnboxedClosureKind) => try!(self.word_space("&mut:")), - Some(FnOnceUnboxedClosureKind) => try!(self.word_space(":")), + Some(FnClosureKind) => try!(self.word_space("&:")), + Some(FnMutClosureKind) => try!(self.word_space("&mut:")), + Some(FnOnceClosureKind) => try!(self.word_space(":")), } try!(self.print_fn_args(decl, None)); try!(word(&mut self.s, "|")); @@ -2396,31 +2390,6 @@ impl<'a> State<'a> { } } - pub fn print_proc_args(&mut self, decl: &ast::FnDecl) -> IoResult<()> { - try!(word(&mut self.s, "proc")); - try!(word(&mut self.s, "(")); - try!(self.print_fn_args(decl, None)); - try!(word(&mut self.s, ")")); - - if let ast::DefaultReturn(..) = decl.output { - return Ok(()); - } - - try!(self.space_if_not_bol()); - try!(self.word_space("->")); - match decl.output { - ast::Return(ref ty) => { - try!(self.print_type(&**ty)); - self.maybe_print_comment(ty.span.lo) - } - ast::DefaultReturn(..) => unreachable!(), - ast::NoReturn(span) => { - try!(self.word_nbsp("!")); - self.maybe_print_comment(span.lo) - } - } - } - pub fn print_bounds(&mut self, prefix: &str, bounds: &[ast::TyParamBound]) @@ -2696,31 +2665,15 @@ impl<'a> State<'a> { } pub fn print_ty_fn(&mut self, - opt_abi: Option<abi::Abi>, - opt_sigil: Option<char>, + abi: abi::Abi, unsafety: ast::Unsafety, - onceness: ast::Onceness, decl: &ast::FnDecl, id: Option<ast::Ident>, - bounds: &OwnedSlice<ast::TyParamBound>, - generics: Option<&ast::Generics>, + generics: &ast::Generics, opt_explicit_self: Option<&ast::ExplicitSelf_>) -> IoResult<()> { try!(self.ibox(indent_unit)); - - // Duplicates the logic in `print_fn_header_info()`. This is because that - // function prints the sigil in the wrong place. That should be fixed. - if opt_sigil == Some('~') && onceness == ast::Once { - try!(word(&mut self.s, "proc")); - } else if opt_sigil == Some('&') { - try!(self.print_unsafety(unsafety)); - try!(self.print_extern_opt_abi(opt_abi)); - } else { - assert!(opt_sigil.is_none()); - try!(self.print_unsafety(unsafety)); - try!(self.print_opt_abi_and_extern_if_nondefault(opt_abi)); - try!(word(&mut self.s, "fn")); - } + try!(self.print_fn_header_info(Some(unsafety), abi, ast::Inherited)); match id { Some(id) => { @@ -2730,35 +2683,10 @@ impl<'a> State<'a> { _ => () } - match generics { Some(g) => try!(self.print_generics(g)), _ => () } + try!(self.print_generics(generics)); try!(zerobreak(&mut self.s)); - - if opt_sigil == Some('&') { - try!(word(&mut self.s, "|")); - } else { - try!(self.popen()); - } - - try!(self.print_fn_args(decl, opt_explicit_self)); - - if opt_sigil == Some('&') { - try!(word(&mut self.s, "|")); - } else { - if decl.variadic { - try!(word(&mut self.s, ", ...")); - } - try!(self.pclose()); - } - - try!(self.print_bounds(":", &bounds[])); - - try!(self.print_fn_output(decl)); - - match generics { - Some(generics) => try!(self.print_where_clause(generics)), - None => {} - } - + try!(self.print_fn_args_and_ret(decl, opt_explicit_self)); + try!(self.print_where_clause(generics)); self.end() } @@ -3015,7 +2943,6 @@ impl<'a> State<'a> { } pub fn print_fn_header_info(&mut self, - _opt_explicit_self: Option<&ast::ExplicitSelf_>, opt_unsafety: Option<ast::Unsafety>, abi: abi::Abi, vis: ast::Visibility) -> IoResult<()> { |
