Skip to content

Commit 305bfb1

Browse files
refactor: upgrade monaco to 0.54.0 and support vscode.languages.registerInlineEditProvider API (#4359)
* feat: support provideInlineEdit API * fix: handle undefined history prop in HistoryInputBox * chore: remove cache * chore: enable yarn caching and add ts-ignore comment * chore: update formate * fix: correct import path for domStylesheets * chore: add comment for ts-ignore directive * chore: upgrade monaco editor version * chore: add mock for window.crypto.randomUUID * fix: add getRandomValues mock to window.crypto * chore: fit monaco 0.54.0 * chore: add ts-nocheck comment to observable.ts * chore: update jest.setup.jsdom.js Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * fix: add delay when typing text in text editor * chore: remove commented out promise import --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
1 parent 20a03ae commit 305bfb1

36 files changed

Lines changed: 478 additions & 69 deletions

File tree

jest.setup.jsdom.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,35 @@ Object.defineProperty(window, 'matchMedia', {
8989
dispatchEvent: jest.fn(),
9090
})),
9191
});
92+
93+
// Mock window.crypto
94+
Object.defineProperty(window, 'crypto', {
95+
writable: true,
96+
value: {
97+
randomUUID: () => 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
98+
const r = Math.random() * 16 | 0;
99+
const v = c === 'x' ? r : (r & 0x3 | 0x8);
100+
return v.toString(16);
101+
}),
102+
getRandomValues: (array) => {
103+
if (!(array instanceof Int8Array || array instanceof Uint8Array ||
104+
array instanceof Int16Array || array instanceof Uint16Array ||
105+
array instanceof Int32Array || array instanceof Uint32Array ||
106+
array instanceof Uint8ClampedArray)) {
107+
throw new TypeError('Expected a TypedArray');
108+
}
109+
for (let i = 0; i < array.length; i++) {
110+
array[i] = Math.floor(Math.random() * 256);
111+
}
112+
return array;
113+
},
114+
},
115+
});
116+
117+
// Mock window.CSS
118+
Object.defineProperty(window, 'CSS', {
119+
writable: true,
120+
value: {
121+
escape: jest.fn((str) => str),
122+
},
123+
});

packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.controller.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import { InlineCompletionsController } from '@opensumi/monaco-editor-core/esm/vs
4040
import {
4141
SuggestItemInfo,
4242
SuggestWidgetAdaptor,
43-
} from '@opensumi/monaco-editor-core/esm/vs/editor/contrib/inlineCompletions/browser/model/suggestWidgetAdaptor';
43+
} from '@opensumi/monaco-editor-core/esm/vs/editor/contrib/inlineCompletions/browser/model/suggestWidgetAdapter';
4444
import { ContextKeyExpr } from '@opensumi/monaco-editor-core/esm/vs/platform/contextkey/common/contextkey';
4545

4646
import { AINativeContextKey } from '../../ai-core.contextkeys';
@@ -166,8 +166,7 @@ export class IntelligentCompletionsController extends BaseAIMonacoEditorControll
166166
model?.inlineCompletionState.read(reader);
167167

