Make createEditorInput async (#20038)

This commit is contained in:
Charles Gagnon
2022-07-14 19:39:52 -07:00
committed by GitHub
parent ada87478a7
commit ba1f4db745
9 changed files with 25 additions and 24 deletions

View File

@@ -71,7 +71,7 @@ export default class EditorComponent extends ComponentBase<azdata.EditorProperti
this._editor.setVisible(true); this._editor.setVisible(true);
let uri = this.createUri(); let uri = this.createUri();
this._editorInput = this.editorService.createEditorInput({ forceUntitled: true, resource: uri, mode: 'plaintext' }) as UntitledTextEditorInput; this._editorInput = await this.editorService.createEditorInput({ forceUntitled: true, resource: uri, mode: 'plaintext' }) as UntitledTextEditorInput;
await this._editor.setInput(this._editorInput, undefined, undefined); await this._editor.setInput(this._editorInput, undefined, undefined);
const model = await this._editorInput.resolve(); const model = await this._editorInput.resolve();

View File

@@ -782,15 +782,15 @@ export class NotebookEditorOverrideContribution extends Disposable implements IW
priority: RegisteredEditorPriority.builtin priority: RegisteredEditorPriority.builtin
}, },
{}, {},
(editorInput, group) => { async (editorInput, group) => {
const fileInput = this._editorService.createEditorInput(editorInput) as FileEditorInput; const fileInput = await this._editorService.createEditorInput(editorInput) as FileEditorInput;
// Try to convert the input, falling back to just a plain file input if we're unable to // Try to convert the input, falling back to just a plain file input if we're unable to
const newInput = this.convertInput(fileInput); const newInput = this.convertInput(fileInput);
return { editor: newInput, options: editorInput.options, group: group }; return { editor: newInput, options: editorInput.options, group: group };
}, },
undefined, undefined,
(diffEditorInput, group) => { async (diffEditorInput, group) => {
const diffEditorInputImpl = this._editorService.createEditorInput(diffEditorInput) as DiffEditorInput; const diffEditorInputImpl = await this._editorService.createEditorInput(diffEditorInput) as DiffEditorInput;
// Try to convert the input, falling back to the original input if we're unable to // Try to convert the input, falling back to the original input if we're unable to
const newInput = this.convertInput(diffEditorInputImpl); const newInput = this.convertInput(diffEditorInputImpl);
return { editor: newInput, options: diffEditorInput.options, group: group }; return { editor: newInput, options: diffEditorInput.options, group: group };

View File

@@ -546,8 +546,8 @@ export class QueryEditorOverrideContribution extends Disposable implements IWork
// Fall back to using the normal text based diff editor - we don't want the query bar and related items showing up in the diff editor // Fall back to using the normal text based diff editor - we don't want the query bar and related items showing up in the diff editor
canHandleDiff: () => false canHandleDiff: () => false
}, },
(editorInput, group) => { async (editorInput, group) => {
const fileInput = this._editorService.createEditorInput(editorInput) as FileEditorInput; const fileInput = await this._editorService.createEditorInput(editorInput) as FileEditorInput;
const langAssociation = languageAssociationRegistry.getAssociationForLanguage(lang); const langAssociation = languageAssociationRegistry.getAssociationForLanguage(lang);
const queryEditorInput = langAssociation?.syncConvertInput?.(fileInput); const queryEditorInput = langAssociation?.syncConvertInput?.(fileInput);
if (!queryEditorInput) { if (!queryEditorInput) {

View File

@@ -309,7 +309,7 @@ export class NotebookService extends Disposable implements INotebookService {
fileInput = this._instantiationService.createInstance(UntitledTextEditorInput, model); fileInput = this._instantiationService.createInstance(UntitledTextEditorInput, model);
} else { } else {
let input: any = { forceFile: true, resource: uri, mode: languageMode }; let input: any = { forceFile: true, resource: uri, mode: languageMode };
fileInput = this._editorService.createEditorInput(input); fileInput = await this._editorService.createEditorInput(input);
} }
} }

View File

@@ -58,7 +58,7 @@ export class QueryEditorService implements IQueryEditorService {
// Create a sql document pane with accoutrements // Create a sql document pane with accoutrements
const mode = this._connectionManagementService.getProviderLanguageMode(connectionProviderName); const mode = this._connectionManagementService.getProviderLanguageMode(connectionProviderName);
const fileInput = this._editorService.createEditorInput({ forceUntitled: true, resource: docUri, mode: mode }) as UntitledTextEditorInput; const fileInput = await this._editorService.createEditorInput({ forceUntitled: true, resource: docUri, mode: mode }) as UntitledTextEditorInput;
let untitledEditorModel = await fileInput.resolve(); let untitledEditorModel = await fileInput.resolve();
if (options.initalContent) { if (options.initalContent) {
untitledEditorModel.textEditorModel.setValue(options.initalContent); untitledEditorModel.textEditorModel.setValue(options.initalContent);
@@ -102,7 +102,7 @@ export class QueryEditorService implements IQueryEditorService {
let docUri: URI = URI.from({ scheme: Schemas.untitled, path: filePath }); let docUri: URI = URI.from({ scheme: Schemas.untitled, path: filePath });
// Create a sql document pane with accoutrements // Create a sql document pane with accoutrements
const fileInput = this._editorService.createEditorInput({ forceUntitled: true, resource: docUri, mode: 'sql' }) as UntitledTextEditorInput; const fileInput = await this._editorService.createEditorInput({ forceUntitled: true, resource: docUri, mode: 'sql' }) as UntitledTextEditorInput;
const m = await fileInput.resolve(); const m = await fileInput.resolve();
//when associatedResource editor is created it is dirty, this must be set to false to be able to detect changes to the editor. //when associatedResource editor is created it is dirty, this must be set to false to be able to detect changes to the editor.
(m as UntitledTextEditorModel).setDirty(false); (m as UntitledTextEditorModel).setDirty(false);

View File

@@ -20,8 +20,8 @@ export class TestQueryEditorService implements IQueryEditorService {
@IEditorService private readonly editorService: IEditorService) { @IEditorService private readonly editorService: IEditorService) {
} }
newSqlEditor(options?: INewSqlEditorOptions): Promise<IUntitledQueryEditorInput> { async newSqlEditor(options?: INewSqlEditorOptions): Promise<IUntitledQueryEditorInput> {
const base = this.editorService.createEditorInput({ resource: undefined, forceUntitled: true }) as UntitledTextEditorInput; const base = await this.editorService.createEditorInput({ resource: undefined, forceUntitled: true }) as UntitledTextEditorInput;
return Promise.resolve(this.instantiationService.createInstance(UntitledQueryEditorInput, '', base, new QueryResultsInput(base.resource.toString(true)))); return Promise.resolve(this.instantiationService.createInstance(UntitledQueryEditorInput, '', base, new QueryResultsInput(base.resource.toString(true))));
} }

View File

@@ -861,7 +861,7 @@ export class EditorService extends Disposable implements EditorServiceImpl {
// {{SQL CARBON EDIT}} -- add back createEditorInput until we can remove all references // {{SQL CARBON EDIT}} -- add back createEditorInput until we can remove all references
private readonly editorInputCache = new ResourceMap<CachedEditorInput>(); private readonly editorInputCache = new ResourceMap<CachedEditorInput>();
createEditorInput(input: EditorInput | IUntypedEditorInput): EditorInput { async createEditorInput(input: EditorInput | IUntypedEditorInput): Promise<EditorInput> {
// Typed Editor Input Support (EditorInput) // Typed Editor Input Support (EditorInput)
if (input instanceof EditorInput) { if (input instanceof EditorInput) {
@@ -873,8 +873,8 @@ export class EditorService extends Disposable implements EditorServiceImpl {
// const original = this.createEditorInput({ ...input.original, forceFile: true /*input.forceFile*/ }); // const original = this.createEditorInput({ ...input.original, forceFile: true /*input.forceFile*/ });
// const modified = this.createEditorInput({ ...input.modified, forceFile: true /*input.forceFile*/ }); // const modified = this.createEditorInput({ ...input.modified, forceFile: true /*input.forceFile*/ });
const original = this.createEditorInput(input.original); const original = await this.createEditorInput(input.original);
const modified = this.createEditorInput(input.modified); const modified = await this.createEditorInput(input.modified);
return this.instantiationService.createInstance(DiffEditorInput, return this.instantiationService.createInstance(DiffEditorInput,
input.label, input.label,
@@ -905,7 +905,7 @@ export class EditorService extends Disposable implements EditorServiceImpl {
untitledModel = this.untitledTextEditorService.create({ associatedResource: untitledInput.resource, ...untitledOptions }); untitledModel = this.untitledTextEditorService.create({ associatedResource: untitledInput.resource, ...untitledOptions });
} }
return this.createOrGetCached(untitledModel.resource, () => { return this.createOrGetCached(untitledModel.resource, async () => {
// Factory function for new untitled editor // Factory function for new untitled editor
const input = this.instantiationService.createInstance(UntitledTextEditorInput, untitledModel); const input = this.instantiationService.createInstance(UntitledTextEditorInput, untitledModel);
@@ -918,7 +918,7 @@ export class EditorService extends Disposable implements EditorServiceImpl {
Event.once(input.onWillDispose)(() => untitledModel.dispose()); Event.once(input.onWillDispose)(() => untitledModel.dispose());
return input; return input;
}) as EditorInput; }) as Promise<EditorInput>;
} }
// Text Resource Editor Support // Text Resource Editor Support
@@ -937,11 +937,11 @@ export class EditorService extends Disposable implements EditorServiceImpl {
// with different resource forms (e.g. path casing on Windows) // with different resource forms (e.g. path casing on Windows)
const canonicalResource = this.uriIdentityService.asCanonicalUri(preferredResource); const canonicalResource = this.uriIdentityService.asCanonicalUri(preferredResource);
return this.createOrGetCached(canonicalResource, () => { return this.createOrGetCached(canonicalResource, async () => {
// File // File
//if (textResourceEditorInput.forceFile || this.fileService.canHandleResource(canonicalResource)) { //if (textResourceEditorInput.forceFile || this.fileService.canHandleResource(canonicalResource)) {
if (this.fileService.canHandleResource(canonicalResource)) { if (await this.fileService.canHandleResource(canonicalResource)) {
return this.fileEditorFactory.createFileEditor(canonicalResource, preferredResource, textResourceEditorInput.label, textResourceEditorInput.description, textResourceEditorInput.encoding, textResourceEditorInput.mode, textResourceEditorInput.contents, this.instantiationService); return this.fileEditorFactory.createFileEditor(canonicalResource, preferredResource, textResourceEditorInput.label, textResourceEditorInput.description, textResourceEditorInput.encoding, textResourceEditorInput.mode, textResourceEditorInput.contents, this.instantiationService);
} }
@@ -997,13 +997,13 @@ export class EditorService extends Disposable implements EditorServiceImpl {
cachedInput.setPreferredContents(textResourceEditorInput.contents); cachedInput.setPreferredContents(textResourceEditorInput.contents);
} }
} }
}) as EditorInput; }) as Promise<EditorInput>;
} }
throw new Error('Unknown input type'); throw new Error('Unknown input type');
} }
private createOrGetCached(resource: URI, factoryFn: () => CachedEditorInput, cachedFn?: (input: CachedEditorInput) => void): CachedEditorInput { private async createOrGetCached(resource: URI, factoryFn: () => Promise<CachedEditorInput>, cachedFn?: (input: CachedEditorInput) => void): Promise<CachedEditorInput> {
// Return early if already cached // Return early if already cached
let input = this.editorInputCache.get(resource); let input = this.editorInputCache.get(resource);
@@ -1016,7 +1016,7 @@ export class EditorService extends Disposable implements EditorServiceImpl {
} }
// Otherwise create and add to cache // Otherwise create and add to cache
input = factoryFn(); input = await factoryFn();
this.editorInputCache.set(resource, input); this.editorInputCache.set(resource, input);
Event.once(input.onWillDispose)(() => this.editorInputCache.delete(resource)); Event.once(input.onWillDispose)(() => this.editorInputCache.delete(resource));

View File

@@ -259,10 +259,11 @@ export interface IEditorService {
findEditors(resource: URI, group: IEditorGroup | GroupIdentifier): readonly EditorInput[]; findEditors(resource: URI, group: IEditorGroup | GroupIdentifier): readonly EditorInput[];
findEditors(editor: IResourceEditorInputIdentifier, group: IEditorGroup | GroupIdentifier): EditorInput | undefined; findEditors(editor: IResourceEditorInputIdentifier, group: IEditorGroup | GroupIdentifier): EditorInput | undefined;
// {{SQL CARBON EDIT}} -- add back createEditorInput until we can remove all references. Make async to handle updated canHandleResource function returning promise
/** /**
* Converts a lightweight input to a workbench editor input. * Converts a lightweight input to a workbench editor input.
*/ */
createEditorInput(input: IUntypedEditorInput): EditorInput; createEditorInput(input: IUntypedEditorInput): Promise<EditorInput>;
/** /**

View File

@@ -917,7 +917,7 @@ export class TestEditorService implements EditorServiceImpl {
revert(editors: IEditorIdentifier[], options?: IRevertOptions): Promise<boolean> { throw new Error('Method not implemented.'); } revert(editors: IEditorIdentifier[], options?: IRevertOptions): Promise<boolean> { throw new Error('Method not implemented.'); }
revertAll(options?: IRevertAllEditorsOptions): Promise<boolean> { throw new Error('Method not implemented.'); } revertAll(options?: IRevertAllEditorsOptions): Promise<boolean> { throw new Error('Method not implemented.'); }
// {{SQL CARBON EDIT}} add createEditorInput back // {{SQL CARBON EDIT}} add createEditorInput back
createEditorInput(input: IUntypedEditorInput): EditorInput { throw new Error('Method not implemented.'); } createEditorInput(input: IUntypedEditorInput): Promise<EditorInput> { throw new Error('Method not implemented.'); }
} }
export class TestFileService implements IFileService { export class TestFileService implements IFileService {