From 0a425682bf46fef20ebc7da845863ed9519d52c8 Mon Sep 17 00:00:00 2001 From: "guqiankun.gqk" Date: Fri, 27 May 2022 14:48:57 +0800 Subject: [PATCH 1/3] feat: update openTextDocument Api --- .../src/browser/vscode/api/main.thread.doc.ts | 11 +++++++---- packages/extension/src/common/vscode/doc.ts | 4 +++- .../hosted/api/vscode/doc/doc-manager.host.ts | 17 +++++++++++------ 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/packages/extension/src/browser/vscode/api/main.thread.doc.ts b/packages/extension/src/browser/vscode/api/main.thread.doc.ts index 209fd504b2..f8bc571090 100644 --- a/packages/extension/src/browser/vscode/api/main.thread.doc.ts +++ b/packages/extension/src/browser/vscode/api/main.thread.doc.ts @@ -218,16 +218,19 @@ export class MainThreadExtensionDocumentData extends WithEventBus implements IMa }); } - async $tryCreateDocument(options: { content: string; language: string }): Promise { + async $tryCreateDocument(options?: { content?: string; language?: string }): Promise { + if (!options) { + options = {}; + } const { language, content } = options; const docRef = await this.docManager.createModelReference( - new URI(`${Schemes.untitled}://temp/` + this.tempDocIdCount++), + new URI(`${Schemes.untitled}://temp/Untitled-` + this.tempDocIdCount++), 'ext-create-document', ); - if (options.language) { + if (language) { docRef.instance.languageId = language; } - if (!isUndefinedOrNull(options.content)) { + if (!isUndefinedOrNull(content)) { docRef.instance.updateContent(content); } return docRef.instance.uri.toString(); diff --git a/packages/extension/src/common/vscode/doc.ts b/packages/extension/src/common/vscode/doc.ts index 9c3a1f1c30..f90c5d4ea9 100644 --- a/packages/extension/src/common/vscode/doc.ts +++ b/packages/extension/src/common/vscode/doc.ts @@ -44,7 +44,9 @@ export interface ExtensionDocumentDataManager extends IExtensionHostDocService { getDocument(resource: Uri | string): vscode.TextDocument | undefined; getDocumentData(resource: Uri | string): ExtHostDocumentData | undefined; getAllDocument(): vscode.TextDocument[]; - openTextDocument(path: Uri | string): Promise; + openTextDocument( + uriOrFileNameOrOptions?: Uri | string | { language?: string; content?: string }, + ): Promise; registerTextDocumentContentProvider(scheme: string, provider: vscode.TextDocumentContentProvider): IDisposable; onDidOpenTextDocument: Event; onDidCloseTextDocument: Event; diff --git a/packages/extension/src/hosted/api/vscode/doc/doc-manager.host.ts b/packages/extension/src/hosted/api/vscode/doc/doc-manager.host.ts index c3a0663caf..a956854e27 100644 --- a/packages/extension/src/hosted/api/vscode/doc/doc-manager.host.ts +++ b/packages/extension/src/hosted/api/vscode/doc/doc-manager.host.ts @@ -1,7 +1,7 @@ import type vscode from 'vscode'; import { IRPCProtocol } from '@opensumi/ide-connection'; -import { BinaryBuffer, CancellationTokenSource, Emitter, IDisposable, isUTF8 } from '@opensumi/ide-core-common'; +import { BinaryBuffer, CancellationTokenSource, Emitter, IDisposable, isUTF8, URI } from '@opensumi/ide-core-common'; import { ExtensionDocumentDataManager, @@ -68,13 +68,18 @@ export class ExtensionDocumentDataManagerImpl implements ExtensionDocumentDataMa return data ? data.document : undefined; } - async openTextDocument(path: Uri | string) { + async openTextDocument(uriOrFileNameOrOptions?: Uri | string | { language?: string; content?: string }) { let uri: Uri; - - if (typeof path === 'string') { - uri = Uri.file(path); + const options = uriOrFileNameOrOptions as { language?: string; content?: string }; + + if (typeof uriOrFileNameOrOptions === 'string') { + uri = Uri.file(uriOrFileNameOrOptions); + } else if (URI.isUri(uriOrFileNameOrOptions)) { + uri = Uri.parse(uriOrFileNameOrOptions.toString()); + } else if (!options || typeof options === 'object') { + uri = Uri.parse(await this._proxy.$tryCreateDocument(options)); } else { - uri = Uri.parse(path.toString()); + throw new Error('illegal argument - uriOrFileNameOrOptions'); } const doc = this._documents.get(uri.toString()); From de01ec65b62ebd1b67bedb947e63b68531d2b622 Mon Sep 17 00:00:00 2001 From: "guqiankun.gqk" Date: Wed, 6 Jul 2022 11:25:37 +0800 Subject: [PATCH 2/3] feat: support global untitled id --- packages/editor/src/browser/untitled-resource.ts | 9 +++++++++ packages/editor/src/browser/workbench-editor.service.ts | 6 ++++-- .../extension/src/browser/vscode/api/main.thread.doc.ts | 8 +++++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/packages/editor/src/browser/untitled-resource.ts b/packages/editor/src/browser/untitled-resource.ts index ec813b3efe..ede129d96e 100644 --- a/packages/editor/src/browser/untitled-resource.ts +++ b/packages/editor/src/browser/untitled-resource.ts @@ -25,6 +25,15 @@ import { AskSaveResult, IResource, IResourceProvider, WorkbenchEditorService } f import { IEditorDocumentModelService, IEditorDocumentModelContentProvider } from './doc-model/types'; +@Injectable() +export class UntitledDocumentIdCounter { + private _id = 1; + + get id() { + return this._id++; + } +} + @Injectable() export class UntitledSchemeDocumentProvider implements IEditorDocumentModelContentProvider { @Autowired(IEditorDocumentModelService) diff --git a/packages/editor/src/browser/workbench-editor.service.ts b/packages/editor/src/browser/workbench-editor.service.ts index 3efd59199b..a027ba2b4a 100644 --- a/packages/editor/src/browser/workbench-editor.service.ts +++ b/packages/editor/src/browser/workbench-editor.service.ts @@ -39,6 +39,7 @@ import { Disposable, makeRandomHexString, } from '@opensumi/ide-core-common'; +import { UntitledDocumentIdCounter } from '@opensumi/ide-editor/lib/browser/untitled-resource'; import { IMessageService } from '@opensumi/ide-overlay'; import * as monaco from '@opensumi/monaco-editor-core/esm/vs/editor/editor.api'; @@ -138,7 +139,8 @@ export class WorkbenchEditorServiceImpl extends WithEventBus implements Workbenc @Autowired(IEditorDocumentModelService) protected documentModelManager: IEditorDocumentModelService; - private untitledIndex = 1; + @Autowired() + private untitledIndex: UntitledDocumentIdCounter; private untitledCloseIndex: number[] = []; @@ -484,7 +486,7 @@ export class WorkbenchEditorServiceImpl extends WithEventBus implements Workbenc private createUntitledURI() { // 优先从已删除的 index 中获取 - const index = this.untitledCloseIndex.shift() || this.untitledIndex++; + const index = this.untitledCloseIndex.shift() || this.untitledIndex.id; return new URI().withScheme(Schemes.untitled).withQuery(`name=Untitled-${index}&index=${index}`); } diff --git a/packages/extension/src/browser/vscode/api/main.thread.doc.ts b/packages/extension/src/browser/vscode/api/main.thread.doc.ts index f8bc571090..ae9af27dd4 100644 --- a/packages/extension/src/browser/vscode/api/main.thread.doc.ts +++ b/packages/extension/src/browser/vscode/api/main.thread.doc.ts @@ -28,6 +28,7 @@ import { EditorDocumentModelOptionChangedEvent, EditorDocumentModelWillSaveEvent, } from '@opensumi/ide-editor/lib/browser'; +import { UntitledDocumentIdCounter } from '@opensumi/ide-editor/lib/browser/untitled-resource'; import { IFileServiceClient } from '@opensumi/ide-file-service'; import { ExtHostAPIIdentifier, IMainThreadDocumentsShape, IExtensionHostDocService } from '../../../common/vscode'; @@ -69,10 +70,11 @@ class ExtensionEditorDocumentProvider implements IEditorDocumentModelContentProv @Injectable({ multiple: true }) export class MainThreadExtensionDocumentData extends WithEventBus implements IMainThreadDocumentsShape { - private tempDocIdCount = 0; - private readonly proxy: IExtensionHostDocService; + @Autowired() + private tempDocIdCount: UntitledDocumentIdCounter; + @Autowired(IEditorDocumentModelService) protected docManager: IEditorDocumentModelService; @@ -224,7 +226,7 @@ export class MainThreadExtensionDocumentData extends WithEventBus implements IMa } const { language, content } = options; const docRef = await this.docManager.createModelReference( - new URI(`${Schemes.untitled}://temp/Untitled-` + this.tempDocIdCount++), + new URI(`${Schemes.untitled}://temp/Untitled-` + this.tempDocIdCount.id), 'ext-create-document', ); if (language) { From b61283587fdb228165937ab038b3097041802a85 Mon Sep 17 00:00:00 2001 From: "guqiankun.gqk" Date: Wed, 6 Jul 2022 17:09:33 +0800 Subject: [PATCH 3/3] chore: fix ci --- packages/editor/src/browser/workbench-editor.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/editor/src/browser/workbench-editor.service.ts b/packages/editor/src/browser/workbench-editor.service.ts index a027ba2b4a..d6280e45f5 100644 --- a/packages/editor/src/browser/workbench-editor.service.ts +++ b/packages/editor/src/browser/workbench-editor.service.ts @@ -39,7 +39,6 @@ import { Disposable, makeRandomHexString, } from '@opensumi/ide-core-common'; -import { UntitledDocumentIdCounter } from '@opensumi/ide-editor/lib/browser/untitled-resource'; import { IMessageService } from '@opensumi/ide-overlay'; import * as monaco from '@opensumi/monaco-editor-core/esm/vs/editor/editor.api'; @@ -89,6 +88,7 @@ import { CodeEditorDidVisibleEvent, RegisterEditorComponentEvent, } from './types'; +import { UntitledDocumentIdCounter } from './untitled-resource'; @Injectable() export class WorkbenchEditorServiceImpl extends WithEventBus implements WorkbenchEditorService {