From cb3bc8a60e6fec5db31620ca6ad879d2346e6161 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 8 Dec 2021 16:50:42 +0100 Subject: [PATCH] Split `ILanguageService.create` into `createById` and `createByMimeType` --- .../editor/common/services/languageService.ts | 21 +++++++++++++----- .../common/services/languageServiceImpl.ts | 22 +++++++++---------- .../common/services/languagesRegistry.ts | 12 +++++++--- .../browser/standaloneCodeEditor.ts | 11 +++++----- .../standalone/browser/standaloneEditor.ts | 8 ++++--- .../test/common/services/modelService.test.ts | 4 ++-- .../api/browser/mainThreadLanguages.ts | 2 +- .../browser/parts/editor/editorStatus.ts | 5 +++-- .../parts/editor/textResourceEditor.ts | 2 +- .../common/editor/textEditorModel.ts | 6 ++--- .../browser/preview/bulkEditPreview.ts | 2 +- .../debug/common/debugContentProvider.ts | 7 +++--- .../workbench/contrib/files/common/files.ts | 2 +- .../interactive/browser/interactiveEditor.ts | 2 +- .../contrib/codeRenderer/codeRenderer.ts | 2 +- .../notebook/browser/diff/diffComponents.ts | 6 ++--- .../notebook/browser/notebook.contribution.ts | 8 +++---- .../common/model/notebookCellTextModel.ts | 2 +- .../notebookEditorKernelManager.test.ts | 4 ++-- .../browser/notebookKernelService.test.ts | 4 ++-- .../output/common/outputChannelModel.ts | 10 ++++----- .../common/outputChannelModelService.ts | 4 ++-- .../performance/browser/perfviewEditor.ts | 2 +- .../common/preferencesContribution.ts | 2 +- .../contrib/scm/browser/scmViewPane.ts | 2 +- .../contrib/search/browser/replaceService.ts | 2 +- .../searchEditor/browser/searchEditorModel.ts | 10 ++++----- .../testing/common/testingContentProvider.ts | 2 +- .../userDataSync/browser/userDataSync.ts | 2 +- .../common/walkThroughContentProvider.ts | 2 +- .../preferences/browser/preferencesService.ts | 6 ++--- .../browser/textModelResolverService.test.ts | 4 ++-- .../parts/editor/editorDiffModel.test.ts | 2 +- .../editor/textResourceEditorInput.test.ts | 10 ++++----- 34 files changed, 105 insertions(+), 87 deletions(-) diff --git a/src/vs/editor/common/services/languageService.ts b/src/vs/editor/common/services/languageService.ts index 43af74b9c0f..2ba0b73a9b8 100644 --- a/src/vs/editor/common/services/languageService.ts +++ b/src/vs/editor/common/services/languageService.ts @@ -38,19 +38,28 @@ export interface ILanguageService { isRegisteredLanguageId(languageId: string): boolean; getRegisteredLanguageIds(): string[]; getRegisteredLanguageNames(): string[]; - getExtensions(alias: string): string[]; - getFilenames(alias: string): string[]; + getExtensions(alias: string): string[]; // TODO + getFilenames(alias: string): string[]; // TODO getMimeTypeForLanguageId(languageId: string): string | null; getLanguageName(languageId: string): string | null; - getLanguageIdForLanguageName(languageName: string): string | null; - getLanguageIdForMimeType(mimeType: string): string | null; + getLanguageIdForLanguageName(languageName: string): string | null; // TODO + getLanguageIdForMimeType(mimeType: string | null | undefined): string | null; getLanguageIdByFilepathOrFirstLine(resource: URI, firstLine?: string): string | null; validateLanguageId(languageId: string): string | null; getConfigurationFiles(languageId: string): URI[]; // --- instantiation - create(commaSeparatedMimetypesOrCommaSeparatedIds: string | undefined): ILanguageSelection; - createByLanguageName(languageName: string): ILanguageSelection; + /** + * Will fall back to 'plaintext' if `languageId` is unknown. + */ + createById(languageId: string | null | undefined): ILanguageSelection; + /** + * Will fall back to 'plaintext' if `mimeType` is unknown. + */ + createByMimeType(mimeType: string | null | undefined): ILanguageSelection; + /** + * Will fall back to 'plaintext' if the `languageId` cannot be determined. + */ createByFilepathOrFirstLine(resource: URI | null, firstLine?: string): ILanguageSelection; triggerMode(commaSeparatedMimetypesOrCommaSeparatedIds: string): void; diff --git a/src/vs/editor/common/services/languageServiceImpl.ts b/src/vs/editor/common/services/languageServiceImpl.ts index 6370bce874f..cb8fffaec43 100644 --- a/src/vs/editor/common/services/languageServiceImpl.ts +++ b/src/vs/editor/common/services/languageServiceImpl.ts @@ -11,6 +11,7 @@ import { LanguagesRegistry } from 'vs/editor/common/services/languagesRegistry'; import { ILanguageSelection, ILanguageService } from 'vs/editor/common/services/languageService'; import { firstOrDefault } from 'vs/base/common/arrays'; import { ILanguageIdCodec } from 'vs/editor/common/modes'; +import { PLAINTEXT_MODE_ID } from 'vs/editor/common/modes/modesRegistry'; class LanguageSelection implements ILanguageSelection { @@ -76,7 +77,7 @@ export class LanguageService extends Disposable implements ILanguageService { super.dispose(); } - public isRegisteredLanguageId(languageId: string): boolean { + public isRegisteredLanguageId(languageId: string | null | undefined): boolean { return this._registry.isRegisteredLanguageId(languageId); } @@ -108,7 +109,7 @@ export class LanguageService extends Disposable implements ILanguageService { return this._registry.getLanguageIdForLanguageName(alias); } - public getLanguageIdForMimeType(mimeType: string): string | null { + public getLanguageIdForMimeType(mimeType: string | null | undefined): string | null { return this._registry.getLanguageIdForMimeType(mimeType); } @@ -132,16 +133,17 @@ export class LanguageService extends Disposable implements ILanguageService { // --- instantiation - public create(commaSeparatedMimetypesOrCommaSeparatedIds: string | undefined): ILanguageSelection { + public createById(languageId: string | null | undefined): ILanguageSelection { return new LanguageSelection(this.onLanguagesMaybeChanged, () => { - const languageId = this.getModeId(commaSeparatedMimetypesOrCommaSeparatedIds); - return this._createModeAndGetLanguageIdentifier(languageId); + const validLanguageId = (languageId && this.isRegisteredLanguageId(languageId) ? languageId : PLAINTEXT_MODE_ID); + this._getOrCreateMode(validLanguageId); + return validLanguageId; }); } - public createByLanguageName(languageName: string): ILanguageSelection { + public createByMimeType(mimeType: string | null | undefined): ILanguageSelection { return new LanguageSelection(this.onLanguagesMaybeChanged, () => { - const languageId = this._getModeIdByLanguageName(languageName); + const languageId = this.getLanguageIdForMimeType(mimeType); return this._createModeAndGetLanguageIdentifier(languageId); }); } @@ -153,7 +155,7 @@ export class LanguageService extends Disposable implements ILanguageService { }); } - private _createModeAndGetLanguageIdentifier(languageId: string | null): string { + private _createModeAndGetLanguageIdentifier(languageId: string | null | undefined): string { // Fall back to plain text if no mode was found const validLanguageId = this.validateLanguageId(languageId || 'plaintext') || NULL_MODE_ID; this._getOrCreateMode(validLanguageId); @@ -166,10 +168,6 @@ export class LanguageService extends Disposable implements ILanguageService { this._getOrCreateMode(languageId || 'plaintext'); } - private _getModeIdByLanguageName(languageName: string): string | null { - return this._registry.getModeIdFromLanguageName(languageName); - } - private _getOrCreateMode(languageId: string): void { if (!this._encounteredLanguages.has(languageId)) { this._encounteredLanguages.add(languageId); diff --git a/src/vs/editor/common/services/languagesRegistry.ts b/src/vs/editor/common/services/languagesRegistry.ts index 554acb2758f..18e649752ab 100644 --- a/src/vs/editor/common/services/languagesRegistry.ts +++ b/src/vs/editor/common/services/languagesRegistry.ts @@ -257,7 +257,10 @@ export class LanguagesRegistry extends Disposable { } } - public isRegisteredLanguageId(languageId: string): boolean { + public isRegisteredLanguageId(languageId: string | null | undefined): boolean { + if (!languageId) { + return false; + } return hasOwnProperty.call(this._languages, languageId); } @@ -283,7 +286,10 @@ export class LanguagesRegistry extends Disposable { return this._lowercaseNameMap[languageNameLower]; } - public getLanguageIdForMimeType(mimeType: string): string | null { + public getLanguageIdForMimeType(mimeType: string | null | undefined): string | null { + if (!mimeType) { + return null; + } if (hasOwnProperty.call(this._mimeTypesMap, mimeType)) { return this._mimeTypesMap[mimeType]; } @@ -326,7 +332,7 @@ export class LanguagesRegistry extends Disposable { ); } - public validateLanguageId(languageId: string | null): string | null { + public validateLanguageId(languageId: string | null | undefined): string | null { if (!languageId || languageId === NULL_MODE_ID) { return NULL_MODE_ID; } diff --git a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts index 9ac0e9505a0..7d806b8cb52 100644 --- a/src/vs/editor/standalone/browser/standaloneCodeEditor.ts +++ b/src/vs/editor/standalone/browser/standaloneCodeEditor.ts @@ -35,7 +35,7 @@ import { IModelService } from 'vs/editor/common/services/modelService'; import { ILanguageSelection, ILanguageService } from 'vs/editor/common/services/languageService'; import { URI } from 'vs/base/common/uri'; import { StandaloneCodeEditorServiceImpl } from 'vs/editor/standalone/browser/standaloneCodeServiceImpl'; -import { Mimes } from 'vs/base/common/mime'; +import { PLAINTEXT_MODE_ID } from 'vs/editor/common/modes/modesRegistry'; /** * Description of an action contribution @@ -437,7 +437,8 @@ export class StandaloneEditor extends StandaloneCodeEditor implements IStandalon let model: ITextModel | null; if (typeof _model === 'undefined') { - model = createTextModel(modelService, languageService, options.value || '', options.language || Mimes.text, undefined); + const languageId = languageService.getLanguageIdForMimeType(options.language) || options.language || PLAINTEXT_MODE_ID; + model = createTextModel(modelService, languageService, options.value || '', languageId, undefined); this._ownsModel = true; } else { model = _model; @@ -573,9 +574,9 @@ export class StandaloneDiffEditor extends DiffEditorWidget implements IStandalon /** * @internal */ -export function createTextModel(modelService: IModelService, languageService: ILanguageService, value: string, language: string | undefined, uri: URI | undefined): ITextModel { +export function createTextModel(modelService: IModelService, languageService: ILanguageService, value: string, languageId: string | undefined, uri: URI | undefined): ITextModel { value = value || ''; - if (!language) { + if (!languageId) { const firstLF = value.indexOf('\n'); let firstLine = value; if (firstLF !== -1) { @@ -583,7 +584,7 @@ export function createTextModel(modelService: IModelService, languageService: IL } return doCreateModel(modelService, value, languageService.createByFilepathOrFirstLine(uri || null, firstLine), uri); } - return doCreateModel(modelService, value, languageService.create(language), uri); + return doCreateModel(modelService, value, languageService.createById(languageId), uri); } /** diff --git a/src/vs/editor/standalone/browser/standaloneEditor.ts b/src/vs/editor/standalone/browser/standaloneEditor.ts index 901fbd7e7b3..45049b5739e 100644 --- a/src/vs/editor/standalone/browser/standaloneEditor.ts +++ b/src/vs/editor/standalone/browser/standaloneEditor.ts @@ -148,11 +148,13 @@ export function createDiffNavigator(diffEditor: IStandaloneDiffEditor, opts?: ID * You can specify the language that should be set for this model or let the language be inferred from the `uri`. */ export function createModel(value: string, language?: string, uri?: URI): ITextModel { + const languageService = StaticServices.languageService.get(); + const languageId = languageService.getLanguageIdForMimeType(language) || language; return createTextModel( StaticServices.modelService.get(), - StaticServices.languageService.get(), + languageService, value, - language, + languageId, uri ); } @@ -161,7 +163,7 @@ export function createModel(value: string, language?: string, uri?: URI): ITextM * Change the language for a model. */ export function setModelLanguage(model: ITextModel, languageId: string): void { - StaticServices.modelService.get().setMode(model, StaticServices.languageService.get().create(languageId)); + StaticServices.modelService.get().setMode(model, StaticServices.languageService.get().createById(languageId)); } /** diff --git a/src/vs/editor/test/common/services/modelService.test.ts b/src/vs/editor/test/common/services/modelService.test.ts index 40efc85b13d..04b368dd4bd 100644 --- a/src/vs/editor/test/common/services/modelService.test.ts +++ b/src/vs/editor/test/common/services/modelService.test.ts @@ -469,7 +469,7 @@ suite('ModelSemanticColoring', () => { } })); - const textModel = disposables.add(modelService.createModel('Hello world', languageService.create('testMode'))); + const textModel = disposables.add(modelService.createModel('Hello world', languageService.createById('testMode'))); // wait for the provider to be called await inFirstCall.wait(); @@ -532,7 +532,7 @@ suite('ModelSemanticColoring', () => { return result; } - const textModel = modelService.createModel('Hello world 2', languageService.create('testMode2')); + const textModel = modelService.createModel('Hello world 2', languageService.createById('testMode2')); try { let result = await getDocumentSemanticTokens(textModel, null, null, CancellationToken.None); assert.ok(result, `We should have tokens (1)`); diff --git a/src/vs/workbench/api/browser/mainThreadLanguages.ts b/src/vs/workbench/api/browser/mainThreadLanguages.ts index 05d2e7c52ca..bd20b8a413d 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguages.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguages.ts @@ -57,7 +57,7 @@ export class MainThreadLanguages implements MainThreadLanguagesShape { const uri = URI.revive(resource); const ref = await this._resolverService.createModelReference(uri); try { - this._modelService.setMode(ref.object.textEditorModel, this._languageService.create(languageId)); + this._modelService.setMode(ref.object.textEditorModel, this._languageService.createById(languageId)); } finally { ref.dispose(); } diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index 5da4fd7598a..675c528e624 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -1207,12 +1207,13 @@ export class ChangeModeAction extends Action { languageId = detectedLanguage; } if (languageId) { - languageSelection = this.languageService.create(languageId); + languageSelection = this.languageService.createById(languageId); } } } } else { - languageSelection = this.languageService.createByLanguageName(pick.label); + const languageId = this.languageService.getLanguageIdForLanguageName(pick.label.toLowerCase()); + languageSelection = this.languageService.createById(languageId); if (resource) { // fire and forget to not slow things down diff --git a/src/vs/workbench/browser/parts/editor/textResourceEditor.ts b/src/vs/workbench/browser/parts/editor/textResourceEditor.ts index c852fca8abc..7f290a1417a 100644 --- a/src/vs/workbench/browser/parts/editor/textResourceEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textResourceEditor.ts @@ -203,7 +203,7 @@ export class TextResourceEditor extends AbstractTextResourceEditor { // Finally apply languageId to model if specified if (candidateLanguageId !== PLAINTEXT_MODE_ID) { - this.modelService.setMode(textModel, this.languageService.create(candidateLanguageId)); + this.modelService.setMode(textModel, this.languageService.createById(candidateLanguageId)); } } } diff --git a/src/vs/workbench/common/editor/textEditorModel.ts b/src/vs/workbench/common/editor/textEditorModel.ts index 2855654dec3..cb218c1563e 100644 --- a/src/vs/workbench/common/editor/textEditorModel.ts +++ b/src/vs/workbench/common/editor/textEditorModel.ts @@ -95,7 +95,7 @@ export class BaseTextEditorModel extends EditorModel implements ITextEditorModel return; } - this.modelService.setMode(this.textEditorModel, this.languageService.create(mode)); + this.modelService.setMode(this.textEditorModel, this.languageService.createById(mode)); } getMode(): string | undefined { @@ -179,7 +179,7 @@ export class BaseTextEditorModel extends EditorModel implements ITextEditorModel } // otherwise take the preferred mode for granted - return languageService.create(preferredMode); + return languageService.createById(preferredMode); } /** @@ -197,7 +197,7 @@ export class BaseTextEditorModel extends EditorModel implements ITextEditorModel // mode (only if specific and changed) if (preferredMode && preferredMode !== PLAINTEXT_MODE_ID && this.textEditorModel.getLanguageId() !== preferredMode) { - this.modelService.setMode(this.textEditorModel, this.languageService.create(preferredMode)); + this.modelService.setMode(this.textEditorModel, this.languageService.createById(preferredMode)); } } diff --git a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview.ts b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview.ts index aa908f8da87..01e837e6e3c 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview.ts @@ -416,7 +416,7 @@ export class BulkEditPreviewProvider implements ITextModelContentProvider { const sourceModel = ref.object.textEditorModel; model = this._modelService.createModel( createTextBufferFactoryFromSnapshot(sourceModel.createSnapshot()), - this._languageService.create(sourceModel.getLanguageId()), + this._languageService.createById(sourceModel.getLanguageId()), previewUri ); ref.dispose(); diff --git a/src/vs/workbench/contrib/debug/common/debugContentProvider.ts b/src/vs/workbench/contrib/debug/common/debugContentProvider.ts index 68e56e8a36a..87d13cdbb46 100644 --- a/src/vs/workbench/contrib/debug/common/debugContentProvider.ts +++ b/src/vs/workbench/contrib/debug/common/debugContentProvider.ts @@ -5,7 +5,7 @@ import { URI as uri } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; -import { guessMimeTypes, Mimes } from 'vs/base/common/mime'; +import { guessMimeTypes } from 'vs/base/common/mime'; import { ITextModel } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/modelService'; import { ILanguageService } from 'vs/editor/common/services/languageService'; @@ -17,6 +17,7 @@ import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerServ import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; +import { PLAINTEXT_MODE_ID } from 'vs/editor/common/modes/modesRegistry'; /** * Debug URI format @@ -94,7 +95,7 @@ export class DebugContentProvider implements IWorkbenchContribution, ITextModelC } const createErrModel = (errMsg?: string) => { this.debugService.sourceIsNotAvailable(resource); - const languageSelection = this.languageService.create(Mimes.text); + const languageSelection = this.languageService.createById(PLAINTEXT_MODE_ID); const message = errMsg ? localize('canNotResolveSourceWithError', "Could not load source '{0}': {1}.", resource.path, errMsg) : localize('canNotResolveSource', "Could not load source '{0}'.", resource.path); @@ -134,7 +135,7 @@ export class DebugContentProvider implements IWorkbenchContribution, ITextModelC } else { // create text model const mime = response.body.mimeType || guessMimeTypes(resource)[0]; - const languageSelection = this.languageService.create(mime); + const languageSelection = this.languageService.createByMimeType(mime); return this.modelService.createModel(response.body.content, languageSelection, resource); } } diff --git a/src/vs/workbench/contrib/files/common/files.ts b/src/vs/workbench/contrib/files/common/files.ts index 69a2b188577..4dbcc0967f5 100644 --- a/src/vs/workbench/contrib/files/common/files.ts +++ b/src/vs/workbench/contrib/files/common/files.ts @@ -198,7 +198,7 @@ export class TextFileContentProvider extends Disposable implements ITextModelCon let languageSelector: ILanguageSelection; if (textFileModel) { - languageSelector = this.languageService.create(textFileModel.getLanguageId()); + languageSelector = this.languageService.createById(textFileModel.getLanguageId()); } else { languageSelector = this.languageService.createByFilepathOrFirstLine(savedFileResource); } diff --git a/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts b/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts index d9b7c2db8d3..e4822942b42 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts @@ -513,7 +513,7 @@ export class InteractiveEditor extends EditorPane { if (selectedOrSuggested) { const language = selectedOrSuggested.supportedLanguages[0]; - const newMode = language ? this.#languageService.create(language).languageId : PLAINTEXT_MODE_ID; + const newMode = language ? this.#languageService.createById(language).languageId : PLAINTEXT_MODE_ID; textModel.setMode(newMode); } } diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/codeRenderer/codeRenderer.ts b/src/vs/workbench/contrib/notebook/browser/contrib/codeRenderer/codeRenderer.ts index 6ccc1520073..c93a2fb96ca 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/codeRenderer/codeRenderer.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/codeRenderer/codeRenderer.ts @@ -60,7 +60,7 @@ abstract class CodeRendererContrib extends Disposable implements IOutputTransfor container.style.height = `${editorHeight + 8}px`; })); - const mode = this.languageService.create(languageId); + const mode = this.languageService.createById(languageId); const textModel = this.modelService.createModel(value, mode, undefined, false); editor.setModel(textModel); diff --git a/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.ts b/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.ts index dcdc3d0f935..930fd49395b 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.ts +++ b/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.ts @@ -596,7 +596,7 @@ abstract class AbstractElementRenderer extends Disposable { this.layout({ metadataHeight: true }); this._metadataEditorDisposeStore.add(this._metadataEditor); - const mode = this.languageService.create('jsonc'); + const mode = this.languageService.createById('jsonc'); const originalMetadataSource = getFormatedMetadataJSON(this.notebookEditor.textModel!, this.cell.type === 'insert' ? this.cell.modified!.metadata || {} @@ -630,7 +630,7 @@ abstract class AbstractElementRenderer extends Disposable { const originalOutputsSource = getFormatedOutputJSON(this.cell.original?.outputs || []); const modifiedOutputsSource = getFormatedOutputJSON(this.cell.modified?.outputs || []); if (originalOutputsSource !== modifiedOutputsSource) { - const mode = this.languageService.create('json'); + const mode = this.languageService.createById('json'); const originalModel = this.modelService.createModel(originalOutputsSource, mode, undefined, true); const modifiedModel = this.modelService.createModel(modifiedOutputsSource, mode, undefined, true); this._outputEditorDisposeStore.add(originalModel); @@ -690,7 +690,7 @@ abstract class AbstractElementRenderer extends Disposable { }, {}); this._outputEditorDisposeStore.add(this._outputEditor); - const mode = this.languageService.create('json'); + const mode = this.languageService.createById('json'); const originaloutputSource = getFormatedOutputJSON( this.notebookEditor.textModel!.transientOptions.transientOutputs ? [] diff --git a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts index bb4f0d24802..7e0325f9924 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts @@ -275,7 +275,7 @@ class CellContentProvider implements ITextModelContentProvider { } }; const languageId = this._languageService.getLanguageIdForLanguageName(cell.language); - const languageSelection = languageId ? this._languageService.create(languageId) : (cell.cellKind === CellKind.Markup ? this._languageService.create('markdown') : this._languageService.createByFilepathOrFirstLine(resource, cell.textBuffer.getLineContent(1))); + const languageSelection = languageId ? this._languageService.createById(languageId) : (cell.cellKind === CellKind.Markup ? this._languageService.createById('markdown') : this._languageService.createByFilepathOrFirstLine(resource, cell.textBuffer.getLineContent(1))); result = this._modelService.createModel( bufferFactory, languageSelection, @@ -349,7 +349,7 @@ class CellInfoContentProvider { const ref = await this._notebookModelResolverService.resolve(data.notebook); let result: ITextModel | null = null; - const mode = this._languageService.create('json'); + const mode = this._languageService.createById('json'); for (const cell of ref.object.notebook.cells) { if (cell.handle === data.handle) { @@ -382,7 +382,7 @@ class CellInfoContentProvider { if (streamOutputData) { return { content: streamOutputData, - mode: this._languageService.create('plaintext') + mode: this._languageService.createById('plaintext') }; } @@ -396,7 +396,7 @@ class CellInfoContentProvider { }, cell: NotebookCellTextModel) { let result: { content: string, mode: ILanguageSelection } | undefined = undefined; - const mode = this._languageService.create('json'); + const mode = this._languageService.createById('json'); const op = cell.outputs.find(op => op.outputId === data.outputId); const streamOutputData = this.parseStreamOutput(op); if (streamOutputData) { diff --git a/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts b/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts index 7bf21049240..25597ad2e36 100644 --- a/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts +++ b/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts @@ -92,7 +92,7 @@ export class NotebookCellTextModel extends Disposable implements ICell { } if (this._textModel) { - const languageId = this._languageService.create(newLanguageId); + const languageId = this._languageService.createById(newLanguageId); this._textModel.setMode(languageId.languageId); } diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookEditorKernelManager.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookEditorKernelManager.test.ts index bb337ccced1..31fc1461357 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookEditorKernelManager.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookEditorKernelManager.test.ts @@ -20,7 +20,7 @@ import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookS import { mock } from 'vs/base/test/common/mock'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { DisposableStore } from 'vs/base/common/lifecycle'; -import { Mimes } from 'vs/base/common/mime'; +import { PLAINTEXT_MODE_ID } from 'vs/editor/common/modes/modesRegistry'; import { insertCellAtIndex } from 'vs/workbench/contrib/notebook/browser/controller/cellOperations'; suite('NotebookEditorKernelManager', () => { @@ -157,6 +157,6 @@ class TestNotebookKernel implements INotebookKernel { } constructor(opts?: { languages: string[] }) { - this.supportedLanguages = opts?.languages ?? [Mimes.text]; + this.supportedLanguages = opts?.languages ?? [PLAINTEXT_MODE_ID]; } } diff --git a/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts b/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts index 0d4f388d0e7..15173253d36 100644 --- a/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts +++ b/src/vs/workbench/contrib/notebook/test/browser/notebookKernelService.test.ts @@ -15,7 +15,7 @@ import { mock } from 'vs/base/test/common/mock'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; -import { Mimes } from 'vs/base/common/mime'; +import { PLAINTEXT_MODE_ID } from 'vs/editor/common/modes/modesRegistry'; suite('NotebookKernelService', () => { @@ -179,7 +179,7 @@ class TestNotebookKernel implements INotebookKernel { } constructor(opts?: { languages?: string[], label?: string, viewType?: string }) { - this.supportedLanguages = opts?.languages ?? [Mimes.text]; + this.supportedLanguages = opts?.languages ?? [PLAINTEXT_MODE_ID]; this.label = opts?.label ?? this.label; this.viewType = opts?.viewType ?? this.viewType; } diff --git a/src/vs/workbench/contrib/output/common/outputChannelModel.ts b/src/vs/workbench/contrib/output/common/outputChannelModel.ts index 59a4f7934f5..99ea7c0aea6 100644 --- a/src/vs/workbench/contrib/output/common/outputChannelModel.ts +++ b/src/vs/workbench/contrib/output/common/outputChannelModel.ts @@ -106,7 +106,7 @@ export class FileOutputChannelModel extends Disposable implements IOutputChannel constructor( private readonly modelUri: URI, - private readonly mimeType: string, + private readonly mimeType: 'text/x-code-log-output' | 'text/x-code-output', private readonly file: URI, @IFileService private readonly fileService: IFileService, @IModelService private readonly modelService: IModelService, @@ -163,7 +163,7 @@ export class FileOutputChannelModel extends Disposable implements IOutputChannel if (this.model) { this.model.setValue(content); } else { - this.model = this.modelService.createModel(content, this.languageService.create(this.mimeType), this.modelUri); + this.model = this.modelService.createModel(content, this.languageService.createByMimeType(this.mimeType), this.modelUri); this.fileHandler.watch(this.etag); const disposable = this.model.onWillDispose(() => { this.cancelModelUpdate(); @@ -324,7 +324,7 @@ class OutputChannelBackedByFile extends FileOutputChannelModel implements IOutpu constructor( id: string, modelUri: URI, - mimeType: string, + mimeType: 'text/x-code-log-output' | 'text/x-code-output', file: URI, @IFileService fileService: IFileService, @IModelService modelService: IModelService, @@ -371,7 +371,7 @@ export class DelegatedOutputChannelModel extends Disposable implements IOutputCh constructor( id: string, modelUri: URI, - mimeType: string, + mimeType: 'text/x-code-log-output' | 'text/x-code-output', outputDir: Promise, @IInstantiationService private readonly instantiationService: IInstantiationService, @IFileService private readonly fileService: IFileService, @@ -380,7 +380,7 @@ export class DelegatedOutputChannelModel extends Disposable implements IOutputCh this.outputChannelModel = this.createOutputChannelModel(id, modelUri, mimeType, outputDir); } - private async createOutputChannelModel(id: string, modelUri: URI, mimeType: string, outputDirPromise: Promise): Promise { + private async createOutputChannelModel(id: string, modelUri: URI, mimeType: 'text/x-code-log-output' | 'text/x-code-output', outputDirPromise: Promise): Promise { const outputDir = await outputDirPromise; const file = resources.joinPath(outputDir, `${id.replace(/[\\/:\*\?"<>\|]/g, '')}.log`); await this.fileService.createFile(file); diff --git a/src/vs/workbench/contrib/output/common/outputChannelModelService.ts b/src/vs/workbench/contrib/output/common/outputChannelModelService.ts index 8fede8ab062..e003de09770 100644 --- a/src/vs/workbench/contrib/output/common/outputChannelModelService.ts +++ b/src/vs/workbench/contrib/output/common/outputChannelModelService.ts @@ -17,7 +17,7 @@ export const IOutputChannelModelService = createDecorator { diff --git a/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts b/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts index 09eeb02a5a1..2b173447827 100644 --- a/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts +++ b/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts @@ -122,7 +122,7 @@ export class PreferencesContribution implements IWorkbenchContribution { let schema = schemaRegistry.getSchemaContributions().schemas[uri.toString()]; if (schema) { const modelContent = JSON.stringify(schema); - const languageSelection = this.languageService.create('jsonc'); + const languageSelection = this.languageService.createById('jsonc'); const model = this.modelService.createModel(modelContent, languageSelection, uri); const disposables = new DisposableStore(); disposables.add(schemaRegistry.onDidChangeSchema(schemaUri => { diff --git a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts index 2d1f8002d4d..3e8f9a3a090 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewPane.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewPane.ts @@ -1649,7 +1649,7 @@ class SCMInputWidget extends Disposable { this.configurationService.updateValue('editor.wordBasedSuggestions', false, { resource: uri }, ConfigurationTarget.MEMORY); } - const textModel = this.modelService.getModel(uri) ?? this.modelService.createModel('', this.languageService.create('scminput'), uri); + const textModel = this.modelService.getModel(uri) ?? this.modelService.createModel('', this.languageService.createById('scminput'), uri); this.inputEditor.setModel(textModel); // Validation diff --git a/src/vs/workbench/contrib/search/browser/replaceService.ts b/src/vs/workbench/contrib/search/browser/replaceService.ts index 2c2dd137cb8..c24f6da0aba 100644 --- a/src/vs/workbench/contrib/search/browser/replaceService.ts +++ b/src/vs/workbench/contrib/search/browser/replaceService.ts @@ -71,7 +71,7 @@ class ReplacePreviewModel extends Disposable { const ref = this._register(await this.textModelResolverService.createModelReference(fileResource)); const sourceModel = ref.object.textEditorModel; const sourceModelModeId = sourceModel.getLanguageId(); - const replacePreviewModel = this.modelService.createModel(createTextBufferFactoryFromSnapshot(sourceModel.createSnapshot()), this.languageService.create(sourceModelModeId), replacePreviewUri); + const replacePreviewModel = this.modelService.createModel(createTextBufferFactoryFromSnapshot(sourceModel.createSnapshot()), this.languageService.createById(sourceModelModeId), replacePreviewUri); this._register(fileMatch.onChange(({ forceUpdateModel }) => this.update(sourceModel, replacePreviewModel, fileMatch, forceUpdateModel))); this._register(this.searchWorkbenchService.searchModel.onReplaceTermChanged(() => this.update(sourceModel, replacePreviewModel, fileMatch))); this._register(fileMatch.onDispose(() => replacePreviewModel.dispose())); // TODO@Sandeep we should not dispose a model directly but rather the reference (depends on https://github.com/microsoft/vscode/issues/17073) diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditorModel.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditorModel.ts index 5017b442fe0..600700a654a 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditorModel.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditorModel.ts @@ -67,7 +67,7 @@ class SearchEditorModelFactory { } return Promise.resolve({ - resultsModel: modelService.getModel(resource) ?? modelService.createModel('', languageService.create('search-result'), resource), + resultsModel: modelService.getModel(resource) ?? modelService.createModel('', languageService.createById('search-result'), resource), configurationModel: new SearchConfigurationModel(config) }); })(); @@ -100,7 +100,7 @@ class SearchEditorModelFactory { } return Promise.resolve({ - resultsModel: modelService.createModel(contents ?? '', languageService.create('search-result'), resource), + resultsModel: modelService.createModel(contents ?? '', languageService.createById('search-result'), resource), configurationModel: new SearchConfigurationModel(config) }); })(); @@ -134,7 +134,7 @@ class SearchEditorModelFactory { const { text, config } = await instantiationService.invokeFunction(parseSavedSearchEditor, existingFile); return ({ - resultsModel: modelService.createModel(text ?? '', languageService.create('search-result'), resource), + resultsModel: modelService.createModel(text ?? '', languageService.createById('search-result'), resource), configurationModel: new SearchConfigurationModel(config) }); })(); @@ -151,7 +151,7 @@ class SearchEditorModelFactory { if (!model && backup) { const factory = await createTextBufferFactoryFromStream(backup.value); - model = modelService.createModel(factory, languageService.create('search-result'), resource); + model = modelService.createModel(factory, languageService.createById('search-result'), resource); } if (model) { @@ -159,7 +159,7 @@ class SearchEditorModelFactory { const { text, config } = parseSerializedSearchEditor(existingFile); modelService.destroyModel(resource); return ({ - resultsModel: modelService.createModel(text ?? '', languageService.create('search-result'), resource), + resultsModel: modelService.createModel(text ?? '', languageService.createById('search-result'), resource), configurationModel: new SearchConfigurationModel(config) }); } diff --git a/src/vs/workbench/contrib/testing/common/testingContentProvider.ts b/src/vs/workbench/contrib/testing/common/testingContentProvider.ts index 09b1b5794e3..956b9d61550 100644 --- a/src/vs/workbench/contrib/testing/common/testingContentProvider.ts +++ b/src/vs/workbench/contrib/testing/common/testingContentProvider.ts @@ -66,7 +66,7 @@ export class TestingContentProvider implements IWorkbenchContribution, ITextMode text = message; } else if (message) { text = message.value; - language = this.languageService.create('markdown'); + language = this.languageService.createById('markdown'); } break; } diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts index f861857fe9a..550e74f3804 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts @@ -1293,7 +1293,7 @@ class UserDataRemoteContentProvider implements ITextModelContentProvider { provideTextContent(uri: URI): Promise | null { if (uri.scheme === USER_DATA_SYNC_SCHEME) { - return this.userDataSyncService.resolveContent(uri).then(content => this.modelService.createModel(content || '', this.languageService.create('jsonc'), uri)); + return this.userDataSyncService.resolveContent(uri).then(content => this.modelService.createModel(content || '', this.languageService.createById('jsonc'), uri)); } return null; } diff --git a/src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughContentProvider.ts b/src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughContentProvider.ts index bd781f2fea3..a7fe7953ef9 100644 --- a/src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughContentProvider.ts +++ b/src/vs/workbench/contrib/welcome/walkThrough/common/walkThroughContentProvider.ts @@ -72,7 +72,7 @@ export class WalkThroughSnippetContentProvider implements ITextModelContentProvi renderer.code = (code, lang) => { i++; const languageId = this.languageService.getLanguageIdForLanguageName(lang) || ''; - const languageSelection = this.languageService.create(languageId); + const languageSelection = this.languageService.createById(languageId); // Create all models for this resource in one go... we'll need them all and we don't want to re-parse markdown each time const model = this.modelService.createModel(code, languageSelection, resource.with({ fragment: `${i}.${lang}` })); if (i === j) { codeEditorModel = model; } diff --git a/src/vs/workbench/services/preferences/browser/preferencesService.ts b/src/vs/workbench/services/preferences/browser/preferencesService.ts index 7db619cdf44..92297584a79 100644 --- a/src/vs/workbench/services/preferences/browser/preferencesService.ts +++ b/src/vs/workbench/services/preferences/browser/preferencesService.ts @@ -122,7 +122,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic if (this.isDefaultSettingsResource(uri)) { const target = this.getConfigurationTargetFromDefaultSettingsResource(uri); - const languageSelection = this.languageService.create('jsonc'); + const languageSelection = this.languageService.createById('jsonc'); const model = this._register(this.modelService.createModel('', languageSelection, uri)); let defaultSettings: DefaultSettings | undefined; @@ -150,14 +150,14 @@ export class PreferencesService extends Disposable implements IPreferencesServic if (this.defaultSettingsRawResource.toString() === uri.toString()) { const defaultRawSettingsEditorModel = this.instantiationService.createInstance(DefaultRawSettingsEditorModel, this.getDefaultSettings(ConfigurationTarget.USER_LOCAL)); - const languageSelection = this.languageService.create('jsonc'); + const languageSelection = this.languageService.createById('jsonc'); const model = this._register(this.modelService.createModel(defaultRawSettingsEditorModel.content, languageSelection, uri)); return model; } if (this.defaultKeybindingsResource.toString() === uri.toString()) { const defaultKeybindingsEditorModel = this.instantiationService.createInstance(DefaultKeybindingsEditorModel, uri); - const languageSelection = this.languageService.create('jsonc'); + const languageSelection = this.languageService.createById('jsonc'); const model = this._register(this.modelService.createModel(defaultKeybindingsEditorModel.content, languageSelection, uri)); return model; } diff --git a/src/vs/workbench/services/textmodelResolver/test/browser/textModelResolverService.test.ts b/src/vs/workbench/services/textmodelResolver/test/browser/textModelResolverService.test.ts index 2fc90f25c38..2130229b2ed 100644 --- a/src/vs/workbench/services/textmodelResolver/test/browser/textModelResolverService.test.ts +++ b/src/vs/workbench/services/textmodelResolver/test/browser/textModelResolverService.test.ts @@ -44,7 +44,7 @@ suite('Workbench - TextModelResolverService', () => { provideTextContent: async function (resource: URI): Promise { if (resource.scheme === 'test') { let modelContent = 'Hello Test'; - let languageSelection = accessor.languageService.create('json'); + let languageSelection = accessor.languageService.createById('json'); return accessor.modelService.createModel(modelContent, languageSelection, resource); } @@ -179,7 +179,7 @@ suite('Workbench - TextModelResolverService', () => { await waitForIt; let modelContent = 'Hello Test'; - let languageSelection = accessor.languageService.create('json'); + let languageSelection = accessor.languageService.createById('json'); return accessor.modelService.createModel(modelContent, languageSelection, resource); } }); diff --git a/src/vs/workbench/test/browser/parts/editor/editorDiffModel.test.ts b/src/vs/workbench/test/browser/parts/editor/editorDiffModel.test.ts index 063fd4f5482..aa113a0807c 100644 --- a/src/vs/workbench/test/browser/parts/editor/editorDiffModel.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editorDiffModel.test.ts @@ -34,7 +34,7 @@ suite('TextDiffEditorModel', () => { provideTextContent: async function (resource: URI): Promise { if (resource.scheme === 'test') { let modelContent = 'Hello Test'; - let languageSelection = accessor.languageService.create('json'); + let languageSelection = accessor.languageService.createById('json'); return accessor.modelService.createModel(modelContent, languageSelection, resource); } diff --git a/src/vs/workbench/test/browser/parts/editor/textResourceEditorInput.test.ts b/src/vs/workbench/test/browser/parts/editor/textResourceEditorInput.test.ts index 1bc501716b6..f126d685bf8 100644 --- a/src/vs/workbench/test/browser/parts/editor/textResourceEditorInput.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/textResourceEditorInput.test.ts @@ -31,7 +31,7 @@ suite('TextResourceEditorInput', () => { test('basics', async () => { const resource = URI.from({ scheme: 'inmemory', authority: null!, path: 'thePath' }); - accessor.modelService.createModel('function test() {}', accessor.languageService.create('text'), resource); + accessor.modelService.createModel('function test() {}', accessor.languageService.createById(PLAINTEXT_MODE_ID), resource); const input = instantiationService.createInstance(TextResourceEditorInput, resource, 'The Name', 'The Description', undefined, undefined); @@ -47,7 +47,7 @@ suite('TextResourceEditorInput', () => { }); const resource = URI.from({ scheme: 'inmemory', authority: null!, path: 'thePath' }); - accessor.modelService.createModel('function test() {}', accessor.languageService.create('text'), resource); + accessor.modelService.createModel('function test() {}', accessor.languageService.createById(PLAINTEXT_MODE_ID), resource); const input = instantiationService.createInstance(TextResourceEditorInput, resource, 'The Name', 'The Description', 'resource-input-test', undefined); @@ -68,7 +68,7 @@ suite('TextResourceEditorInput', () => { }); const resource = URI.from({ scheme: 'inmemory', authority: null!, path: 'thePath' }); - accessor.modelService.createModel('function test() {}', accessor.languageService.create('text'), resource); + accessor.modelService.createModel('function test() {}', accessor.languageService.createById(PLAINTEXT_MODE_ID), resource); const input = instantiationService.createInstance(TextResourceEditorInput, resource, 'The Name', 'The Description', undefined, undefined); input.setPreferredMode('resource-input-test'); @@ -80,7 +80,7 @@ suite('TextResourceEditorInput', () => { test('preferred contents (via ctor)', async () => { const resource = URI.from({ scheme: 'inmemory', authority: null!, path: 'thePath' }); - accessor.modelService.createModel('function test() {}', accessor.languageService.create('text'), resource); + accessor.modelService.createModel('function test() {}', accessor.languageService.createById(PLAINTEXT_MODE_ID), resource); const input = instantiationService.createInstance(TextResourceEditorInput, resource, 'The Name', 'The Description', undefined, 'My Resource Input Contents'); @@ -97,7 +97,7 @@ suite('TextResourceEditorInput', () => { test('preferred contents (via setPreferredContents)', async () => { const resource = URI.from({ scheme: 'inmemory', authority: null!, path: 'thePath' }); - accessor.modelService.createModel('function test() {}', accessor.languageService.create('text'), resource); + accessor.modelService.createModel('function test() {}', accessor.languageService.createById(PLAINTEXT_MODE_ID), resource); const input = instantiationService.createInstance(TextResourceEditorInput, resource, 'The Name', 'The Description', undefined, undefined); input.setPreferredContents('My Resource Input Contents');