From e7dbed062599842c380d804997e1c6e3527c9c92 Mon Sep 17 00:00:00 2001 From: Alexandru Dima Date: Fri, 24 Feb 2023 17:11:18 +0100 Subject: [PATCH] Add support for `ILanguageSelection` directly to the text model (#175344) Add support for `ILanguageSelection` directly to the text model (fixes #155609) --- src/vs/editor/common/model.ts | 11 ++++- src/vs/editor/common/model/textModel.ts | 24 +++++++-- src/vs/editor/common/services/model.ts | 2 - src/vs/editor/common/services/modelService.ts | 49 +++---------------- .../standalone/browser/standaloneEditor.ts | 3 +- .../browser/widget/codeEditorWidget.test.ts | 4 +- .../common/model/textModelWithTokens.test.ts | 4 +- .../api/browser/mainThreadLanguages.ts | 2 +- .../parts/editor/textResourceEditor.ts | 2 +- .../common/editor/textEditorModel.ts | 4 +- .../contrib/debug/browser/breakpointWidget.ts | 4 +- .../workbench/contrib/debug/browser/repl.ts | 2 +- .../emmet/test/browser/emmetAction.test.ts | 2 +- .../interactive/browser/interactiveEditor.ts | 2 +- .../browser/languageDetection.contribution.ts | 2 +- .../browser/model/mergeEditorModel.ts | 10 ++-- .../notebook/browser/notebook.contribution.ts | 2 +- .../common/model/notebookCellTextModel.ts | 2 +- .../performance/browser/perfviewEditor.ts | 2 +- .../browser/commands/fileTemplateSnippets.ts | 4 +- .../textfile/browser/textFileService.ts | 2 +- .../textfile/common/textFileEditorModel.ts | 2 +- .../test/browser/untitledTextEditor.test.ts | 5 +- 23 files changed, 64 insertions(+), 82 deletions(-) diff --git a/src/vs/editor/common/model.ts b/src/vs/editor/common/model.ts index 0df35045e97..846dd034eec 100644 --- a/src/vs/editor/common/model.ts +++ b/src/vs/editor/common/model.ts @@ -22,6 +22,7 @@ import { IGuidesTextModelPart } from 'vs/editor/common/textModelGuides'; import { ITokenizationTextModelPart } from 'vs/editor/common/tokenizationTextModelPart'; import { ThemeColor } from 'vs/base/common/themables'; import { UndoRedoGroup } from 'vs/platform/undoRedo/common/undoRedo'; +import { ILanguageSelection } from 'vs/editor/common/languages/language'; /** * Vertical Lane in the overview ruler of the editor. @@ -871,7 +872,15 @@ export interface ITextModel { * @param source The source of the call that set the language. * @internal */ - setMode(languageId: string, source?: string): void; + setLanguage(languageId: string, source?: string): void; + + /** + * Set the current language mode associated with the model. + * @param languageSelection The new language selection. + * @param source The source of the call that set the language. + * @internal + */ + setLanguage(languageSelection: ILanguageSelection, source?: string): void; /** * Returns the real (inner-most) language mode at a given position. diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index e7014aab076..32ee664464b 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -9,7 +9,7 @@ import { Color } from 'vs/base/common/color'; import { illegalArgument, onUnexpectedError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; import { IMarkdownString } from 'vs/base/common/htmlContent'; -import { combinedDisposable, Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { combinedDisposable, Disposable, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { listenStream } from 'vs/base/common/stream'; import * as strings from 'vs/base/common/strings'; import { Constants } from 'vs/base/common/uint'; @@ -24,7 +24,7 @@ import { TextChange } from 'vs/editor/common/core/textChange'; import { EDITOR_MODEL_DEFAULTS } from 'vs/editor/common/core/textModelDefaults'; import { IWordAtPosition } from 'vs/editor/common/core/wordHelper'; import { FormattingOptions } from 'vs/editor/common/languages'; -import { ILanguageService } from 'vs/editor/common/languages/language'; +import { ILanguageSelection, ILanguageService } from 'vs/editor/common/languages/language'; import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'; import * as model from 'vs/editor/common/model'; import { BracketPairsTextModelPart } from 'vs/editor/common/model/bracketPairsTextModelPart/bracketPairsImpl'; @@ -243,6 +243,7 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati private _buffer: model.ITextBuffer; private _bufferDisposable: IDisposable; private _options: model.TextModelResolvedOptions; + private _languageSelectionListener = this._register(new MutableDisposable()); private _isDisposed: boolean; private __isDisposing: boolean; @@ -287,7 +288,7 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati constructor( source: string | model.ITextBufferFactory, - languageId: string, + languageIdOrSelection: string | ILanguageSelection, creationOptions: model.ITextModelCreationOptions, associatedResource: URI | null = null, @IUndoRedoService private readonly _undoRedoService: IUndoRedoService, @@ -313,6 +314,11 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati this._options = TextModel.resolveOptions(this._buffer, creationOptions); + const languageId = (typeof languageIdOrSelection === 'string' ? languageIdOrSelection : languageIdOrSelection.languageId); + if (typeof languageIdOrSelection !== 'string') { + this._languageSelectionListener.value = languageIdOrSelection.onDidChange(() => this._setLanguage(languageIdOrSelection.languageId)); + } + this._bracketPairs = this._register(new BracketPairsTextModelPart(this, this._languageConfigurationService)); this._guidesTextModelPart = this._register(new GuidesTextModelPart(this, this._languageConfigurationService)); this._decorationProvider = this._register(new ColorizedBracketPairsDecorationProvider(this)); @@ -1907,7 +1913,17 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati return this.tokenization.getLanguageId(); } - public setMode(languageId: string, source?: string): void { + public setLanguage(languageIdOrSelection: string | ILanguageSelection, source?: string): void { + if (typeof languageIdOrSelection === 'string') { + this._languageSelectionListener.clear(); + this._setLanguage(languageIdOrSelection, source); + } else { + this._languageSelectionListener.value = languageIdOrSelection.onDidChange(() => this._setLanguage(languageIdOrSelection.languageId, source)); + this._setLanguage(languageIdOrSelection.languageId, source); + } + } + + private _setLanguage(languageId: string, source?: string): void { this.tokenization.setLanguageId(languageId, source); this._languageService.requestRichLanguageFeatures(languageId); } diff --git a/src/vs/editor/common/services/model.ts b/src/vs/editor/common/services/model.ts index de627268e69..17355399606 100644 --- a/src/vs/editor/common/services/model.ts +++ b/src/vs/editor/common/services/model.ts @@ -21,8 +21,6 @@ export interface IModelService { updateModel(model: ITextModel, value: string | ITextBufferFactory): void; - setMode(model: ITextModel, languageSelection: ILanguageSelection, source?: string): void; - destroyModel(resource: URI): void; getModels(): ITextModel[]; diff --git a/src/vs/editor/common/services/modelService.ts b/src/vs/editor/common/services/modelService.ts index 9a8544466d5..4de8d88004d 100644 --- a/src/vs/editor/common/services/modelService.ts +++ b/src/vs/editor/common/services/modelService.ts @@ -40,46 +40,22 @@ function computeModelSha1(model: ITextModel): string { return shaComputer.digest(); } - class ModelData implements IDisposable { - public readonly model: TextModel; - - private _languageSelection: ILanguageSelection | null; - private _languageSelectionListener: IDisposable | null; private readonly _modelEventListeners = new DisposableStore(); constructor( - model: TextModel, + public readonly model: TextModel, onWillDispose: (model: ITextModel) => void, onDidChangeLanguage: (model: ITextModel, e: IModelLanguageChangedEvent) => void ) { this.model = model; - - this._languageSelection = null; - this._languageSelectionListener = null; - this._modelEventListeners.add(model.onWillDispose(() => onWillDispose(model))); this._modelEventListeners.add(model.onDidChangeLanguage((e) => onDidChangeLanguage(model, e))); } - private _disposeLanguageSelection(): void { - if (this._languageSelectionListener) { - this._languageSelectionListener.dispose(); - this._languageSelectionListener = null; - } - } - public dispose(): void { this._modelEventListeners.dispose(); - this._disposeLanguageSelection(); - } - - public setLanguage(languageSelection: ILanguageSelection, source?: string): void { - this._disposeLanguageSelection(); - this._languageSelection = languageSelection; - this._languageSelectionListener = this._languageSelection.onDidChange(() => this.model.setMode(languageSelection.languageId, source)); - this.model.setMode(languageSelection.languageId, source); } } @@ -242,7 +218,8 @@ export class ModelService extends Disposable implements IModelService { return true; } - public getCreationOptions(language: string, resource: URI | undefined, isForSimpleWidget: boolean): ITextModelCreationOptions { + public getCreationOptions(languageIdOrSelection: string | ILanguageSelection, resource: URI | undefined, isForSimpleWidget: boolean): ITextModelCreationOptions { + const language = (typeof languageIdOrSelection === 'string' ? languageIdOrSelection : languageIdOrSelection.languageId); let creationOptions = this._modelCreationOptionsByLanguageAndResource[language + resource]; if (!creationOptions) { const editor = this._configurationService.getValue('editor', { overrideIdentifier: language, resource }); @@ -345,12 +322,12 @@ export class ModelService extends Disposable implements IModelService { } } - private _createModelData(value: string | ITextBufferFactory, languageId: string, resource: URI | undefined, isForSimpleWidget: boolean): ModelData { + private _createModelData(value: string | ITextBufferFactory, languageIdOrSelection: string | ILanguageSelection, resource: URI | undefined, isForSimpleWidget: boolean): ModelData { // create & save the model - const options = this.getCreationOptions(languageId, resource, isForSimpleWidget); + const options = this.getCreationOptions(languageIdOrSelection, resource, isForSimpleWidget); const model: TextModel = new TextModel( value, - languageId, + languageIdOrSelection, options, resource, this._undoRedoService, @@ -478,8 +455,7 @@ export class ModelService extends Disposable implements IModelService { let modelData: ModelData; if (languageSelection) { - modelData = this._createModelData(value, languageSelection.languageId, resource, isForSimpleWidget); - this.setMode(modelData.model, languageSelection); + modelData = this._createModelData(value, languageSelection, resource, isForSimpleWidget); } else { modelData = this._createModelData(value, PLAINTEXT_LANGUAGE_ID, resource, isForSimpleWidget); } @@ -489,17 +465,6 @@ export class ModelService extends Disposable implements IModelService { return modelData.model; } - public setMode(model: ITextModel, languageSelection: ILanguageSelection, source?: string): void { - if (!languageSelection) { - return; - } - const modelData = this._models[MODEL_ID(model.uri)]; - if (!modelData) { - return; - } - modelData.setLanguage(languageSelection, source); - } - public destroyModel(resource: URI): void { // We need to support that not all models get disposed through this service (i.e. model.dispose() should work!) const modelData = this._models[MODEL_ID(resource)]; diff --git a/src/vs/editor/standalone/browser/standaloneEditor.ts b/src/vs/editor/standalone/browser/standaloneEditor.ts index f976cb4aa5f..6027a2ac7a5 100644 --- a/src/vs/editor/standalone/browser/standaloneEditor.ts +++ b/src/vs/editor/standalone/browser/standaloneEditor.ts @@ -240,9 +240,8 @@ export function createModel(value: string, language?: string, uri?: URI): ITextM */ export function setModelLanguage(model: ITextModel, mimeTypeOrLanguageId: string): void { const languageService = StandaloneServices.get(ILanguageService); - const modelService = StandaloneServices.get(IModelService); const languageId = languageService.getLanguageIdByMimeType(mimeTypeOrLanguageId) || mimeTypeOrLanguageId || PLAINTEXT_LANGUAGE_ID; - modelService.setMode(model, languageService.createById(languageId)); + model.setLanguage(languageService.createById(languageId)); } /** diff --git a/src/vs/editor/test/browser/widget/codeEditorWidget.test.ts b/src/vs/editor/test/browser/widget/codeEditorWidget.test.ts index 7fa0217572a..43a058e3b74 100644 --- a/src/vs/editor/test/browser/widget/codeEditorWidget.test.ts +++ b/src/vs/editor/test/browser/widget/codeEditorWidget.test.ts @@ -41,7 +41,7 @@ suite('CodeEditorWidget', () => { invoked = true; })); - viewModel.model.setMode('testMode'); + viewModel.model.setLanguage('testMode'); assert.deepStrictEqual(invoked, true); @@ -55,7 +55,7 @@ suite('CodeEditorWidget', () => { const languageService = instantiationService.get(ILanguageService); const disposables = new DisposableStore(); disposables.add(languageService.registerLanguage({ id: 'testMode' })); - viewModel.model.setMode('testMode'); + viewModel.model.setLanguage('testMode'); let invoked = false; disposables.add(editor.onDidChangeModelLanguageConfiguration((e) => { diff --git a/src/vs/editor/test/common/model/textModelWithTokens.test.ts b/src/vs/editor/test/common/model/textModelWithTokens.test.ts index 39add3ef287..9406e15adf7 100644 --- a/src/vs/editor/test/common/model/textModelWithTokens.test.ts +++ b/src/vs/editor/test/common/model/textModelWithTokens.test.ts @@ -586,12 +586,12 @@ suite('TextModelWithTokens regression tests', () => { assertViewLineTokens(model, 1, true, [createViewLineToken(12, 1)]); assertViewLineTokens(model, 2, true, [createViewLineToken(9, 1)]); - model.setMode(LANG_ID1); + model.setLanguage(LANG_ID1); assertViewLineTokens(model, 1, true, [createViewLineToken(12, 11)]); assertViewLineTokens(model, 2, true, [createViewLineToken(9, 12)]); - model.setMode(LANG_ID2); + model.setLanguage(LANG_ID2); assertViewLineTokens(model, 1, false, [createViewLineToken(12, 1)]); assertViewLineTokens(model, 2, false, [createViewLineToken(9, 1)]); diff --git a/src/vs/workbench/api/browser/mainThreadLanguages.ts b/src/vs/workbench/api/browser/mainThreadLanguages.ts index c532913bccd..7ec1932f4b0 100644 --- a/src/vs/workbench/api/browser/mainThreadLanguages.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguages.ts @@ -52,7 +52,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.createById(languageId)); + ref.object.textEditorModel.setLanguage(this._languageService.createById(languageId)); } finally { ref.dispose(); } diff --git a/src/vs/workbench/browser/parts/editor/textResourceEditor.ts b/src/vs/workbench/browser/parts/editor/textResourceEditor.ts index bc637e33a4b..e33f2de8e4e 100644 --- a/src/vs/workbench/browser/parts/editor/textResourceEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textResourceEditor.ts @@ -207,7 +207,7 @@ export class TextResourceEditor extends AbstractTextResourceEditor { // High confidence, set language id at TextEditorModel level to block future auto-detection this.input.model.setLanguageId(candidateLanguage.id); } else { - this.modelService.setMode(textModel, this.languageService.createById(candidateLanguage.id)); + textModel.setLanguage(this.languageService.createById(candidateLanguage.id)); } const opts = this.modelService.getCreationOptions(textModel.getLanguageId(), textModel.uri, textModel.isForSimpleWidget); diff --git a/src/vs/workbench/common/editor/textEditorModel.ts b/src/vs/workbench/common/editor/textEditorModel.ts index c182aa14e4a..591723e24e8 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.createById(languageId), source); + this.textEditorModel.setLanguage(this.languageService.createById(languageId), source); } protected installModelListeners(model: ITextModel): void { @@ -211,7 +211,7 @@ export class BaseTextEditorModel extends EditorModel implements ITextEditorModel // language (only if specific and changed) if (preferredLanguageId && preferredLanguageId !== PLAINTEXT_LANGUAGE_ID && this.textEditorModel.getLanguageId() !== preferredLanguageId) { - this.modelService.setMode(this.textEditorModel, this.languageService.createById(preferredLanguageId)); + this.textEditorModel.setLanguage(this.languageService.createById(preferredLanguageId)); } } diff --git a/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts b/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts index 38683d90103..a072436bb28 100644 --- a/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts +++ b/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts @@ -169,7 +169,7 @@ export class BreakpointWidget extends ZoneWidget implements IPrivateBreakpointWi if (this.editor.hasModel()) { // Use plaintext language for log messages, otherwise respect underlying editor language #125619 const languageId = this.context === Context.LOG_MESSAGE ? PLAINTEXT_LANGUAGE_ID : this.editor.getModel().getLanguageId(); - this.input.getModel().setMode(languageId); + this.input.getModel().setLanguage(languageId); } } @@ -229,7 +229,7 @@ export class BreakpointWidget extends ZoneWidget implements IPrivateBreakpointWi CONTEXT_IN_BREAKPOINT_WIDGET.bindTo(scopedContextKeyService).set(true); const model = this.modelService.createModel('', null, uri.parse(`${DEBUG_SCHEME}:${this.editor.getId()}:breakpointinput`), true); if (this.editor.hasModel()) { - model.setMode(this.editor.getModel().getLanguageId()); + model.setLanguage(this.editor.getModel().getLanguageId()); } this.input.setModel(model); this.setInputMode(); diff --git a/src/vs/workbench/contrib/debug/browser/repl.ts b/src/vs/workbench/contrib/debug/browser/repl.ts index 1773c546174..4195e2e3fba 100644 --- a/src/vs/workbench/contrib/debug/browser/repl.ts +++ b/src/vs/workbench/contrib/debug/browser/repl.ts @@ -342,7 +342,7 @@ export class Repl extends FilterViewPane implements IHistoryNavigationWidget { this.modelChangeListener.dispose(); this.modelChangeListener = activeEditorControl.onDidChangeModelLanguage(() => this.setMode()); if (this.model && activeEditorControl.hasModel()) { - this.model.setMode(activeEditorControl.getModel().getLanguageId()); + this.model.setLanguage(activeEditorControl.getModel().getLanguageId()); } } } diff --git a/src/vs/workbench/contrib/emmet/test/browser/emmetAction.test.ts b/src/vs/workbench/contrib/emmet/test/browser/emmetAction.test.ts index 41dc18cf8f2..da5770a1d73 100644 --- a/src/vs/workbench/contrib/emmet/test/browser/emmetAction.test.ts +++ b/src/vs/workbench/contrib/emmet/test/browser/emmetAction.test.ts @@ -39,7 +39,7 @@ suite('Emmet', () => { assert.fail('Editor model not found'); } - model.setMode(mode); + model.setLanguage(mode); const langOutput = EmmetEditorAction.getLanguage(editor, new MockGrammarContributions(scopeName)); if (!langOutput) { assert.fail('langOutput not found'); diff --git a/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts b/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts index 86dda88474b..e413531c102 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts @@ -554,7 +554,7 @@ export class InteractiveEditor extends EditorPane { if (selectedOrSuggested) { const language = selectedOrSuggested.supportedLanguages[0]; const newMode = language ? this.#languageService.createById(language).languageId : PLAINTEXT_LANGUAGE_ID; - textModel.setMode(newMode); + textModel.setLanguage(newMode); NOTEBOOK_KERNEL.bindTo(this.#contextKeyService).set(selectedOrSuggested.id); } diff --git a/src/vs/workbench/contrib/languageDetection/browser/languageDetection.contribution.ts b/src/vs/workbench/contrib/languageDetection/browser/languageDetection.contribution.ts index 363f76cb570..9211cf9643f 100644 --- a/src/vs/workbench/contrib/languageDetection/browser/languageDetection.contribution.ts +++ b/src/vs/workbench/contrib/languageDetection/browser/languageDetection.contribution.ts @@ -139,7 +139,7 @@ registerAction2(class extends Action2 { if (editorUri) { const lang = await languageDetectionService.detectLanguage(editorUri); if (lang) { - editor.getModel()?.setMode(lang, LanguageDetectionLanguageEventSource); + editor.getModel()?.setLanguage(lang, LanguageDetectionLanguageEventSource); } else { notificationService.warn(localize('noDetection', "Unable to detect editor language")); } diff --git a/src/vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel.ts b/src/vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel.ts index 9de532d436b..1e5a2b2f686 100644 --- a/src/vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel.ts +++ b/src/vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel.ts @@ -10,7 +10,6 @@ import { URI } from 'vs/base/common/uri'; import { Range } from 'vs/editor/common/core/range'; import { ILanguageService } from 'vs/editor/common/languages/language'; import { ITextModel } from 'vs/editor/common/model'; -import { IModelService } from 'vs/editor/common/services/model'; import { localize } from 'vs/nls'; import { IResourceUndoRedoElement, IUndoRedoService, UndoRedoElementType, UndoRedoGroup } from 'vs/platform/undoRedo/common/undoRedo'; import { EditorModel } from 'vs/workbench/common/editor/editorModel'; @@ -59,7 +58,6 @@ export class MergeEditorModel extends EditorModel { private readonly diffComputer: IMergeDiffComputer, private readonly options: { resetResult: boolean }, public readonly telemetry: MergeEditorTelemetry, - @IModelService private readonly modelService: IModelService, @ILanguageService private readonly languageService: ILanguageService, @IUndoRedoService private readonly undoRedoService: IUndoRedoService, ) { @@ -558,10 +556,10 @@ export class MergeEditorModel extends EditorModel { public setLanguageId(languageId: string, source?: string): void { const language = this.languageService.createById(languageId); - this.modelService.setMode(this.base, language, source); - this.modelService.setMode(this.input1.textModel, language, source); - this.modelService.setMode(this.input2.textModel, language, source); - this.modelService.setMode(this.resultTextModel, language, source); + this.base.setLanguage(language, source); + this.input1.textModel.setLanguage(language, source); + this.input2.textModel.setLanguage(language, source); + this.resultTextModel.setLanguage(language, source); } public getInitialResultValue(): string { diff --git a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts index a461f1e77dc..92ef90c24ad 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts @@ -506,7 +506,7 @@ class CellInfoContentProvider { } model.setValue(newResult.content); - model.setMode(newResult.mode.languageId); + model.setLanguage(newResult.mode.languageId); }); const once = model.onWillDispose(() => { diff --git a/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts b/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts index 02865d69aa7..c5d927de580 100644 --- a/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts +++ b/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts @@ -93,7 +93,7 @@ export class NotebookCellTextModel extends Disposable implements ICell { if (this._textModel) { const languageId = this._languageService.createById(newLanguageId); - this._textModel.setMode(languageId.languageId); + this._textModel.setLanguage(languageId.languageId); } if (this._language === newLanguage) { diff --git a/src/vs/workbench/contrib/performance/browser/perfviewEditor.ts b/src/vs/workbench/contrib/performance/browser/perfviewEditor.ts index 1f9d20449ef..377833d6122 100644 --- a/src/vs/workbench/contrib/performance/browser/perfviewEditor.ts +++ b/src/vs/workbench/contrib/performance/browser/perfviewEditor.ts @@ -95,7 +95,7 @@ class PerfModelContentProvider implements ITextModelContentProvider { this._model = this._modelService.getModel(resource) || this._modelService.createModel('Loading...', langId, resource); this._modelDisposables.push(langId.onDidChange(e => { - this._model?.setMode(e); + this._model?.setLanguage(e); })); this._modelDisposables.push(this._extensionService.onDidChangeExtensionsStatus(this._updateModel, this)); diff --git a/src/vs/workbench/contrib/snippets/browser/commands/fileTemplateSnippets.ts b/src/vs/workbench/contrib/snippets/browser/commands/fileTemplateSnippets.ts index b96d2b093af..600ff83d1ed 100644 --- a/src/vs/workbench/contrib/snippets/browser/commands/fileTemplateSnippets.ts +++ b/src/vs/workbench/contrib/snippets/browser/commands/fileTemplateSnippets.ts @@ -7,7 +7,6 @@ import { groupBy, isFalsyOrEmpty } from 'vs/base/common/arrays'; import { compare } from 'vs/base/common/strings'; import { getCodeEditor } from 'vs/editor/browser/editorBrowser'; import { ILanguageService } from 'vs/editor/common/languages/language'; -import { IModelService } from 'vs/editor/common/services/model'; import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { localize } from 'vs/nls'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; @@ -37,7 +36,6 @@ export class ApplyFileSnippetAction extends SnippetsAction { const quickInputService = accessor.get(IQuickInputService); const editorService = accessor.get(IEditorService); const langService = accessor.get(ILanguageService); - const modelService = accessor.get(IModelService); const editor = getCodeEditor(editorService.activeTextEditorControl); if (!editor || !editor.hasModel()) { @@ -62,7 +60,7 @@ export class ApplyFileSnippetAction extends SnippetsAction { }]); // set language if possible - modelService.setMode(editor.getModel(), langService.createById(selection.langId), ApplyFileSnippetAction.Id); + editor.getModel().setLanguage(langService.createById(selection.langId), ApplyFileSnippetAction.Id); editor.focus(); } diff --git a/src/vs/workbench/services/textfile/browser/textFileService.ts b/src/vs/workbench/services/textfile/browser/textFileService.ts index a78fc891cf9..6920a263671 100644 --- a/src/vs/workbench/services/textfile/browser/textFileService.ts +++ b/src/vs/workbench/services/textfile/browser/textFileService.ts @@ -531,7 +531,7 @@ export abstract class AbstractTextFileService extends Disposable implements ITex const sourceLanguageId = sourceTextModel.getLanguageId(); const targetLanguageId = targetTextModel.getLanguageId(); if (sourceLanguageId !== PLAINTEXT_LANGUAGE_ID && targetLanguageId === PLAINTEXT_LANGUAGE_ID) { - targetTextModel.setMode(sourceLanguageId); // only use if more specific than plain/text + targetTextModel.setLanguage(sourceLanguageId); // only use if more specific than plain/text } // transient properties diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index 14d31691b99..ca47e361dbd 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -196,7 +196,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil const firstLineText = this.getFirstLineText(this.textEditorModel); const languageSelection = this.getOrCreateLanguage(this.resource, this.languageService, this.preferredLanguageId, firstLineText); - this.modelService.setMode(this.textEditorModel, languageSelection); + this.textEditorModel.setLanguage(languageSelection); } override setLanguageId(languageId: string, source?: string): void { diff --git a/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.test.ts b/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.test.ts index 9aacd0a6493..7c6b704a56f 100644 --- a/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.test.ts +++ b/src/vs/workbench/services/untitled/test/browser/untitledTextEditor.test.ts @@ -351,7 +351,7 @@ suite('Untitled text editors', () => { await input.resolve(); assert.ok(!input.model.hasLanguageSetExplicitly); - accessor.modelService.setMode(model.textEditorModel!, accessor.languageService.createById(language)); + model.textEditorModel!.setLanguage(accessor.languageService.createById(language)); assert.ok(input.model.hasLanguageSetExplicitly); assert.strictEqual(model.getLanguageId(), language); @@ -373,8 +373,7 @@ suite('Untitled text editors', () => { await input.resolve(); assert.ok(!input.model.hasLanguageSetExplicitly); - accessor.modelService.setMode( - model.textEditorModel!, + model.textEditorModel!.setLanguage( accessor.languageService.createById(language), // This is really what this is testing LanguageDetectionLanguageEventSource);