forked from mirrors/jj
diff: extract helper that returns texts between two UnchangedRanges
This commit is contained in:
parent
055f15b6a8
commit
e28fdac48e
1 changed files with 21 additions and 13 deletions
|
@ -555,6 +555,21 @@ impl<'input> Diff<'input> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns contents between the `previous` ends and the `current` starts.
|
||||||
|
fn hunk_between<'a>(
|
||||||
|
&'a self,
|
||||||
|
previous: &'a UnchangedRange,
|
||||||
|
current: &'a UnchangedRange,
|
||||||
|
) -> impl Iterator<Item = &'input BStr> + 'a {
|
||||||
|
itertools::chain(
|
||||||
|
iter::once(&self.base_input[previous.base.end..current.base.start]),
|
||||||
|
(0..current.offsets.len()).map(|i| {
|
||||||
|
let changed_range = previous.end(i)..current.start(i);
|
||||||
|
&self.other_inputs[i][changed_range]
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
/// Uses the given tokenizer to split the changed regions into smaller
|
/// Uses the given tokenizer to split the changed regions into smaller
|
||||||
/// regions. Then tries to finds unchanged regions among them.
|
/// regions. Then tries to finds unchanged regions among them.
|
||||||
pub fn refine_changed_regions(&mut self, tokenizer: impl Fn(&[u8]) -> Vec<Range<usize>>) {
|
pub fn refine_changed_regions(&mut self, tokenizer: impl Fn(&[u8]) -> Vec<Range<usize>>) {
|
||||||
|
@ -568,14 +583,8 @@ impl<'input> Diff<'input> {
|
||||||
// create a new Diff instance. Then adjust the start positions and
|
// create a new Diff instance. Then adjust the start positions and
|
||||||
// offsets to be valid in the context of the larger Diff instance
|
// offsets to be valid in the context of the larger Diff instance
|
||||||
// (`self`).
|
// (`self`).
|
||||||
let mut slices = vec![&self.base_input[previous.base.end..current.base.start]];
|
let refined_diff =
|
||||||
for i in 0..current.offsets.len() {
|
Diff::for_tokenizer(self.hunk_between(&previous, current), &tokenizer);
|
||||||
let changed_range = previous.end(i)..current.start(i);
|
|
||||||
slices.push(&self.other_inputs[i][changed_range]);
|
|
||||||
}
|
|
||||||
|
|
||||||
let refined_diff = Diff::for_tokenizer(slices, &tokenizer);
|
|
||||||
|
|
||||||
for refined in refined_diff.unchanged_regions {
|
for refined in refined_diff.unchanged_regions {
|
||||||
let new_base_start = refined.base.start + previous.base.end;
|
let new_base_start = refined.base.start + previous.base.end;
|
||||||
let new_base_end = refined.base.end + previous.base.end;
|
let new_base_end = refined.base.end + previous.base.end;
|
||||||
|
@ -660,11 +669,10 @@ impl<'diff, 'input> Iterator for DiffHunkIterator<'diff, 'input> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let Some(current) = self.unchanged_iter.next() {
|
if let Some(current) = self.unchanged_iter.next() {
|
||||||
let mut slices =
|
let slices = self
|
||||||
vec![&self.diff.base_input[self.previous.base.end..current.base.start]];
|
.diff
|
||||||
for (i, input) in self.diff.other_inputs.iter().enumerate() {
|
.hunk_between(&self.previous, current)
|
||||||
slices.push(&input[self.previous.end(i)..current.start(i)]);
|
.collect_vec();
|
||||||
}
|
|
||||||
self.previous = current.clone();
|
self.previous = current.clone();
|
||||||
self.unchanged_emitted = false;
|
self.unchanged_emitted = false;
|
||||||
if slices.iter().any(|slice| !slice.is_empty()) {
|
if slices.iter().any(|slice| !slice.is_empty()) {
|
||||||
|
|
Loading…
Reference in a new issue