Skip to content

Commit dfcc65a

Browse files
committed
perf(vscode): replace fast-diff with whitespace check
1 parent d1e7568 commit dfcc65a

File tree

4 files changed

+29
-70
lines changed

4 files changed

+29
-70
lines changed
Lines changed: 28 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import type * as vscode from 'vscode';
2-
import diff = require('fast-diff');
32

43
/** for test unit */
54
export type FormatableTextDocument = Pick<vscode.TextDocument, 'getText' | 'offsetAt' | 'positionAt'>;
@@ -61,72 +60,41 @@ function getTrimmedNewText(
6160
return;
6261
}
6362

64-
const map = createOffsetMap(oldText, edit.newText);
65-
const newStart = map[overlapStart];
66-
const newEnd = map[overlapEnd];
67-
return {
68-
start: editStart + overlapStart,
69-
end: editStart + overlapEnd,
70-
newText: edit.newText.slice(newStart, newEnd),
71-
};
72-
}
63+
let oldTextIndex = 0;
64+
let newTextIndex = 0;
65+
let newStart = overlapStart;
66+
let newEnd = overlapEnd;
7367

74-
function createOffsetMap(oldText: string, newText: string) {
75-
const length = oldText.length;
76-
const map = new Array<number>(length + 1);
77-
let oldIndex = 0;
78-
let newIndex = 0;
79-
map[0] = 0;
80-
81-
for (const [op, text] of diff(oldText, newText)) {
82-
if (op === diff.EQUAL) {
83-
for (let i = 0; i < text.length; i++) {
84-
oldIndex++;
85-
newIndex++;
86-
map[oldIndex] = newIndex;
87-
}
88-
}
89-
else if (op === diff.DELETE) {
90-
for (let i = 0; i < text.length; i++) {
91-
oldIndex++;
92-
map[oldIndex] = Number.NaN;
93-
}
68+
while (true) {
69+
if (oldTextIndex === overlapStart) {
70+
newStart = newTextIndex;
9471
}
95-
else {
96-
newIndex += text.length;
72+
if (oldTextIndex === overlapEnd) {
73+
newEnd = newTextIndex;
74+
break;
9775
}
98-
}
99-
100-
map[length] = newIndex;
101-
102-
let lastDefinedIndex = 0;
103-
for (let i = 1; i <= length; i++) {
104-
if (map[i] === undefined || Number.isNaN(map[i])) {
76+
const oldCharCode = oldText.charCodeAt(oldTextIndex);
77+
const newCharCode = edit.newText.charCodeAt(newTextIndex);
78+
if (oldCharCode === newCharCode || (!isWhitespaceChar(oldCharCode) && !isWhitespaceChar(newCharCode))) {
79+
oldTextIndex++;
80+
newTextIndex++;
10581
continue;
10682
}
107-
interpolate(map, lastDefinedIndex, i);
108-
lastDefinedIndex = i;
109-
}
110-
if (lastDefinedIndex < length) {
111-
interpolate(map, lastDefinedIndex, length);
83+
if (isWhitespaceChar(oldCharCode)) {
84+
oldTextIndex++;
85+
}
86+
if (isWhitespaceChar(newCharCode)) {
87+
newTextIndex++;
88+
}
11289
}
11390

114-
return map;
91+
return {
92+
start: editStart + overlapStart,
93+
end: editStart + overlapEnd,
94+
newText: edit.newText.slice(newStart, newEnd),
95+
};
11596
}
11697

117-
function interpolate(map: number[], startIndex: number, endIndex: number) {
118-
const startValue = map[startIndex] ?? 0;
119-
const endValue = map[endIndex] ?? startValue;
120-
const gap = endIndex - startIndex;
121-
if (gap <= 1) {
122-
return;
123-
}
124-
const delta = (endValue - startValue) / gap;
125-
for (let i = 1; i < gap; i++) {
126-
const index = startIndex + i;
127-
if (map[index] !== undefined && !Number.isNaN(map[index])) {
128-
continue;
129-
}
130-
map[index] = Math.floor(startValue + delta * i);
131-
}
98+
function isWhitespaceChar(charCode: number) {
99+
return charCode === 32 || charCode === 9 || charCode === 10 || charCode === 13;
132100
}

extensions/vscode/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,6 @@
490490
"@vue/language-core": "3.1.8",
491491
"@vue/language-server": "3.1.8",
492492
"@vue/typescript-plugin": "3.1.8",
493-
"fast-diff": "^1.3.0",
494493
"laplacenoma": "^0.0.3",
495494
"reactive-vscode": "^0.2.9",
496495
"rolldown": "1.0.0-beta.8",

extensions/vscode/tests/rangeFormatting.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ describe('provideDocumentRangeFormattingEdits', () => {
3030
createTextEdit(
3131
selection.start.character - 1,
3232
selection.end.character,
33-
` <div>
33+
`\n <div>
3434
<div>2</div>
3535
</div>`,
3636
),

pnpm-lock.yaml

Lines changed: 0 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)