diff options
| author | Jonathan Behrens <fintelia@gmail.com> | 2017-05-06 17:59:51 -0400 |
|---|---|---|
| committer | Jonathan Behrens <fintelia@gmail.com> | 2017-05-06 17:59:51 -0400 |
| commit | b1c9832c9b54e75141501b691844bdfd37cde7cb (patch) | |
| tree | 12311ac8d24980865a83f892b628a554e7f4b035 /src | |
| parent | 7c6479358bb562094de8a932c941254b5e31f210 (diff) | |
Respect file_lines within write_snippet() function
Diffstat (limited to 'src')
| -rw-r--r-- | src/file_lines.rs | 14 | ||||
| -rw-r--r-- | src/missed_spans.rs | 24 |
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; |
