Compare commits

..

No commits in common. "05959d99beef107c320e3d1e7f15ad060f6cf393" and "f65082bea9ba5dce8e9c506008396b578d77f550" have entirely different histories.

2 changed files with 23 additions and 59 deletions

View file

@ -120,7 +120,7 @@ pub fn diff(allocator: std.mem.Allocator, dst: []const u8, src: []const u8) erro
const dmp = diffz.default; const dmp = diffz.default;
var diff_list = try diffz.diff(&dmp, arena, src, dst, false); var diff_list = try diffz.diff(&dmp, arena, src, dst, false);
try diffz.diffCleanupSemanticLossless(arena, &diff_list); try diffz.diffCleanupSemantic(arena, &diff_list);
if (diff_list.items.len > 2) if (diff_list.items.len > 2)
try diffs.ensureTotalCapacity(allocator, (diff_list.items.len - 1) / 2); try diffs.ensureTotalCapacity(allocator, (diff_list.items.len - 1) / 2);
@ -128,89 +128,53 @@ pub fn diff(allocator: std.mem.Allocator, dst: []const u8, src: []const u8) erro
var lines_dst: usize = 0; var lines_dst: usize = 0;
var pos_dst: usize = 0; var pos_dst: usize = 0;
var last_offset: usize = 0; var last_offset: usize = 0;
var last_equal_char: u8 = '\n';
for (diff_list.items) |diffz_diff| { for (diff_list.items) |diffz_diff| {
switch (diffz_diff.operation) { switch (diffz_diff.operation) {
.equal => { .equal => {
const dist = diffz_diff.text.len; const dist = diffz_diff.text.len;
pos_dst += dist; pos_dst += dist;
scan_eol(diffz_diff.text, &lines_dst, &last_offset); scan_eol(diffz_diff.text, &lines_dst, &last_offset);
last_equal_char = diffz_diff.text[diffz_diff.text.len - 1];
}, },
.insert => { .insert => {
const dist = diffz_diff.text.len; const dist = diffz_diff.text.len;
pos_dst += dist; pos_dst += dist;
var line_start_dst: usize = lines_dst; const line_start_dst: usize = lines_dst;
scan_eol(diffz_diff.text, &lines_dst, &last_offset); scan_eol(diffz_diff.text, &lines_dst, &last_offset);
const n_lines = lines_dst - line_start_dst;
if (n_lines == 0) {
(try diffs.addOne(allocator)).* = .{
.kind = .modify,
.line = line_start_dst,
.lines = 1,
};
} else {
if (diffz_diff.text[0] != '\n') {
(try diffs.addOne(allocator)).* = .{
.kind = .modify,
.line = line_start_dst,
.lines = 1,
};
line_start_dst += 1;
}
(try diffs.addOne(allocator)).* = .{ (try diffs.addOne(allocator)).* = .{
.kind = .insert, .kind = .insert,
.line = line_start_dst, .line = line_start_dst,
.lines = n_lines, .lines = lines_dst - line_start_dst,
}; };
line_start_dst += n_lines; if (last_offset > 0)
if (last_offset > 0) {
(try diffs.addOne(allocator)).* = .{ (try diffs.addOne(allocator)).* = .{
.kind = .modify, .kind = .modify,
.line = line_start_dst, .line = line_start_dst,
.lines = 1, .lines = 1,
}; };
}
}
}, },
.delete => { .delete => {
pos_dst += 0; pos_dst += 0;
var lines: usize = 0; var lines: usize = 0;
var diff_offset: usize = 0; var diff_offset: usize = 0;
var line_start_dst: usize = lines_dst;
scan_eol(diffz_diff.text, &lines, &diff_offset); scan_eol(diffz_diff.text, &lines, &diff_offset);
if (lines == 0) {
(try diffs.addOne(allocator)).* = .{ (try diffs.addOne(allocator)).* = .{
.kind = .modify, .kind = .modify,
.line = line_start_dst, .line = lines_dst,
.lines = 1, .lines = 1,
}; };
} else { if (lines > 0)
if (last_equal_char != '\n') {
// Deleting starts in previous line
(try diffs.addOne(allocator)).* = .{
.kind = .modify,
.line = line_start_dst,
.lines = 1,
};
line_start_dst += 1;
}
(try diffs.addOne(allocator)).* = .{ (try diffs.addOne(allocator)).* = .{
.kind = .delete, .kind = .delete,
.line = line_start_dst, .line = lines_dst,
.lines = 1, .lines = lines,
}; };
if (lines > 0 and diff_offset > 0)
if (diff_offset > 0 and last_equal_char == '\n') {
(try diffs.addOne(allocator)).* = .{ (try diffs.addOne(allocator)).* = .{
.kind = .modify, .kind = .modify,
.line = line_start_dst, .line = lines_dst,
.lines = 1, .lines = 1,
}; };
}
}
}, },
} }
} }

View file

@ -1508,7 +1508,7 @@ pub const Editor = struct {
if (change.line > row) if (change.line > row)
break; break;
if (change.kind == .insert or change.kind == .modify) if (change.kind == .insert)
if (row >= change.line and row < change.line + change.lines) if (row >= change.line and row < change.line + change.lines)
return null; return null;