diff options
| author | bors <bors@rust-lang.org> | 2019-09-09 16:33:43 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2019-09-09 16:33:43 +0000 |
| commit | 0b36e9dea3f2ff25b1d0df2669836c33cce89ae5 (patch) | |
| tree | e5e45ef04b46bdba8f8959029e7da415a58b0983 /src/libsyntax | |
| parent | 45859b7ca764cafb14efb8c63a83d5e48dc5d016 (diff) | |
| parent | f7ee13040b66c323359c8aea139ba4d91db84376 (diff) | |
| download | rust-0b36e9dea3f2ff25b1d0df2669836c33cce89ae5.tar.gz rust-0b36e9dea3f2ff25b1d0df2669836c33cce89ae5.zip | |
Auto merge of #64313 - Centril:rollup-7w8b67g, r=Centril
Rollup of 5 pull requests
Successful merges:
- #63468 (Resolve attributes in several places)
- #64121 (Override `StepBy::{try_fold, try_rfold}`)
- #64278 (check git in bootstrap.py)
- #64306 (Fix typo in config.toml.example)
- #64312 (Unify escape usage)
Failed merges:
r? @ghost
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast.rs | 10 | ||||
| -rw-r--r-- | src/libsyntax/ext/base.rs | 140 | ||||
| -rw-r--r-- | src/libsyntax/ext/build.rs | 9 | ||||
| -rw-r--r-- | src/libsyntax/ext/expand.rs | 199 | ||||
| -rw-r--r-- | src/libsyntax/ext/placeholders.rs | 145 | ||||
| -rw-r--r-- | src/libsyntax/ext/proc_macro.rs | 8 | ||||
| -rw-r--r-- | src/libsyntax/mut_visit.rs | 13 | ||||
| -rw-r--r-- | src/libsyntax/parse/diagnostics.rs | 9 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 9 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser/expr.rs | 6 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser/generics.rs | 7 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser/item.rs | 3 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser/pat.rs | 1 | ||||
| -rw-r--r-- | src/libsyntax/print/pprust/tests.rs | 1 |
14 files changed, 541 insertions, 19 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index bfb2db95963..bcbc0a19ce7 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -352,7 +352,7 @@ pub struct GenericParam { pub ident: Ident, pub attrs: ThinVec<Attribute>, pub bounds: GenericBounds, - + pub is_placeholder: bool, pub kind: GenericParamKind, } @@ -613,6 +613,7 @@ pub struct FieldPat { pub attrs: ThinVec<Attribute>, pub id: NodeId, pub span: Span, + pub is_placeholder: bool, } #[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, Copy)] @@ -935,6 +936,7 @@ pub struct Arm { pub body: P<Expr>, pub span: Span, pub id: NodeId, + pub is_placeholder: bool, } #[derive(Clone, RustcEncodable, RustcDecodable, Debug)] @@ -945,6 +947,7 @@ pub struct Field { pub is_shorthand: bool, pub attrs: ThinVec<Attribute>, pub id: NodeId, + pub is_placeholder: bool, } #[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Debug, Copy)] @@ -1798,6 +1801,7 @@ pub struct Param { pub pat: P<Pat>, pub id: NodeId, pub span: Span, + pub is_placeholder: bool, } /// Alternative representation for `Arg`s describing `self` parameter of methods. @@ -1859,6 +1863,7 @@ impl Param { span, ty, id: DUMMY_NODE_ID, + is_placeholder: false }; match eself.node { SelfKind::Explicit(ty, mutbl) => param(mutbl, ty), @@ -2054,6 +2059,8 @@ pub struct Variant { pub disr_expr: Option<AnonConst>, /// Span pub span: Span, + /// Is a macro placeholder + pub is_placeholder: bool, } /// Part of `use` item to the right of its prefix. @@ -2216,6 +2223,7 @@ pub struct StructField { pub id: NodeId, pub ty: P<Ty>, pub attrs: Vec<Attribute>, + pub is_placeholder: bool, } /// Fields and constructor ids of enum variants and structs. diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs index c4569b3fba1..7759a985d61 100644 --- a/src/libsyntax/ext/base.rs +++ b/src/libsyntax/ext/base.rs @@ -35,6 +35,13 @@ pub enum Annotatable { ForeignItem(P<ast::ForeignItem>), Stmt(P<ast::Stmt>), Expr(P<ast::Expr>), + Arm(ast::Arm), + Field(ast::Field), + FieldPat(ast::FieldPat), + GenericParam(ast::GenericParam), + Param(ast::Param), + StructField(ast::StructField), + Variant(ast::Variant), } impl HasAttrs for Annotatable { @@ -46,6 +53,13 @@ impl HasAttrs for Annotatable { Annotatable::ForeignItem(ref foreign_item) => &foreign_item.attrs, Annotatable::Stmt(ref stmt) => stmt.attrs(), Annotatable::Expr(ref expr) => &expr.attrs, + Annotatable::Arm(ref arm) => &arm.attrs, + Annotatable::Field(ref field) => &field.attrs, + Annotatable::FieldPat(ref fp) => &fp.attrs, + Annotatable::GenericParam(ref gp) => &gp.attrs, + Annotatable::Param(ref p) => &p.attrs, + Annotatable::StructField(ref sf) => &sf.attrs, + Annotatable::Variant(ref v) => &v.attrs(), } } @@ -57,6 +71,13 @@ impl HasAttrs for Annotatable { Annotatable::ForeignItem(foreign_item) => foreign_item.visit_attrs(f), Annotatable::Stmt(stmt) => stmt.visit_attrs(f), Annotatable::Expr(expr) => expr.visit_attrs(f), + Annotatable::Arm(arm) => arm.visit_attrs(f), + Annotatable::Field(field) => field.visit_attrs(f), + Annotatable::FieldPat(fp) => fp.visit_attrs(f), + Annotatable::GenericParam(gp) => gp.visit_attrs(f), + Annotatable::Param(p) => p.visit_attrs(f), + Annotatable::StructField(sf) => sf.visit_attrs(f), + Annotatable::Variant(v) => v.visit_attrs(f), } } } @@ -70,6 +91,13 @@ impl Annotatable { Annotatable::ForeignItem(ref foreign_item) => foreign_item.span, Annotatable::Stmt(ref stmt) => stmt.span, Annotatable::Expr(ref expr) => expr.span, + Annotatable::Arm(ref arm) => arm.span, + Annotatable::Field(ref field) => field.span, + Annotatable::FieldPat(ref fp) => fp.pat.span, + Annotatable::GenericParam(ref gp) => gp.ident.span, + Annotatable::Param(ref p) => p.span, + Annotatable::StructField(ref sf) => sf.span, + Annotatable::Variant(ref v) => v.span, } } @@ -81,6 +109,13 @@ impl Annotatable { Annotatable::ForeignItem(foreign_item) => visitor.visit_foreign_item(foreign_item), Annotatable::Stmt(stmt) => visitor.visit_stmt(stmt), Annotatable::Expr(expr) => visitor.visit_expr(expr), + Annotatable::Arm(arm) => visitor.visit_arm(arm), + Annotatable::Field(field) => visitor.visit_field(field), + Annotatable::FieldPat(fp) => visitor.visit_field_pattern(fp), + Annotatable::GenericParam(gp) => visitor.visit_generic_param(gp), + Annotatable::Param(p) => visitor.visit_param(p), + Annotatable::StructField(sf) =>visitor.visit_struct_field(sf), + Annotatable::Variant(v) => visitor.visit_variant(v), } } @@ -136,6 +171,55 @@ impl Annotatable { } } + pub fn expect_arm(self) -> ast::Arm { + match self { + Annotatable::Arm(arm) => arm, + _ => panic!("expected match arm") + } + } + + pub fn expect_field(self) -> ast::Field { + match self { + Annotatable::Field(field) => field, + _ => panic!("expected field") + } + } + + pub fn expect_field_pattern(self) -> ast::FieldPat { + match self { + Annotatable::FieldPat(fp) => fp, + _ => panic!("expected field pattern") + } + } + + pub fn expect_generic_param(self) -> ast::GenericParam { + match self { + Annotatable::GenericParam(gp) => gp, + _ => panic!("expected generic parameter") + } + } + + pub fn expect_param(self) -> ast::Param { + match self { + Annotatable::Param(param) => param, + _ => panic!("expected parameter") + } + } + + pub fn expect_struct_field(self) -> ast::StructField { + match self { + Annotatable::StructField(sf) => sf, + _ => panic!("expected struct field") + } + } + + pub fn expect_variant(self) -> ast::Variant { + match self { + Annotatable::Variant(v) => v, + _ => panic!("expected variant") + } + } + pub fn derive_allowed(&self) -> bool { match *self { Annotatable::Item(ref item) => match item.node { @@ -325,6 +409,34 @@ pub trait MacResult { fn make_ty(self: Box<Self>) -> Option<P<ast::Ty>> { None } + + fn make_arms(self: Box<Self>) -> Option<SmallVec<[ast::Arm; 1]>> { + None + } + + fn make_fields(self: Box<Self>) -> Option<SmallVec<[ast::Field; 1]>> { + None + } + + fn make_field_patterns(self: Box<Self>) -> Option<SmallVec<[ast::FieldPat; 1]>> { + None + } + + fn make_generic_params(self: Box<Self>) -> Option<SmallVec<[ast::GenericParam; 1]>> { + None + } + + fn make_params(self: Box<Self>) -> Option<SmallVec<[ast::Param; 1]>> { + None + } + + fn make_struct_fields(self: Box<Self>) -> Option<SmallVec<[ast::StructField; 1]>> { + None + } + + fn make_variants(self: Box<Self>) -> Option<SmallVec<[ast::Variant; 1]>> { + None + } } macro_rules! make_MacEager { @@ -498,6 +610,34 @@ impl MacResult for DummyResult { fn make_ty(self: Box<DummyResult>) -> Option<P<ast::Ty>> { Some(DummyResult::raw_ty(self.span, self.is_error)) } + + fn make_arms(self: Box<DummyResult>) -> Option<SmallVec<[ast::Arm; 1]>> { + Some(SmallVec::new()) + } + + fn make_fields(self: Box<DummyResult>) -> Option<SmallVec<[ast::Field; 1]>> { + Some(SmallVec::new()) + } + + fn make_field_patterns(self: Box<DummyResult>) -> Option<SmallVec<[ast::FieldPat; 1]>> { + Some(SmallVec::new()) + } + + fn make_generic_params(self: Box<DummyResult>) -> Option<SmallVec<[ast::GenericParam; 1]>> { + Some(SmallVec::new()) + } + + fn make_params(self: Box<DummyResult>) -> Option<SmallVec<[ast::Param; 1]>> { + Some(SmallVec::new()) + } + + fn make_struct_fields(self: Box<DummyResult>) -> Option<SmallVec<[ast::StructField; 1]>> { + Some(SmallVec::new()) + } + + fn make_variants(self: Box<DummyResult>) -> Option<SmallVec<[ast::Variant; 1]>> { + Some(SmallVec::new()) + } } /// A syntax extension kind. diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs index dc6cbfcf6ad..06a55316f31 100644 --- a/src/libsyntax/ext/build.rs +++ b/src/libsyntax/ext/build.rs @@ -166,7 +166,8 @@ impl<'a> ExtCtxt<'a> { bounds, kind: ast::GenericParamKind::Type { default, - } + }, + is_placeholder: false } } @@ -207,6 +208,7 @@ impl<'a> ExtCtxt<'a> { attrs: attrs.into(), bounds, kind: ast::GenericParamKind::Lifetime, + is_placeholder: false } } @@ -404,6 +406,7 @@ impl<'a> ExtCtxt<'a> { is_shorthand: false, attrs: ThinVec::new(), id: ast::DUMMY_NODE_ID, + is_placeholder: false, } } pub fn expr_struct( @@ -614,6 +617,7 @@ impl<'a> ExtCtxt<'a> { body: expr, span, id: ast::DUMMY_NODE_ID, + is_placeholder: false, } } @@ -701,6 +705,7 @@ impl<'a> ExtCtxt<'a> { pat: arg_pat, span, ty, + is_placeholder: false, } } @@ -774,6 +779,7 @@ impl<'a> ExtCtxt<'a> { vis: respan(span.shrink_to_lo(), ast::VisibilityKind::Inherited), attrs: Vec::new(), id: ast::DUMMY_NODE_ID, + is_placeholder: false, } }).collect(); @@ -790,6 +796,7 @@ impl<'a> ExtCtxt<'a> { id: ast::DUMMY_NODE_ID, ident, span, + is_placeholder: false, } } diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index 4fd0c367288..87e2d721f89 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -141,7 +141,40 @@ ast_fragments! { "impl item"; many fn flat_map_impl_item; fn visit_impl_item; fn make_impl_items; } ForeignItems(SmallVec<[ast::ForeignItem; 1]>) { - "foreign item"; many fn flat_map_foreign_item; fn visit_foreign_item; fn make_foreign_items; + "foreign item"; + many fn flat_map_foreign_item; + fn visit_foreign_item; + fn make_foreign_items; + } + Arms(SmallVec<[ast::Arm; 1]>) { + "match arm"; many fn flat_map_arm; fn visit_arm; fn make_arms; + } + Fields(SmallVec<[ast::Field; 1]>) { + "field expression"; many fn flat_map_field; fn visit_field; fn make_fields; + } + FieldPats(SmallVec<[ast::FieldPat; 1]>) { + "field pattern"; + many fn flat_map_field_pattern; + fn visit_field_pattern; + fn make_field_patterns; + } + GenericParams(SmallVec<[ast::GenericParam; 1]>) { + "generic parameter"; + many fn flat_map_generic_param; + fn visit_generic_param; + fn make_generic_params; + } + Params(SmallVec<[ast::Param; 1]>) { + "function parameter"; many fn flat_map_param; fn visit_param; fn make_params; + } + StructFields(SmallVec<[ast::StructField; 1]>) { + "field"; + many fn flat_map_struct_field; + fn visit_struct_field; + fn make_struct_fields; + } + Variants(SmallVec<[ast::Variant; 1]>) { + "variant"; many fn flat_map_variant; fn visit_variant; fn make_variants; } } @@ -154,6 +187,21 @@ impl AstFragmentKind { -> AstFragment { let mut items = items.into_iter(); match self { + AstFragmentKind::Arms => + AstFragment::Arms(items.map(Annotatable::expect_arm).collect()), + AstFragmentKind::Fields => + AstFragment::Fields(items.map(Annotatable::expect_field).collect()), + AstFragmentKind::FieldPats => + AstFragment::FieldPats(items.map(Annotatable::expect_field_pattern).collect()), + AstFragmentKind::GenericParams => + AstFragment::GenericParams(items.map(Annotatable::expect_generic_param).collect()), + AstFragmentKind::Params => + AstFragment::Params(items.map(Annotatable::expect_param).collect()), + AstFragmentKind::StructFields => AstFragment::StructFields( + items.map(Annotatable::expect_struct_field).collect() + ), + AstFragmentKind::Variants => + AstFragment::Variants(items.map(Annotatable::expect_variant).collect()), AstFragmentKind::Items => AstFragment::Items(items.map(Annotatable::expect_item).collect()), AstFragmentKind::ImplItems => @@ -177,7 +225,7 @@ impl AstFragmentKind { pub struct Invocation { pub kind: InvocationKind, - fragment_kind: AstFragmentKind, + pub fragment_kind: AstFragmentKind, pub expansion_data: ExpansionData, } @@ -482,6 +530,27 @@ impl<'a, 'b> MacroExpander<'a, 'b> { Annotatable::Expr(mut expr) => { Annotatable::Expr({ cfg.visit_expr(&mut expr); expr }) } + Annotatable::Arm(arm) => { + Annotatable::Arm(cfg.flat_map_arm(arm).pop().unwrap()) + } + Annotatable::Field(field) => { + Annotatable::Field(cfg.flat_map_field(field).pop().unwrap()) + } + Annotatable::FieldPat(fp) => { + Annotatable::FieldPat(cfg.flat_map_field_pattern(fp).pop().unwrap()) + } + Annotatable::GenericParam(param) => { + Annotatable::GenericParam(cfg.flat_map_generic_param(param).pop().unwrap()) + } + Annotatable::Param(param) => { + Annotatable::Param(cfg.flat_map_param(param).pop().unwrap()) + } + Annotatable::StructField(sf) => { + Annotatable::StructField(cfg.flat_map_struct_field(sf).pop().unwrap()) + } + Annotatable::Variant(v) => { + Annotatable::Variant(cfg.flat_map_variant(v).pop().unwrap()) + } } } @@ -547,6 +616,14 @@ impl<'a, 'b> MacroExpander<'a, 'b> { Annotatable::ForeignItem(item) => token::NtForeignItem(item.into_inner()), Annotatable::Stmt(stmt) => token::NtStmt(stmt.into_inner()), Annotatable::Expr(expr) => token::NtExpr(expr), + Annotatable::Arm(..) + | Annotatable::Field(..) + | Annotatable::FieldPat(..) + | Annotatable::GenericParam(..) + | Annotatable::Param(..) + | Annotatable::StructField(..) + | Annotatable::Variant(..) + => panic!("unexpected annotatable"), })), DUMMY_SP).into(); let input = self.extract_proc_macro_attr_input(attr.tokens, span); let tok_result = expander.expand(self.cx, span, input, item_tok); @@ -625,6 +702,14 @@ impl<'a, 'b> MacroExpander<'a, 'b> { Annotatable::Expr(_) if self.cx.ecfg.proc_macro_hygiene() => return, Annotatable::Stmt(_) => ("statements", sym::proc_macro_hygiene), Annotatable::Expr(_) => ("expressions", sym::proc_macro_hygiene), + Annotatable::Arm(..) + | Annotatable::Field(..) + | Annotatable::FieldPat(..) + | Annotatable::GenericParam(..) + | Annotatable::Param(..) + | Annotatable::StructField(..) + | Annotatable::Variant(..) + => panic!("unexpected annotatable"), }; emit_feature_err( self.cx.parse_sess, @@ -681,6 +766,14 @@ impl<'a, 'b> MacroExpander<'a, 'b> { AstFragmentKind::TraitItems => return, AstFragmentKind::ImplItems => return, AstFragmentKind::ForeignItems => return, + AstFragmentKind::Arms + | AstFragmentKind::Fields + | AstFragmentKind::FieldPats + | AstFragmentKind::GenericParams + | AstFragmentKind::Params + | AstFragmentKind::StructFields + | AstFragmentKind::Variants + => panic!("unexpected AST fragment kind"), }; if self.cx.ecfg.proc_macro_hygiene() { return @@ -771,6 +864,14 @@ impl<'a> Parser<'a> { }, AstFragmentKind::Ty => AstFragment::Ty(self.parse_ty()?), AstFragmentKind::Pat => AstFragment::Pat(self.parse_pat(None)?), + AstFragmentKind::Arms + | AstFragmentKind::Fields + | AstFragmentKind::FieldPats + | AstFragmentKind::GenericParams + | AstFragmentKind::Params + | AstFragmentKind::StructFields + | AstFragmentKind::Variants + => panic!("unexpected AST fragment kind"), }) } @@ -972,6 +1073,84 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { }); } + fn flat_map_arm(&mut self, arm: ast::Arm) -> SmallVec<[ast::Arm; 1]> { + let mut arm = configure!(self, arm); + + let (attr, traits, after_derive) = self.classify_item(&mut arm); + if attr.is_some() || !traits.is_empty() { + return self.collect_attr(attr, traits, Annotatable::Arm(arm), + AstFragmentKind::Arms, after_derive) + .make_arms(); + } + + noop_flat_map_arm(arm, self) + } + + fn flat_map_field(&mut self, field: ast::Field) -> SmallVec<[ast::Field; 1]> { + let mut field = configure!(self, field); + + let (attr, traits, after_derive) = self.classify_item(&mut field); + if attr.is_some() || !traits.is_empty() { + return self.collect_attr(attr, traits, Annotatable::Field(field), + AstFragmentKind::Fields, after_derive) + .make_fields(); + } + + noop_flat_map_field(field, self) + } + + fn flat_map_field_pattern(&mut self, fp: ast::FieldPat) -> SmallVec<[ast::FieldPat; 1]> { + let mut fp = configure!(self, fp); + + let (attr, traits, after_derive) = self.classify_item(&mut fp); + if attr.is_some() || !traits.is_empty() { + return self.collect_attr(attr, traits, Annotatable::FieldPat(fp), + AstFragmentKind::FieldPats, after_derive) + .make_field_patterns(); + } + + noop_flat_map_field_pattern(fp, self) + } + + fn flat_map_param(&mut self, p: ast::Param) -> SmallVec<[ast::Param; 1]> { + let mut p = configure!(self, p); + + let (attr, traits, after_derive) = self.classify_item(&mut p); + if attr.is_some() || !traits.is_empty() { + return self.collect_attr(attr, traits, Annotatable::Param(p), + AstFragmentKind::Params, after_derive) + .make_params(); + } + + noop_flat_map_param(p, self) + } + + fn flat_map_struct_field(&mut self, sf: ast::StructField) -> SmallVec<[ast::StructField; 1]> { + let mut sf = configure!(self, sf); + + let (attr, traits, after_derive) = self.classify_item(&mut sf); + if attr.is_some() || !traits.is_empty() { + return self.collect_attr(attr, traits, Annotatable::StructField(sf), + AstFragmentKind::StructFields, after_derive) + .make_struct_fields(); + } + + noop_flat_map_struct_field(sf, self) + } + + fn flat_map_variant(&mut self, variant: ast::Variant) -> SmallVec<[ast::Variant; 1]> { + let mut variant = configure!(self, variant); + + let (attr, traits, after_derive) = self.classify_item(&mut variant); + if attr.is_some() || !traits.is_empty() { + return self.collect_attr(attr, traits, Annotatable::Variant(variant), + AstFragmentKind::Variants, after_derive) + .make_variants(); + } + + noop_flat_map_variant(variant, self) + } + fn filter_map_expr(&mut self, expr: P<ast::Expr>) -> Option<P<ast::Expr>> { let expr = configure!(self, expr); expr.filter_map(|mut expr| { @@ -1227,12 +1406,20 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { } } - fn flat_map_generic_param( - &mut self, - param: ast::GenericParam + fn flat_map_generic_param( + &mut self, + param: ast::GenericParam ) -> SmallVec<[ast::GenericParam; 1]> { - let param = configure!(self, param); + let mut param = configure!(self, param); + + let (attr, traits, after_derive) = self.classify_item(&mut param); + if attr.is_some() || !traits.is_empty() { + return self.collect_attr(attr, traits, Annotatable::GenericParam(param), + AstFragmentKind::GenericParams, after_derive) + .make_generic_params(); + } + noop_flat_map_generic_param(param, self) } diff --git a/src/libsyntax/ext/placeholders.rs b/src/libsyntax/ext/placeholders.rs index d800cfedcfb..52a0f95bce7 100644 --- a/src/libsyntax/ext/placeholders.rs +++ b/src/libsyntax/ext/placeholders.rs @@ -32,6 +32,16 @@ pub fn placeholder(kind: AstFragmentKind, id: ast::NodeId) -> AstFragment { attrs: ThinVec::new(), node: ast::ExprKind::Mac(mac_placeholder()), }); + let ty = P(ast::Ty { + id, + node: ast::TyKind::Mac(mac_placeholder()), + span, + }); + let pat = P(ast::Pat { + id, + node: ast::PatKind::Mac(mac_placeholder()), + span, + }); match kind { AstFragmentKind::Expr => AstFragment::Expr(expr_placeholder()), @@ -67,6 +77,81 @@ pub fn placeholder(kind: AstFragmentKind, id: ast::NodeId) -> AstFragment { let mac = P((mac_placeholder(), ast::MacStmtStyle::Braces, ThinVec::new())); ast::Stmt { id, span, node: ast::StmtKind::Mac(mac) } }]), + AstFragmentKind::Arms => AstFragment::Arms(smallvec![ + ast::Arm { + attrs: Default::default(), + body: expr_placeholder(), + guard: None, + id, + pat, + span, + is_placeholder: true, + } + ]), + AstFragmentKind::Fields => AstFragment::Fields(smallvec![ + ast::Field { + attrs: Default::default(), + expr: expr_placeholder(), + id, + ident, + is_shorthand: false, + span, + is_placeholder: true, + } + ]), + AstFragmentKind::FieldPats => AstFragment::FieldPats(smallvec![ + ast::FieldPat { + attrs: Default::default(), + id, + ident, + is_shorthand: false, + pat, + span, + is_placeholder: true, + } + ]), + AstFragmentKind::GenericParams => AstFragment::GenericParams(smallvec![{ + ast::GenericParam { + attrs: Default::default(), + bounds: Default::default(), + id, + ident, + is_placeholder: true, + kind: ast::GenericParamKind::Lifetime, + } + }]), + AstFragmentKind::Params => AstFragment::Params(smallvec![ + ast::Param { + attrs: Default::default(), + id, + pat, + span, + ty, + is_placeholder: true, + } + ]), + AstFragmentKind::StructFields => AstFragment::StructFields(smallvec![ + ast::StructField { + attrs: Default::default(), + id, + ident: None, + span, + ty, + vis, + is_placeholder: true, + } + ]), + AstFragmentKind::Variants => AstFragment::Variants(smallvec![ + ast::Variant { + attrs: Default::default(), + data: ast::VariantData::Struct(Default::default(), false), + disr_expr: None, + id, + ident, + span, + is_placeholder: true, + } + ]) } } @@ -105,6 +190,66 @@ impl<'a, 'b> PlaceholderExpander<'a, 'b> { } impl<'a, 'b> MutVisitor for PlaceholderExpander<'a, 'b> { + fn flat_map_arm(&mut self, arm: ast::Arm) -> SmallVec<[ast::Arm; 1]> { + if arm.is_placeholder { + self.remove(arm.id).make_arms() + } else { + noop_flat_map_arm(arm, self) + } + } + + fn flat_map_field(&mut self, field: ast::Field) -> SmallVec<[ast::Field; 1]> { + if field.is_placeholder { + self.remove(field.id).make_fields() + } else { + noop_flat_map_field(field, self) + } + } + + fn flat_map_field_pattern(&mut self, fp: ast::FieldPat) -> SmallVec<[ast::FieldPat; 1]> { + if fp.is_placeholder { + self.remove(fp.id).make_field_patterns() + } else { + noop_flat_map_field_pattern(fp, self) + } + } + + fn flat_map_generic_param( + &mut self, + param: ast::GenericParam + ) -> SmallVec<[ast::GenericParam; 1]> + { + if param.is_placeholder { + self.remove(param.id).make_generic_params() + } else { + noop_flat_map_generic_param(param, self) + } + } + + fn flat_map_param(&mut self, p: ast::Param) -> SmallVec<[ast::Param; 1]> { + if p.is_placeholder { + self.remove(p.id).make_params() + } else { + noop_flat_map_param(p, self) + } + } + + fn flat_map_struct_field(&mut self, sf: ast::StructField) -> SmallVec<[ast::StructField; 1]> { + if sf.is_placeholder { + self.remove(sf.id).make_struct_fields() + } else { + noop_flat_map_struct_field(sf, self) + } + } + + fn flat_map_variant(&mut self, variant: ast::Variant) -> SmallVec<[ast::Variant; 1]> { + if variant.is_placeholder { + self.remove(variant.id).make_variants() + } else { + noop_flat_map_variant(variant, self) + } + } + fn flat_map_item(&mut self, item: P<ast::Item>) -> SmallVec<[P<ast::Item>; 1]> { match item.node { ast::ItemKind::Mac(_) => return self.remove(item.id).make_items(), diff --git a/src/libsyntax/ext/proc_macro.rs b/src/libsyntax/ext/proc_macro.rs index 4a44c9a9f1f..47b17ced816 100644 --- a/src/libsyntax/ext/proc_macro.rs +++ b/src/libsyntax/ext/proc_macro.rs @@ -88,6 +88,14 @@ impl MultiItemModifier for ProcMacroDerive { item: Annotatable) -> Vec<Annotatable> { let item = match item { + Annotatable::Arm(..) | + Annotatable::Field(..) | + Annotatable::FieldPat(..) | + Annotatable::GenericParam(..) | + Annotatable::Param(..) | + Annotatable::StructField(..) | + Annotatable::Variant(..) + => panic!("unexpected annotatable"), Annotatable::Item(item) => item, Annotatable::ImplItem(_) | Annotatable::TraitItem(_) | diff --git a/src/libsyntax/mut_visit.rs b/src/libsyntax/mut_visit.rs index 1c356886668..5a37222ee55 100644 --- a/src/libsyntax/mut_visit.rs +++ b/src/libsyntax/mut_visit.rs @@ -370,6 +370,7 @@ pub fn noop_flat_map_field_pattern<T: MutVisitor>( attrs, id, ident, + is_placeholder: _, is_shorthand: _, pat, span, @@ -403,7 +404,7 @@ pub fn noop_visit_use_tree<T: MutVisitor>(use_tree: &mut UseTree, vis: &mut T) { } pub fn noop_flat_map_arm<T: MutVisitor>(mut arm: Arm, vis: &mut T) -> SmallVec<[Arm; 1]> { - let Arm { attrs, pat, guard, body, span, id } = &mut arm; + let Arm { attrs, pat, guard, body, span, id, is_placeholder: _ } = &mut arm; visit_attrs(attrs, vis); vis.visit_id(id); vis.visit_pat(pat); @@ -477,7 +478,7 @@ pub fn noop_visit_foreign_mod<T: MutVisitor>(foreign_mod: &mut ForeignMod, vis: pub fn noop_flat_map_variant<T: MutVisitor>(mut variant: Variant, vis: &mut T) -> SmallVec<[Variant; 1]> { - let Variant { ident, attrs, id, data, disr_expr, span } = &mut variant; + let Variant { ident, attrs, id, data, disr_expr, span, is_placeholder: _ } = &mut variant; vis.visit_ident(ident); visit_attrs(attrs, vis); vis.visit_id(id); @@ -585,7 +586,7 @@ pub fn noop_visit_meta_item<T: MutVisitor>(mi: &mut MetaItem, vis: &mut T) { } pub fn noop_flat_map_param<T: MutVisitor>(mut param: Param, vis: &mut T) -> SmallVec<[Param; 1]> { - let Param { attrs, id, pat, span, ty } = &mut param; + let Param { attrs, id, pat, span, ty, is_placeholder: _ } = &mut param; vis.visit_id(id); visit_thin_attrs(attrs, vis); vis.visit_pat(pat); @@ -736,7 +737,7 @@ pub fn noop_flat_map_generic_param<T: MutVisitor>( vis: &mut T ) -> SmallVec<[GenericParam; 1]> { - let GenericParam { id, ident, attrs, bounds, kind } = &mut param; + let GenericParam { id, ident, attrs, bounds, kind, is_placeholder: _ } = &mut param; vis.visit_id(id); vis.visit_ident(ident); visit_thin_attrs(attrs, vis); @@ -828,7 +829,7 @@ pub fn noop_visit_poly_trait_ref<T: MutVisitor>(p: &mut PolyTraitRef, vis: &mut pub fn noop_flat_map_struct_field<T: MutVisitor>(mut sf: StructField, visitor: &mut T) -> SmallVec<[StructField; 1]> { - let StructField { span, ident, vis, id, ty, attrs } = &mut sf; + let StructField { span, ident, vis, id, ty, attrs, is_placeholder: _ } = &mut sf; visitor.visit_span(span); visit_opt(ident, |ident| visitor.visit_ident(ident)); visitor.visit_vis(vis); @@ -839,7 +840,7 @@ pub fn noop_flat_map_struct_field<T: MutVisitor>(mut sf: StructField, visitor: & } pub fn noop_flat_map_field<T: MutVisitor>(mut f: Field, vis: &mut T) -> SmallVec<[Field; 1]> { - let Field { ident, expr, span, is_shorthand: _, attrs, id } = &mut f; + let Field { ident, expr, span, is_shorthand: _, attrs, id, is_placeholder: _ } = &mut f; vis.visit_ident(ident); vis.visit_expr(expr); vis.visit_id(id); diff --git a/src/libsyntax/parse/diagnostics.rs b/src/libsyntax/parse/diagnostics.rs index 3120d0e3517..b74f2492c35 100644 --- a/src/libsyntax/parse/diagnostics.rs +++ b/src/libsyntax/parse/diagnostics.rs @@ -29,7 +29,14 @@ crate fn dummy_arg(ident: Ident) -> Param { span: ident.span, id: ast::DUMMY_NODE_ID }; - Param { attrs: ThinVec::default(), id: ast::DUMMY_NODE_ID, pat, span: ident.span, ty: P(ty) } + Param { + attrs: ThinVec::default(), + id: ast::DUMMY_NODE_ID, + pat, + span: ident.span, + ty: P(ty), + is_placeholder: false, + } } pub enum Error { diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index fcaf5065dac..fcebfa29962 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -1040,7 +1040,14 @@ impl<'a> Parser<'a> { let span = lo.to(self.token.span); - Ok(Param { attrs: attrs.into(), id: DUMMY_NODE_ID, pat, span, ty }) + Ok(Param { + attrs: attrs.into(), + id: ast::DUMMY_NODE_ID, + is_placeholder: false, + pat, + span, + ty, + }) } /// Parses mutability (`mut` or nothing). diff --git a/src/libsyntax/parse/parser/expr.rs b/src/libsyntax/parse/parser/expr.rs index 4dbb5ff75eb..31b28443abb 100644 --- a/src/libsyntax/parse/parser/expr.rs +++ b/src/libsyntax/parse/parser/expr.rs @@ -1193,7 +1193,8 @@ impl<'a> Parser<'a> { ty: t, pat, span, - id: DUMMY_NODE_ID + id: DUMMY_NODE_ID, + is_placeholder: false, }) } @@ -1455,6 +1456,7 @@ impl<'a> Parser<'a> { body: expr, span: lo.to(hi), id: DUMMY_NODE_ID, + is_placeholder: false, }) } @@ -1611,6 +1613,7 @@ impl<'a> Parser<'a> { is_shorthand: false, attrs: ThinVec::new(), id: DUMMY_NODE_ID, + is_placeholder: false, }); } } @@ -1697,6 +1700,7 @@ impl<'a> Parser<'a> { is_shorthand, attrs: attrs.into(), id: DUMMY_NODE_ID, + is_placeholder: false, }) } diff --git a/src/libsyntax/parse/parser/generics.rs b/src/libsyntax/parse/parser/generics.rs index 54f24f8ef2b..3e6118ad86f 100644 --- a/src/libsyntax/parse/parser/generics.rs +++ b/src/libsyntax/parse/parser/generics.rs @@ -49,7 +49,8 @@ impl<'a> Parser<'a> { bounds, kind: GenericParamKind::Type { default, - } + }, + is_placeholder: false }) } @@ -66,7 +67,8 @@ impl<'a> Parser<'a> { bounds: Vec::new(), kind: GenericParamKind::Const { ty, - } + }, + is_placeholder: false }) } @@ -90,6 +92,7 @@ impl<'a> Parser<'a> { attrs: attrs.into(), bounds, kind: ast::GenericParamKind::Lifetime, + is_placeholder: false }); } else if self.check_keyword(kw::Const) { // Parse const parameter. diff --git a/src/libsyntax/parse/parser/item.rs b/src/libsyntax/parse/parser/item.rs index be7fc48fdaf..baae6155f34 100644 --- a/src/libsyntax/parse/parser/item.rs +++ b/src/libsyntax/parse/parser/item.rs @@ -1575,6 +1575,7 @@ impl<'a> Parser<'a> { data: struct_def, disr_expr, span: vlo.to(self.prev_span), + is_placeholder: false, }; variants.push(vr); @@ -1730,6 +1731,7 @@ impl<'a> Parser<'a> { id: DUMMY_NODE_ID, ty, attrs, + is_placeholder: false, }) }).map(|(r, _)| r) } @@ -1821,6 +1823,7 @@ impl<'a> Parser<'a> { id: DUMMY_NODE_ID, ty, attrs, + is_placeholder: false, }) } diff --git a/src/libsyntax/parse/parser/pat.rs b/src/libsyntax/parse/parser/pat.rs index 49f8d58c6a7..08ee3a6bd86 100644 --- a/src/libsyntax/parse/parser/pat.rs +++ b/src/libsyntax/parse/parser/pat.rs @@ -882,6 +882,7 @@ impl<'a> Parser<'a> { attrs: attrs.into(), id: ast::DUMMY_NODE_ID, span: lo.to(hi), + is_placeholder: false, }) } diff --git a/src/libsyntax/print/pprust/tests.rs b/src/libsyntax/print/pprust/tests.rs index afd1726adf3..05d78cdd87e 100644 --- a/src/libsyntax/print/pprust/tests.rs +++ b/src/libsyntax/print/pprust/tests.rs @@ -61,6 +61,7 @@ fn test_variant_to_string() { data: ast::VariantData::Unit(ast::DUMMY_NODE_ID), disr_expr: None, span: syntax_pos::DUMMY_SP, + is_placeholder: false, }; let varstr = variant_to_string(&var); |
