diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2019-11-23 16:54:24 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2019-11-24 11:47:46 +0300 |
| commit | f1359c61d302057d82c5276aba86fec1fe326bb8 (patch) | |
| tree | 7060c8ea19e8577ed82934d83db668d7de93cf69 /src/libsyntax_expand/expand.rs | |
| parent | 37bb0c7fa68700b7637c137c8b31cdc2e6b49b5e (diff) | |
| download | rust-f1359c61d302057d82c5276aba86fec1fe326bb8.tar.gz rust-f1359c61d302057d82c5276aba86fec1fe326bb8.zip | |
expand: Fully preserve visibilities on unnamed fields with attributes
Diffstat (limited to 'src/libsyntax_expand/expand.rs')
| -rw-r--r-- | src/libsyntax_expand/expand.rs | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/libsyntax_expand/expand.rs b/src/libsyntax_expand/expand.rs index 2532bbc0fe2..4f05b0147bf 100644 --- a/src/libsyntax_expand/expand.rs +++ b/src/libsyntax_expand/expand.rs @@ -86,7 +86,7 @@ macro_rules! ast_fragments { // mention some macro variable from those arguments even if it's not used. #[cfg_attr(bootstrap, allow(unused_macros))] macro _repeating($flat_map_ast_elt) {} - placeholder(AstFragmentKind::$Kind, *id).$make_ast() + placeholder(AstFragmentKind::$Kind, *id, None).$make_ast() })),)?)* _ => panic!("unexpected AST fragment kind") } @@ -275,6 +275,23 @@ pub enum InvocationKind { }, } +impl InvocationKind { + fn placeholder_visibility(&self) -> Option<ast::Visibility> { + // HACK: For unnamed fields placeholders should have the same visibility as the actual + // fields because for tuple structs/variants resolve determines visibilities of their + // constructor using these field visibilities before attributes on them are are expanded. + // The assumption is that the attribute expansion cannot change field visibilities, + // and it holds because only inert attributes are supported in this position. + match self { + InvocationKind::Attr { item: Annotatable::StructField(field), .. } | + InvocationKind::Derive { item: Annotatable::StructField(field), .. } | + InvocationKind::DeriveContainer { item: Annotatable::StructField(field), .. } + if field.ident.is_none() => Some(field.vis.clone()), + _ => None, + } + } +} + impl Invocation { pub fn span(&self) -> Span { match &self.kind { @@ -931,6 +948,7 @@ impl<'a, 'b> InvocationCollector<'a, 'b> { _ => None, }; let expn_id = ExpnId::fresh(expn_data); + let vis = kind.placeholder_visibility(); self.invocations.push(Invocation { kind, fragment_kind, @@ -940,7 +958,7 @@ impl<'a, 'b> InvocationCollector<'a, 'b> { ..self.cx.current_expansion.clone() }, }); - placeholder(fragment_kind, NodeId::placeholder_from_expn_id(expn_id)) + placeholder(fragment_kind, NodeId::placeholder_from_expn_id(expn_id), vis) } fn collect_bang(&mut self, mac: ast::Mac, span: Span, kind: AstFragmentKind) -> AstFragment { |
