Skip to content

Commit

Permalink
Remove SourceMapper trait
Browse files Browse the repository at this point in the history
SourceMap is now in the root of all rustc-specific crates, syntax_pos,
so there's no need for the trait object to decouple the dependencies
between librustc_errors and libsyntax as was needed previously.
  • Loading branch information
Mark-Simulacrum committed Nov 15, 2019
1 parent 942f0a6 commit 3f93ffc
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 84 deletions.
5 changes: 3 additions & 2 deletions src/librustc_codegen_ssa/back/write.rs
Expand Up @@ -23,7 +23,8 @@ use rustc_data_structures::profiling::SelfProfilerRef;
use rustc_fs_util::link_or_copy; use rustc_fs_util::link_or_copy;
use rustc_data_structures::svh::Svh; use rustc_data_structures::svh::Svh;
use rustc_data_structures::sync::Lrc; use rustc_data_structures::sync::Lrc;
use rustc_errors::{Handler, Level, FatalError, DiagnosticId, SourceMapperDyn}; use rustc_errors::{Handler, Level, FatalError, DiagnosticId};
use syntax_pos::source_map::SourceMap;
use rustc_errors::emitter::{Emitter}; use rustc_errors::emitter::{Emitter};
use rustc_target::spec::MergeFunctions; use rustc_target::spec::MergeFunctions;
use syntax::attr; use syntax::attr;
Expand Down Expand Up @@ -1679,7 +1680,7 @@ impl Emitter for SharedEmitter {
} }
drop(self.sender.send(SharedEmitterMessage::AbortIfErrors)); drop(self.sender.send(SharedEmitterMessage::AbortIfErrors));
} }
fn source_map(&self) -> Option<&Lrc<SourceMapperDyn>> { fn source_map(&self) -> Option<&Lrc<SourceMap>> {
None None
} }
} }
Expand Down
11 changes: 6 additions & 5 deletions src/librustc_errors/annotate_snippet_emitter_writer.rs
Expand Up @@ -6,9 +6,10 @@
//! [annotate_snippets]: https://docs.rs/crate/annotate-snippets/ //! [annotate_snippets]: https://docs.rs/crate/annotate-snippets/


use syntax_pos::{SourceFile, MultiSpan, Loc}; use syntax_pos::{SourceFile, MultiSpan, Loc};
use syntax_pos::source_map::SourceMap;
use crate::{ use crate::{
Level, CodeSuggestion, Diagnostic, Emitter, Level, CodeSuggestion, Diagnostic, Emitter,
SourceMapperDyn, SubDiagnostic, DiagnosticId SubDiagnostic, DiagnosticId
}; };
use crate::emitter::FileWithAnnotatedLines; use crate::emitter::FileWithAnnotatedLines;
use rustc_data_structures::sync::Lrc; use rustc_data_structures::sync::Lrc;
Expand All @@ -20,7 +21,7 @@ use annotate_snippets::formatter::DisplayListFormatter;


/// Generates diagnostics using annotate-snippet /// Generates diagnostics using annotate-snippet
pub struct AnnotateSnippetEmitterWriter { pub struct AnnotateSnippetEmitterWriter {
source_map: Option<Lrc<SourceMapperDyn>>, source_map: Option<Lrc<SourceMap>>,
/// If true, hides the longer explanation text /// If true, hides the longer explanation text
short_message: bool, short_message: bool,
/// If true, will normalize line numbers with `LL` to prevent noise in UI test diffs. /// If true, will normalize line numbers with `LL` to prevent noise in UI test diffs.
Expand Down Expand Up @@ -49,7 +50,7 @@ impl Emitter for AnnotateSnippetEmitterWriter {
&suggestions); &suggestions);
} }


fn source_map(&self) -> Option<&Lrc<SourceMapperDyn>> { fn source_map(&self) -> Option<&Lrc<SourceMap>> {
self.source_map.as_ref() self.source_map.as_ref()
} }


