Skip to content

Commit e9bf262

Browse files
author
guqiankun.gqk
committed
fix: 增加monaco keybindingService override
1 parent e88ec5c commit e9bf262

6 files changed

Lines changed: 124 additions & 139 deletions

File tree

packages/core/src/client/index.ts

Lines changed: 20 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { MonacoOverrides } from './override/monacoOverride/index';
12
import { Injectable, Injector, ConstructorOf, Provider } from '@opensumi/di';
23
import {
34
BrowserModule,
@@ -6,8 +7,6 @@ import {
67
PreferenceProviderProvider,
78
PreferenceScope,
89
PreferenceProvider,
9-
IContextKeyService,
10-
KeybindingService,
1110
} from '@opensumi/ide-core-browser';
1211
import { ClientApp as BasicClientApp } from '@opensumi/ide-core-browser/lib/bootstrap/app';
1312

@@ -34,51 +33,31 @@ import { FileSchemeContribution } from './file-scheme/index.contribution';
3433
import { PreferenceSettingContribution } from './preference/preference.setting.contribution';
3534
import { LayoutRestoreContributation } from './layout/index.contribution';
3635

37-
import {
38-
MonacoCodeService,
39-
IMonacoCodeService,
40-
monacoCodeServiceProxy,
41-
} from './override/monacoOverride/codeEditorService';
42-
import { ICodeEditorService } from '@opensumi/monaco-editor-core/esm/vs/editor/browser/services/codeEditorService';
4336
import { BreadCrumbServiceImplOverride, IBreadCrumbService } from './override/breadcrumb.service';
4437
import { SearchContribution } from './search/index.contribution';
4538
import {
4639
MonacoSnippetSuggestProviderOverride,
4740
MonacoSnippetSuggestProvider,
4841
} from './override/snippet.service';
49-
import { MonacoContextKeyService } from './override/monacoContextKeyService';
42+
import { IMonacoOverrideService, MonacoOverrideService } from './override/monacoContextKeyService';
5043
import {
5144
VSCodeContributesServiceOverride,
5245
VSCodeContributesServiceToken,
5346
} from './override/vscodeContributesService';
5447

55-
import { ExtensionNodeServiceServerPath } from '@opensumi/ide-extension';
56-
import {
57-
IMonacoTextModelService,
58-
MonacoTextModelService,
59-
monacoTextModelServiceProxy,
60-
} from './override/monacoOverride/textModelService';
61-
import {
62-
IMonacoBulkEditServiceProxy,
63-
MonacoBulkEditService,
64-
monacoBulkEditServiceProxy,
65-
} from './override/monacoOverride/workspaceEditService';
66-
import { ICommandServiceToken } from '@opensumi/ide-monaco/lib/browser/contrib/command';
67-
import { MonacoCommandService } from '@opensumi/ide-editor/lib/browser/monaco-contrib/command/command.service';
68-
import { IBulkEditServiceShape } from '@opensumi/ide-workspace-edit';
69-
// @ts-ignore
7048
import {
7149
IMonacoCommandServiceProxy,
7250
monacoCommandServiceProxy,
7351
} from './override/monacoOverride/commandService';
52+
import { ICommandServiceToken } from '@opensumi/ide-monaco/lib/browser/contrib/command';
53+
import { MonacoCommandService } from '@opensumi/ide-editor/lib/browser/monaco-contrib/command/command.service';
7454
import {
75-
IScopedContextKeyServiceProxy,
76-
MonacoContextKeyServiceOverride,
77-
// IMonacoCommandServiceProxy,
78-
// monacoCommandServiceProxy,
79-
ScopedContextKeyServiceProxy,
80-
} from './override/monacoOverride/contextKeyService';
81-
import { customKeybindingService } from './override/monacoOverride/customKeybindingService';
55+
IMonacoCodeService,
56+
MonacoCodeService,
57+
monacoCodeServiceProxy,
58+
} from './override/monacoOverride/codeEditorService';
59+
60+
// import { MonacoOverrides } from './override/monacoOverride';
8261
export * from './override/monacoOverride/codeEditorService';
8362

