Preserve visibility on trait items inside trait and impl

This commit is contained in:
David Tolnay
2021-08-20 13:41:27 -07:00
committed by Caleb Cartwright
parent c8bd550c8d
commit fd6b025e8a
4 changed files with 17 additions and 20 deletions
+8 -7
View File
@@ -168,14 +168,14 @@ pub(crate) struct FnSig<'a> {
constness: ast::Const,
defaultness: ast::Defaultness,
unsafety: ast::Unsafe,
visibility: ast::Visibility,
visibility: &'a ast::Visibility,
}
impl<'a> FnSig<'a> {
pub(crate) fn from_method_sig(
method_sig: &'a ast::FnSig,
generics: &'a ast::Generics,
visibility: ast::Visibility,
visibility: &'a ast::Visibility,
) -> FnSig<'a> {
FnSig {
unsafety: method_sig.header.unsafety,
@@ -198,7 +198,7 @@ pub(crate) fn from_fn_kind(
match *fn_kind {
visit::FnKind::Fn(fn_ctxt, _, fn_sig, vis, _) => match fn_ctxt {
visit::FnCtxt::Assoc(..) => {
let mut fn_sig = FnSig::from_method_sig(fn_sig, generics, vis.clone());
let mut fn_sig = FnSig::from_method_sig(fn_sig, generics, vis);
fn_sig.defaultness = defaultness;
fn_sig
}
@@ -210,7 +210,7 @@ pub(crate) fn from_fn_kind(
is_async: Cow::Borrowed(&fn_sig.header.asyncness),
defaultness,
unsafety: fn_sig.header.unsafety,
visibility: vis.clone(),
visibility: vis,
},
},
_ => unreachable!(),
@@ -317,6 +317,7 @@ pub(crate) fn rewrite_required_fn(
indent: Indent,
ident: symbol::Ident,
sig: &ast::FnSig,
vis: &ast::Visibility,
generics: &ast::Generics,
span: Span,
) -> Option<String> {
@@ -328,7 +329,7 @@ pub(crate) fn rewrite_required_fn(
&context,
indent,
ident,
&FnSig::from_method_sig(sig, generics, DEFAULT_VISIBILITY),
&FnSig::from_method_sig(sig, generics, vis),
span,
FnBraceStyle::None,
)?;
@@ -1754,7 +1755,7 @@ pub(crate) fn from_trait_item(ti: &'a ast::AssocItem) -> Self {
};
StaticParts {
prefix: "const",
vis: &DEFAULT_VISIBILITY,
vis: &ti.vis,
ident: ti.ident,
ty,
mutability: ast::Mutability::Not,
@@ -3110,7 +3111,7 @@ fn rewrite(&self, context: &RewriteContext<'_>, shape: Shape) -> Option<String>
context,
shape.indent,
self.ident,
&FnSig::from_method_sig(&fn_sig, generics, self.vis.clone()),
&FnSig::from_method_sig(&fn_sig, generics, &self.vis),
span,
FnBraceStyle::None,
)
+5 -9
View File
@@ -3,7 +3,7 @@
use rustc_ast::{ast, token::DelimToken, visit, AstLike};
use rustc_data_structures::sync::Lrc;
use rustc_span::{symbol, BytePos, Pos, Span, DUMMY_SP};
use rustc_span::{symbol, BytePos, Pos, Span};
use crate::attr::*;
use crate::comment::{contains_comment, rewrite_comment, CodeCharKind, CommentCodeSlices};
@@ -568,6 +568,7 @@ pub(crate) fn visit_item(&mut self, item: &ast::Item) {
indent,
item.ident,
&fn_signature,
&item.vis,
generics,
item.span,
);
@@ -641,14 +642,9 @@ pub(crate) fn visit_trait_item(&mut self, ti: &ast::AssocItem) {
let ast::FnKind(defaultness, ref sig, ref generics, ref block) = **fn_kind;
if let Some(ref body) = block {
let inner_attrs = inner_attributes(&ti.attrs);
let vis = ast::Visibility {
kind: ast::VisibilityKind::Inherited,
span: DUMMY_SP,
tokens: None,
};
let fn_ctxt = visit::FnCtxt::Assoc(visit::AssocCtxt::Trait);
self.visit_fn(
visit::FnKind::Fn(fn_ctxt, ti.ident, sig, &vis, Some(body)),
visit::FnKind::Fn(fn_ctxt, ti.ident, sig, &ti.vis, Some(body)),
generics,
&sig.decl,
ti.span,
@@ -658,7 +654,7 @@ pub(crate) fn visit_trait_item(&mut self, ti: &ast::AssocItem) {
} else {
let indent = self.block_indent;
let rewrite =
self.rewrite_required_fn(indent, ti.ident, sig, generics, ti.span);
self.rewrite_required_fn(indent, ti.ident, sig, &ti.vis, generics, ti.span);
self.push_rewrite(ti.span, rewrite);
}
}
@@ -708,7 +704,7 @@ pub(crate) fn visit_impl_item(&mut self, ii: &ast::AssocItem) {
} else {
let indent = self.block_indent;
let rewrite =
self.rewrite_required_fn(indent, ii.ident, sig, generics, ii.span);
self.rewrite_required_fn(indent, ii.ident, sig, &ii.vis, generics, ii.span);
self.push_rewrite(ii.span, rewrite);
}
}
+1 -1
View File
@@ -25,7 +25,7 @@ fn foo() {
impl Visible for Bar {
pub const C: i32;
pub type T;
fn f();
pub fn f();
pub fn g() {}
}
+3 -3
View File
@@ -213,8 +213,8 @@ trait B<'a, 'b, 'c, T> = Debug<'a, T>
+ EEEEEEE;
trait Visible {
const C: i32;
pub const C: i32;
pub type T;
fn f();
fn g() {}
pub fn f();
pub fn g() {}
}