Skip to content

Commit c5e1aca

Browse files
committed
Preserve span parent in try_metavars.
1 parent b0d68f4 commit c5e1aca

File tree

1 file changed

+35
-27
lines changed

1 file changed

+35
-27
lines changed

compiler/rustc_span/src/lib.rs

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -916,35 +916,43 @@ impl Span {
916916
}
917917

918918
/// Check if you can select metavar spans for the given spans to get matching contexts.
919-
fn try_metavars(a: SpanData, b: SpanData, a_orig: Span, b_orig: Span) -> (SpanData, SpanData) {
920-
match with_metavar_spans(|mspans| (mspans.get(a_orig), mspans.get(b_orig))) {
921-
(None, None) => {}
922-
(Some(meta_a), None) => {
923-
let meta_a = meta_a.data();
924-
if meta_a.ctxt == b.ctxt {
925-
return (meta_a, b);
926-
}
927-
}
928-
(None, Some(meta_b)) => {
929-
let meta_b = meta_b.data();
930-
if a.ctxt == meta_b.ctxt {
931-
return (a, meta_b);
932-
}
933-
}
934-
(Some(meta_a), Some(meta_b)) => {
935-
let meta_b = meta_b.data();
936-
if a.ctxt == meta_b.ctxt {
937-
return (a, meta_b);
938-
}
939-
let meta_a = meta_a.data();
940-
if meta_a.ctxt == b.ctxt {
941-
return (meta_a, b);
942-
} else if meta_a.ctxt == meta_b.ctxt {
943-
return (meta_a, meta_b);
944-
}
945-
}
919+
#[tracing::instrument(level = "trace", ret)]
920+
fn try_metavars(
921+
mut a: SpanData,
922+
mut b: SpanData,
923+
a_orig: Span,
924+
b_orig: Span,
925+
) -> (SpanData, SpanData) {
926+
let a_parent = a.parent;
927+
let b_parent = b.parent;
928+
929+
let (meta_a, meta_b) = with_metavar_spans(|mspans| {
930+
(mspans.get(a_orig.with_parent(None)), mspans.get(b_orig.with_parent(None)))
931+
});
932+
933+
let meta_a = meta_a.map(Span::data);
934+
let meta_b = meta_b.map(Span::data);
935+
936+
if let Some(meta_b) = meta_b
937+
&& meta_b.ctxt == a.ctxt
938+
{
939+
b = meta_b;
940+
}
941+
if let Some(meta_a) = meta_a
942+
&& meta_a.ctxt == b.ctxt
943+
{
944+
a = meta_a;
945+
}
946+
if let Some(meta_a) = meta_a
947+
&& let Some(meta_b) = meta_b
948+
&& meta_a.ctxt == meta_b.ctxt
949+
{
950+
a = meta_a;
951+
b = meta_b;
946952
}
947953

954+
a.parent = a_parent;
955+
b.parent = b_parent;
948956
(a, b)
949957
}
950958

0 commit comments

Comments
 (0)