Skip to content

Commit db8a927

Browse files
committed
Introduce BareFnTy::decl_span and fix generics span.
1 parent 5953c57 commit db8a927

File tree

4 files changed

+10
-14
lines changed

4 files changed

+10
-14
lines changed

compiler/rustc_ast/src/ast.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1976,6 +1976,8 @@ pub struct BareFnTy {
19761976
pub ext: Extern,
19771977
pub generic_params: Vec<GenericParam>,
19781978
pub decl: P<FnDecl>,
1979+
/// Span of the `fn(...) -> ...` part.
1980+
pub decl_span: Span,
19791981
}
19801982

19811983
/// The various kinds of type recognized by the compiler.

compiler/rustc_ast/src/mut_visit.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -460,10 +460,11 @@ pub fn noop_visit_ty<T: MutVisitor>(ty: &mut P<Ty>, vis: &mut T) {
460460
vis.visit_mt(mt);
461461
}
462462
TyKind::BareFn(bft) => {
463-
let BareFnTy { unsafety, ext: _, generic_params, decl } = bft.deref_mut();
463+
let BareFnTy { unsafety, ext: _, generic_params, decl, decl_span } = bft.deref_mut();
464464
visit_unsafety(unsafety, vis);
465465
generic_params.flat_map_in_place(|param| vis.flat_map_generic_param(param));
466466
vis.visit_fn_decl(decl);
467+
vis.visit_span(decl_span);
467468
}
468469
TyKind::Tup(tys) => visit_vec(tys, |ty| vis.visit_ty(ty)),
469470
TyKind::Paren(ty) => vis.visit_ty(ty),

compiler/rustc_parse/src/parser/ty.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,7 @@ impl<'a> Parser<'a> {
518518
kind: rustc_ast::VisibilityKind::Inherited,
519519
tokens: None,
520520
};
521+
let span_start = self.token.span;
521522
let ast::FnHeader { ext, unsafety, constness, asyncness } =
522523
self.parse_fn_front_matter(&inherited_vis)?;
523524
let decl = self.parse_fn_decl(|_| false, AllowPlus::No, recover_return_sign)?;
@@ -531,7 +532,8 @@ impl<'a> Parser<'a> {
531532
if let ast::Async::Yes { span, .. } = asyncness {
532533
self.error_fn_ptr_bad_qualifier(whole_span, span, "async");
533534
}
534-
Ok(TyKind::BareFn(P(BareFnTy { ext, unsafety, generic_params: params, decl })))
535+
let decl_span = span_start.to(self.token.span);
536+
Ok(TyKind::BareFn(P(BareFnTy { ext, unsafety, generic_params: params, decl, decl_span })))
535537
}
536538

537539
/// Emit an error for the given bad function pointer qualifier.

compiler/rustc_resolve/src/late.rs

+3-12
Original file line numberDiff line numberDiff line change
@@ -594,11 +594,7 @@ impl<'a: 'ast, 'ast> Visitor<'ast> for LateResolutionVisitor<'a, '_, 'ast> {
594594
self.diagnostic_metadata.current_trait_object = Some(&bounds[..]);
595595
}
596596
TyKind::BareFn(ref bare_fn) => {
597-
let span = if bare_fn.generic_params.is_empty() {
598-
ty.span.shrink_to_lo()
599-
} else {
600-
ty.span
601-
};
597+
let span = ty.span.shrink_to_lo().to(bare_fn.decl_span.shrink_to_lo());
602598
self.with_generic_param_rib(
603599
&bare_fn.generic_params,
604600
NormalRibKind,
@@ -627,8 +623,7 @@ impl<'a: 'ast, 'ast> Visitor<'ast> for LateResolutionVisitor<'a, '_, 'ast> {
627623
self.diagnostic_metadata.current_type_path = prev_ty;
628624
}
629625
fn visit_poly_trait_ref(&mut self, tref: &'ast PolyTraitRef, _: &'ast TraitBoundModifier) {
630-
let span =
631-
if tref.bound_generic_params.is_empty() { tref.span.shrink_to_lo() } else { tref.span };
626+
let span = tref.span.shrink_to_lo().to(tref.trait_ref.path.span.shrink_to_lo());
632627
self.with_generic_param_rib(
633628
&tref.bound_generic_params,
634629
NormalRibKind,
@@ -890,11 +885,7 @@ impl<'a: 'ast, 'ast> Visitor<'ast> for LateResolutionVisitor<'a, '_, 'ast> {
890885
..
891886
}) = p
892887
{
893-
let span = if bound_generic_params.is_empty() {
894-
predicate_span.shrink_to_lo()
895-
} else {
896-
*predicate_span
897-
};
888+
let span = predicate_span.shrink_to_lo().to(bounded_ty.span.shrink_to_lo());
898889
this.with_generic_param_rib(
899890
&bound_generic_params,
900891
NormalRibKind,

0 commit comments

Comments
 (0)