mirror of https://github.com/rust-lang/rust.git
Auto merge of #123165 - oli-obk:no_ord_def_id3, r=cjgillot
Stop sorting `Span`s' `SyntaxContext`, as that is incompatible with incremental work towards https://github.com/rust-lang/rust/issues/90317 Luckily no one actually needed these to be sorted, so it didn't even affect diagnostics. I'm guessing they'd have been sorted by creation time anyway, so it wouldn't really have mattered. r? `@cjgillot`
This commit is contained in:
commit
25c9f2ca06
|
@ -4762,6 +4762,7 @@ dependencies = [
|
|||
name = "rustc_span"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"derivative",
|
||||
"indexmap",
|
||||
"itoa",
|
||||
"md-5",
|
||||
|
|
|
@ -5,6 +5,7 @@ edition = "2021"
|
|||
|
||||
[dependencies]
|
||||
# tidy-alphabetical-start
|
||||
derivative = "2.2.0"
|
||||
indexmap = { version = "2.0.0" }
|
||||
itoa = "1.0"
|
||||
md5 = { package = "md-5", version = "0.10.0" }
|
||||
|
|
|
@ -43,9 +43,15 @@ use std::hash::Hash;
|
|||
use tracing::{debug, trace};
|
||||
|
||||
/// A `SyntaxContext` represents a chain of pairs `(ExpnId, Transparency)` named "marks".
|
||||
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
|
||||
pub struct SyntaxContext(u32);
|
||||
|
||||
// To ensure correctness of incremental compilation,
|
||||
// `SyntaxContext` must not implement `Ord` or `PartialOrd`.
|
||||
// See https://github.com/rust-lang/rust/issues/90317.
|
||||
impl !Ord for SyntaxContext {}
|
||||
impl !PartialOrd for SyntaxContext {}
|
||||
|
||||
#[derive(Debug, Encodable, Decodable, Clone)]
|
||||
pub struct SyntaxContextData {
|
||||
outer_expn: ExpnId,
|
||||
|
|
|
@ -467,46 +467,23 @@ impl FileName {
|
|||
/// `SpanData` is public because `Span` uses a thread-local interner and can't be
|
||||
/// sent to other threads, but some pieces of performance infra run in a separate thread.
|
||||
/// Using `Span` is generally preferred.
|
||||
#[derive(Clone, Copy, Hash, PartialEq, Eq)]
|
||||
#[derive(Clone, Copy, Hash, PartialEq, Eq, derivative::Derivative)]
|
||||
#[derivative(PartialOrd, Ord)]
|
||||
pub struct SpanData {
|
||||
pub lo: BytePos,
|
||||
pub hi: BytePos,
|
||||
/// Information about where the macro came from, if this piece of
|
||||
/// code was created by a macro expansion.
|
||||
#[derivative(PartialOrd = "ignore", Ord = "ignore")]
|
||||
// `SyntaxContext` does not implement `Ord`.
|
||||
// The other fields are enough to determine in-file order.
|
||||
pub ctxt: SyntaxContext,
|
||||
#[derivative(PartialOrd = "ignore", Ord = "ignore")]
|
||||
// `LocalDefId` does not implement `Ord`.
|
||||
// The other fields are enough to determine in-file order.
|
||||
pub parent: Option<LocalDefId>,
|
||||
}
|
||||
|
||||
// Order spans by position in the file.
|
||||
impl Ord for SpanData {
|
||||
fn cmp(&self, other: &Self) -> Ordering {
|
||||
let SpanData {
|
||||
lo: s_lo,
|
||||
hi: s_hi,
|
||||
ctxt: s_ctxt,
|
||||
// `LocalDefId` does not implement `Ord`.
|
||||
// The other fields are enough to determine in-file order.
|
||||
parent: _,
|
||||
} = self;
|
||||
let SpanData {
|
||||
lo: o_lo,
|
||||
hi: o_hi,
|
||||
ctxt: o_ctxt,
|
||||
// `LocalDefId` does not implement `Ord`.
|
||||
// The other fields are enough to determine in-file order.
|
||||
parent: _,
|
||||
} = other;
|
||||
|
||||
(s_lo, s_hi, s_ctxt).cmp(&(o_lo, o_hi, o_ctxt))
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialOrd for SpanData {
|
||||
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
||||
Some(self.cmp(other))
|
||||
}
|
||||
}
|
||||
|
||||
impl SpanData {
|
||||
#[inline]
|
||||
pub fn span(&self) -> Span {
|
||||
|
|
Loading…
Reference in New Issue