diff options
| author | bors <bors@rust-lang.org> | 2018-06-30 07:10:18 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-06-30 07:10:18 +0000 |
| commit | acf50b79beb5909c16861cc7c91e8226b7f78272 (patch) | |
| tree | 19e6e9829d02f450633734a93c3678b6d1720e2c /src/libsyntax | |
| parent | 87ecf5442ced38a6253e670dd6d87c0c334b21fb (diff) | |
| parent | 99575b5cac73a71685a783262249d803001a06a8 (diff) | |
| download | rust-acf50b79beb5909c16861cc7c91e8226b7f78272.tar.gz rust-acf50b79beb5909c16861cc7c91e8226b7f78272.zip | |
Auto merge of #51806 - oli-obk:lowering_cleanups1, r=cramertj
Lowering cleanups [1/N]
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast.rs | 20 | ||||
| -rw-r--r-- | src/libsyntax/feature_gate.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/fold.rs | 35 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 18 | ||||
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/visit.rs | 2 |
6 files changed, 54 insertions, 25 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 53465c071f3..d767265ead9 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -1547,7 +1547,11 @@ pub enum TyKind { TraitObject(GenericBounds, TraitObjectSyntax), /// An `impl Bound1 + Bound2 + Bound3` type /// where `Bound` is a trait or a lifetime. - ImplTrait(GenericBounds), + /// + /// The `NodeId` exists to prevent lowering from having to + /// generate `NodeId`s on the fly, which would complicate + /// the generation of `existential type` items significantly + ImplTrait(NodeId, GenericBounds), /// No-op; kept solely so that we can pretty-print faithfully Paren(P<Ty>), /// Unused for now @@ -1718,18 +1722,28 @@ pub enum Unsafety { #[derive(Copy, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)] pub enum IsAsync { - Async(NodeId), + Async { + closure_id: NodeId, + return_impl_trait_id: NodeId, + }, NotAsync, } impl IsAsync { pub fn is_async(self) -> bool { - if let IsAsync::Async(_) = self { + if let IsAsync::Async { .. } = self { true } else { false } } + /// In case this is an `Async` return the `NodeId` for the generated impl Trait item + pub fn opt_return_id(self) -> Option<NodeId> { + match self { + IsAsync::Async { return_impl_trait_id, .. } => Some(return_impl_trait_id), + IsAsync::NotAsync => None, + } + } } #[derive(Copy, Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)] diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 6d55b3de75d..2ae0e669fd0 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -1726,7 +1726,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> { "labels on blocks are unstable"); } } - ast::ExprKind::Closure(_, ast::IsAsync::Async(_), ..) => { + ast::ExprKind::Closure(_, ast::IsAsync::Async { .. }, ..) => { gate_feature_post!(&self, async_await, e.span, "async closures are unstable"); } ast::ExprKind::Async(..) => { diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index 712d00fde32..d9d3febc4fe 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -100,6 +100,10 @@ pub trait Folder : Sized { noop_fold_fn_decl(d, self) } + fn fold_asyncness(&mut self, a: IsAsync) -> IsAsync { + noop_fold_asyncness(a, self) + } + fn fold_block(&mut self, b: P<Block>) -> P<Block> { noop_fold_block(b, self) } @@ -396,8 +400,8 @@ pub fn noop_fold_ty<T: Folder>(t: P<Ty>, fld: &mut T) -> P<Ty> { TyKind::TraitObject(bounds, syntax) => { TyKind::TraitObject(bounds.move_map(|b| fld.fold_param_bound(b)), syntax) } - TyKind::ImplTrait(bounds) => { - TyKind::ImplTrait(bounds.move_map(|b| fld.fold_param_bound(b))) + TyKind::ImplTrait(id, bounds) => { + TyKind::ImplTrait(fld.new_id(id), bounds.move_map(|b| fld.fold_param_bound(b))) } TyKind::Mac(mac) => { TyKind::Mac(fld.fold_mac(mac)) @@ -669,6 +673,16 @@ pub fn noop_fold_interpolated<T: Folder>(nt: token::Nonterminal, fld: &mut T) } } +pub fn noop_fold_asyncness<T: Folder>(asyncness: IsAsync, fld: &mut T) -> IsAsync { + match asyncness { + IsAsync::Async { closure_id, return_impl_trait_id } => IsAsync::Async { + closure_id: fld.new_id(closure_id), + return_impl_trait_id: fld.new_id(return_impl_trait_id), + }, + IsAsync::NotAsync => IsAsync::NotAsync, + } +} + pub fn noop_fold_fn_decl<T: Folder>(decl: P<FnDecl>, fld: &mut T) -> P<FnDecl> { decl.map(|FnDecl {inputs, output, variadic}| FnDecl { inputs: inputs.move_map(|x| fld.fold_arg(x)), @@ -996,10 +1010,7 @@ pub fn noop_fold_impl_item<T: Folder>(i: ImplItem, folder: &mut T) } pub fn noop_fold_fn_header<T: Folder>(mut header: FnHeader, folder: &mut T) -> FnHeader { - header.asyncness = match header.asyncness { - IsAsync::Async(node_id) => IsAsync::Async(folder.new_id(node_id)), - IsAsync::NotAsync => IsAsync::NotAsync, - }; + header.asyncness = folder.fold_asyncness(header.asyncness); header } @@ -1249,12 +1260,8 @@ pub fn noop_fold_expr<T: Folder>(Expr {id, node, span, attrs}: Expr, folder: &mu arms.move_map(|x| folder.fold_arm(x))) } ExprKind::Closure(capture_clause, asyncness, movability, decl, body, span) => { - let asyncness = match asyncness { - IsAsync::Async(node_id) => IsAsync::Async(folder.new_id(node_id)), - IsAsync::NotAsync => IsAsync::NotAsync, - }; ExprKind::Closure(capture_clause, - asyncness, + folder.fold_asyncness(asyncness), movability, folder.fold_fn_decl(decl), folder.fold_expr(body), @@ -1265,7 +1272,11 @@ pub fn noop_fold_expr<T: Folder>(Expr {id, node, span, attrs}: Expr, folder: &mu opt_label.map(|label| folder.fold_label(label))) } ExprKind::Async(capture_clause, node_id, body) => { - ExprKind::Async(capture_clause, folder.new_id(node_id), folder.fold_block(body)) + ExprKind::Async( + capture_clause, + folder.new_id(node_id), + folder.fold_block(body), + ) } ExprKind::Assign(el, er) => { ExprKind::Assign(folder.fold_expr(el), folder.fold_expr(er)) diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index faf2cf64e1d..e04fec797e0 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -1299,7 +1299,10 @@ impl<'a> Parser<'a> { /// Parse asyncness: `async` or nothing fn parse_asyncness(&mut self) -> IsAsync { if self.eat_keyword(keywords::Async) { - IsAsync::Async(ast::DUMMY_NODE_ID) + IsAsync::Async { + closure_id: ast::DUMMY_NODE_ID, + return_impl_trait_id: ast::DUMMY_NODE_ID, + } } else { IsAsync::NotAsync } @@ -1537,7 +1540,7 @@ impl<'a> Parser<'a> { // Always parse bounds greedily for better error recovery. let bounds = self.parse_generic_bounds()?; impl_dyn_multi = bounds.len() > 1 || self.prev_token_kind == PrevTokenKind::Plus; - TyKind::ImplTrait(bounds) + TyKind::ImplTrait(ast::DUMMY_NODE_ID, bounds) } else if self.check_keyword(keywords::Dyn) && self.look_ahead(1, |t| t.can_begin_bound() && !can_continue_type_after_non_fn_ident(t)) { @@ -3279,10 +3282,8 @@ impl<'a> Parser<'a> { } else { Movability::Movable }; - let asyncness = if self.span.edition() >= Edition::Edition2018 - && self.eat_keyword(keywords::Async) - { - IsAsync::Async(ast::DUMMY_NODE_ID) + let asyncness = if self.span.edition() >= Edition::Edition2018 { + self.parse_asyncness() } else { IsAsync::NotAsync }; @@ -6798,7 +6799,10 @@ impl<'a> Parser<'a> { let fn_span = self.prev_span; let (ident, item_, extra_attrs) = self.parse_item_fn(unsafety, - IsAsync::Async(ast::DUMMY_NODE_ID), + IsAsync::Async { + closure_id: ast::DUMMY_NODE_ID, + return_impl_trait_id: ast::DUMMY_NODE_ID, + }, respan(fn_span, Constness::NotConst), Abi::Rust)?; let prev_span = self.prev_span; diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 3359225e159..74edf538842 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -1078,7 +1078,7 @@ impl<'a> State<'a> { let prefix = if syntax == ast::TraitObjectSyntax::Dyn { "dyn" } else { "" }; self.print_type_bounds(prefix, &bounds[..])?; } - ast::TyKind::ImplTrait(ref bounds) => { + ast::TyKind::ImplTrait(_, ref bounds) => { self.print_type_bounds("impl", &bounds[..])?; } ast::TyKind::Array(ref ty, ref length) => { diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index 41e3ad9d4f4..bb35bcee438 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -338,7 +338,7 @@ pub fn walk_ty<'a, V: Visitor<'a>>(visitor: &mut V, typ: &'a Ty) { visitor.visit_anon_const(length) } TyKind::TraitObject(ref bounds, ..) | - TyKind::ImplTrait(ref bounds) => { + TyKind::ImplTrait(_, ref bounds) => { walk_list!(visitor, visit_param_bound, bounds); } TyKind::Typeof(ref expression) => { |
