Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: optimize inline diff viewer #3836

Merged
merged 26 commits into from
Jul 11, 2024
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
ada2e26
feat: optimize inline diff viewer
bytemain Jul 5, 2024
ee24f57
chore: update code
bytemain Jul 5, 2024
80991f9
chore: fix typo
bytemain Jul 5, 2024
bb57bd9
fix: discard
Ricbet Jul 5, 2024
9f9a227
fix: content widget handle
Ricbet Jul 5, 2024
958558b
chore: improve prioritize those closest to the head
Ricbet Jul 5, 2024
86be544
chore: improve layout code
Ricbet Jul 5, 2024
7010626
fix: removed widget position
Ricbet Jul 5, 2024
f14de91
feat: support setValue
Ricbet Jul 5, 2024
511d9a1
fix: inlineContentWidget
Ricbet Jul 5, 2024
cf2d0cd
Merge remote-tracking branch 'origin/feat/support-redo-re-render' int…
bytemain Jul 5, 2024
f5aba17
Merge remote-tracking branch 'origin/main' into feat/diff-viewer-optmize
bytemain Jul 5, 2024
1b5eb7d
chore: event report
Ricbet Jul 5, 2024
4f4eb5e
fix: check inline content widget
bytemain Jul 5, 2024
bab2ec0
chore: update code
bytemain Jul 5, 2024
a86907e
feat: dispose all diff previewer
bytemain Jul 5, 2024
c6be2a1
fix: event track
bytemain Jul 5, 2024
10f5c02
fix: recompute use default mode
bytemain Jul 5, 2024
91809b3
chore: update code
bytemain Jul 11, 2024
33ae626
Merge branch 'main' into feat/diff-viewer-optmize
bytemain Jul 11, 2024
8a5e294
chore: update code
bytemain Jul 11, 2024
6afb8d1
refactor: add inline diff service
bytemain Jul 11, 2024
a3098a2
fix: widget not show
bytemain Jul 11, 2024
6e40b77
chore: update code
bytemain Jul 11, 2024
6fe2781
fix: accept button cannot show
bytemain Jul 11, 2024
681b327
chore: update code
bytemain Jul 11, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions packages/ai-native/src/browser/preferences/schema.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { AINativeSettingSectionsId, PreferenceSchema } from '@opensumi/ide-core-browser';
import { localize } from '@opensumi/ide-core-common';

