Skip to content

Commit 538e9ce

Browse files
authored
fix(inline-diff): fix error in calculating lines of code change (#4074)
1 parent c4bf2ff commit 538e9ce

1 file changed

Lines changed: 37 additions & 17 deletions

File tree

packages/ai-native/src/browser/widget/inline-stream-diff/live-preview.decoration.tsx

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ export class LivePreviewDiffDecorationModel extends Disposable {
9090
// Parts that require snapshots
9191
private addedRangeDec: EnhanceDecorationsCollection;
9292
private partialEditWidgetList: AcceptPartialEditWidget[] = [];
93-
private removedZoneWidgets: Array<RemovedZoneWidget> = [];
93+
private removedZoneWidgets: RemovedZoneWidget[] = [];
9494
private zone: LineRange;
9595

9696
constructor(private readonly monacoEditor: ICodeEditor) {
@@ -515,17 +515,29 @@ export class LivePreviewDiffDecorationModel extends Disposable {
515515
return newElement;
516516
}
517517

518-
/**
519-
* 获取当前编辑器的代码采纳状态
520-
* 1. 已经采纳的代码信息
521-
* 2. 还未处理的代码信息
522-
*/
523-
getTotalCodeInfo(): ITotalCodeInfo {
524-
const resolvedList = this.partialEditWidgetList.filter((w) => w.isAccepted);
525-
const unresolvedList = this.partialEditWidgetList.filter((w) => w.isPending);
526-
527-
const resolvedStatus = caculate(resolvedList);
528-
const unresolvedStatus = caculate(unresolvedList);
518+
static computeCodeInfo(
519+
partialEditWidgetList: AcceptPartialEditWidget[],
520+
addedDecList: IEnhanceModelDeltaDecoration[],
521+
removedWidgetList: RemovedZoneWidget[],
522+
): ITotalCodeInfo {
523+
// 代码除了新增和删除行,还需要统计变更行
524+
// 1. 新增 N 行 => N
525+
// 2. 删除 N 行 => N
526+
// 3. 新增 M 行,删除 N 行 => max(M, N)
527+
// 综上所述,变更行数 = sum(list.map(item => max(新增行数, 删除行数)))
528+
const resolvedStatus = caculate(partialEditWidgetList);
529+
const unresolvedStatus = { added: 0, deleted: 0, changed: 0 };
530+
partialEditWidgetList.forEach((v, idx) => {
531+
if (v.status === 'pending') {
532+
const addedDec = addedDecList[idx];
533+
const removedWidget = removedWidgetList[idx];
534+
const addedLinesCount = addedDec?.length || 0;
535+
const deletedLinesCount = removedWidget?.height || 0;
536+
unresolvedStatus.added += addedLinesCount;
537+
unresolvedStatus.deleted += deletedLinesCount;
538+
unresolvedStatus.changed += Math.max(addedLinesCount, deletedLinesCount);
539+
}
540+
});
529541

530542
return {
531543
totalAddedLinesCount: resolvedStatus.added,
@@ -536,11 +548,6 @@ export class LivePreviewDiffDecorationModel extends Disposable {
536548
unresolvedChangedLinesCount: unresolvedStatus.changed,
537549
};
538550

539-
// 代码除了新增和删除行,还需要统计变更行
540-
// 1. 新增 N 行 => N
541-
// 2. 删除 N 行 => N
542-
// 3. 新增 M 行,删除 N 行 => max(M, N)
543-
// 综上所述,变更行数 = sum(list.map(item => max(新增行数, 删除行数)))
544551
function caculate(list: AcceptPartialEditWidget[]) {
545552
const result = { added: 0, deleted: 0, changed: 0 };
546553
list.forEach((widget) => {
@@ -554,6 +561,19 @@ export class LivePreviewDiffDecorationModel extends Disposable {
554561
}
555562
}
556563

564+
/**
565+
* 获取当前编辑器的代码采纳状态
566+
* 1. 已经采纳的代码信息
567+
* 2. 还未处理的代码信息
568+
*/
569+
getTotalCodeInfo(): ITotalCodeInfo {
570+
const partialEditWidgetList = this.partialEditWidgetList;
571+
const addedDecList = this.addedRangeDec.getDecorations();
572+
const removedWidgetList = this.removedZoneWidgets;
573+
574+
return LivePreviewDiffDecorationModel.computeCodeInfo(partialEditWidgetList, addedDecList, removedWidgetList);
575+
}
576+
557577
/**
558578
* 记录 partial edit widget 与 added range 的映射关系(主要用于位置计算)
559579
*/

0 commit comments

Comments
 (0)