@opensumi/ide-editor 3.2.5-next-1724407522.0 → 3.2.5-next-1724407842.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/lib/browser/doc-model/editor-document-model-service.d.ts +2 -1
  2. package/lib/browser/doc-model/editor-document-model-service.d.ts.map +1 -1
  3. package/lib/browser/doc-model/editor-document-model-service.js +22 -0
  4. package/lib/browser/doc-model/editor-document-model-service.js.map +1 -1
  5. package/lib/browser/doc-model/editor-document-model.d.ts +1 -0
  6. package/lib/browser/doc-model/editor-document-model.d.ts.map +1 -1
  7. package/lib/browser/doc-model/editor-document-model.js +14 -0
  8. package/lib/browser/doc-model/editor-document-model.js.map +1 -1
  9. package/lib/browser/doc-model/saveParticipants.d.ts.map +1 -1
  10. package/lib/browser/doc-model/saveParticipants.js +1 -0
  11. package/lib/browser/doc-model/saveParticipants.js.map +1 -1
  12. package/lib/browser/doc-model/types.d.ts +3 -1
  13. package/lib/browser/doc-model/types.d.ts.map +1 -1
  14. package/lib/browser/doc-model/types.js.map +1 -1
  15. package/lib/browser/editor.contribution.d.ts.map +1 -1
  16. package/lib/browser/editor.contribution.js +7 -4
  17. package/lib/browser/editor.contribution.js.map +1 -1
  18. package/lib/browser/format/formatter-selector.d.ts.map +1 -1
  19. package/lib/browser/format/formatter-selector.js +6 -8
  20. package/lib/browser/format/formatter-selector.js.map +1 -1
  21. package/lib/browser/fs-resource/fs-resource.d.ts.map +1 -1
  22. package/lib/browser/fs-resource/fs-resource.js +5 -7
  23. package/lib/browser/fs-resource/fs-resource.js.map +1 -1
  24. package/lib/browser/hooks/useEditor.d.ts +2 -2
  25. package/lib/browser/hooks/useEditor.d.ts.map +1 -1
  26. package/lib/browser/hooks/useEditor.js +10 -11
  27. package/lib/browser/hooks/useEditor.js.map +1 -1
  28. package/lib/browser/merge-conflict/merge-conflict.model.d.ts.map +1 -1
  29. package/lib/browser/merge-conflict/merge-conflict.model.js +3 -4
  30. package/lib/browser/merge-conflict/merge-conflict.model.js.map +1 -1
  31. package/lib/browser/monaco-contrib/callHierarchy/callHierarchy.service.d.ts.map +1 -1
  32. package/lib/browser/monaco-contrib/callHierarchy/callHierarchy.service.js +3 -3
  33. package/lib/browser/monaco-contrib/callHierarchy/callHierarchy.service.js.map +1 -1
  34. package/lib/browser/monaco-contrib/typeHierarchy/typeHierarchy.service.d.ts.map +1 -1
  35. package/lib/browser/monaco-contrib/typeHierarchy/typeHierarchy.service.js +3 -3
  36. package/lib/browser/monaco-contrib/typeHierarchy/typeHierarchy.service.js.map +1 -1
  37. package/lib/browser/untitled-resource.d.ts.map +1 -1
  38. package/lib/browser/untitled-resource.js +5 -7
  39. package/lib/browser/untitled-resource.js.map +1 -1
  40. package/lib/browser/workbench-editor.service.d.ts.map +1 -1
  41. package/lib/browser/workbench-editor.service.js +12 -20
  42. package/lib/browser/workbench-editor.service.js.map +1 -1
  43. package/lib/common/editor.d.ts +47 -0
  44. package/lib/common/editor.d.ts.map +1 -1
  45. package/lib/common/editor.js.map +1 -1
  46. package/package.json +14 -14
  47. package/src/browser/doc-model/editor-document-model-service.ts +25 -1
  48. package/src/browser/doc-model/editor-document-model.ts +18 -0
  49. package/src/browser/doc-model/saveParticipants.ts +1 -0
  50. package/src/browser/doc-model/types.ts +3 -1
  51. package/src/browser/editor.contribution.ts +8 -3
  52. package/src/browser/format/formatter-selector.ts +6 -8
  53. package/src/browser/fs-resource/fs-resource.ts +5 -7
  54. package/src/browser/hooks/useEditor.ts +13 -12
  55. package/src/browser/merge-conflict/merge-conflict.model.ts +4 -5
  56. package/src/browser/monaco-contrib/callHierarchy/callHierarchy.service.ts +4 -2
  57. package/src/browser/monaco-contrib/typeHierarchy/typeHierarchy.service.ts +5 -2
  58. package/src/browser/untitled-resource.ts +5 -7
  59. package/src/browser/workbench-editor.service.ts +13 -21
  60. package/src/common/editor.ts +59 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opensumi/ide-editor",
