//! 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>>) {
for ranges in ranges.values_mut() {
ranges.sort();
let mut result = vec![];
- {
- let mut iter = ranges.iter_mut().peekable();
- while let Some(next) = iter.next() {
- let mut next = *next;
- while let Some(&&mut peek) = iter.peek() {
- if let Some(merged) = next.merge(peek) {
- iter.next().unwrap();
- next = merged;
- } else {
- break;
- }
+ let mut iter = ranges.iter_mut().peekable();
+ while let Some(next) = iter.next() {
+ let mut next = *next;
+ while let Some(&&mut peek) = iter.peek() {
+ if let Some(merged) = next.merge(peek) {
+ iter.next().unwrap();
+ next = merged;
+ } else {
+ break;
}
- result.push(next)
}
+ result.push(next)
}
*ranges = result;
}
/// Returns an iterator over the files contained in `self`.
pub fn files(&self) -> Files<'_> {
- Files(self.0.as_ref().map(|m| m.keys()))
+ Files(self.0.as_ref().map(HashMap::keys))
}
/// Returns JSON representation as accepted by the `--file-lines JSON` arg.