diff --git a/src/text/inline.rs b/src/text/inline.rs index 4ed02ac..d518f0e 100644 --- a/src/text/inline.rs +++ b/src/text/inline.rs @@ -99,7 +99,6 @@ pub struct InlineChange<'s, T: DiffableStr + ?Sized> { old_index: Option, new_index: Option, values: Vec<(bool, &'s T)>, - missing_newline: bool, } impl<'s, T: DiffableStr + ?Sized> InlineChange<'s, T> { @@ -143,7 +142,7 @@ impl<'s, T: DiffableStr + ?Sized> InlineChange<'s, T> { /// Returns `true` if this change needs to be followed up by a /// missing newline. pub fn missing_newline(&self) -> bool { - self.missing_newline + !self.values.last().map_or(true, |x| x.1.ends_with_newline()) } } @@ -154,7 +153,6 @@ impl<'s, T: DiffableStr + ?Sized> From> for InlineChange<'s, T> { old_index: change.old_index(), new_index: change.new_index(), values: vec![(false, change.value())], - missing_newline: change.missing_newline(), } } } @@ -169,7 +167,7 @@ impl<'s, T: DiffableStr + ?Sized> fmt::Display for InlineChange<'s, T> { }; write!(f, "{}{}{}", marker, value, marker)?; } - if self.missing_newline { + if self.missing_newline() { writeln!(f)?; } Ok(()) @@ -183,7 +181,6 @@ pub(crate) fn iter_inline_changes<'diff, T>( where T: DiffableStr + ?Sized, { - let newline_terminated = diff.newline_terminated; let (tag, old_range, new_range) = op.as_tag_tuple(); if let DiffTag::Equal | DiffTag::Insert | DiffTag::Delete = tag { @@ -264,40 +261,20 @@ where old_index: Some(old_index), new_index: None, values, - missing_newline: false, }); old_index += 1; } - if newline_terminated - && !old_slices.is_empty() - && !old_slices[old_slices.len() - 1].ends_with_newline() - { - if let Some(last) = rv.last_mut() { - last.missing_newline = true; - } - } - for values in new_values { rv.push(InlineChange { tag: ChangeTag::Insert, old_index: None, new_index: Some(new_index), values, - missing_newline: false, }); new_index += 1; } - if newline_terminated - && !new_slices.is_empty() - && !new_slices[new_slices.len() - 1].ends_with_newline() - { - if let Some(last) = rv.last_mut() { - last.missing_newline = true; - } - } - Box::new(rv.into_iter()) as Box> } diff --git a/src/text/mod.rs b/src/text/mod.rs index b8b19aa..0bb598f 100644 --- a/src/text/mod.rs +++ b/src/text/mod.rs @@ -374,7 +374,6 @@ impl<'old, 'new, 'bufs, T: DiffableStr + ?Sized + 'old + 'new> TextDiff<'old, 'n /// up the value from the appropriate slice and also handle correct index /// handling. pub fn iter_changes(&self, op: &DiffOp) -> impl Iterator> { - let newline_terminated = self.newline_terminated; let (tag, old_range, new_range) = op.as_tag_tuple(); let mut old_index = old_range.start; let mut new_index = new_range.start; @@ -392,9 +391,6 @@ impl<'old, 'new, 'bufs, T: DiffableStr + ?Sized + 'old + 'new> TextDiff<'old, 'n old_index: Some(old_index - 1), new_index: Some(new_index - 1), value: first, - missing_newline: newline_terminated - && rest.is_empty() - && !first.ends_with_newline(), }) } else { None @@ -409,9 +405,6 @@ impl<'old, 'new, 'bufs, T: DiffableStr + ?Sized + 'old + 'new> TextDiff<'old, 'n old_index: Some(old_index - 1), new_index: None, value: first, - missing_newline: newline_terminated - && rest.is_empty() - && !first.ends_with_newline(), }) } else { None @@ -426,9 +419,6 @@ impl<'old, 'new, 'bufs, T: DiffableStr + ?Sized + 'old + 'new> TextDiff<'old, 'n old_index: None, new_index: Some(new_index - 1), value: first, - missing_newline: newline_terminated - && rest.is_empty() - && !first.ends_with_newline(), }) } else { None @@ -443,9 +433,6 @@ impl<'old, 'new, 'bufs, T: DiffableStr + ?Sized + 'old + 'new> TextDiff<'old, 'n old_index: Some(old_index - 1), new_index: None, value: first, - missing_newline: newline_terminated - && rest.is_empty() - && !first.ends_with_newline(), }) } else if let Some((&first, rest)) = new_slices.split_first() { new_slices = rest; @@ -455,9 +442,6 @@ impl<'old, 'new, 'bufs, T: DiffableStr + ?Sized + 'old + 'new> TextDiff<'old, 'n old_index: None, new_index: Some(new_index - 1), value: first, - missing_newline: newline_terminated - && rest.is_empty() - && !first.ends_with_newline(), }) } else { None diff --git a/src/text/snapshots/similar__text__captured_word_ops.snap b/src/text/snapshots/similar__text__captured_word_ops.snap index df27ad2..203ee83 100644 --- a/src/text/snapshots/similar__text__captured_word_ops.snap +++ b/src/text/snapshots/similar__text__captured_word_ops.snap @@ -12,7 +12,6 @@ expression: "&changes" 0, ), value: "Hello", - missing_newline: false, }, Change { tag: Equal, @@ -23,7 +22,6 @@ expression: "&changes" 1, ), value: " ", - missing_newline: false, }, Change { tag: Equal, @@ -34,7 +32,6 @@ expression: "&changes" 2, ), value: "World", - missing_newline: false, }, Change { tag: Equal, @@ -45,7 +42,6 @@ expression: "&changes" 3, ), value: "\n", - missing_newline: false, }, Change { tag: Equal, @@ -56,7 +52,6 @@ expression: "&changes" 4, ), value: "some", - missing_newline: false, }, Change { tag: Insert, @@ -65,7 +60,6 @@ expression: "&changes" 5, ), value: " ", - missing_newline: false, }, Change { tag: Insert, @@ -74,7 +68,6 @@ expression: "&changes" 6, ), value: "amazing", - missing_newline: false, }, Change { tag: Equal, @@ -85,7 +78,6 @@ expression: "&changes" 7, ), value: " ", - missing_newline: false, }, Change { tag: Equal, @@ -96,7 +88,6 @@ expression: "&changes" 8, ), value: "stuff", - missing_newline: false, }, Change { tag: Equal, @@ -107,7 +98,6 @@ expression: "&changes" 9, ), value: " ", - missing_newline: false, }, Change { tag: Equal, @@ -118,7 +108,6 @@ expression: "&changes" 10, ), value: "here", - missing_newline: false, }, Change { tag: Equal, @@ -129,7 +118,6 @@ expression: "&changes" 11, ), value: "\n", - missing_newline: false, }, Change { tag: Equal, @@ -140,7 +128,6 @@ expression: "&changes" 12, ), value: "some", - missing_newline: false, }, Change { tag: Equal, @@ -151,7 +138,6 @@ expression: "&changes" 13, ), value: " ", - missing_newline: false, }, Change { tag: Equal, @@ -162,7 +148,6 @@ expression: "&changes" 14, ), value: "more", - missing_newline: false, }, Change { tag: Equal, @@ -173,7 +158,6 @@ expression: "&changes" 15, ), value: " ", - missing_newline: false, }, Change { tag: Equal, @@ -184,7 +168,6 @@ expression: "&changes" 16, ), value: "stuff", - missing_newline: false, }, Change { tag: Equal, @@ -195,7 +178,6 @@ expression: "&changes" 17, ), value: " ", - missing_newline: false, }, Change { tag: Equal, @@ -206,7 +188,6 @@ expression: "&changes" 18, ), value: "here", - missing_newline: false, }, Change { tag: Equal, @@ -217,6 +198,5 @@ expression: "&changes" 19, ), value: "\n", - missing_newline: false, }, ] diff --git a/src/text/snapshots/similar__text__inline__line_ops_inline.snap b/src/text/snapshots/similar__text__inline__line_ops_inline.snap index 4870e2d..2133460 100644 --- a/src/text/snapshots/similar__text__inline__line_ops_inline.snap +++ b/src/text/snapshots/similar__text__inline__line_ops_inline.snap @@ -15,7 +15,6 @@ expression: "&changes" "Stuff\n", ), ], - missing_newline: false, }, InlineChange { tag: Equal, @@ -31,7 +30,6 @@ expression: "&changes" "Hello World\n", ), ], - missing_newline: false, }, InlineChange { tag: Delete, @@ -49,7 +47,6 @@ expression: "&changes" "stuff here\n", ), ], - missing_newline: false, }, InlineChange { tag: Insert, @@ -71,7 +68,6 @@ expression: "&changes" "stuff here\n", ), ], - missing_newline: false, }, InlineChange { tag: Equal, @@ -87,7 +83,6 @@ expression: "&changes" "some more stuff here\n", ), ], - missing_newline: false, }, InlineChange { tag: Delete, @@ -101,7 +96,6 @@ expression: "&changes" "\n", ), ], - missing_newline: false, }, InlineChange { tag: Delete, @@ -115,7 +109,6 @@ expression: "&changes" "Aha stuff here\n", ), ], - missing_newline: false, }, InlineChange { tag: Delete, @@ -129,6 +122,5 @@ expression: "&changes" "and more stuff", ), ], - missing_newline: true, }, ] diff --git a/src/text/snapshots/similar__text__line_ops.snap b/src/text/snapshots/similar__text__line_ops.snap index 2ad65be..f187259 100644 --- a/src/text/snapshots/similar__text__line_ops.snap +++ b/src/text/snapshots/similar__text__line_ops.snap @@ -12,7 +12,6 @@ expression: "&changes" 0, ), value: "Hello World\n", - missing_newline: false, }, Change { tag: Delete, @@ -21,7 +20,6 @@ expression: "&changes" ), new_index: None, value: "some stuff here\n", - missing_newline: false, }, Change { tag: Insert, @@ -30,7 +28,6 @@ expression: "&changes" 1, ), value: "some amazing stuff here\n", - missing_newline: false, }, Change { tag: Equal, @@ -41,6 +38,5 @@ expression: "&changes" 2, ), value: "some more stuff here\n", - missing_newline: false, }, ] diff --git a/src/text/snapshots/similar__text__virtual_newlines.snap b/src/text/snapshots/similar__text__virtual_newlines.snap index d4882cf..a3915a8 100644 --- a/src/text/snapshots/similar__text__virtual_newlines.snap +++ b/src/text/snapshots/similar__text__virtual_newlines.snap @@ -12,7 +12,6 @@ expression: "&changes" 0, ), value: "a\n", - missing_newline: false, }, Change { tag: Delete, @@ -21,7 +20,6 @@ expression: "&changes" ), new_index: None, value: "b", - missing_newline: true, }, Change { tag: Insert, @@ -30,6 +28,5 @@ expression: "&changes" 1, ), value: "c\n", - missing_newline: false, }, ] diff --git a/src/text/udiff.rs b/src/text/udiff.rs index 3c2d50e..f1d0ff9 100644 --- a/src/text/udiff.rs +++ b/src/text/udiff.rs @@ -258,7 +258,7 @@ impl<'diff, 'old, 'new, 'bufs, T: DiffableStr + ?Sized> if !self.diff.newline_terminated() { writeln!(w)?; } - if change.missing_newline() { + if self.diff.newline_terminated() && change.missing_newline() { writeln!(w, "{}", MissingNewlineHint(self.missing_newline_hint))?; } } @@ -278,7 +278,7 @@ impl<'diff, 'old, 'new, 'bufs, T: DiffableStr + ?Sized> fmt::Display if !self.diff.newline_terminated() { writeln!(f)?; } - if change.missing_newline() { + if self.diff.newline_terminated() && change.missing_newline() { writeln!(f, "{}", MissingNewlineHint(self.missing_newline_hint))?; } } diff --git a/src/types.rs b/src/types.rs index 23c1cc3..147a18c 100644 --- a/src/types.rs +++ b/src/types.rs @@ -55,7 +55,6 @@ pub struct Change<'s, T: ?Sized> { pub(crate) old_index: Option, pub(crate) new_index: Option, pub(crate) value: &'s T, - pub(crate) missing_newline: bool, } impl<'s, T: ?Sized> Change<'s, T> { @@ -261,7 +260,7 @@ mod text_additions { /// The [`std::fmt::Display`] implementation of [`Change`] will automatically /// insert a newline after the value if this is true. pub fn missing_newline(&self) -> bool { - self.missing_newline + !T::ends_with_newline(self.value) } } @@ -271,7 +270,7 @@ mod text_additions { f, "{}{}", self.to_string_lossy(), - if self.missing_newline { "\n" } else { "" } + if self.missing_newline() { "\n" } else { "" } ) } }