Auto merge of #93967 - cjgillot:short-struct-span, r=petrochenkov · rust-lang/rust@46b8c23 (original) (raw)
`@@ -934,28 +934,105 @@ impl<'hir> Map<'hir> {
`
934
934
`}
`
935
935
``
936
936
`/// Gets the span of the definition of the specified HIR node.
`
937
``
`` -
/// This is used by tcx.get_span
``
``
937
`` +
/// This is used by tcx.def_span
.
``
938
938
`pub fn span(self, hir_id: HirId) -> Span {
`
939
939
`self.opt_span(hir_id)
`
940
940
`.unwrap_or_else(|| bug!("hir::map::Map::span: id not in map: {:?}", hir_id))
`
941
941
`}
`
942
942
``
943
943
`pub fn opt_span(self, hir_id: HirId) -> Option {
`
``
944
`+
fn until_within(outer: Span, end: Span) -> Span {
`
``
945
`+
if let Some(end) = end.find_ancestor_inside(outer) {
`
``
946
`+
outer.with_hi(end.hi())
`
``
947
`+
} else {
`
``
948
`+
outer
`
``
949
`+
}
`
``
950
`+
}
`
``
951
+
``
952
`+
fn named_span(item_span: Span, ident: Ident, generics: Option<&Generics<'_>>) -> Span {
`
``
953
`+
if ident.name != kw::Empty {
`
``
954
`+
let mut span = until_within(item_span, ident.span);
`
``
955
`+
if let Some(g) = generics
`
``
956
`+
&& !g.span.is_dummy()
`
``
957
`+
&& let Some(g_span) = g.span.find_ancestor_inside(item_span)
`
``
958
`+
{
`
``
959
`+
span = span.to(g_span);
`
``
960
`+
}
`
``
961
`+
span
`
``
962
`+
} else {
`
``
963
`+
item_span
`
``
964
`+
}
`
``
965
`+
}
`
``
966
+
944
967
`let span = match self.find(hir_id)? {
`
945
``
`-
Node::Param(param) => param.span,
`
``
968
`+
// Function-like.
`
``
969
`+
Node::Item(Item { kind: ItemKind::Fn(sig, ..), .. })
`
``
970
`+
| Node::TraitItem(TraitItem { kind: TraitItemKind::Fn(sig, ..), .. })
`
``
971
`+
| Node::ImplItem(ImplItem { kind: ImplItemKind::Fn(sig, ..), .. }) => sig.span,
`
``
972
`+
// Constants and Statics.
`
``
973
`+
Node::Item(Item {
`
``
974
`+
kind:
`
``
975
`+
ItemKind::Const(ty, ..)
`
``
976
`+
| ItemKind::Static(ty, ..)
`
``
977
`+
| ItemKind::Impl(Impl { self_ty: ty, .. }),
`
``
978
`+
span: outer_span,
`
``
979
`+
..
`
``
980
`+
})
`
``
981
`+
| Node::TraitItem(TraitItem {
`
``
982
`+
kind: TraitItemKind::Const(ty, ..),
`
``
983
`+
span: outer_span,
`
``
984
`+
..
`
``
985
`+
})
`
``
986
`+
| Node::ImplItem(ImplItem {
`
``
987
`+
kind: ImplItemKind::Const(ty, ..),
`
``
988
`+
span: outer_span,
`
``
989
`+
..
`
``
990
`+
})
`
``
991
`+
| Node::ForeignItem(ForeignItem {
`
``
992
`+
kind: ForeignItemKind::Static(ty, ..),
`
``
993
`+
span: outer_span,
`
``
994
`+
..
`
``
995
`+
}) => until_within(*outer_span, ty.span),
`
``
996
`+
// With generics and bounds.
`
``
997
`+
Node::Item(Item {
`
``
998
`+
kind: ItemKind::Trait(_, _, generics, bounds, _),
`
``
999
`+
span: outer_span,
`
``
1000
`+
..
`
``
1001
`+
})
`
``
1002
`+
| Node::TraitItem(TraitItem {
`
``
1003
`+
kind: TraitItemKind::Type(bounds, _),
`
``
1004
`+
generics,
`
``
1005
`+
span: outer_span,
`
``
1006
`+
..
`
``
1007
`+
}) => {
`
``
1008
`+
let end = if let Some(b) = bounds.last() { b.span() } else { generics.span };
`
``
1009
`+
until_within(*outer_span, end)
`
``
1010
`+
}
`
``
1011
`+
// Other cases.
`
946
1012
`Node::Item(item) => match &item.kind {
`
947
``
`-
ItemKind::Fn(sig, _, _) => sig.span,
`
948
``
`-
_ => item.span,
`
``
1013
`+
ItemKind::Use(path, _) => path.span,
`
``
1014
`+
_ => named_span(item.span, item.ident, item.kind.generics()),
`
949
1015
`},
`
950
``
`-
Node::ForeignItem(foreign_item) => foreign_item.span,
`
951
``
`-
Node::TraitItem(trait_item) => match &trait_item.kind {
`
952
``
`-
TraitItemKind::Fn(sig, _) => sig.span,
`
953
``
`-
_ => trait_item.span,
`
954
``
`-
},
`
955
``
`-
Node::ImplItem(impl_item) => match &impl_item.kind {
`
956
``
`-
ImplItemKind::Fn(sig, _) => sig.span,
`
957
``
`-
_ => impl_item.span,
`
``
1016
`+
Node::ImplItem(item) => named_span(item.span, item.ident, Some(item.generics)),
`
``
1017
`+
Node::ForeignItem(item) => match item.kind {
`
``
1018
`+
ForeignItemKind::Fn(decl, _, _) => until_within(item.span, decl.output.span()),
`
``
1019
`+
_ => named_span(item.span, item.ident, None),
`
958
1020
`},
`
``
1021
`+
Node::Ctor(..) => return self.opt_span(self.get_parent_node(hir_id)),
`
``
1022
`+
_ => self.span_with_body(hir_id),
`
``
1023
`+
};
`
``
1024
`+
Some(span)
`
``
1025
`+
}
`
``
1026
+
``
1027
`` +
/// Like hir.span()
, but includes the body of items
``
``
1028
`+
/// (instead of just the item header)
`
``
1029
`+
pub fn span_with_body(self, hir_id: HirId) -> Span {
`
``
1030
`+
match self.get(hir_id) {
`
``
1031
`+
Node::Param(param) => param.span,
`
``
1032
`+
Node::Item(item) => item.span,
`
``
1033
`+
Node::ForeignItem(foreign_item) => foreign_item.span,
`
``
1034
`+
Node::TraitItem(trait_item) => trait_item.span,
`
``
1035
`+
Node::ImplItem(impl_item) => impl_item.span,
`
959
1036
`Node::Variant(variant) => variant.span,
`
960
1037
`Node::Field(field) => field.span,
`
961
1038
`Node::AnonConst(constant) => self.body(constant.body).value.span,
`
`@@ -973,29 +1050,12 @@ impl<'hir> Map<'hir> {
`
973
1050
`Node::Pat(pat) => pat.span,
`
974
1051
`Node::Arm(arm) => arm.span,
`
975
1052
`Node::Block(block) => block.span,
`
976
``
`-
Node::Ctor(..) => match self.find(self.get_parent_node(hir_id))? {
`
977
``
`-
Node::Item(item) => item.span,
`
978
``
`-
Node::Variant(variant) => variant.span,
`
979
``
`-
_ => unreachable!(),
`
980
``
`-
},
`
``
1053
`+
Node::Ctor(..) => self.span_with_body(self.get_parent_node(hir_id)),
`
981
1054
`Node::Lifetime(lifetime) => lifetime.span,
`
982
1055
`Node::GenericParam(param) => param.span,
`
983
1056
`Node::Infer(i) => i.span,
`
984
1057
`Node::Local(local) => local.span,
`
985
1058
`Node::Crate(item) => item.spans.inner_span,
`
986
``
`-
};
`
987
``
`-
Some(span)
`
988
``
`-
}
`
989
``
-
990
``
`` -
/// Like hir.span()
, but includes the body of function items
``
991
``
`-
/// (instead of just the function header)
`
992
``
`-
pub fn span_with_body(self, hir_id: HirId) -> Span {
`
993
``
`-
match self.find(hir_id) {
`
994
``
`-
Some(Node::TraitItem(item)) => item.span,
`
995
``
`-
Some(Node::ImplItem(impl_item)) => impl_item.span,
`
996
``
`-
Some(Node::Item(item)) => item.span,
`
997
``
`-
Some(_) => self.span(hir_id),
`
998
``
`-
_ => bug!("hir::map::Map::span_with_body: id not in map: {:?}", hir_id),
`
999
1059
`}
`
1000
1060
`}
`
1001
1061
``