Simplified change newline handling

This commit is contained in:
Armin Ronacher 2021-02-02 22:54:22 +01:00
parent 1991955c52
commit d4495038a3
8 changed files with 6 additions and 81 deletions

View file

@ -99,7 +99,6 @@ pub struct InlineChange<'s, T: DiffableStr + ?Sized> {
old_index: Option<usize>, old_index: Option<usize>,
new_index: Option<usize>, new_index: Option<usize>,
values: Vec<(bool, &'s T)>, values: Vec<(bool, &'s T)>,
missing_newline: bool,
} }
impl<'s, T: DiffableStr + ?Sized> InlineChange<'s, T> { 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 /// Returns `true` if this change needs to be followed up by a
/// missing newline. /// missing newline.
pub fn missing_newline(&self) -> bool { 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<Change<'s, T>> for InlineChange<'s, T> {
old_index: change.old_index(), old_index: change.old_index(),
new_index: change.new_index(), new_index: change.new_index(),
values: vec![(false, change.value())], 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)?; write!(f, "{}{}{}", marker, value, marker)?;
} }
if self.missing_newline { if self.missing_newline() {
writeln!(f)?; writeln!(f)?;
} }
Ok(()) Ok(())
@ -183,7 +181,6 @@ pub(crate) fn iter_inline_changes<'diff, T>(
where where
T: DiffableStr + ?Sized, T: DiffableStr + ?Sized,
{ {
let newline_terminated = diff.newline_terminated;
let (tag, old_range, new_range) = op.as_tag_tuple(); let (tag, old_range, new_range) = op.as_tag_tuple();
if let DiffTag::Equal | DiffTag::Insert | DiffTag::Delete = tag { if let DiffTag::Equal | DiffTag::Insert | DiffTag::Delete = tag {
@ -264,40 +261,20 @@ where
old_index: Some(old_index), old_index: Some(old_index),
new_index: None, new_index: None,
values, values,
missing_newline: false,
}); });
old_index += 1; 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 { for values in new_values {
rv.push(InlineChange { rv.push(InlineChange {
tag: ChangeTag::Insert, tag: ChangeTag::Insert,
old_index: None, old_index: None,
new_index: Some(new_index), new_index: Some(new_index),
values, values,
missing_newline: false,
}); });
new_index += 1; 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<dyn Iterator<Item = _>> Box::new(rv.into_iter()) as Box<dyn Iterator<Item = _>>
} }

View file