8463
export { ExtensionManagerModule as ExtensionClientManagerModule } from './extension-manager';
@@ -110,36 +89,7 @@ export class ClientModule extends BrowserModule {
11089
LayoutRestoreContributation,
11190

11291
/* monaco override*/
113-
{
114-
token: MonacoCodeService,
115-
useValue: monacoCodeServiceProxy,
116-
override: true,
117-
},
118-
{
119-
token: IMonacoCodeService,
120-
useClass: MonacoCodeService,
121-
},
122-
// MonacoTextModelService
123-
{
124-
token: MonacoTextModelService,
125-
useValue: monacoTextModelServiceProxy,
126-
override: true,
127-
},
128-
{
129-
token: IMonacoTextModelService,
130-
useClass: MonacoTextModelService,
131-
},
132-
// IBulkEditServiceShape
133-
{
134-
token: IBulkEditServiceShape,
135-
useValue: monacoBulkEditServiceProxy,
136-
override: true,
137-
},
138-
{
139-
token: IMonacoBulkEditServiceProxy,
140-
useClass: MonacoBulkEditService,
141-
},
142-
// MonacoCommandService
92+
// ...MonacoOverrides,
14393
{
14494
token: ICommandServiceToken,
14595
useValue: monacoCommandServiceProxy,
@@ -150,32 +100,14 @@ export class ClientModule extends BrowserModule {
150100
useClass: MonacoCommandService,
151101
},
152102
{
153-
token: KeybindingService,
154-
useValue: customKeybindingService,
155-
},
156-
// MonacoContextKeyService
157-
{
158-
token: IContextKeyService,
159-
useClass: MonacoContextKeyServiceOverride,
103+
token: MonacoCodeService,
104+
useValue: monacoCodeServiceProxy,
160105
override: true,
161106
},
162107
{
163-
token: IScopedContextKeyServiceProxy,
164-
useClass: ScopedContextKeyServiceProxy,
108+
token: IMonacoCodeService,
109+
useClass: MonacoCodeService,
165110
},
166-
// {
167-
// token: IScopedContextKeyServiceProxy,
168-
// useClass: MonacoCommandService,
169-
// },
170-
// {
171-
// token: ScopedContextKeyServiceProxy,
172-
// useFactory: (injector) => {
173-
// const contextKeyService = injector.get(ScopedContextKeyServiceProxy);
174-
175-
// return new ScopedContextKeyServiceProxy(,injector);
176-
// },
177-
// // override: true,
178-
// },
179111
/* monaco override */
180112
{
181113
token: IBreadCrumbService,
@@ -192,6 +124,10 @@ export class ClientModule extends BrowserModule {
192124
useClass: VSCodeContributesServiceOverride,
193125
override: true,
194126
},
127+
{
128+
token: IMonacoOverrideService,
129+
useClass: MonacoOverrideService,
130+
},
195131
];
196132
preferences = injectDebugPreferences;
197133
}
@@ -216,15 +152,12 @@ export class ClientApp extends BasicClientApp {
216152
super(opts);
217153
this.modules = opts.modules;
218154
this.initServer(opts);
219-
// monaco override proxy 防止组件卸载后 monaco override 实例被销毁
220155
this.initMonacoProxy();
221156
}
222157

223158
initMonacoProxy() {
224-
this.disposer.addDispose(monacoCodeServiceProxy.setInjector(this.injector));
225-
this.disposer.addDispose(monacoTextModelServiceProxy.setInjector(this.injector));
226-
this.disposer.addDispose(monacoBulkEditServiceProxy.setInjector(this.injector));
227159
this.disposer.addDispose(monacoCommandServiceProxy.setInjector(this.injector));
160+
this.disposer.addDispose(monacoCodeServiceProxy.setInjector(this.injector));
228161
}
229162

230163
private initServer(opts: IAppOpts) {
Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,32 @@
1-
import { Injectable } from '@opensumi/di';
2-
import { IContextKeyService } from '@opensumi/ide-core-browser';
3-
import { ContextKeyService } from '@opensumi/monaco-editor-core/esm/vs/platform/contextkey/browser/contextKeyService';
4-
import { MonacoContextKeyService as BaseContextKeyService } from '@opensumi/ide-monaco/lib/browser/monaco.context-key.service';
5-
// TODO 暂时此处覆盖其 dispose 防止报错
1+
import { Autowired, Injectable, Injector, INJECTOR_TOKEN } from '@opensumi/di';
2+
import {
3+
MonacoContribution,
4+
Domain,
5+
MonacoOverrideServiceRegistry,
6+
} from '@opensumi/ide-core-browser';
7+
import { StandaloneKeybindingServiceProxy } from './monacoOverride/standaloneKeybindingService';
8+
9+
import { ICommandServiceToken } from '@opensumi/ide-monaco/lib/browser/contrib/command';
10+
import { MonacoCodeService } from './monacoOverride/codeEditorService';
11+
import { MonacoCommandService } from '@opensumi/ide-editor/lib/browser/monaco-contrib/command/command.service';
12+
// import { MonacoCodeService, monacoCodeServiceProxy } from './codeEditorService';
13+
14+
export const IMonacoOverrideService = Symbol('IMonacoOverrideService');
615
@Injectable()
7-
export class MonacoContextKeyService extends BaseContextKeyService implements IContextKeyService {
8-
public readonly contextKeyService: ContextKeyService;
16+
@Domain(MonacoContribution)
17+
export class MonacoOverrideService implements MonacoContribution {
18+
@Autowired(ICommandServiceToken)
19+
monacoCommandService: MonacoCommandService;
920

10-
constructor() {
11-
super();
12-
// TODO 不放window
13-
// ContextKeyService 全局唯一 组件重置后需重新绑定
14-
this.contextKeyService =
15-
(window as any)?._alex?.ContextKeyService || new ContextKeyService(this.configurationService);
16-
(window as any)._alex = {};
17-
(window as any)._alex.ContextKeyService = this.contextKeyService;
18-
this.listenToContextChanges();
19-
}
21+
@Autowired(MonacoCodeService)
22+
monacoCodeService: MonacoCodeService;
2023

21-
dispose(): void {}
24+
registerOverrideService(registry: MonacoOverrideServiceRegistry) {
25+
// TODO opensumi ServiceNames
26+
registry.registerOverrideService(
27+
// @ts-ignore
28+
'keybindingService',
29+
new StandaloneKeybindingServiceProxy(this.monacoCodeService, this.monacoCommandService)
30+
);
31+
}
2232
}

packages/core/src/client/override/monacoOverride/codeEditorService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class MonacoCodeServiceProxy extends AbstractCodeEditorService {
4040
return this.injector!.get(IMonacoCodeService).getActiveCodeEditor();
4141
}
4242

43-
openCodeEditor(...args: any[]) {
43+
async openCodeEditor(...args: any[]) {
4444
return this.injector!.get(IMonacoCodeService).openCodeEditor(...args);
4545
}
4646
}

packages/core/src/client/override/monacoOverride/contextKeyService.ts

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -132,26 +132,11 @@ export class ScopedContextKeyServiceProxy
132132
extends BaseContextKeyService
133133
implements IScopedContextKeyService
134134
{
135-
injector: Injector;
136-
isProxyInjector: boolean = false;
137-
constructor(
138-
@Optional() public readonly contextKeyService: ContextKeyService,
139-
proxyInjector?: Injector
140-
) {
135+
constructor(@Optional() public readonly contextKeyService: ContextKeyService) {
141136
super();
142-
if (proxyInjector) {
143-
this.injector = proxyInjector;
144-
this.isProxyInjector = true;
145-
this.contextKeyService = this.injector.get(ContextKeyService);
146-
}
147-
// this.contextKeyService = contextKeyService;
148137
this.listenToContextChanges();
149138
}
150139
attachToDomNode(domNode: HTMLElement): void {
151-
if (this.isProxyInjector) {
152-
return this.injector.get(ScopedContextKeyServiceProxy).attachToDomNode(domNode);
153-
}
154-
155140
if (this.contextKeyService['_domNode']) {
156141
this.contextKeyService['_domNode'].removeAttribute(KEYBINDING_CONTEXT_ATTR);
157142
}
@@ -163,9 +148,6 @@ export class ScopedContextKeyServiceProxy
163148
}
164149

165150
match(expression: string | ContextKeyExpression | undefined): boolean {
166-
if (this.isProxyInjector) {
167-
return this.injector.get(ScopedContextKeyServiceProxy).match(expression);
168-
}
169151
try {
170152
let parsed: ContextKeyExpression | undefined;
171153
if (typeof expression === 'string') {
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { Provider } from '@opensumi/di';
2+
import { IMonacoCodeService, MonacoCodeService, monacoCodeServiceProxy } from './codeEditorService';
3+
import {
4+
MonacoTextModelService,
5+
monacoCommandServiceProxy,
6+
IMonacoCommandServiceProxy,
7+
} from './commandService';
8+
import {
9+
IMonacoBulkEditServiceProxy,
10+
MonacoBulkEditService,
11+
monacoBulkEditServiceProxy,
12+
} from './workspaceEditService';
13+
import { IBulkEditServiceShape } from '@opensumi/ide-workspace-edit';
14+
15+
import { MonacoCommandService } from '@opensumi/ide-editor/lib/browser/monaco-contrib/command/command.service';
16+
import { ICommandServiceToken } from '@opensumi/ide-monaco/lib/browser/contrib/command';
17+
import { IMonacoTextModelService, monacoTextModelServiceProxy } from './textModelService';
18+
19+
// monaco override 暂时用不到
20+
export const MonacoOverrides: Provider[] = [
21+
{
22+
token: MonacoCodeService,
23+
useValue: monacoCodeServiceProxy,
24+
override: true,
25+
},
26+
{
27+
token: IMonacoCodeService,
28+
useClass: MonacoCodeService,
29+
},
30+
// MonacoTextModelService
31+
{
32+
token: MonacoTextModelService,
33+
useValue: monacoTextModelServiceProxy,
34+
override: true,
35+
},
36+
{
37+
token: IMonacoTextModelService,
38+
useClass: MonacoTextModelService,
39+
},
40+
// IBulkEditServiceShape
41+
{
42+
token: IBulkEditServiceShape,
43+
useValue: monacoBulkEditServiceProxy,
44+
override: true,
45+
},
46+
{
47+
token: IMonacoBulkEditServiceProxy,
48+
useClass: MonacoBulkEditService,
49+
},
50+
// MonacoCommandService
51+
{
52+
token: ICommandServiceToken,
53+
useValue: monacoCommandServiceProxy,
54+
override: true,
55+
},
56+
{
57+
token: IMonacoCommandServiceProxy,
58+
useClass: MonacoCommandService,
59+
},
60+
];

packages/core/src/client/override/monacoOverride/customKeybindingService.ts renamed to packages/core/src/client/override/monacoOverride/standaloneKeybindingService.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
1+
import { CommandService } from '@alipay/alex/modules/ide-core-browser';
2+
import { ICommandService } from '@opensumi/monaco-editor-core/esm/vs/platform/commands/common/commands';
13
import { StandaloneKeybindingService } from '@opensumi/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneServices';
24
import { StandaloneServices } from '@opensumi/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneServices';
35
import { IContextKeyService } from '@opensumi/monaco-editor-core/esm/vs/platform/contextkey/common/contextkey';
4-
import { ICommandService } from '@opensumi/monaco-editor-core/esm/vs/platform/commands/common/commands';
56
import { ITelemetryService } from '@opensumi/monaco-editor-core/esm/vs/platform/telemetry/common/telemetry';
67
import { INotificationService } from '@opensumi/monaco-editor-core/esm/vs/platform/notification/common/notification';
78
import { ILogService } from '@opensumi/monaco-editor-core/esm/vs/platform/log/common/log';
89
import { ICodeEditorService } from '@opensumi/monaco-editor-core/esm/vs/editor/browser/services/codeEditorService';
10+
import { monacoCommandServiceProxy } from './commandService';
11+
import { MonacoCodeService, monacoCodeServiceProxy } from './codeEditorService';
12+
import { Injector } from '@opensumi/di';
13+
import { ICommandServiceToken } from '@opensumi/ide-monaco/lib/browser/contrib/command';
914

10-
class CustomKeybindingService extends StandaloneKeybindingService {
11-
constructor() {
12-
const codeEditorService = StandaloneServices.get(ICodeEditorService);
13-
15+
export class StandaloneKeybindingServiceProxy extends StandaloneKeybindingService {
16+
// TODO contextService
17+
constructor(monacoCodeService: ICodeEditorService, monacoCommandService: ICommandService) {
1418
super(
1519
StandaloneServices.get(IContextKeyService),
16-
StandaloneServices.get(ICommandService),
20+
monacoCommandService,
21+
// StandaloneServices.get(ICommandService),
1722
StandaloneServices.get(ITelemetryService),
1823
StandaloneServices.get(INotificationService),
1924
StandaloneServices.get(ILogService),
20-
StandaloneServices.get(ICodeEditorService)
25+
// StandaloneServices.get(ICodeEditorService)
26+
monacoCodeService
2127
);
22-
23-
codeEditorService.onCodeEditorAdd(() => {
24-
this['_domNodeListeners'].forEach((d) => {
25-
d.dispose();
26-
});
27-
});
2828
}
2929
}
3030

31-
export const customKeybindingService = new CustomKeybindingService();
31+
// export const standaloneKeybindingServiceProxy = new StandaloneKeybindingServiceProxy();

0 commit comments

Comments
 (0)