//! 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 serde::de::{Deserialize, Deserializer};
-use serde::ser::{self, Serialize, Serializer};
+use serde::{ser, Deserialize, Deserializer, Serialize, Serializer};
use serde_json as json;
use syntax::source_map::{self, SourceFile};
}
}
+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>>) {