Stop sorting Span
s' SyntaxContext
, as that is incompatible with incremental
This commit is contained in:
parent
43a0686f8d
commit
4239a739e8
@ -4631,6 +4631,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" }
|
||||
|
@ -42,9 +42,15 @@
|
||||
use std::hash::Hash;
|
||||
|
||||
/// 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,
|
||||
|
@ -469,46 +469,23 @@ pub fn into_local_path(self) -> Option<PathBuf> {
|
||||
/// `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
Block a user