export enum EInlineDifPreviewMode {
export enum EInlineDiffPreviewMode {
inlineLive = 'inlineLive',
sideBySide = 'sideBySide',
}
Expand All @@ -10,12 +10,12 @@ export const aiNativePreferenceSchema: PreferenceSchema = {
properties: {
[AINativeSettingSectionsId.InlineDiffPreviewMode]: {
type: 'string',
enum: [EInlineDifPreviewMode.inlineLive, EInlineDifPreviewMode.sideBySide],
enum: [EInlineDiffPreviewMode.inlineLive, EInlineDiffPreviewMode.sideBySide],
enumDescriptions: [
localize('preference.ai.native.inlineDiff.preview.mode.inlineLive'),
localize('preference.ai.native.inlineDiff.preview.mode.sideBySide'),
],
default: EInlineDifPreviewMode.inlineLive,
default: EInlineDiffPreviewMode.inlineLive,
},
[AINativeSettingSectionsId.InlineChatAutoVisible]: {
type: 'boolean',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import { monacoApi } from '@opensumi/ide-monaco/lib/browser/monaco-api';
import { ContentWidgetPositionPreference } from '@opensumi/ide-monaco/lib/browser/monaco-exports/editor';

import { CodeActionService } from '../../contrib/code-action/code-action.service';
import { EInlineDifPreviewMode } from '../../preferences/schema';
import { EInlineDiffPreviewMode } from '../../preferences/schema';
import { ERunStrategy } from '../../types';
import {
BaseInlineDiffPreviewer,
Expand Down Expand Up @@ -310,7 +310,7 @@ export class InlineChatHandler extends Disposable {
});
}

private visibleDiffWidget(
visibleDiffWidget(
monacoEditor: monaco.ICodeEditor,
options: {
crossSelection: monaco.Selection;
Expand All @@ -325,12 +325,12 @@ export class InlineChatHandler extends Disposable {
const { crossSelection, chatResponse } = options;
const { relationId, startTime, isRetry } = reportInfo;

const inlineDiffMode = this.preferenceService.getValid<EInlineDifPreviewMode>(
const inlineDiffMode = this.preferenceService.getValid<EInlineDiffPreviewMode>(
AINativeSettingSectionsId.InlineDiffPreviewMode,
EInlineDifPreviewMode.inlineLive,
EInlineDiffPreviewMode.inlineLive,
);

if (inlineDiffMode === EInlineDifPreviewMode.sideBySide) {
if (inlineDiffMode === EInlineDiffPreviewMode.sideBySide) {
this.diffPreviewer = this.injector.get(SideBySideInlineDiffWidget, [monacoEditor, crossSelection]);
} else {
this.diffPreviewer = this.injector.get(LiveInlineDiffPreviewer, [monacoEditor, crossSelection]);
Expand Down Expand Up @@ -441,6 +441,18 @@ export class InlineChatHandler extends Disposable {
);
}

get onPartialEditEvent() {
return (this.diffPreviewer as LiveInlineDiffPreviewer).onPartialEditEvent;
}

acceptAllPartialEdits() {
this.diffPreviewer.handleAction(EResultKind.ACCEPT);
}

discardAllPartialEdits() {
this.diffPreviewer.handleAction(EResultKind.DISCARD);
}

private async handleDiffPreviewStrategy(
monacoEditor: monaco.ICodeEditor,
strategy: (...arg: any[]) => MaybePromise<ChatResponse | InlineChatController>,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Autowired, INJECTOR_TOKEN, Injectable, Injector } from '@opensumi/di';
import { Disposable, ErrorResponse, ReplyResponse } from '@opensumi/ide-core-common';
import { Disposable, ErrorResponse, IDisposable, ReplyResponse } from '@opensumi/ide-core-common';
import { EOL, ICodeEditor, IPosition, ITextModel, Position, Selection } from '@opensumi/ide-monaco';
import { ContentWidgetPositionPreference } from '@opensumi/ide-monaco/lib/browser/monaco-exports/editor';
import { DefaultEndOfLine } from '@opensumi/monaco-editor-core/esm/vs/editor/common/model';
Expand Down Expand Up @@ -203,4 +203,7 @@ export class LiveInlineDiffPreviewer extends BaseInlineDiffPreviewer<InlineStrea
const diffModel = this.node.recompute(EComputerMode.legacy);
this.node.readyRender(diffModel);
}
get onPartialEditEvent() {
return this.node.onPartialEditEvent;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ export class InlineStreamDiffHandler extends Disposable {
private undoRedoGroup: UndoRedoGroup;
private partialEditWidgetHandle: (widgets: AcceptPartialEditWidget[]) => void;

protected readonly _onDidEditChange = new Emitter<void>();
protected readonly _onDidEditChange = this.registerDispose(new Emitter<void>());
public readonly onDidEditChange: Event<void> = this._onDidEditChange.event;

constructor(private readonly monacoEditor: ICodeEditor, private readonly selection: Selection) {
Expand Down Expand Up @@ -397,4 +397,8 @@ export class InlineStreamDiffHandler extends Disposable {
this.pushStackElement();
this.monacoEditor.focus();
}

get onPartialEditEvent() {
return this.livePreviewDiffDecorationModel.onPartialEditEvent;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import ReactDOMClient from 'react-dom/client';
import { Autowired, INJECTOR_TOKEN, Injectable, Injector } from '@opensumi/di';
import { KeybindingRegistry, StackingLevel } from '@opensumi/ide-core-browser';
import { AI_INLINE_DIFF_PARTIAL_EDIT } from '@opensumi/ide-core-browser/lib/ai-native/command';
import { Disposable, Emitter, Event, isUndefined, uuid } from '@opensumi/ide-core-common';
import { Disposable, Emitter, Event, IRange, isUndefined, uuid } from '@opensumi/ide-core-common';
import { ISingleEditOperation } from '@opensumi/ide-editor';
import { ICodeEditor, IEditorDecorationsCollection, Position, Range, Selection } from '@opensumi/ide-monaco';
import { ReactInlineContentWidget } from '@opensumi/ide-monaco/lib/browser/ai-native/BaseInlineContentWidget';
Expand Down Expand Up @@ -46,6 +46,31 @@ enum EPartialEdit {
discard = 'discard',
}

export interface IPartialEditEvent {
/**
* 总 diff 数
*/
totalPartialEditCount: number;
/**
* 已采纳数
*/
acceptedPartialEditCount: number;

/**
* 已添加行数
*/
totalAddedLinesCount: number;
/**
* 已删除行数
*/
totalRemovedLinesCount: number;
currentPartialEdit: {
type: EPartialEdit;
deletedLinesCount: number;
addedLinesCount: number;
};
}

interface ITextLinesTokens {
text: string;
lineTokens: LineTokens;
Expand All @@ -64,10 +89,10 @@ export class AcceptPartialEditWidget extends ReactInlineContentWidget {
private _id: string;
private _decorationId: string;

private readonly _onAccept = new Emitter<void>();
private readonly _onAccept = this.registerDispose(new Emitter<void>());
public readonly onAccept: Event<void> = this._onAccept.event;

private readonly _onDiscard = new Emitter<void>();
private readonly _onDiscard = this.registerDispose(new Emitter<void>());
public readonly onDiscard: Event<void> = this._onDiscard.event;

positionPreference = [ContentWidgetPositionPreference.EXACT];
Expand Down Expand Up @@ -191,6 +216,9 @@ export class LivePreviewDiffDecorationModel extends Disposable {
@Autowired(InlineStreamDiffService)
private readonly inlineStreamDiffService: InlineStreamDiffService;

private readonly _onPartialEditEvent = this.registerDispose(new Emitter<IPartialEditEvent>());
public readonly onPartialEditEvent: Event<IPartialEditEvent> = this._onPartialEditEvent.event;

private zoneDec: IEditorDecorationsCollection;

private activeLineDec: IEditorDecorationsCollection;
Expand Down Expand Up @@ -432,6 +460,18 @@ export class LivePreviewDiffDecorationModel extends Disposable {
findRemovedWidget?.resume();
};

const event: IPartialEditEvent = {
totalPartialEditCount: this.partialEditWidgetList.length,
acceptedPartialEditCount: this.partialEditWidgetList.filter((w) => w.isHidden).length,
totalAddedLinesCount: 0,
totalRemovedLinesCount: 0,
currentPartialEdit: {
addedLinesCount: 0,
deletedLinesCount: 0,
type,
},
};

/**
* 将 partial widget 的所有操作和代码变更放在单独的 undo/redo 堆栈组里面
*/
Expand Down Expand Up @@ -470,6 +510,8 @@ export class LivePreviewDiffDecorationModel extends Disposable {
}

this.monacoEditor.focus();

this._onPartialEditEvent.fire(event);
this._onPartialEditWidgetListChange.fire(this.partialEditWidgetList);
}

Expand Down
Loading