@ -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 /// up the value from the appropriate slice and also handle correct index
/// handling. /// handling.
pub fn iter_changes(&self, op: &DiffOp) -> impl Iterator<Item = Change<'_, T>> { pub fn iter_changes(&self, op: &DiffOp) -> impl Iterator<Item = Change<'_, T>> {
let newline_terminated = self.newline_terminated;
let (tag, old_range, new_range) = op.as_tag_tuple(); let (tag, old_range, new_range) = op.as_tag_tuple();
let mut old_index = old_range.start; let mut old_index = old_range.start;
let mut new_index = new_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), old_index: Some(old_index - 1),
new_index: Some(new_index - 1), new_index: Some(new_index - 1),
value: first, value: first,
missing_newline: newline_terminated
&& rest.is_empty()
&& !first.ends_with_newline(),
}) })
} else { } else {
None None
@ -409,9 +405,6 @@ impl<'old, 'new, 'bufs, T: DiffableStr + ?Sized + 'old + 'new> TextDiff<'old, 'n
old_index: Some(old_index - 1), old_index: Some(old_index - 1),
new_index: None, new_index: None,
value: first, value: first,
missing_newline: newline_terminated
&& rest.is_empty()
&& !first.ends_with_newline(),
}) })
} else { } else {
None None
@ -426,9 +419,6 @@ impl<'old, 'new, 'bufs, T: DiffableStr + ?Sized + 'old + 'new> TextDiff<'old, 'n
old_index: None, old_index: None,
new_index: Some(new_index - 1), new_index: Some(new_index - 1),
value: first, value: first,
missing_newline: newline_terminated
&& rest.is_empty()
&& !first.ends_with_newline(),
}) })
} else { } else {
None None
@ -443,9 +433,6 @@ impl<'old, 'new, 'bufs, T: DiffableStr + ?Sized + 'old + 'new> TextDiff<'old, 'n
old_index: Some(old_index - 1), old_index: Some(old_index - 1),
new_index: None, new_index: None,
value: first, value: first,
missing_newline: newline_terminated
&& rest.is_empty()
&& !first.ends_with_newline(),
}) })
} else if let Some((&first, rest)) = new_slices.split_first() { } else if let Some((&first, rest)) = new_slices.split_first() {
new_slices = rest; new_slices = rest;
@ -455,9 +442,6 @@ impl<'old, 'new, 'bufs, T: DiffableStr + ?Sized + 'old + 'new> TextDiff<'old, 'n
old_index: None, old_index: None,
new_index: Some(new_index - 1), new_index: Some(new_index - 1),
value: first, value: first,
missing_newline: newline_terminated
&& rest.is_empty()
&& !first.ends_with_newline(),
}) })
} else { } else {
None None

View file

@ -12,7 +12,6 @@ expression: "&changes"
0, 0,
), ),
value: "Hello", value: "Hello",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -23,7 +22,6 @@ expression: "&changes"
1, 1,
), ),
value: " ", value: " ",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -34,7 +32,6 @@ expression: "&changes"
2, 2,
), ),
value: "World", value: "World",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -45,7 +42,6 @@ expression: "&changes"
3, 3,
), ),
value: "\n", value: "\n",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -56,7 +52,6 @@ expression: "&changes"
4, 4,
), ),
value: "some", value: "some",
missing_newline: false,
}, },
Change { Change {
tag: Insert, tag: Insert,
@ -65,7 +60,6 @@ expression: "&changes"
5, 5,
), ),
value: " ", value: " ",
missing_newline: false,
}, },
Change { Change {
tag: Insert, tag: Insert,
@ -74,7 +68,6 @@ expression: "&changes"
6, 6,
), ),
value: "amazing", value: "amazing",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -85,7 +78,6 @@ expression: "&changes"
7, 7,
), ),
value: " ", value: " ",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -96,7 +88,6 @@ expression: "&changes"
8, 8,
), ),
value: "stuff", value: "stuff",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -107,7 +98,6 @@ expression: "&changes"
9, 9,
), ),
value: " ", value: " ",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -118,7 +108,6 @@ expression: "&changes"
10, 10,
), ),
value: "here", value: "here",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -129,7 +118,6 @@ expression: "&changes"
11, 11,
), ),
value: "\n", value: "\n",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -140,7 +128,6 @@ expression: "&changes"
12, 12,
), ),
value: "some", value: "some",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -151,7 +138,6 @@ expression: "&changes"
13, 13,
), ),
value: " ", value: " ",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -162,7 +148,6 @@ expression: "&changes"
14, 14,
), ),
value: "more", value: "more",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -173,7 +158,6 @@ expression: "&changes"
15, 15,
), ),
value: " ", value: " ",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -184,7 +168,6 @@ expression: "&changes"
16, 16,
), ),
value: "stuff", value: "stuff",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -195,7 +178,6 @@ expression: "&changes"
17, 17,
), ),
value: " ", value: " ",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -206,7 +188,6 @@ expression: "&changes"
18, 18,
), ),
value: "here", value: "here",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -217,6 +198,5 @@ expression: "&changes"
19, 19,
), ),
value: "\n", value: "\n",
missing_newline: false,
}, },
] ]

View file

@ -15,7 +15,6 @@ expression: "&changes"
"Stuff\n", "Stuff\n",
), ),
], ],
missing_newline: false,
}, },
InlineChange { InlineChange {
tag: Equal, tag: Equal,
@ -31,7 +30,6 @@ expression: "&changes"
"Hello World\n", "Hello World\n",
), ),
], ],
missing_newline: false,
}, },
InlineChange { InlineChange {
tag: Delete, tag: Delete,
@ -49,7 +47,6 @@ expression: "&changes"
"stuff here\n", "stuff here\n",
), ),
], ],
missing_newline: false,
}, },
InlineChange { InlineChange {
tag: Insert, tag: Insert,
@ -71,7 +68,6 @@ expression: "&changes"
"stuff here\n", "stuff here\n",
), ),
], ],
missing_newline: false,
}, },
InlineChange { InlineChange {
tag: Equal, tag: Equal,
@ -87,7 +83,6 @@ expression: "&changes"
"some more stuff here\n", "some more stuff here\n",
), ),
], ],
missing_newline: false,
}, },
InlineChange { InlineChange {
tag: Delete, tag: Delete,
@ -101,7 +96,6 @@ expression: "&changes"
"\n", "\n",
), ),
], ],
missing_newline: false,
}, },
InlineChange { InlineChange {
tag: Delete, tag: Delete,
@ -115,7 +109,6 @@ expression: "&changes"
"Aha stuff here\n", "Aha stuff here\n",
), ),
], ],
missing_newline: false,
}, },
InlineChange { InlineChange {
tag: Delete, tag: Delete,
@ -129,6 +122,5 @@ expression: "&changes"
"and more stuff", "and more stuff",
), ),
], ],
missing_newline: true,
}, },
] ]