3
- "version": "3.2.5-next-1724407522.0",
3
+ "version": "3.2.5-next-1724407842.0",
4
4
  "files": [
5
5
  "lib",
6
6
  "src"
@@ -17,21 +17,21 @@
17
17
  "url": "git@github.com:opensumi/core.git"
18
18
  },
19
19
  "dependencies": {
20
- "@opensumi/ide-core-common": "3.2.5-next-1724407522.0",
21
- "@opensumi/ide-core-node": "3.2.5-next-1724407522.0",
22
- "@opensumi/ide-file-service": "3.2.5-next-1724407522.0",
23
- "@opensumi/ide-monaco": "3.2.5-next-1724407522.0",
24
- "@opensumi/ide-utils": "3.2.5-next-1724407522.0",
20
+ "@opensumi/ide-core-common": "3.2.5-next-1724407842.0",
21
+ "@opensumi/ide-core-node": "3.2.5-next-1724407842.0",
22
+ "@opensumi/ide-file-service": "3.2.5-next-1724407842.0",
23
+ "@opensumi/ide-monaco": "3.2.5-next-1724407842.0",
24
+ "@opensumi/ide-utils": "3.2.5-next-1724407842.0",
25
25
  "vscode-oniguruma": "1.5.1"
26
26
  },
27
27
  "devDependencies": {
28
- "@opensumi/ide-components": "3.2.5-next-1724407522.0",
29
- "@opensumi/ide-core-browser": "3.2.5-next-1724407522.0",
30
- "@opensumi/ide-dev-tool": "3.2.5-next-1724407522.0",
31
- "@opensumi/ide-overlay": "3.2.5-next-1724407522.0",
32
- "@opensumi/ide-quick-open": "3.2.5-next-1724407522.0",
33
- "@opensumi/ide-theme": "3.2.5-next-1724407522.0",
34
- "@opensumi/ide-workspace": "3.2.5-next-1724407522.0"
28
+ "@opensumi/ide-components": "3.2.5-next-1724407842.0",
29
+ "@opensumi/ide-core-browser": "3.2.5-next-1724407842.0",
30
+ "@opensumi/ide-dev-tool": "3.2.5-next-1724407842.0",
31
+ "@opensumi/ide-overlay": "3.2.5-next-1724407842.0",
32
+ "@opensumi/ide-quick-open": "3.2.5-next-1724407842.0",
33
+ "@opensumi/ide-theme": "3.2.5-next-1724407842.0",
34
+ "@opensumi/ide-workspace": "3.2.5-next-1724407842.0"
35
35
  },
36
- "gitHead": "8cc47746874b1638043507b3b60b8f0d776dd210"
36
+ "gitHead": "7ed3e7872ef82de42d9523f55c5eb83b5aa0f581"
37
37
  }
@@ -23,7 +23,7 @@ import { IHashCalculateService } from '@opensumi/ide-core-common/lib/hash-calcul
23
23
  import { IFileServiceClient } from '@opensumi/ide-file-service';
24
24
  import { EOL } from '@opensumi/ide-monaco/lib/browser/monaco-api/types';
25
25
 
26
- import { IEditorDocumentModel } from '../../common/editor';
26
+ import { IEditorDocumentDescription, IEditorDocumentModel } from '../../common/editor';
27
27
 
28
28
  import { EditorDocumentModel } from './editor-document-model';
29
29
  import {
@@ -230,6 +230,30 @@ export class EditorDocumentModelServiceImpl extends WithEventBus implements IEdi
230
230
  return this._modelReferenceManager.getReferenceIfHasInstance(uri.toString(), reason);
231
231
  }
232
232
 
