1
Fork 0

Avoid specialization for the Span Encodable and Decodable impls

This commit is contained in:
bjorn3 2023-12-31 19:35:32 +00:00
parent 1c20462338
commit 6ed37bdc42
16 changed files with 140 additions and 94 deletions

View file

@ -35,6 +35,8 @@
#![feature(rustdoc_internals)]
// tidy-alphabetical-end
extern crate self as rustc_span;
#[macro_use]
extern crate rustc_macros;
@ -43,6 +45,7 @@ extern crate tracing;
use rustc_data_structures::{outline, AtomicRef};
use rustc_macros::HashStable_Generic;
use rustc_serialize::opaque::{FileEncoder, MemDecoder};
use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
mod caching_source_map_view;
@ -1016,22 +1019,43 @@ impl Default for Span {
}
}
impl<E: Encoder> Encodable<E> for Span {
default fn encode(&self, s: &mut E) {
let span = self.data();
span.lo.encode(s);
span.hi.encode(s);
pub trait SpanEncoder: Encoder {
fn encode_span(&mut self, span: Span);
}
impl SpanEncoder for FileEncoder {
fn encode_span(&mut self, span: Span) {
let span = span.data();
span.lo.encode(self);
span.hi.encode(self);
}
}
impl<D: Decoder> Decodable<D> for Span {
default fn decode(s: &mut D) -> Span {
let lo = Decodable::decode(s);
let hi = Decodable::decode(s);
impl<E: SpanEncoder> Encodable<E> for Span {
fn encode(&self, s: &mut E) {
s.encode_span(*self);
}
}
pub trait SpanDecoder: Decoder {
fn decode_span(&mut self) -> Span;
}
impl SpanDecoder for MemDecoder<'_> {
fn decode_span(&mut self) -> Span {
let lo = Decodable::decode(self);
let hi = Decodable::decode(self);
Span::new(lo, hi, SyntaxContext::root(), None)
}
}
impl<D: SpanDecoder> Decodable<D> for Span {
fn decode(s: &mut D) -> Span {
s.decode_span()
}
}
/// Insert `source_map` into the session globals for the duration of the
/// closure's execution.
pub fn set_source_map<T, F: FnOnce() -> T>(source_map: Lrc<SourceMap>, f: F) -> T {
@ -1360,7 +1384,7 @@ impl Clone for SourceFile {
}
}
impl<S: Encoder> Encodable<S> for SourceFile {
impl<S: SpanEncoder> Encodable<S> for SourceFile {
fn encode(&self, s: &mut S) {
self.name.encode(s);
self.src_hash.encode(s);
@ -1434,7 +1458,7 @@ impl<S: Encoder> Encodable<S> for SourceFile {
}
}
impl<D: Decoder> Decodable<D> for SourceFile {
impl<D: SpanDecoder> Decodable<D> for SourceFile {
fn decode(d: &mut D) -> SourceFile {
let name: FileName = Decodable::decode(d);
let src_hash: SourceFileHash = Decodable::decode(d);