168168
const suggestWidgetSelectedItem = inlineCompletionsController['_suggestWidgetSelectedItem'] as IObservable<
169-
SuggestItemInfo | undefined,
170-
unknown
169+
SuggestItemInfo | undefined
171170
>;
172171
const selectedItem = suggestWidgetSelectedItem.get();
173172
if (selectedItem) {

packages/ai-native/src/browser/contrib/intelligent-completions/intelligent-completions.feature.registry.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { Injectable } from '@opensumi/di';
22
import { Disposable } from '@opensumi/ide-core-common';
3+
import { InlineEditProvider } from '@opensumi/ide-monaco';
34

45
import { ICodeEditsProvider, IIntelligentCompletionProvider, IIntelligentCompletionsRegistry } from '../../types';
56

67
@Injectable()
78
export class IntelligentCompletionsRegistry extends Disposable implements IIntelligentCompletionsRegistry {
89
private inlineCompletionsProvider: IIntelligentCompletionProvider | undefined;
910
private codeEditsProvider: ICodeEditsProvider | undefined;
11+
private inlineEditProvider: InlineEditProvider | undefined;
1012

1113
registerIntelligentCompletionProvider(provider: IIntelligentCompletionProvider): void {
1214
this.inlineCompletionsProvider = provider;
@@ -16,6 +18,10 @@ export class IntelligentCompletionsRegistry extends Disposable implements IIntel
1618
this.inlineCompletionsProvider = provider;
1719
}
1820

21+
registerInlineEditProvider(provider: InlineEditProvider): void {
22+
this.inlineEditProvider = provider;
23+
}
24+
1925
registerCodeEditsProvider(provider: ICodeEditsProvider): void {
2026
this.codeEditsProvider = provider;
2127
}
@@ -27,4 +33,9 @@ export class IntelligentCompletionsRegistry extends Disposable implements IIntel
2733
getCodeEditsProvider(): ICodeEditsProvider | undefined {
2834
return this.codeEditsProvider;
2935
}
36+
37+
getInlineEditProvider(): InlineEditProvider | undefined {
38+
// TODO: 支持模块内调用
39+
return this.inlineEditProvider;
40+
}
3041
}

packages/ai-native/src/browser/types.ts

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,15 @@ import {
1313
MaybePromise,
1414
MergeConflictEditorMode,
1515
} from '@opensumi/ide-core-common';
16-
import { ICodeEditor, IRange, ISelection, ITextModel, NewSymbolNamesProvider, Position } from '@opensumi/ide-monaco';
16+
import {
17+
ICodeEditor,
18+
IRange,
19+
ISelection,
20+
ITextModel,
21+
InlineEditProvider,
22+
NewSymbolNamesProvider,
23+
Position,
24+
} from '@opensumi/ide-monaco';
1725
import { SumiReadableStream } from '@opensumi/ide-utils/lib/stream';
1826
import { IMarker } from '@opensumi/monaco-editor-core/esm/vs/platform/markers/common/markers';
1927

@@ -226,14 +234,39 @@ export type ICodeEditsProvider = (
226234
token: CancellationToken,
227235
) => MaybePromise<ICodeEditsResult | undefined>;
228236

237+
export type IIntelligentInlineEditProvider = (
238+
editor: ICodeEditor,
239+
position: IPosition,
240+
contextBean: IAICompletionOption,
241+
token: CancellationToken,
242+
) => MaybePromise<IIntelligentCompletionsResult>;
243+
244+
/**
245+
* Interface for registering intelligent completion providers and code edits providers.
246+
*/
229247
export interface IIntelligentCompletionsRegistry {
230248
/**
231-
* @deprecated use registerInlineCompletionProvider API
249+
* Registers an intelligent completion provider.
250+
* @deprecated Use the `registerInlineCompletionsProvider` method instead.
251+
* @param provider - The intelligent completion provider to register.
232252
*/
233253
registerIntelligentCompletionProvider(provider: IIntelligentCompletionProvider): void;
254+
255+
/**
256+
* Registers an inline completions provider.
257+
* @param provider - The intelligent completion provider to register.
258+
*/
234259
registerInlineCompletionsProvider(provider: IIntelligentCompletionProvider): void;
260+
261+
/**
262+
* Registers an inline edit provider.
263+
* @param provider The inline edit provider to register.
264+
*/
265+
registerInlineEditProvider(provider: InlineEditProvider): void;
266+
235267
/**
236-
* 注册 code edits 功能
268+
* Registers a code edits provider.
269+
* @param provider - The code edits provider to register.
237270
*/
238271
registerCodeEditsProvider(provider: ICodeEditsProvider): void;
239272
}

packages/ai-native/src/browser/widget/inline-chat/inline-chat-editor.controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ export class InlineChatEditorController extends BaseAIMonacoEditorController {
222222

223223
protected async showInlineChat(monacoEditor: monaco.ICodeEditor): Promise<void> {
224224
// 调试状态下禁用 inline chat。影响调试体验
225-
const inDebugMode = this.contextKeyService.getContextValue(CONTEXT_IN_DEBUG_MODE_KEY);
225+
const inDebugMode = this.contextKeyService.getContextKeyValue(CONTEXT_IN_DEBUG_MODE_KEY);
226226
if (inDebugMode) {
227227
return;
228228
}

packages/ai-native/src/browser/widget/inline-diff/inline-diff.controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export class InlineDiffController extends BaseAIMonacoEditorController {
5151

5252
private previewerStore: Map<string, IInlineDiffPreviewer>;
5353
private currentPreviewer: ISettableObservable<IInlineDiffPreviewer | undefined>;
54-
private modelChangeObs: IObservable<monaco.editor.ITextModel, unknown>;
54+
private modelChangeObs: IObservable<monaco.editor.ITextModel>;
5555

5656
mount(): IDisposable {
5757
this.previewerStore = new Map();

packages/ai-native/src/browser/widget/inline-input/inline-input.controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export class InlineInputController extends BaseAIMonacoEditorController {
6767
private aiNativeContextKey: AINativeContextKey;
6868

6969
private inputValue: ISettableObservable<string>;
70-
private modelChangeObs: IObservable<monaco.editor.ITextModel, unknown>;
70+
private modelChangeObs: IObservable<monaco.editor.ITextModel>;
7171
private inlineInputWidgetStore: Map<
7272
string,
7373
InlineInputWidgetStoreInEmptyLine | InlineInputWidgetStoreInSelection | null

packages/comments/__test__/browser/comment-thread.test.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { Injector } from '@opensumi/di';
22
import { IContextKeyService } from '@opensumi/ide-core-browser';
33
import { URI } from '@opensumi/ide-core-common';
4+
import { createBrowserInjector } from '@opensumi/ide-dev-tool/src/injector-helper';
5+
import { MockInjector } from '@opensumi/ide-dev-tool/src/mock-injector';
46
import { positionToRange } from '@opensumi/ide-monaco';
7+
import { createMockedMonaco } from '@opensumi/ide-monaco/__mocks__/monaco';
8+
import { MockContextKeyService } from '@opensumi/ide-monaco/__mocks__/monaco.context-key.service';
59
import { IIconService } from '@opensumi/ide-theme';
610
import { IconService } from '@opensumi/ide-theme/lib/browser';
711

8-
import { createBrowserInjector } from '../../../../tools/dev-tool/src/injector-helper';
9-
import { MockInjector } from '../../../../tools/dev-tool/src/mock-injector';
10-
import { createMockedMonaco } from '../../../monaco/__mocks__/monaco';
11-
import { MockContextKeyService } from '../../../monaco/__mocks__/monaco.context-key.service';
1212
import { CommentsModule } from '../../src/browser';
1313
import { CommentMode, ICommentsService } from '../../src/common';
1414

@@ -134,10 +134,10 @@ describe('comment service test', () => {
134134
const thread = commentsService.createThread(uri, positionToRange(1), {
135135
contextValue,
136136
});
137-
expect(thread.contextKeyService.getContextValue('thread')).toBe(contextValue);
138-
expect(thread.contextKeyService.getContextValue('threadsLength')).toBe(1);
137+
expect(thread.contextKeyService.getContextKeyValue('thread')).toBe(contextValue);
138+
expect(thread.contextKeyService.getContextKeyValue('threadsLength')).toBe(1);
139139
commentsService.createThread(uri, positionToRange(2));
140140
// 同一个 uri 的 threadsLength 会变为 2
141-
expect(thread.contextKeyService.getContextValue('threadsLength')).toBe(2);
141+
expect(thread.contextKeyService.getContextKeyValue('threadsLength')).toBe(2);
142142
});
143143
});

packages/comments/src/browser/comments-thread.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export class CommentsThread extends Disposable implements ICommentsThread {
4646
}
4747

4848
get contextValue() {
49-
return this._contextKeyService.getContextValue('thread');
49+
return this._contextKeyService.getContextKeyValue('thread');
5050
}
5151

5252
get onDidChangeCollapsibleState() {

packages/components/src/input/HistoryInputBox.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import React from 'react';
22

3-
import { HistoryNavigator } from '@opensumi/monaco-editor-core/esm/vs/base/common/history';
3+
import { HistoryNavigator, IHistory } from '@opensumi/monaco-editor-core/esm/vs/base/common/history';
44

55
import { IInputBaseProps, Input } from './Input';
66

77
export interface HistoryInputBoxProp extends IInputBaseProps {
88
// 上层自己持久化历史记录
9-
history?: string[];
9+
history?: IHistory<string>;
1010
onReady?: (api: IHistoryInputBoxHandler) => void;
1111
}
1212

@@ -32,7 +32,7 @@ export class HistoryInputBox extends React.Component<HistoryInputBoxProp> {
3232
public componentDidMount() {
3333
const { history, onReady } = this.props;
3434

35-
this.history = new HistoryNavigator(history || [], 100);
35+
this.history = new HistoryNavigator(history || new Set([]), 100);
3636
this.inputProps = { ...this.props };
3737
delete this.inputProps.onReady;
3838

0 commit comments

Comments
 (0)