233
+ getModelDescription(uri: URI, reason?: string): IEditorDocumentDescription | null {
234
+ const ref = this.getModelReference(uri, reason);
235
+ if (!ref) {
236
+ return null;
237
+ }
238
+
239
+ const instance = ref.instance;
240
+ const resullt = {
241
+ alwaysDirty: instance.alwaysDirty,
242
+ closeAutoSave: instance.closeAutoSave,
243
+ disposeEvenDirty: instance.disposeEvenDirty,
244
+ eol: instance.eol,
245
+ encoding: instance.encoding,
246
+ dirty: instance.dirty,
247
+ languageId: instance.languageId,
248
+ readonly: instance.readonly,
249
+ uri: instance.uri,
250
+ id: instance.id,
251
+ savable: instance.savable,
252
+ };
253
+ ref.dispose();
254
+ return resullt;
255
+ }
256
+
233
257
  getAllModels(): IEditorDocumentModel[] {
234
258
  return Array.from(this.editorDocModels.values());
235
259
  }
@@ -360,7 +360,25 @@ export class EditorDocumentModel extends Disposable implements IEditorDocumentMo
360
360
  return this.monacoModel;
361
361
  }
362
362
 
363
+ async syncDocumentModelToExtThread() {
364
+ await this.eventBus.fireAndAwait(
365
+ new EditorDocumentModelOptionChangedEvent({
366
+ uri: this.uri,
367
+ languageId: this.languageId,
368
+ encoding: this.encoding,
369
+ eol: this.eol,
370
+ dirty: this.dirty,
371
+ }),
372
+ );
373
+ }
374
+
363
375
  async save(force = false, reason: SaveReason = SaveReason.Manual): Promise<boolean> {
376
+ if (!this.dirty) {
377
+ // 如果文档内容没有变化,则只同步新状态到插件进程
378
+ await this.syncDocumentModelToExtThread();
379
+ return false;
380
+ }
381
+
364
382
  const provider = await this.contentRegistry.getProvider(this.uri);
365
383
  const isReadonly = await provider?.isReadonly(this.uri);
366
384
 
@@ -283,6 +283,7 @@ export class TrimFinalNewLinesParticipant extends WithEventBus {
283
283
 
284
284
  const model = modelRef.instance.getMonacoModel();
285
285
  this.doTrimFinalNewLines(model, e.payload.reason !== SaveReason.Manual);
286
+ modelRef.dispose();
286
287
  }
287
288
  }
288
289
 
@@ -12,7 +12,7 @@ import * as monaco from '@opensumi/ide-monaco';
12
12
  import { EOL, EndOfLineSequence } from '@opensumi/ide-monaco/lib/browser/monaco-api/types';
13
13
 
14
14
  import { IEditorDocumentModelContentChange, SaveReason } from '../../common';
15
- import { IEditorDocumentModel, IEditorDocumentModelRef } from '../../common/editor';
15
+ import { IEditorDocumentDescription, IEditorDocumentModel, IEditorDocumentModelRef } from '../../common/editor';
16
16
 
