Refactor FnKind variant to hold &Fn
This commit is contained in:
parent
2f348cb7ce
commit
c22a27130d
12 changed files with 93 additions and 91 deletions
|
@ -954,8 +954,14 @@ fn walk_coroutine_kind<T: MutVisitor>(vis: &mut T, coroutine_kind: &mut Coroutin
|
||||||
|
|
||||||
fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
|
fn walk_fn<T: MutVisitor>(vis: &mut T, kind: FnKind<'_>) {
|
||||||
match kind {
|
match kind {
|
||||||
FnKind::Fn(_ctxt, _ident, FnSig { header, decl, span }, _visibility, generics, body) => {
|
FnKind::Fn(
|
||||||
|
_ctxt,
|
||||||
|
_ident,
|
||||||
|
_vis,
|
||||||
|
Fn { defaultness, generics, body, sig: FnSig { header, decl, span } },
|
||||||
|
) => {
|
||||||
// Identifier and visibility are visited as a part of the item.
|
// Identifier and visibility are visited as a part of the item.
|
||||||
|
visit_defaultness(vis, defaultness);
|
||||||
vis.visit_fn_header(header);
|
vis.visit_fn_header(header);
|
||||||
vis.visit_generics(generics);
|
vis.visit_generics(generics);
|
||||||
vis.visit_fn_decl(decl);
|
vis.visit_fn_decl(decl);
|
||||||
|
@ -1205,13 +1211,8 @@ impl WalkItemKind for ItemKind {
|
||||||
ItemKind::Const(item) => {
|
ItemKind::Const(item) => {
|
||||||
visit_const_item(item, vis);
|
visit_const_item(item, vis);
|
||||||
}
|
}
|
||||||
ItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
|
ItemKind::Fn(func) => {
|
||||||
visit_defaultness(vis, defaultness);
|
vis.visit_fn(FnKind::Fn(FnCtxt::Free, ident, visibility, &mut *func), span, id);
|
||||||
vis.visit_fn(
|
|
||||||
FnKind::Fn(FnCtxt::Free, ident, sig, visibility, generics, body),
|
|
||||||
span,
|
|
||||||
id,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
ItemKind::Mod(safety, mod_kind) => {
|
ItemKind::Mod(safety, mod_kind) => {
|
||||||
visit_safety(vis, safety);
|
visit_safety(vis, safety);
|
||||||
|
@ -1329,10 +1330,9 @@ impl WalkItemKind for AssocItemKind {
|
||||||
AssocItemKind::Const(item) => {
|
AssocItemKind::Const(item) => {
|
||||||
visit_const_item(item, visitor);
|
visit_const_item(item, visitor);
|
||||||
}
|
}
|
||||||
AssocItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
|
AssocItemKind::Fn(func) => {
|
||||||
visit_defaultness(visitor, defaultness);
|
|
||||||
visitor.visit_fn(
|
visitor.visit_fn(
|
||||||
FnKind::Fn(FnCtxt::Assoc(ctxt), ident, sig, visibility, generics, body),
|
FnKind::Fn(FnCtxt::Assoc(ctxt), ident, visibility, &mut *func),
|
||||||
span,
|
span,
|
||||||
id,
|
id,
|
||||||
);
|
);
|
||||||
|
@ -1476,10 +1476,9 @@ impl WalkItemKind for ForeignItemKind {
|
||||||
visitor.visit_ty(ty);
|
visitor.visit_ty(ty);
|
||||||
visit_opt(expr, |expr| visitor.visit_expr(expr));
|
visit_opt(expr, |expr| visitor.visit_expr(expr));
|
||||||
}
|
}
|
||||||
ForeignItemKind::Fn(box Fn { defaultness, generics, sig, body }) => {
|
ForeignItemKind::Fn(func) => {
|
||||||
visit_defaultness(visitor, defaultness);
|
|
||||||
visitor.visit_fn(
|
visitor.visit_fn(
|
||||||
FnKind::Fn(FnCtxt::Foreign, ident, sig, visibility, generics, body),
|
FnKind::Fn(FnCtxt::Foreign, ident, visibility, &mut *func),
|
||||||
span,
|
span,
|
||||||
id,
|
id,
|
||||||
);
|
);
|
||||||
|
@ -1965,14 +1964,7 @@ impl<N: DummyAstNode, T: DummyAstNode> DummyAstNode for crate::ast_traits::AstNo
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum FnKind<'a> {
|
pub enum FnKind<'a> {
|
||||||
/// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
|
/// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
|
||||||
Fn(
|
Fn(FnCtxt, &'a mut Ident, &'a mut Visibility, &'a mut Fn),
|
||||||
FnCtxt,
|
|
||||||
&'a mut Ident,
|
|
||||||
&'a mut FnSig,
|
|
||||||
&'a mut Visibility,
|
|
||||||
&'a mut Generics,
|
|
||||||
&'a mut Option<P<Block>>,
|
|
||||||
),
|
|
||||||
|
|
||||||
/// E.g., `|x, y| body`.
|
/// E.g., `|x, y| body`.
|
||||||
Closure(
|
Closure(
|
||||||
|
|
|
@ -65,7 +65,7 @@ impl BoundKind {
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
pub enum FnKind<'a> {
|
pub enum FnKind<'a> {
|
||||||
/// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
|
/// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
|
||||||
Fn(FnCtxt, &'a Ident, &'a FnSig, &'a Visibility, &'a Generics, &'a Option<P<Block>>),
|
Fn(FnCtxt, &'a Ident, &'a Visibility, &'a Fn),
|
||||||
|
|
||||||
/// E.g., `|x, y| body`.
|
/// E.g., `|x, y| body`.
|
||||||
Closure(&'a ClosureBinder, &'a Option<CoroutineKind>, &'a FnDecl, &'a Expr),
|
Closure(&'a ClosureBinder, &'a Option<CoroutineKind>, &'a FnDecl, &'a Expr),
|
||||||
|
@ -74,7 +74,7 @@ pub enum FnKind<'a> {
|
||||||
impl<'a> FnKind<'a> {
|
impl<'a> FnKind<'a> {
|
||||||
pub fn header(&self) -> Option<&'a FnHeader> {
|
pub fn header(&self) -> Option<&'a FnHeader> {
|
||||||
match *self {
|
match *self {
|
||||||
FnKind::Fn(_, _, sig, _, _, _) => Some(&sig.header),
|
FnKind::Fn(_, _, _, Fn { sig, .. }) => Some(&sig.header),
|
||||||
FnKind::Closure(..) => None,
|
FnKind::Closure(..) => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@ impl<'a> FnKind<'a> {
|
||||||
|
|
||||||
pub fn decl(&self) -> &'a FnDecl {
|
pub fn decl(&self) -> &'a FnDecl {
|
||||||
match self {
|
match self {
|
||||||
FnKind::Fn(_, _, sig, _, _, _) => &sig.decl,
|
FnKind::Fn(_, _, _, Fn { sig, .. }) => &sig.decl,
|
||||||
FnKind::Closure(_, _, decl, _) => decl,
|
FnKind::Closure(_, _, decl, _) => decl,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -374,8 +374,8 @@ impl WalkItemKind for ItemKind {
|
||||||
try_visit!(visitor.visit_ty(ty));
|
try_visit!(visitor.visit_ty(ty));
|
||||||
visit_opt!(visitor, visit_expr, expr);
|
visit_opt!(visitor, visit_expr, expr);
|
||||||
}
|
}
|
||||||
ItemKind::Fn(box Fn { defaultness: _, generics, sig, body }) => {
|
ItemKind::Fn(func) => {
|
||||||
let kind = FnKind::Fn(FnCtxt::Free, ident, sig, vis, generics, body);
|
let kind = FnKind::Fn(FnCtxt::Free, ident, vis, &*func);
|
||||||
try_visit!(visitor.visit_fn(kind, span, id));
|
try_visit!(visitor.visit_fn(kind, span, id));
|
||||||
}
|
}
|
||||||
ItemKind::Mod(_unsafety, mod_kind) => match mod_kind {
|
ItemKind::Mod(_unsafety, mod_kind) => match mod_kind {
|
||||||
|
@ -715,8 +715,8 @@ impl WalkItemKind for ForeignItemKind {
|
||||||
try_visit!(visitor.visit_ty(ty));
|
try_visit!(visitor.visit_ty(ty));
|
||||||
visit_opt!(visitor, visit_expr, expr);
|
visit_opt!(visitor, visit_expr, expr);
|
||||||
}
|
}
|
||||||
ForeignItemKind::Fn(box Fn { defaultness: _, generics, sig, body }) => {
|
ForeignItemKind::Fn(func) => {
|
||||||
let kind = FnKind::Fn(FnCtxt::Foreign, ident, sig, vis, generics, body);
|
let kind = FnKind::Fn(FnCtxt::Foreign, ident, vis, &*func);
|
||||||
try_visit!(visitor.visit_fn(kind, span, id));
|
try_visit!(visitor.visit_fn(kind, span, id));
|
||||||
}
|
}
|
||||||
ForeignItemKind::TyAlias(box TyAlias {
|
ForeignItemKind::TyAlias(box TyAlias {
|
||||||
|
@ -858,7 +858,12 @@ pub fn walk_fn_decl<'a, V: Visitor<'a>>(
|
||||||
|
|
||||||
pub fn walk_fn<'a, V: Visitor<'a>>(visitor: &mut V, kind: FnKind<'a>) -> V::Result {
|
pub fn walk_fn<'a, V: Visitor<'a>>(visitor: &mut V, kind: FnKind<'a>) -> V::Result {
|
||||||
match kind {
|
match kind {
|
||||||
FnKind::Fn(_ctxt, _ident, FnSig { header, decl, span: _ }, _vis, generics, body) => {
|
FnKind::Fn(
|
||||||
|
_ctxt,
|
||||||
|
_ident,
|
||||||
|
_vis,
|
||||||
|
Fn { defaultness: _, sig: FnSig { header, decl, span: _ }, generics, body },
|
||||||
|
) => {
|
||||||
// Identifier and visibility are visited as a part of the item.
|
// Identifier and visibility are visited as a part of the item.
|
||||||
try_visit!(visitor.visit_fn_header(header));
|
try_visit!(visitor.visit_fn_header(header));
|
||||||
try_visit!(visitor.visit_generics(generics));
|
try_visit!(visitor.visit_generics(generics));
|
||||||
|
@ -892,8 +897,8 @@ impl WalkItemKind for AssocItemKind {
|
||||||
try_visit!(visitor.visit_ty(ty));
|
try_visit!(visitor.visit_ty(ty));
|
||||||
visit_opt!(visitor, visit_expr, expr);
|
visit_opt!(visitor, visit_expr, expr);
|
||||||
}
|
}
|
||||||
AssocItemKind::Fn(box Fn { defaultness: _, generics, sig, body }) => {
|
AssocItemKind::Fn(func) => {
|
||||||
let kind = FnKind::Fn(FnCtxt::Assoc(ctxt), ident, sig, vis, generics, body);
|
let kind = FnKind::Fn(FnCtxt::Assoc(ctxt), ident, vis, &*func);
|
||||||
try_visit!(visitor.visit_fn(kind, span, id));
|
try_visit!(visitor.visit_fn(kind, span, id));
|
||||||
}
|
}
|
||||||
AssocItemKind::Type(box TyAlias {
|
AssocItemKind::Type(box TyAlias {
|
||||||
|
|
|
@ -2125,7 +2125,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
||||||
self.arena.alloc(self.expr_call_mut(span, e, args))
|
self.arena.alloc(self.expr_call_mut(span, e, args))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn expr_call_lang_item_fn_mut(
|
pub(super) fn expr_call_lang_item_fn_mut(
|
||||||
&mut self,
|
&mut self,
|
||||||
span: Span,
|
span: Span,
|
||||||
lang_item: hir::LangItem,
|
lang_item: hir::LangItem,
|
||||||
|
@ -2135,7 +2135,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
||||||
self.expr_call_mut(span, path, args)
|
self.expr_call_mut(span, path, args)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn expr_call_lang_item_fn(
|
pub(super) fn expr_call_lang_item_fn(
|
||||||
&mut self,
|
&mut self,
|
||||||
span: Span,
|
span: Span,
|
||||||
lang_item: hir::LangItem,
|
lang_item: hir::LangItem,
|
||||||
|
|
|
@ -917,7 +917,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
||||||
walk_list!(self, visit_attribute, &item.attrs);
|
walk_list!(self, visit_attribute, &item.attrs);
|
||||||
return; // Avoid visiting again.
|
return; // Avoid visiting again.
|
||||||
}
|
}
|
||||||
ItemKind::Fn(box Fn { defaultness, sig, generics, body }) => {
|
ItemKind::Fn(func @ box Fn { defaultness, generics: _, sig, body }) => {
|
||||||
self.check_defaultness(item.span, *defaultness);
|
self.check_defaultness(item.span, *defaultness);
|
||||||
|
|
||||||
let is_intrinsic =
|
let is_intrinsic =
|
||||||
|
@ -947,7 +947,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
||||||
|
|
||||||
self.visit_vis(&item.vis);
|
self.visit_vis(&item.vis);
|
||||||
self.visit_ident(&item.ident);
|
self.visit_ident(&item.ident);
|
||||||
let kind = FnKind::Fn(FnCtxt::Free, &item.ident, sig, &item.vis, generics, body);
|
let kind = FnKind::Fn(FnCtxt::Free, &item.ident, &item.vis, &*func);
|
||||||
self.visit_fn(kind, item.span, item.id);
|
self.visit_fn(kind, item.span, item.id);
|
||||||
walk_list!(self, visit_attribute, &item.attrs);
|
walk_list!(self, visit_attribute, &item.attrs);
|
||||||
return; // Avoid visiting again.
|
return; // Avoid visiting again.
|
||||||
|
@ -1348,19 +1348,20 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
if let FnKind::Fn(
|
if let FnKind::Fn(
|
||||||
_,
|
|
||||||
_,
|
|
||||||
FnSig { header: FnHeader { ext: Extern::Implicit(extern_span), .. }, .. },
|
|
||||||
_,
|
_,
|
||||||
_,
|
_,
|
||||||
_,
|
_,
|
||||||
|
Fn {
|
||||||
|
sig: FnSig { header: FnHeader { ext: Extern::Implicit(extern_span), .. }, .. },
|
||||||
|
..
|
||||||
|
},
|
||||||
) = fk
|
) = fk
|
||||||
{
|
{
|
||||||
self.maybe_lint_missing_abi(*extern_span, id);
|
self.maybe_lint_missing_abi(*extern_span, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Functions without bodies cannot have patterns.
|
// Functions without bodies cannot have patterns.
|
||||||
if let FnKind::Fn(ctxt, _, sig, _, _, None) = fk {
|
if let FnKind::Fn(ctxt, _, _, Fn { body: None, sig, .. }) = fk {
|
||||||
Self::check_decl_no_pat(&sig.decl, |span, ident, mut_ident| {
|
Self::check_decl_no_pat(&sig.decl, |span, ident, mut_ident| {
|
||||||
if mut_ident && matches!(ctxt, FnCtxt::Assoc(_)) {
|
if mut_ident && matches!(ctxt, FnCtxt::Assoc(_)) {
|
||||||
if let Some(ident) = ident {
|
if let Some(ident) = ident {
|
||||||
|
@ -1394,7 +1395,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
||||||
.is_some();
|
.is_some();
|
||||||
|
|
||||||
let disallowed = (!tilde_const_allowed).then(|| match fk {
|
let disallowed = (!tilde_const_allowed).then(|| match fk {
|
||||||
FnKind::Fn(_, ident, _, _, _, _) => TildeConstReason::Function { ident: ident.span },
|
FnKind::Fn(_, ident, _, _) => TildeConstReason::Function { ident: ident.span },
|
||||||
FnKind::Closure(..) => TildeConstReason::Closure,
|
FnKind::Closure(..) => TildeConstReason::Closure,
|
||||||
});
|
});
|
||||||
self.with_tilde_const(disallowed, |this| visit::walk_fn(this, fk));
|
self.with_tilde_const(disallowed, |this| visit::walk_fn(this, fk));
|
||||||
|
@ -1470,15 +1471,14 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
||||||
self.outer_trait_or_trait_impl.as_ref().and_then(TraitOrTraitImpl::constness).is_some();
|
self.outer_trait_or_trait_impl.as_ref().and_then(TraitOrTraitImpl::constness).is_some();
|
||||||
|
|
||||||
match &item.kind {
|
match &item.kind {
|
||||||
AssocItemKind::Fn(box Fn { sig, generics, body, .. })
|
AssocItemKind::Fn(func)
|
||||||
if parent_is_const
|
if parent_is_const
|
||||||
|| ctxt == AssocCtxt::Trait
|
|| ctxt == AssocCtxt::Trait
|
||||||
|| matches!(sig.header.constness, Const::Yes(_)) =>
|
|| matches!(func.sig.header.constness, Const::Yes(_)) =>
|
||||||
{
|
{
|
||||||
self.visit_vis(&item.vis);
|
self.visit_vis(&item.vis);
|
||||||
self.visit_ident(&item.ident);
|
self.visit_ident(&item.ident);
|
||||||
let kind =
|
let kind = FnKind::Fn(FnCtxt::Assoc(ctxt), &item.ident, &item.vis, &*func);
|
||||||
FnKind::Fn(FnCtxt::Assoc(ctxt), &item.ident, sig, &item.vis, generics, body);
|
|
||||||
walk_list!(self, visit_attribute, &item.attrs);
|
walk_list!(self, visit_attribute, &item.attrs);
|
||||||
self.visit_fn(kind, item.span, item.id);
|
self.visit_fn(kind, item.span, item.id);
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,8 +34,8 @@ impl<'a> State<'a> {
|
||||||
self.maybe_print_comment(span.lo());
|
self.maybe_print_comment(span.lo());
|
||||||
self.print_outer_attributes(attrs);
|
self.print_outer_attributes(attrs);
|
||||||
match kind {
|
match kind {
|
||||||
ast::ForeignItemKind::Fn(box ast::Fn { defaultness, sig, generics, body }) => {
|
ast::ForeignItemKind::Fn(func) => {
|
||||||
self.print_fn_full(sig, ident, generics, vis, *defaultness, body.as_deref(), attrs);
|
self.print_fn_full(ident, vis, attrs, &*func);
|
||||||
}
|
}
|
||||||
ast::ForeignItemKind::Static(box ast::StaticItem { ty, mutability, expr, safety }) => {
|
ast::ForeignItemKind::Static(box ast::StaticItem { ty, mutability, expr, safety }) => {
|
||||||
self.print_item_const(
|
self.print_item_const(
|
||||||
|
@ -199,16 +199,8 @@ impl<'a> State<'a> {
|
||||||
*defaultness,
|
*defaultness,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
ast::ItemKind::Fn(box ast::Fn { defaultness, sig, generics, body }) => {
|
ast::ItemKind::Fn(func) => {
|
||||||
self.print_fn_full(
|
self.print_fn_full(item.ident, &item.vis, &item.attrs, &*func);
|
||||||
sig,
|
|
||||||
item.ident,
|
|
||||||
generics,
|
|
||||||
&item.vis,
|
|
||||||
*defaultness,
|
|
||||||
body.as_deref(),
|
|
||||||
&item.attrs,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
ast::ItemKind::Mod(safety, mod_kind) => {
|
ast::ItemKind::Mod(safety, mod_kind) => {
|
||||||
self.head(Self::to_string(|s| {
|
self.head(Self::to_string(|s| {
|
||||||
|
@ -542,8 +534,8 @@ impl<'a> State<'a> {
|
||||||
self.maybe_print_comment(span.lo());
|
self.maybe_print_comment(span.lo());
|
||||||
self.print_outer_attributes(attrs);
|
self.print_outer_attributes(attrs);
|
||||||
match kind {
|
match kind {
|
||||||
ast::AssocItemKind::Fn(box ast::Fn { defaultness, sig, generics, body }) => {
|
ast::AssocItemKind::Fn(func) => {
|
||||||
self.print_fn_full(sig, ident, generics, vis, *defaultness, body.as_deref(), attrs);
|
self.print_fn_full(ident, vis, attrs, &*func);
|
||||||
}
|
}
|
||||||
ast::AssocItemKind::Const(box ast::ConstItem { defaultness, generics, ty, expr }) => {
|
ast::AssocItemKind::Const(box ast::ConstItem { defaultness, generics, ty, expr }) => {
|
||||||
self.print_item_const(
|
self.print_item_const(
|
||||||
|
@ -653,19 +645,17 @@ impl<'a> State<'a> {
|
||||||
|
|
||||||
fn print_fn_full(
|
fn print_fn_full(
|
||||||
&mut self,
|
&mut self,
|
||||||
sig: &ast::FnSig,
|
|
||||||
name: Ident,
|
name: Ident,
|
||||||
generics: &ast::Generics,
|
|
||||||
vis: &ast::Visibility,
|
vis: &ast::Visibility,
|
||||||
defaultness: ast::Defaultness,
|
|
||||||
body: Option<&ast::Block>,
|
|
||||||
attrs: &[ast::Attribute],
|
attrs: &[ast::Attribute],
|
||||||
|
func: &ast::Fn,
|
||||||
) {
|
) {
|
||||||
|
let ast::Fn { defaultness, generics, sig, body } = func;
|
||||||
if body.is_some() {
|
if body.is_some() {
|
||||||
self.head("");
|
self.head("");
|
||||||
}
|
}
|
||||||
self.print_visibility(vis);
|
self.print_visibility(vis);
|
||||||
self.print_defaultness(defaultness);
|
self.print_defaultness(*defaultness);
|
||||||
self.print_fn(&sig.decl, sig.header, Some(name), generics);
|
self.print_fn(&sig.decl, sig.header, Some(name), generics);
|
||||||
if let Some(body) = body {
|
if let Some(body) = body {
|
||||||
self.nbsp();
|
self.nbsp();
|
||||||
|
|
|
@ -330,10 +330,12 @@ impl EarlyLintPass for UnsafeCode {
|
||||||
if let FnKind::Fn(
|
if let FnKind::Fn(
|
||||||
ctxt,
|
ctxt,
|
||||||
_,
|
_,
|
||||||
ast::FnSig { header: ast::FnHeader { safety: ast::Safety::Unsafe(_), .. }, .. },
|
|
||||||
_,
|
_,
|
||||||
_,
|
ast::Fn {
|
||||||
body,
|
sig: ast::FnSig { header: ast::FnHeader { safety: ast::Safety::Unsafe(_), .. }, .. },
|
||||||
|
body,
|
||||||
|
..
|
||||||
|
},
|
||||||
) = fk
|
) = fk
|
||||||
{
|
{
|
||||||
let decorator = match ctxt {
|
let decorator = match ctxt {
|
||||||
|
|
|
@ -170,9 +170,12 @@ impl<'a, 'ra, 'tcx> visit::Visitor<'a> for DefCollector<'a, 'ra, 'tcx> {
|
||||||
|
|
||||||
fn visit_fn(&mut self, fn_kind: FnKind<'a>, span: Span, _: NodeId) {
|
fn visit_fn(&mut self, fn_kind: FnKind<'a>, span: Span, _: NodeId) {
|
||||||
match fn_kind {
|
match fn_kind {
|
||||||
FnKind::Fn(_ctxt, _ident, FnSig { header, decl, span: _ }, _vis, generics, body)
|
FnKind::Fn(
|
||||||
if let Some(coroutine_kind) = header.coroutine_kind =>
|
_ctxt,
|
||||||
{
|
_ident,
|
||||||
|
_vis,
|
||||||
|
Fn { sig: FnSig { header, decl, span: _ }, generics, body, .. },
|
||||||
|
) if let Some(coroutine_kind) = header.coroutine_kind => {
|
||||||
self.visit_fn_header(header);
|
self.visit_fn_header(header);
|
||||||
self.visit_generics(generics);
|
self.visit_generics(generics);
|
||||||
|
|
||||||
|
|
|
@ -986,8 +986,8 @@ impl<'ra: 'ast, 'ast, 'tcx> Visitor<'ast> for LateResolutionVisitor<'_, 'ast, 'r
|
||||||
match fn_kind {
|
match fn_kind {
|
||||||
// Bail if the function is foreign, and thus cannot validly have
|
// Bail if the function is foreign, and thus cannot validly have
|
||||||
// a body, or if there's no body for some other reason.
|
// a body, or if there's no body for some other reason.
|
||||||
FnKind::Fn(FnCtxt::Foreign, _, sig, _, generics, _)
|
FnKind::Fn(FnCtxt::Foreign, _, _, Fn { sig, generics, .. })
|
||||||
| FnKind::Fn(_, _, sig, _, generics, None) => {
|
| FnKind::Fn(_, _, _, Fn { sig, generics, body: None, .. }) => {
|
||||||
self.visit_fn_header(&sig.header);
|
self.visit_fn_header(&sig.header);
|
||||||
self.visit_generics(generics);
|
self.visit_generics(generics);
|
||||||
self.with_lifetime_rib(
|
self.with_lifetime_rib(
|
||||||
|
@ -1019,7 +1019,7 @@ impl<'ra: 'ast, 'ast, 'tcx> Visitor<'ast> for LateResolutionVisitor<'_, 'ast, 'r
|
||||||
// Create a label rib for the function.
|
// Create a label rib for the function.
|
||||||
this.with_label_rib(RibKind::FnOrCoroutine, |this| {
|
this.with_label_rib(RibKind::FnOrCoroutine, |this| {
|
||||||
match fn_kind {
|
match fn_kind {
|
||||||
FnKind::Fn(_, _, sig, _, generics, body) => {
|
FnKind::Fn(_, _, _, Fn { sig, generics, body, .. }) => {
|
||||||
this.visit_generics(generics);
|
this.visit_generics(generics);
|
||||||
|
|
||||||
let declaration = &sig.decl;
|
let declaration = &sig.decl;
|
||||||
|
|
|
@ -224,7 +224,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
||||||
let suggestion = if self.current_trait_ref.is_none()
|
let suggestion = if self.current_trait_ref.is_none()
|
||||||
&& let Some((fn_kind, _)) = self.diag_metadata.current_function
|
&& let Some((fn_kind, _)) = self.diag_metadata.current_function
|
||||||
&& let Some(FnCtxt::Assoc(_)) = fn_kind.ctxt()
|
&& let Some(FnCtxt::Assoc(_)) = fn_kind.ctxt()
|
||||||
&& let FnKind::Fn(_, _, sig, ..) = fn_kind
|
&& let FnKind::Fn(_, _, _, ast::Fn { sig, .. }) = fn_kind
|
||||||
&& let Some(items) = self.diag_metadata.current_impl_items
|
&& let Some(items) = self.diag_metadata.current_impl_items
|
||||||
&& let Some(item) = items.iter().find(|i| {
|
&& let Some(item) = items.iter().find(|i| {
|
||||||
i.ident.name == item_str.name
|
i.ident.name == item_str.name
|
||||||
|
@ -560,7 +560,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
||||||
Applicability::MaybeIncorrect,
|
Applicability::MaybeIncorrect,
|
||||||
);
|
);
|
||||||
if !self.self_value_is_available(path[0].ident.span) {
|
if !self.self_value_is_available(path[0].ident.span) {
|
||||||
if let Some((FnKind::Fn(_, _, sig, ..), fn_span)) =
|
if let Some((FnKind::Fn(_, _, _, ast::Fn { sig, .. }), fn_span)) =
|
||||||
&self.diag_metadata.current_function
|
&self.diag_metadata.current_function
|
||||||
{
|
{
|
||||||
let (span, sugg) = if let Some(param) = sig.decl.inputs.get(0) {
|
let (span, sugg) = if let Some(param) = sig.decl.inputs.get(0) {
|
||||||
|
@ -3249,7 +3249,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
||||||
{
|
{
|
||||||
let pre = if lt.kind == MissingLifetimeKind::Ampersand
|
let pre = if lt.kind == MissingLifetimeKind::Ampersand
|
||||||
&& let Some((kind, _span)) = self.diag_metadata.current_function
|
&& let Some((kind, _span)) = self.diag_metadata.current_function
|
||||||
&& let FnKind::Fn(_, _, sig, _, _, _) = kind
|
&& let FnKind::Fn(_, _, _, ast::Fn { sig, .. }) = kind
|
||||||
&& !sig.decl.inputs.is_empty()
|
&& !sig.decl.inputs.is_empty()
|
||||||
&& let sugg = sig
|
&& let sugg = sig
|
||||||
.decl
|
.decl
|
||||||
|
@ -3290,7 +3290,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
||||||
} else if (lt.kind == MissingLifetimeKind::Ampersand
|
} else if (lt.kind == MissingLifetimeKind::Ampersand
|
||||||
|| lt.kind == MissingLifetimeKind::Underscore)
|
|| lt.kind == MissingLifetimeKind::Underscore)
|
||||||
&& let Some((kind, _span)) = self.diag_metadata.current_function
|
&& let Some((kind, _span)) = self.diag_metadata.current_function
|
||||||
&& let FnKind::Fn(_, _, sig, _, _, _) = kind
|
&& let FnKind::Fn(_, _, _, ast::Fn { sig, .. }) = kind
|
||||||
&& let ast::FnRetTy::Ty(ret_ty) = &sig.decl.output
|
&& let ast::FnRetTy::Ty(ret_ty) = &sig.decl.output
|
||||||
&& !sig.decl.inputs.is_empty()
|
&& !sig.decl.inputs.is_empty()
|
||||||
&& let arg_refs = sig
|
&& let arg_refs = sig
|
||||||
|
@ -3350,7 +3350,7 @@ impl<'ast, 'ra: 'ast, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
|
||||||
let mut owned_sugg = lt.kind == MissingLifetimeKind::Ampersand;
|
let mut owned_sugg = lt.kind == MissingLifetimeKind::Ampersand;
|
||||||
let mut sugg = vec![(lt.span, String::new())];
|
let mut sugg = vec![(lt.span, String::new())];
|
||||||
if let Some((kind, _span)) = self.diag_metadata.current_function
|
if let Some((kind, _span)) = self.diag_metadata.current_function
|
||||||
&& let FnKind::Fn(_, _, sig, _, _, _) = kind
|
&& let FnKind::Fn(_, _, _, ast::Fn { sig, .. }) = kind
|
||||||
&& let ast::FnRetTy::Ty(ty) = &sig.decl.output
|
&& let ast::FnRetTy::Ty(ty) = &sig.decl.output
|
||||||
{
|
{
|
||||||
let mut lt_finder =
|
let mut lt_finder =
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use rustc_ast::visit::FnKind;
|
use rustc_ast::visit::FnKind;
|
||||||
use rustc_ast::{NodeId, WherePredicateKind};
|
use rustc_ast::{Fn, NodeId, WherePredicateKind};
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use rustc_lint::{EarlyContext, EarlyLintPass};
|
use rustc_lint::{EarlyContext, EarlyLintPass};
|
||||||
use rustc_session::declare_lint_pass;
|
use rustc_session::declare_lint_pass;
|
||||||
|
@ -39,7 +39,7 @@ declare_lint_pass!(MultipleBoundLocations => [MULTIPLE_BOUND_LOCATIONS]);
|
||||||
|
|
||||||
impl EarlyLintPass for MultipleBoundLocations {
|
impl EarlyLintPass for MultipleBoundLocations {
|
||||||
fn check_fn(&mut self, cx: &EarlyContext<'_>, kind: FnKind<'_>, _: Span, _: NodeId) {
|
fn check_fn(&mut self, cx: &EarlyContext<'_>, kind: FnKind<'_>, _: Span, _: NodeId) {
|
||||||
if let FnKind::Fn(_, _, _, _, generics, _) = kind
|
if let FnKind::Fn(_, _, _, Fn { generics, .. }) = kind
|
||||||
&& !generics.params.is_empty()
|
&& !generics.params.is_empty()
|
||||||
&& !generics.where_clause.predicates.is_empty()
|
&& !generics.where_clause.predicates.is_empty()
|
||||||
{
|
{
|
||||||
|
|
|
@ -333,19 +333,19 @@ impl<'a> FnSig<'a> {
|
||||||
defaultness: ast::Defaultness,
|
defaultness: ast::Defaultness,
|
||||||
) -> FnSig<'a> {
|
) -> FnSig<'a> {
|
||||||
match *fn_kind {
|
match *fn_kind {
|
||||||
visit::FnKind::Fn(visit::FnCtxt::Assoc(..), _, fn_sig, vis, generics, _) => {
|
visit::FnKind::Fn(visit::FnCtxt::Assoc(..), _, vis, ast::Fn { sig, generics, .. }) => {
|
||||||
let mut fn_sig = FnSig::from_method_sig(fn_sig, generics, vis);
|
let mut fn_sig = FnSig::from_method_sig(sig, generics, vis);
|
||||||
fn_sig.defaultness = defaultness;
|
fn_sig.defaultness = defaultness;
|
||||||
fn_sig
|
fn_sig
|
||||||
}
|
}
|
||||||
visit::FnKind::Fn(_, _, fn_sig, vis, generics, _) => FnSig {
|
visit::FnKind::Fn(_, _, vis, ast::Fn { sig, generics, .. }) => FnSig {
|
||||||
decl,
|
decl,
|
||||||
generics,
|
generics,
|
||||||
ext: fn_sig.header.ext,
|
ext: sig.header.ext,
|
||||||
constness: fn_sig.header.constness,
|
constness: sig.header.constness,
|
||||||
coroutine_kind: Cow::Borrowed(&fn_sig.header.coroutine_kind),
|
coroutine_kind: Cow::Borrowed(&sig.header.coroutine_kind),
|
||||||
defaultness,
|
defaultness,
|
||||||
safety: fn_sig.header.safety,
|
safety: sig.header.safety,
|
||||||
visibility: vis,
|
visibility: vis,
|
||||||
},
|
},
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
|
@ -3453,6 +3453,7 @@ impl Rewrite for ast::ForeignItem {
|
||||||
ref sig,
|
ref sig,
|
||||||
ref generics,
|
ref generics,
|
||||||
ref body,
|
ref body,
|
||||||
|
..
|
||||||
} = **fn_kind;
|
} = **fn_kind;
|
||||||
if body.is_some() {
|
if body.is_some() {
|
||||||
let mut visitor = FmtVisitor::from_context(context);
|
let mut visitor = FmtVisitor::from_context(context);
|
||||||
|
@ -3461,7 +3462,7 @@ impl Rewrite for ast::ForeignItem {
|
||||||
let inner_attrs = inner_attributes(&self.attrs);
|
let inner_attrs = inner_attributes(&self.attrs);
|
||||||
let fn_ctxt = visit::FnCtxt::Foreign;
|
let fn_ctxt = visit::FnCtxt::Foreign;
|
||||||
visitor.visit_fn(
|
visitor.visit_fn(
|
||||||
visit::FnKind::Fn(fn_ctxt, &self.ident, sig, &self.vis, generics, body),
|
visit::FnKind::Fn(fn_ctxt, &self.ident, &self.vis, fn_kind),
|
||||||
&sig.decl,
|
&sig.decl,
|
||||||
self.span,
|
self.span,
|
||||||
defaultness,
|
defaultness,
|
||||||
|
|
|
@ -386,7 +386,14 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
|
||||||
let indent = self.block_indent;
|
let indent = self.block_indent;
|
||||||
let block;
|
let block;
|
||||||
let rewrite = match fk {
|
let rewrite = match fk {
|
||||||
visit::FnKind::Fn(_, ident, _, _, _, Some(ref b)) => {
|
visit::FnKind::Fn(
|
||||||
|
_,
|
||||||
|
ident,
|
||||||
|
_,
|
||||||
|
ast::Fn {
|
||||||
|
body: Some(ref b), ..
|
||||||
|
},
|
||||||
|
) => {
|
||||||
block = b;
|
block = b;
|
||||||
self.rewrite_fn_before_block(
|
self.rewrite_fn_before_block(
|
||||||
indent,
|
indent,
|
||||||
|
@ -539,6 +546,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
|
||||||
ref sig,
|
ref sig,
|
||||||
ref generics,
|
ref generics,
|
||||||
ref body,
|
ref body,
|
||||||
|
..
|
||||||
} = **fn_kind;
|
} = **fn_kind;
|
||||||
if body.is_some() {
|
if body.is_some() {
|
||||||
let inner_attrs = inner_attributes(&item.attrs);
|
let inner_attrs = inner_attributes(&item.attrs);
|
||||||
|
@ -547,7 +555,7 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
|
||||||
_ => visit::FnCtxt::Foreign,
|
_ => visit::FnCtxt::Foreign,
|
||||||
};
|
};
|
||||||
self.visit_fn(
|
self.visit_fn(
|
||||||
visit::FnKind::Fn(fn_ctxt, &item.ident, sig, &item.vis, generics, body),
|
visit::FnKind::Fn(fn_ctxt, &item.ident, &item.vis, fn_kind),
|
||||||
&sig.decl,
|
&sig.decl,
|
||||||
item.span,
|
item.span,
|
||||||
defaultness,
|
defaultness,
|
||||||
|
@ -640,12 +648,13 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
|
||||||
ref sig,
|
ref sig,
|
||||||
ref generics,
|
ref generics,
|
||||||
ref body,
|
ref body,
|
||||||
|
..
|
||||||
} = **fn_kind;
|
} = **fn_kind;
|
||||||
if body.is_some() {
|
if body.is_some() {
|
||||||
let inner_attrs = inner_attributes(&ai.attrs);
|
let inner_attrs = inner_attributes(&ai.attrs);
|
||||||
let fn_ctxt = visit::FnCtxt::Assoc(assoc_ctxt);
|
let fn_ctxt = visit::FnCtxt::Assoc(assoc_ctxt);
|
||||||
self.visit_fn(
|
self.visit_fn(
|
||||||
visit::FnKind::Fn(fn_ctxt, &ai.ident, sig, &ai.vis, generics, body),
|
visit::FnKind::Fn(fn_ctxt, &ai.ident, &ai.vis, fn_kind),
|
||||||
&sig.decl,
|
&sig.decl,
|
||||||
ai.span,
|
ai.span,
|
||||||
defaultness,
|
defaultness,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue