File tree Expand file tree Collapse file tree 2 files changed +20
-3
lines changed Expand file tree Collapse file tree 2 files changed +20
-3
lines changed Original file line number Diff line number Diff line change @@ -981,10 +981,14 @@ func (dmp *DiffMatchPatch) DiffCleanupSemanticLossless(diffs []Diff) []Diff {
981
981
bestScore := diffCleanupSemanticScore_ (equality1 , edit ) +
982
982
diffCleanupSemanticScore_ (edit , equality2 )
983
983
984
- for len (edit ) != 0 && len (equality2 ) != 0 && edit [0 ] == equality2 [0 ] {
984
+ for len (edit ) != 0 && len (equality2 ) != 0 {
985
+ _ , sz := utf8 .DecodeRuneInString (edit )
986
+ if edit [:sz ] != equality2 [:sz ] {
987
+ break
988
+ }
985
989
equality1 += string (edit [0 ])
986
- edit = edit [1 :] + string (equality2 [0 ])
987
- equality2 = equality2 [1 :]
990
+ edit = edit [sz :] + string (equality2 [0 ])
991
+ equality2 = equality2 [sz :]
988
992
score := diffCleanupSemanticScore_ (equality1 , edit ) +
989
993
diffCleanupSemanticScore_ (edit , equality2 )
990
994
// The >= encourages trailing rather than leading whitespace on
Original file line number Diff line number Diff line change @@ -450,6 +450,19 @@ func Test_diffCleanupSemanticLossless(t *testing.T) {
450
450
Diff {DiffEqual , "The ♕." },
451
451
Diff {DiffInsert , " The ♔." },
452
452
Diff {DiffEqual , " The ♖." }}, diffs )
453
+
454
+ // Rune boundaries.
455
+ diffs = []Diff {
456
+ Diff {DiffEqual , "♕♕" },
457
+ Diff {DiffInsert , "♔♔" },
458
+ Diff {DiffEqual , "♖♖" }}
459
+
460
+ dmp .DiffCleanupSemanticLossless (diffs )
461
+
462
+ assertDiffEqual (t , []Diff {
463
+ Diff {DiffEqual , "♕♕" },
464
+ Diff {DiffInsert , "♔♔" },
465
+ Diff {DiffEqual , "♖♖" }}, diffs )
453
466
}
454
467
455
468
func Test_diffCleanupSemantic (t * testing.T ) {
You can’t perform that action at this time.
0 commit comments