]> git.lizzy.rs Git - rust.git/blobdiff - src/config/file_lines.rs
Release v1.4.2
[rust.git] / src / config / file_lines.rs
index c085a0b5deb6aaca672b69e60b2e3e2fc1676629..f0dc6c66597033b7a0a6fb8b03729668beee9e5f 100644 (file)
@@ -1,12 +1,12 @@
 //! 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};
@@ -93,6 +93,12 @@ fn from(range: &'a LineRange) -> Range {
     }
 }
 
+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 }
@@ -150,26 +156,39 @@ fn merge(self, other: Range) -> Option<Range> {
 #[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;
     }
@@ -193,7 +212,7 @@ pub fn from_ranges(mut ranges: HashMap<FileName, Vec<Range>>) -> FileLines {
 
     /// 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.