17
17
  export interface IDocModelUpdateOptions extends monaco.editor.ITextModelUpdateOptions {
18
18
  detectIndentation?: boolean;
@@ -130,6 +130,7 @@ export interface IEditorDocumentModelService {
130
130
  * 当文档从来没有被打开过时,返回null
131
131
  */
132
132
  getModelReference(uri: URI, reason?: string): IEditorDocumentModelRef | null;
133
+ getModelDescription(uri: URI, reason?: string): IEditorDocumentDescription | null;
133
134
 
134
135
  /**
135
136
  * 获得全部model
@@ -193,6 +194,7 @@ export interface IEditorDocumentModelOptionChangedEventPayload {
193
194
  encoding?: string;
194
195
  languageId?: string;
195
196
  eol?: EOL;
197
+ dirty?: boolean;
196
198
  }
197
199
 
198
200
  export class EditorDocumentModelCreationEvent extends BasicEvent<IEditorDocumentModelCreationEventPayload> {}
@@ -808,7 +808,12 @@ export class EditorContribution
808
808
  return;
809
809
  }
810
810
 
811
- return this.editorDocumentModelService.getModelReference(uri)?.instance.encoding;
811
+ const ref = this.editorDocumentModelService.getModelDescription(uri);
812
+ if (!ref) {
813
+ return;
814
+ }
815
+
816
+ return ref.encoding;
812
817
  },
813
818
  });
814
819
 
@@ -832,8 +837,8 @@ export class EditorContribution
832
837
 
833
838
  const provider = await this.contentRegistry.getProvider(uri);
834
839
  const guessedEncoding = await provider?.guessEncoding?.(uri);
835
- const ref = this.editorDocumentModelService.getModelReference(uri);
836
- const currentEncoding = documentModel?.encoding ?? ref?.instance.encoding;
840
+ const ref = this.editorDocumentModelService.getModelDescription(uri);
841
+ const currentEncoding = documentModel?.encoding ?? ref?.encoding;
837
842
 
838
843
  let matchIndex: number | undefined;
839
844
  const encodingItems: QuickPickItem<string>[] = Object.keys(SUPPORTED_ENCODINGS)
@@ -47,12 +47,11 @@ export class FormattingSelector implements IFormattingSelector {
47
47
  mode: FormattingMode,
48
48
  _kind: FormattingKind,
49
49
  ): Promise<T | undefined> {
50
- const docRef = this.modelService.getModelReference(URI.from(document.uri.toJSON()));
51
- if (!docRef) {
50
+ const docDesc = this.modelService.getModelDescription(URI.from(document.uri.toJSON()));
51
+ if (!docDesc) {
52
52
  return;
53
53
  }
54
- const languageId = docRef.instance.languageId;
55
- docRef.dispose();
54
+ const languageId = docDesc.languageId;
56
55
  const preferred = this.getPreferedFormatter(languageId);
57
56
 
58
57
  const elements: { [key: string]: T } = {};
@@ -120,12 +119,11 @@ export class FormattingSelector implements IFormattingSelector {
120
119
  formatters: T[],
121
120
  document: ITextModel,
122
121
  ): Promise<T | undefined> {
123
- const docRef = this.modelService.getModelReference(URI.from(document.uri.toJSON()));
124
- if (!docRef) {
122
+ const docDesc = this.modelService.getModelDescription(URI.from(document.uri.toJSON()));
123
+ if (!docDesc) {
125
124
  return;
126
125
  }
127
- const languageId = docRef.instance.languageId;
128
- docRef.dispose();
126
+ const languageId = docDesc.languageId;
129
127
 
130
128
  const elements: { [key: string]: T } = {};
131
129
  formatters.forEach((provider: T) => {
@@ -181,8 +181,8 @@ export class FileSystemResourceProvider extends WithEventBus implements IResourc
181
181
  this.cachedFileStat.delete(resource.uri.toString());
182
182
  }
183
183
  async shouldCloseResourceWithoutConfirm(resource: IResource) {
184
- const documentModelRef = this.documentModelService.getModelReference(resource.uri, 'close-resource-check');
185
- if (documentModelRef && documentModelRef.instance.dirty) {
184
+ const documentModelRef = this.documentModelService.getModelDescription(resource.uri, 'close-resource-check');
185
+ if (documentModelRef && documentModelRef.dirty) {
186
186
  return true;
187
187
  }
188
188
  return false;
@@ -204,6 +204,7 @@ export class FileSystemResourceProvider extends WithEventBus implements IResourc
204
204
  documentModelRef.dispose();
205
205
  return false;
206
206
  } else {
207
+ documentModelRef.dispose();
207
208
  return true;
208
209
  }
209
210
  }
@@ -222,11 +223,8 @@ export class FileSystemResourceProvider extends WithEventBus implements IResourc
222
223
  }
223
224
  }
224
225
  }
225
- const documentModelRef = this.documentModelService.getModelReference(resource.uri, 'close-resource-check');
226
- if (!documentModelRef || !documentModelRef.instance.dirty) {
227
- if (documentModelRef) {
228
- documentModelRef.dispose();
229
- }
226
+ const documentModelRef = this.documentModelService.getModelDescription(resource.uri, 'close-resource-check');
227
+ if (!documentModelRef || !documentModelRef.dirty) {
230
228
  return true;
231
229
  }
232
230
 
@@ -1,34 +1,35 @@
1
1
  import { useEffect, useState } from 'react';
2
2
 
3
- import { URI, useInjectable } from '@opensumi/ide-core-browser';
3
+ import { DisposableStore, URI, useInjectable } from '@opensumi/ide-core-browser';
4
4
 
5
5
  import { IEditorDocumentModelService } from '../doc-model/types';
6
- import { IEditorDocumentModelRef } from '../types';
6
+ import { IEditorDocumentModel } from '../types';
7
7
 
8
- export function useEditorDocumentModelRef(uri: URI) {
8
+ export function useEditorDocumentModel(uri: URI) {
9
9
  const documentService: IEditorDocumentModelService = useInjectable(IEditorDocumentModelService);
10
- const [ref, setRef] = useState<IEditorDocumentModelRef | null>(null);
10
+ const [instance, setInstance] = useState<IEditorDocumentModel | null>(null);
11
11
 
12
12
  useEffect(() => {
13
+ const toDispose = new DisposableStore();
13
14
  const run = () => {
14
15
  const ref = documentService.getModelReference(uri);
15
16
  if (ref) {
16
- setRef(ref);
17
+ setInstance(ref.instance);
18
+ ref.dispose();
17
19
  }
18
20
  };
19
21
 
20
- const toDispose = documentService.onDocumentModelCreated(uri.toString(), () => {
21
- run();
22
- });
22
+ toDispose.add(
23
+ documentService.onDocumentModelCreated(uri.toString(), () => {
24
+ run();
25
+ }),
26
+ );
23
27
 
24
28
  run();
25
29
  return () => {
26
30
  toDispose.dispose();
27
- if (ref) {
28
- ref.dispose();
29
- }
30
31
  };
31
32
  }, [uri]);
32
33
 
33
- return ref;
34
+ return instance;
34
35
  }
@@ -4,12 +4,12 @@ import { useEffect, useMemo, useState } from 'react';
4
4
  import { formatLocalize, useInjectable } from '@opensumi/ide-core-browser';
5
5
  import { DisposableStore, URI } from '@opensumi/ide-utils';
6
6
 
7
- import { useEditorDocumentModelRef } from '../hooks/useEditor';
7
+ import { useEditorDocumentModel } from '../hooks/useEditor';
8
8
 
9
9
  import { MergeConflictService } from './merge-conflict.service';
10
10
 
11
11
  export function useMergeConflictModel(uri: URI) {
12
- const editorModel = useEditorDocumentModelRef(uri);
12
+ const editorModel = useEditorDocumentModel(uri);
13
13
 
14
14
  /**
15
15
  * 如果是原来就有冲突的文件,当冲突没了之后,仍然显示冲突
@@ -28,9 +28,8 @@ export function useMergeConflictModel(uri: URI) {
28
28
  const disposables = new DisposableStore();
29
29
 
30
30
  if (editorModel) {
31
- const { instance } = editorModel;
32
31
  const run = () => {
33
- const n = mergeConflictService.scanDocument(instance.getMonacoModel());
32
+ const n = mergeConflictService.scanDocument(editorModel.getMonacoModel());
34
33
  setConflictsCount(n);
35
34
  if (n > 0) {
36
35
  setIsInitialVisiable(true);
@@ -40,7 +39,7 @@ export function useMergeConflictModel(uri: URI) {
40
39
  const debounceRun = debounce(run, 150);
41
40
 
42
41
  disposables.add(
43
- instance.getMonacoModel().onDidChangeContent(() => {
42
+ editorModel.getMonacoModel().onDidChangeContent(() => {
44
43
  debounceRun();
45
44
  }),
46
45
  );
@@ -112,8 +112,10 @@ export class CallHierarchyService implements ICallHierarchyService {
112
112
  }
113
113
 
114
114
  async prepareCallHierarchyProvider(resource: Uri, position: Position) {
115
- let textModel = this.modelService.getModelReference(URI.parse(resource.toString()))?.instance.getMonacoModel();
116
- let textModelReference: IDisposable | undefined;
115
+ let textModelReference = this.modelService.getModelReference(URI.parse(resource.toString()));
116
+ let textModel: ITextModel | undefined = textModelReference?.instance.getMonacoModel();
117
+ textModelReference?.dispose();
118
+
117
119
  if (!textModel) {
118
120
  const result = await this.modelService.createModelReference(URI.parse(resource.toString()));
119
121
  textModel = result.instance.getMonacoModel();
@@ -104,8 +104,11 @@ export class TypeHierarchyService implements ITypeHierarchyService {
104
104
  }
105
105
 
106
106
  async prepareTypeHierarchyProvider(resource: Uri, position: Position) {
107
- let textModel = this.modelService.getModelReference(URI.parse(resource.toString()))?.instance.getMonacoModel();
108
- let textModelReference: IDisposable | undefined;
107
+ let textModelReference = this.modelService.getModelReference(URI.parse(resource.toString()));
108
+
109
+ let textModel: ITextModel | undefined = textModelReference?.instance.getMonacoModel();
110
+ textModelReference?.dispose();
111
+
109
112
  if (!textModel) {
110
113
  const result = await this.modelService.createModelReference(URI.parse(resource.toString()));
111
114
  textModel = result.instance.getMonacoModel();
@@ -171,8 +171,8 @@ export class UntitledSchemeResourceProvider extends WithEventBus implements IRes
171
171
  }
172
172
 
173
173
  async shouldCloseResourceWithoutConfirm(resource: IResource) {
174
- const documentModelRef = this.documentModelService.getModelReference(resource.uri, 'close-resource-check');
175
- if (documentModelRef && documentModelRef.instance.dirty) {
174
+ const documentModelRef = this.documentModelService.getModelDescription(resource.uri, 'close-resource-check');
175
+ if (documentModelRef && documentModelRef.dirty) {
176
176
  return true;
177
177
  }
178
178
  return false;
@@ -195,16 +195,14 @@ export class UntitledSchemeResourceProvider extends WithEventBus implements IRes
195
195
  documentModelRef.dispose();
196
196
  return false;
197
197
  } else {
198
+ documentModelRef.dispose();
198
199
  return true;
199
200
  }
200
201
  }
201
202
 
202
203
  async shouldCloseResource(resource: IResource) {
203
- const documentModelRef = this.documentModelService.getModelReference(resource.uri, 'close-resource-check');
204
- if (!documentModelRef || !documentModelRef.instance.dirty) {
205
- if (documentModelRef) {
206
- documentModelRef.dispose();
207
- }
204
+ const documentModelRef = this.documentModelService.getModelDescription(resource.uri, 'close-resource-check');
205
+ if (!documentModelRef || !documentModelRef.dirty) {
208
206
  return true;
209
207
  }
210
208
  // 询问用户是否保存
@@ -44,6 +44,7 @@ import {
44
44
  debounce,
45
45
  formatLocalize,
46
46
  getDebugLogger,
47
+ isDefined,
47
48
  isUndefinedOrNull,
48
49
  localize,
49
50
  makeRandomHexString,
@@ -435,10 +436,9 @@ export class WorkbenchEditorServiceImpl extends WithEventBus implements Workbenc
435
436
  // contextKeys
436
437
  const getLanguageFromModel = (uri: URI) => {
437
438
  let result: string | null = null;
438
- const modelRef = this.documentModelManager.getModelReference(uri, 'resourceContextKey');
439
+ const modelRef = this.documentModelManager.getModelDescription(uri, 'resourceContextKey');
439
440
  if (modelRef) {
440
- result = modelRef.instance.languageId;
441
- modelRef.dispose();
441
+ result = modelRef.languageId;
442
442
  }
443
443
  return result;
444
444
  };
@@ -717,12 +717,10 @@ export class EditorGroup extends WithEventBus implements IGridEditorGroup {
717
717
  /**
718
718
  * 当前打开的所有resource
719
719
  */
720
- // @observable.shallow
721
720
  resources: IResource[] = [];
722
721
 
723
722
  resourceStatus: Map<IResource, Promise<void>> = new Map();
724
723
 
725
- // @observable.ref
726
724
  _currentResource: IResource | null;
727
725
 
728
726
  _currentOpenType: IEditorOpenType | null;
@@ -894,12 +892,9 @@ export class EditorGroup extends WithEventBus implements IGridEditorGroup {
894
892
  if (!this._resourceContext) {
895
893
  const getLanguageFromModel = (uri: URI) => {
896
894
  let result: string | null = null;
897
- const modelRef = this.documentModelManager.getModelReference(uri, 'resourceContextKey');
895
+ const modelRef = this.documentModelManager.getModelDescription(uri, 'resourceContextKey');
898
896
  if (modelRef) {
899
- if (modelRef) {
900
- result = modelRef.instance.languageId;
901
- }
902
- modelRef.dispose();
897
+ result = modelRef.languageId;
903
898
  }
904
899
  return result;
905
900
  };
@@ -1414,6 +1409,9 @@ export class EditorGroup extends WithEventBus implements IGridEditorGroup {
1414
1409
  if (options && options.label) {
1415
1410
  resource.name = options.label;
1416
1411
  }
1412
+ if (options && isDefined(options.supportsRevive)) {
1413
+ resource.supportsRevive = options.supportsRevive;
1414
+ }
1417
1415
  let replaceResource: IResource | null = null;
1418
1416
  if (options && options.index !== undefined && options.index < this.resources.length) {
1419
1417
  replaceResource = this.resources[options.index];
@@ -2305,9 +2303,7 @@ export class EditorGroup extends WithEventBus implements IGridEditorGroup {
2305
2303
  // 否则使用 document 进行保存 (如果有)
2306
2304
  const docRef = this.documentModelManager.getModelReference(resource.uri);
2307
2305
  if (docRef) {
2308
- if (docRef.instance.dirty) {
2309
- await docRef.instance.save(undefined, reason);
2310
- }
2306
+ await docRef.instance.save(undefined, reason);
2311
2307
  docRef.dispose();
2312
2308
  }
2313
2309
  }
@@ -2340,11 +2336,9 @@ export class EditorGroup extends WithEventBus implements IGridEditorGroup {
2340
2336
 
2341
2337
  hasDirty(): boolean {
2342
2338
  for (const r of this.resources) {
2343
- const docRef = this.documentModelManager.getModelReference(r.uri);
2339
+ const docRef = this.documentModelManager.getModelDescription(r.uri);
2344
2340
  if (docRef) {
2345
- const isDirty = docRef.instance.dirty;
2346
- docRef.dispose();
2347
- if (isDirty) {
2341
+ if (docRef.dirty) {
2348
2342
  return true;
2349
2343
  }
2350
2344
  }
@@ -2358,15 +2352,13 @@ export class EditorGroup extends WithEventBus implements IGridEditorGroup {
2358
2352
  calcDirtyCount(countedUris: Set<string> = new Set<string>()): number {
2359
2353
  let count = 0;
2360
2354
  for (const r of this.resources) {
2361
- const docRef = this.documentModelManager.getModelReference(r.uri, 'calc-dirty-count');
2355
+ const docRef = this.documentModelManager.getModelDescription(r.uri, 'calc-dirty-count');
2362
2356
  if (countedUris.has(r.uri.toString())) {
2363
2357
  continue;
2364
2358
  }
2365
2359
  countedUris.add(r.uri.toString());
2366
2360
  if (docRef) {
2367
- const isDirty = docRef.instance.dirty;
2368
- docRef.dispose();
2369
- if (isDirty) {
2361
+ if (docRef.dirty) {
2370
2362
  count += 1;
2371
2363
  }
2372
2364
  }
@@ -29,10 +29,66 @@ import type { ITextModel, ITextModelUpdateOptions } from '@opensumi/monaco-edito
29
29
 
30
30
  export { ShowLightbulbIconMode } from '@opensumi/ide-monaco';
31
31
 
32
+ export interface IEditorDocumentDescription {
33
+ /**
34
+ * 文档URI
35
+ */
36
+ readonly uri: URI;
37
+
38
+ /**
39
+ * A unique identifier associated with this model.
40
+ */
41
+ readonly id: string;
42
+
43
+ /**
44
+ * 编码
45
+ */
46
+ readonly encoding: string;
47
+
48
+ /**
49
+ * 行末结束
50
+ */
51
+ readonly eol: EOL;
52
+
53
+ /**
54
+ * 语言Id
55
+ */
56
+ readonly languageId: string;
57
+
58
+ /**
59
+ * 是否被修改过
60
+ */
61
+ readonly dirty: boolean;
62
+
63
+ /**
64
+ * 能否修改
65
+ */
66
+ readonly readonly: boolean;
67
+
68
+ /**
69
+ * 能否保存
70
+ */
71
+ readonly savable: boolean;
72
+
73
+ /**
74
+ * 是否永远都显示 dirty
75
+ */
76
+ readonly alwaysDirty: boolean;
77
+
78
+ /**
79
+ * 即便是 dirty 也要被 dispose
80
+ */
81
+ readonly disposeEvenDirty: boolean;
82
+
83
+ /**
84
+ * 是否关闭自动保存功能
85
+ */
86
+ readonly closeAutoSave: boolean;
87
+ }
88
+
32
89
  /**
33
90
  * editorDocumentModel is a wrapped concept for monaco's textModel
34
91
  */
35
-
36
92
  export interface IEditorDocumentModel extends IDisposable {
37
93
  /**
38
94
  * 文档URI
@@ -636,6 +692,8 @@ export interface IResourceOpenOptions {
636
692
  * 当关闭时指定 force 参数,用来跳过 shouldClose 等逻辑
637
693
  */
638
694
  forceClose?: boolean;
695
+
696
+ supportsRevive?: boolean;
639
697
  }
640
698
 
641
699
  export interface IResourceOpenResult {