mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-21 22:34:05 +00:00
Rollup merge of #128197 - Alexendoo:span-ctxt, r=davidtwco
Skip locking span interner for some syntax context checks - `from_expansion` now never needs to consult the interner - `eq_ctxt` now only needs the interner when both spans are fully interned
This commit is contained in:
commit
e158303c09
@ -559,12 +559,6 @@ impl Span {
|
||||
!self.is_dummy() && sm.is_span_accessible(self)
|
||||
}
|
||||
|
||||
/// Returns `true` if this span comes from any kind of macro, desugaring or inlining.
|
||||
#[inline]
|
||||
pub fn from_expansion(self) -> bool {
|
||||
!self.ctxt().is_root()
|
||||
}
|
||||
|
||||
/// Returns `true` if `span` originates in a derive-macro's expansion.
|
||||
pub fn in_derive_expansion(self) -> bool {
|
||||
matches!(self.ctxt().outer_expn_data().kind, ExpnKind::Macro(MacroKind::Derive, _))
|
||||
|
@ -303,6 +303,13 @@ impl Span {
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns `true` if this span comes from any kind of macro, desugaring or inlining.
|
||||
#[inline]
|
||||
pub fn from_expansion(self) -> bool {
|
||||
// If the span is fully inferred then ctxt > MAX_CTXT
|
||||
self.inline_ctxt().map_or(true, |ctxt| !ctxt.is_root())
|
||||
}
|
||||
|
||||
/// Returns `true` if this is a dummy span with any hygienic context.
|
||||
#[inline]
|
||||
pub fn is_dummy(self) -> bool {
|
||||
@ -370,9 +377,10 @@ impl Span {
|
||||
pub fn eq_ctxt(self, other: Span) -> bool {
|
||||
match (self.inline_ctxt(), other.inline_ctxt()) {
|
||||
(Ok(ctxt1), Ok(ctxt2)) => ctxt1 == ctxt2,
|
||||
(Ok(ctxt), Err(index)) | (Err(index), Ok(ctxt)) => {
|
||||
with_span_interner(|interner| ctxt == interner.spans[index].ctxt)
|
||||
}
|
||||
// If `inline_ctxt` returns `Ok` the context is <= MAX_CTXT.
|
||||
// If it returns `Err` the span is fully interned and the context is > MAX_CTXT.
|
||||
// As these do not overlap an `Ok` and `Err` result cannot have an equal context.
|
||||
(Ok(_), Err(_)) | (Err(_), Ok(_)) => false,
|
||||
(Err(index1), Err(index2)) => with_span_interner(|interner| {
|
||||
interner.spans[index1].ctxt == interner.spans[index2].ctxt
|
||||
}),
|
||||
|
Loading…
Reference in New Issue
Block a user