//! This module contains types and functions to support formatting specific line ranges.
+use itertools::Itertools;
use std::collections::HashMap;
use std::path::PathBuf;
use std::rc::Rc;
use std::{cmp, fmt, iter, str};
+use rustc_span::{self, SourceFile};
use serde::{ser, Deserialize, Deserializer, Serialize, Serializer};
use serde_json as json;
-use syntax::source_map::{self, SourceFile};
-
/// A range of lines in a file, inclusive of both ends.
pub struct LineRange {
pub file: Rc<SourceFile>,
Stdin,
}
-impl From<source_map::FileName> for FileName {
- fn from(name: source_map::FileName) -> FileName {
+impl From<rustc_span::FileName> for FileName {
+ fn from(name: rustc_span::FileName) -> FileName {
match name {
- source_map::FileName::Real(p) => FileName::Real(p),
- source_map::FileName::Custom(ref f) if f == "stdin" => FileName::Stdin,
+ rustc_span::FileName::Real(p) => FileName::Real(p.into_local_path()),
+ rustc_span::FileName::Custom(ref f) if f == "stdin" => FileName::Stdin,
_ => unreachable!(),
}
}
}
}
+impl fmt::Display for Range {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "{}..{}", self.lo, self.hi)
+ }
+}
+
impl Range {
pub fn new(lo: usize, hi: usize) -> Range {
Range { lo, hi }
#[derive(Clone, Debug, Default, PartialEq)]
pub struct FileLines(Option<HashMap<FileName, Vec<Range>>>);
+impl fmt::Display for FileLines {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match &self.0 {
+ None => write!(f, "None")?,
+ Some(map) => {
+ for (file_name, ranges) in map.iter() {
+ write!(f, "{}: ", file_name)?;
+ write!(f, "{}\n", ranges.iter().format(", "))?;
+ }
+ }
+ };
+ Ok(())
+ }
+}
+
/// Normalizes the ranges so that the invariants for `FileLines` hold: ranges are non-overlapping,
/// and ordered by their start point.
fn normalize_ranges(ranges: &mut HashMap<FileName, Vec<Range>>) {