about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorJonathan Behrens <fintelia@gmail.com>2017-05-06 17:59:51 -0400
committerJonathan Behrens <fintelia@gmail.com>2017-05-06 17:59:51 -0400
commitb1c9832c9b54e75141501b691844bdfd37cde7cb (patch)
tree12311ac8d24980865a83f892b628a554e7f4b035 /src
parent7c6479358bb562094de8a932c941254b5e31f210 (diff)
Respect file_lines within write_snippet() function
Diffstat (limited to 'src')
-rw-r--r--src/file_lines.rs14
-rw-r--r--src/missed_spans.rs24
2 files changed, 36 insertions, 2 deletions
diff --git a/src/file_lines.rs b/src/file_lines.rs
index 3db75e1ce7e..ea3d63feb92 100644
--- a/src/file_lines.rs
+++ b/src/file_lines.rs
@@ -158,6 +158,20 @@ impl FileLines {
             Err(_) => false,
         }
     }
+
+    pub fn intersects_range(&self, file_name: &str, lo: usize, hi: usize) -> bool {
+        let map = match self.0 {
+            // `None` means "all lines in all files".
+            None => return true,
+            Some(ref map) => map,
+        };
+
+        match canonicalize_path_string(file_name)
+                  .and_then(|canonical| map.get_vec(&canonical).ok_or(())) {
+            Ok(ranges) => ranges.iter().any(|r| r.intersects(Range::new(lo, hi))),
+            Err(_) => false,
+        }
+    }
 }
 
 /// FileLines files iterator.
diff --git a/src/missed_spans.rs b/src/missed_spans.rs
index c0f04f56e15..aef158199ba 100644
--- a/src/missed_spans.rs
+++ b/src/missed_spans.rs
@@ -83,17 +83,18 @@ impl<'a> FmtVisitor<'a> {
         let big_snippet = &local_begin.fm.src.as_ref().unwrap()[start_index..end_index];
 
         let big_diff = (span.lo - big_span_lo).to_usize();
-        let snippet = self.snippet(span);
+        let snippet = self.snippet(span.clone());
 
         debug!("write_snippet `{}`", snippet);
 
-        self.write_snippet_inner(big_snippet, big_diff, &snippet, process_last_snippet);
+        self.write_snippet_inner(big_snippet, big_diff, &snippet, span, process_last_snippet);
     }
 
     fn write_snippet_inner<F>(&mut self,
                               big_snippet: &str,
                               big_diff: usize,
                               old_snippet: &str,
+                              span: Span,
                               process_last_snippet: F)
         where F: Fn(&mut FmtVisitor, &str, &str)
     {
@@ -104,6 +105,10 @@ impl<'a> FmtVisitor<'a> {
         let mut last_wspace = None;
         let mut rewrite_next_comment = true;
 
+        let char_pos = self.codemap.lookup_char_pos(span.lo);
+        let file_name = &char_pos.file.name;
+        let mut cur_line = char_pos.line;
+
         fn replace_chars(string: &str) -> String {
             string
                 .chars()
@@ -129,6 +134,15 @@ impl<'a> FmtVisitor<'a> {
 
                 let fix_indent = last_char.map_or(true, |rev_c| ['{', '\n'].contains(&rev_c));
 
+                let subslice_num_lines = subslice.chars().filter(|c| *c == '\n').count();
+
+                if rewrite_next_comment &&
+                   !self.config
+                        .file_lines
+                        .intersects_range(file_name, cur_line, cur_line + subslice_num_lines) {
+                    rewrite_next_comment = false;
+                }
+
                 if rewrite_next_comment {
                     if fix_indent {
                         if let Some('{') = last_char {
@@ -172,6 +186,7 @@ impl<'a> FmtVisitor<'a> {
                         }
                     }
 
+                    cur_line += subslice_num_lines;
                     continue;
                 } else {
                     rewrite_next_comment = false;
@@ -182,6 +197,10 @@ impl<'a> FmtVisitor<'a> {
                 i += offset;
 
                 if c == '\n' {
+                    if !self.config.file_lines.contains_line(file_name, cur_line) {
+                        last_wspace = None;
+                    }
+
                     if let Some(lw) = last_wspace {
                         self.buffer.push_str(&snippet[line_start..lw]);
                         self.buffer.push_str("\n");
@@ -189,6 +208,7 @@ impl<'a> FmtVisitor<'a> {
                         self.buffer.push_str(&snippet[line_start..i + 1]);
                     }
 
+                    cur_line += 1;
                     line_start = i + 1;
                     last_wspace = None;
                     rewrite_next_comment = rewrite_next_comment || kind == CodeCharKind::Normal;