Expand All @@ -61,7 +62,7 @@ impl Emitter for AnnotateSnippetEmitterWriter {
/// Collects all the data needed to generate the data structures needed for the /// Collects all the data needed to generate the data structures needed for the
/// `annotate-snippets` library. /// `annotate-snippets` library.
struct DiagnosticConverter<'a> { struct DiagnosticConverter<'a> {
source_map: Option<Lrc<SourceMapperDyn>>, source_map: Option<Lrc<SourceMap>>,
level: Level, level: Level,
message: String, message: String,
code: Option<DiagnosticId>, code: Option<DiagnosticId>,
Expand Down Expand Up @@ -168,7 +169,7 @@ impl<'a> DiagnosticConverter<'a> {


impl AnnotateSnippetEmitterWriter { impl AnnotateSnippetEmitterWriter {
pub fn new( pub fn new(
source_map: Option<Lrc<SourceMapperDyn>>, source_map: Option<Lrc<SourceMap>>,
short_message: bool, short_message: bool,
external_macro_backtrace: bool, external_macro_backtrace: bool,
) -> Self { ) -> Self {
Expand Down
25 changes: 13 additions & 12 deletions src/librustc_errors/emitter.rs
Expand Up @@ -10,10 +10,11 @@
use Destination::*; use Destination::*;


use syntax_pos::{SourceFile, Span, MultiSpan}; use syntax_pos::{SourceFile, Span, MultiSpan};
use syntax_pos::source_map::SourceMap;


use crate::{ use crate::{
Level, CodeSuggestion, Diagnostic, SubDiagnostic, pluralize, Level, CodeSuggestion, Diagnostic, SubDiagnostic, pluralize,
SuggestionStyle, SourceMapper, SourceMapperDyn, DiagnosticId, SuggestionStyle, DiagnosticId,
}; };
use crate::Level::Error; use crate::Level::Error;
use crate::snippet::{Annotation, AnnotationType, Line, MultilineAnnotation, StyledString, Style}; use crate::snippet::{Annotation, AnnotationType, Line, MultilineAnnotation, StyledString, Style};
Expand Down Expand Up @@ -49,7 +50,7 @@ impl HumanReadableErrorType {
pub fn new_emitter( pub fn new_emitter(
self, self,
dst: Box<dyn Write + Send>, dst: Box<dyn Write + Send>,
source_map: Option<Lrc<SourceMapperDyn>>, source_map: Option<Lrc<SourceMap>>,
teach: bool, teach: bool,
terminal_width: Option<usize>, terminal_width: Option<usize>,
external_macro_backtrace: bool, external_macro_backtrace: bool,
Expand Down Expand Up @@ -192,7 +193,7 @@ pub trait Emitter {
true true
} }


fn source_map(&self) -> Option<&Lrc<SourceMapperDyn>>; fn source_map(&self) -> Option<&Lrc<SourceMap>>;


/// Formats the substitutions of the primary_span /// Formats the substitutions of the primary_span
/// ///
Expand Down Expand Up @@ -271,7 +272,7 @@ pub trait Emitter {
// point directly at <*macros>. Since these are often difficult to read, this // point directly at <*macros>. Since these are often difficult to read, this
// will change the span to point at the use site. // will change the span to point at the use site.
fn fix_multispans_in_std_macros(&self, fn fix_multispans_in_std_macros(&self,
source_map: &Option<Lrc<SourceMapperDyn>>, source_map: &Option<Lrc<SourceMap>>,
span: &mut MultiSpan, span: &mut MultiSpan,
children: &mut Vec<SubDiagnostic>, children: &mut Vec<SubDiagnostic>,
level: &Level, level: &Level,
Expand Down Expand Up @@ -311,7 +312,7 @@ pub trait Emitter {
// <*macros>. Since these locations are often difficult to read, we move these Spans from // <*macros>. Since these locations are often difficult to read, we move these Spans from
// <*macros> to their corresponding use site. // <*macros> to their corresponding use site.
fn fix_multispan_in_std_macros(&self, fn fix_multispan_in_std_macros(&self,
source_map: &Option<Lrc<SourceMapperDyn>>, source_map: &Option<Lrc<SourceMap>>,
span: &mut MultiSpan, span: &mut MultiSpan,
always_backtrace: bool) -> bool { always_backtrace: bool) -> bool {
let sm = match source_map { let sm = match source_map {
Expand Down Expand Up @@ -397,7 +398,7 @@ pub trait Emitter {
} }


impl Emitter for EmitterWriter { impl Emitter for EmitterWriter {
fn source_map(&self) -> Option<&Lrc<SourceMapperDyn>> { fn source_map(&self) -> Option<&Lrc<SourceMap>> {
self.sm.as_ref() self.sm.as_ref()
} }


Expand Down Expand Up @@ -428,7 +429,7 @@ impl Emitter for EmitterWriter {
pub struct SilentEmitter; pub struct SilentEmitter;


impl Emitter for SilentEmitter { impl Emitter for SilentEmitter {
fn source_map(&self) -> Option<&Lrc<SourceMapperDyn>> { None } fn source_map(&self) -> Option<&Lrc<SourceMap>> { None }
fn emit_diagnostic(&mut self, _: &Diagnostic) {} fn emit_diagnostic(&mut self, _: &Diagnostic) {}
} }


Expand Down Expand Up @@ -476,7 +477,7 @@ impl ColorConfig {
/// Handles the writing of `HumanReadableErrorType::Default` and `HumanReadableErrorType::Short` /// Handles the writing of `HumanReadableErrorType::Default` and `HumanReadableErrorType::Short`
pub struct EmitterWriter { pub struct EmitterWriter {
dst: Destination, dst: Destination,
sm: Option<Lrc<SourceMapperDyn>>, sm: Option<Lrc<SourceMap>>,
short_message: bool, short_message: bool,
teach: bool, teach: bool,
ui_testing: bool, ui_testing: bool,
Expand All @@ -495,7 +496,7 @@ pub struct FileWithAnnotatedLines {
impl EmitterWriter { impl EmitterWriter {
pub fn stderr( pub fn stderr(
color_config: ColorConfig, color_config: ColorConfig,
source_map: Option<Lrc<SourceMapperDyn>>, source_map: Option<Lrc<SourceMap>>,
short_message: bool, short_message: bool,
teach: bool, teach: bool,
terminal_width: Option<usize>, terminal_width: Option<usize>,
Expand All @@ -515,7 +516,7 @@ impl EmitterWriter {


pub fn new( pub fn new(
dst: Box<dyn Write + Send>, dst: Box<dyn Write + Send>,
source_map: Option<Lrc<SourceMapperDyn>>, source_map: Option<Lrc<SourceMap>>,
short_message: bool, short_message: bool,
teach: bool, teach: bool,
colored: bool, colored: bool,
Expand Down Expand Up @@ -1685,7 +1686,7 @@ impl FileWithAnnotatedLines {
/// This helps us quickly iterate over the whole message (including secondary file spans) /// This helps us quickly iterate over the whole message (including secondary file spans)
pub fn collect_annotations( pub fn collect_annotations(
msp: &MultiSpan, msp: &MultiSpan,
source_map: &Option<Lrc<SourceMapperDyn>> source_map: &Option<Lrc<SourceMap>>
) -> Vec<FileWithAnnotatedLines> { ) -> Vec<FileWithAnnotatedLines> {
fn add_annotation_to_file(file_vec: &mut Vec<FileWithAnnotatedLines>, fn add_annotation_to_file(file_vec: &mut Vec<FileWithAnnotatedLines>,
file: Lrc<SourceFile>, file: Lrc<SourceFile>,
Expand Down Expand Up @@ -2067,7 +2068,7 @@ impl<'a> Drop for WritableDst<'a> {
} }


/// Whether the original and suggested code are visually similar enough to warrant extra wording. /// Whether the original and suggested code are visually similar enough to warrant extra wording.
pub fn is_case_difference(sm: &dyn SourceMapper, suggested: &str, sp: Span) -> bool { pub fn is_case_difference(sm: &SourceMap, suggested: &str, sp: Span) -> bool {
// FIXME: this should probably be extended to also account for `FO0` → `FOO` and unicode. // FIXME: this should probably be extended to also account for `FO0` → `FOO` and unicode.
let found = sm.span_to_snippet(sp).unwrap(); let found = sm.span_to_snippet(sp).unwrap();
let ascii_confusables = &['c', 'f', 'i', 'k', 'o', 's', 'u', 'v', 'w', 'x', 'y', 'z']; let ascii_confusables = &['c', 'f', 'i', 'k', 'o', 's', 'u', 'v', 'w', 'x', 'y', 'z'];
Expand Down
33 changes: 5 additions & 28 deletions src/librustc_errors/lib.rs
Expand Up @@ -18,6 +18,8 @@ use registry::Registry;
use rustc_data_structures::sync::{self, Lrc, Lock}; use rustc_data_structures::sync::{self, Lrc, Lock};
use rustc_data_structures::fx::{FxHashSet, FxIndexMap}; use rustc_data_structures::fx::{FxHashSet, FxIndexMap};
use rustc_data_structures::stable_hasher::StableHasher; use rustc_data_structures::stable_hasher::StableHasher;
use syntax_pos::source_map::SourceMap;
use syntax_pos::{Loc, Span, MultiSpan};


use std::borrow::Cow; use std::borrow::Cow;
use std::cell::Cell; use std::cell::Cell;
Expand All @@ -36,17 +38,6 @@ pub mod registry;
mod styled_buffer; mod styled_buffer;
mod lock; mod lock;


use syntax_pos::{
BytePos,
FileLinesResult,
FileName,
Loc,
MultiSpan,
SourceFile,
Span,
SpanSnippetError,
};

pub type PResult<'a, T> = Result<T, DiagnosticBuilder<'a>>; pub type PResult<'a, T> = Result<T, DiagnosticBuilder<'a>>;


// `PResult` is used a lot. Make sure it doesn't unintentionally get bigger. // `PResult` is used a lot. Make sure it doesn't unintentionally get bigger.
Expand Down Expand Up @@ -150,26 +141,12 @@ pub struct SubstitutionPart {
pub snippet: String, pub snippet: String,
} }


pub type SourceMapperDyn = dyn SourceMapper + sync::Send + sync::Sync;

pub trait SourceMapper {
fn lookup_char_pos(&self, pos: BytePos) -> Loc;
fn span_to_lines(&self, sp: Span) -> FileLinesResult;
fn span_to_string(&self, sp: Span) -> String;
fn span_to_snippet(&self, sp: Span) -> Result<String, SpanSnippetError>;
fn span_to_filename(&self, sp: Span) -> FileName;
fn merge_spans(&self, sp_lhs: Span, sp_rhs: Span) -> Option<Span>;
fn call_span_if_macro(&self, sp: Span) -> Span;
fn ensure_source_file_source_present(&self, source_file: Lrc<SourceFile>) -> bool;
fn doctest_offset_line(&self, file: &FileName, line: usize) -> usize;
}

impl CodeSuggestion { impl CodeSuggestion {
/// Returns the assembled code suggestions, whether they should be shown with an underline /// Returns the assembled code suggestions, whether they should be shown with an underline
/// and whether the substitution only differs in capitalization. /// and whether the substitution only differs in capitalization.
pub fn splice_lines( pub fn splice_lines(
&self, &self,
cm: &SourceMapperDyn, cm: &SourceMap,
) -> Vec<(String, Vec<SubstitutionPart>, bool)> { ) -> Vec<(String, Vec<SubstitutionPart>, bool)> {
use syntax_pos::{CharPos, Pos}; use syntax_pos::{CharPos, Pos};


Expand Down Expand Up @@ -376,7 +353,7 @@ impl Handler {
color_config: ColorConfig, color_config: ColorConfig,
can_emit_warnings: bool, can_emit_warnings: bool,
treat_err_as_bug: Option<usize>, treat_err_as_bug: Option<usize>,
cm: Option<Lrc<SourceMapperDyn>>, cm: Option<Lrc<SourceMap>>,
) -> Self { ) -> Self {
Self::with_tty_emitter_and_flags( Self::with_tty_emitter_and_flags(
color_config, color_config,
Expand All @@ -391,7 +368,7 @@ impl Handler {


pub fn with_tty_emitter_and_flags( pub fn with_tty_emitter_and_flags(
color_config: ColorConfig, color_config: ColorConfig,
cm: Option<Lrc<SourceMapperDyn>>, cm: Option<Lrc<SourceMap>>,
flags: HandlerFlags, flags: HandlerFlags,
) -> Self { ) -> Self {
let emitter = Box::new(EmitterWriter::stderr( let emitter = Box::new(EmitterWriter::stderr(
Expand Down
6 changes: 3 additions & 3 deletions src/libsyntax/json.rs
Expand Up @@ -12,7 +12,7 @@
use crate::source_map::{SourceMap, FilePathMapping}; use crate::source_map::{SourceMap, FilePathMapping};


use errors::registry::Registry; use errors::registry::Registry;
use errors::{SubDiagnostic, CodeSuggestion, SourceMapper, SourceMapperDyn}; use errors::{SubDiagnostic, CodeSuggestion};
use errors::{DiagnosticId, Applicability}; use errors::{DiagnosticId, Applicability};
use errors::emitter::{Emitter, HumanReadableErrorType}; use errors::emitter::{Emitter, HumanReadableErrorType};


Expand All @@ -31,7 +31,7 @@ mod tests;
pub struct JsonEmitter { pub struct JsonEmitter {
dst: Box<dyn Write + Send>, dst: Box<dyn Write + Send>,
registry: Option<Registry>, registry: Option<Registry>,
sm: Lrc<dyn SourceMapper + sync::Send + sync::Sync>, sm: Lrc<SourceMap>,
pretty: bool, pretty: bool,
ui_testing: bool, ui_testing: bool,
json_rendered: HumanReadableErrorType, json_rendered: HumanReadableErrorType,
Expand Down Expand Up @@ -116,7 +116,7 @@ impl Emitter for JsonEmitter {
} }
} }


fn source_map(&self) -> Option<&Lrc<SourceMapperDyn>> { fn source_map(&self) -> Option<&Lrc<SourceMap>> {
Some(&self.sm) Some(&self.sm)
} }


Expand Down
42 changes: 8 additions & 34 deletions src/libsyntax_pos/source_map.rs
Expand Up @@ -22,8 +22,6 @@ use std::fs;
use std::io; use std::io;
use log::debug; use log::debug;


use errors::SourceMapper;

#[cfg(test)] #[cfg(test)]
mod tests; mod tests;


Expand Down Expand Up @@ -956,28 +954,15 @@ impl SourceMap {


None None
} }
} pub fn ensure_source_file_source_present(&self, source_file: Lrc<SourceFile>) -> bool {

source_file.add_external_src(
impl SourceMapper for SourceMap { || match source_file.name {
fn lookup_char_pos(&self, pos: BytePos) -> Loc { FileName::Real(ref name) => self.file_loader.read_file(name).ok(),
self.lookup_char_pos(pos) _ => None,
} }
fn span_to_lines(&self, sp: Span) -> FileLinesResult { )
self.span_to_lines(sp)
}
fn span_to_string(&self, sp: Span) -> String {
self.span_to_string(sp)
}
fn span_to_snippet(&self, sp: Span) -> Result<String, SpanSnippetError> {
self.span_to_snippet(sp)
}
fn span_to_filename(&self, sp: Span) -> FileName {
self.span_to_filename(sp)
}
fn merge_spans(&self, sp_lhs: Span, sp_rhs: Span) -> Option<Span> {
self.merge_spans(sp_lhs, sp_rhs)
} }
fn call_span_if_macro(&self, sp: Span) -> Span { pub fn call_span_if_macro(&self, sp: Span) -> Span {
if self.span_to_filename(sp.clone()).is_macros() { if self.span_to_filename(sp.clone()).is_macros() {
let v = sp.macro_backtrace(); let v = sp.macro_backtrace();
if let Some(use_site) = v.last() { if let Some(use_site) = v.last() {
Expand All @@ -986,17 +971,6 @@ impl SourceMapper for SourceMap {
} }
sp sp
} }
fn ensure_source_file_source_present(&self, source_file: Lrc<SourceFile>) -> bool {
source_file.add_external_src(
|| match source_file.name {
FileName::Real(ref name) => self.file_loader.read_file(name).ok(),
_ => None,
}
)
}
fn doctest_offset_line(&self, file: &FileName, line: usize) -> usize {
self.doctest_offset_line(file, line)
}
} }


#[derive(Clone)] #[derive(Clone)]
Expand Down

0 comments on commit 3f93ffc

Please sign in to comment.