View file

@ -12,7 +12,6 @@ expression: "&changes"
0, 0,
), ),
value: "Hello World\n", value: "Hello World\n",
missing_newline: false,
}, },
Change { Change {
tag: Delete, tag: Delete,
@ -21,7 +20,6 @@ expression: "&changes"
), ),
new_index: None, new_index: None,
value: "some stuff here\n", value: "some stuff here\n",
missing_newline: false,
}, },
Change { Change {
tag: Insert, tag: Insert,
@ -30,7 +28,6 @@ expression: "&changes"
1, 1,
), ),
value: "some amazing stuff here\n", value: "some amazing stuff here\n",
missing_newline: false,
}, },
Change { Change {
tag: Equal, tag: Equal,
@ -41,6 +38,5 @@ expression: "&changes"
2, 2,
), ),
value: "some more stuff here\n", value: "some more stuff here\n",
missing_newline: false,
}, },
] ]

View file

@ -12,7 +12,6 @@ expression: "&changes"
0, 0,
), ),
value: "a\n", value: "a\n",
missing_newline: false,
}, },
Change { Change {
tag: Delete, tag: Delete,
@ -21,7 +20,6 @@ expression: "&changes"
), ),
new_index: None, new_index: None,
value: "b", value: "b",
missing_newline: true,
}, },
Change { Change {
tag: Insert, tag: Insert,
@ -30,6 +28,5 @@ expression: "&changes"
1, 1,
), ),
value: "c\n", value: "c\n",
missing_newline: false,
}, },
] ]

View file

@ -258,7 +258,7 @@ impl<'diff, 'old, 'new, 'bufs, T: DiffableStr + ?Sized>
if !self.diff.newline_terminated() { if !self.diff.newline_terminated() {
writeln!(w)?; writeln!(w)?;
} }
if change.missing_newline() { if self.diff.newline_terminated() && change.missing_newline() {
writeln!(w, "{}", MissingNewlineHint(self.missing_newline_hint))?; 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() { if !self.diff.newline_terminated() {
writeln!(f)?; writeln!(f)?;
} }
if change.missing_newline() { if self.diff.newline_terminated() && change.missing_newline() {
writeln!(f, "{}", MissingNewlineHint(self.missing_newline_hint))?; writeln!(f, "{}", MissingNewlineHint(self.missing_newline_hint))?;
} }
} }

View file

@ -55,7 +55,6 @@ pub struct Change<'s, T: ?Sized> {
pub(crate) old_index: Option<usize>, pub(crate) old_index: Option<usize>,
pub(crate) new_index: Option<usize>, pub(crate) new_index: Option<usize>,
pub(crate) value: &'s T, pub(crate) value: &'s T,
pub(crate) missing_newline: bool,
} }
impl<'s, T: ?Sized> Change<'s, T> { impl<'s, T: ?Sized> Change<'s, T> {
@ -261,7 +260,7 @@ mod text_additions {
/// The [`std::fmt::Display`] implementation of [`Change`] will automatically /// The [`std::fmt::Display`] implementation of [`Change`] will automatically
/// insert a newline after the value if this is true. /// insert a newline after the value if this is true.
pub fn missing_newline(&self) -> bool { pub fn missing_newline(&self) -> bool {
self.missing_newline !T::ends_with_newline(self.value)
} }
} }
@ -271,7 +270,7 @@ mod text_additions {
f, f,
"{}{}", "{}{}",
self.to_string_lossy(), self.to_string_lossy(),
if self.missing_newline { "\n" } else { "" } if self.missing_newline() { "\n" } else { "" }
) )
} }
} }