diff --git a/src/vs/editor/browser/services/abstractCodeEditorService.ts b/src/vs/editor/browser/services/abstractCodeEditorService.ts index 53c5bac6f281..a7e8785c3a8e 100644 --- a/src/vs/editor/browser/services/abstractCodeEditorService.ts +++ b/src/vs/editor/browser/services/abstractCodeEditorService.ts @@ -120,6 +120,16 @@ export abstract class AbstractCodeEditorService extends Disposable implements IC return this._transientWatchers[uri].get(key); } + public getTransientModelProperties(model: ITextModel): [string, any][] | undefined { + const uri = model.uri.toString(); + + if (!this._transientWatchers.hasOwnProperty(uri)) { + return undefined; + } + + return this._transientWatchers[uri].keys().map(key => [key, this._transientWatchers[uri].get(key)]); + } + _removeWatcher(w: ModelTransientSettingWatcher): void { delete this._transientWatchers[w.uri]; } @@ -145,4 +155,8 @@ export class ModelTransientSettingWatcher { public get(key: string): any { return this._values[key]; } + + public keys(): string[] { + return Object.keys(this._values); + } } diff --git a/src/vs/editor/browser/services/codeEditorService.ts b/src/vs/editor/browser/services/codeEditorService.ts index 0cfba7fd7fbb..22f0e9e48449 100644 --- a/src/vs/editor/browser/services/codeEditorService.ts +++ b/src/vs/editor/browser/services/codeEditorService.ts @@ -43,6 +43,7 @@ export interface ICodeEditorService { setTransientModelProperty(model: ITextModel, key: string, value: any): void; getTransientModelProperty(model: ITextModel, key: string): any; + getTransientModelProperties(model: ITextModel): [string, any][] | undefined; getActiveCodeEditor(): ICodeEditor | null; openCodeEditor(input: IResourceInput, source: ICodeEditor | null, sideBySide?: boolean): Promise; diff --git a/src/vs/workbench/services/textfile/browser/textFileService.ts b/src/vs/workbench/services/textfile/browser/textFileService.ts index 76be4e91cc23..355f94cb60dc 100644 --- a/src/vs/workbench/services/textfile/browser/textFileService.ts +++ b/src/vs/workbench/services/textfile/browser/textFileService.ts @@ -32,6 +32,7 @@ import { IFilesConfigurationService } from 'vs/workbench/services/filesConfigura import { CancellationToken } from 'vs/base/common/cancellation'; import { ITextModelService, IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService'; import { BaseTextEditorModel } from 'vs/workbench/common/editor/textEditorModel'; +import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; /** * The workbench file service implementation implements the raw file service spec and adds additional methods on top. @@ -70,7 +71,8 @@ export abstract class AbstractTextFileService extends Disposable implements ITex @IEditorService private readonly editorService: IEditorService, @ITextResourceConfigurationService protected readonly textResourceConfigurationService: ITextResourceConfigurationService, @IFilesConfigurationService protected readonly filesConfigurationService: IFilesConfigurationService, - @ITextModelService private readonly textModelService: ITextModelService + @ITextModelService private readonly textModelService: ITextModelService, + @ICodeEditorService private readonly codeEditorService: ICodeEditorService ) { super(); @@ -517,6 +519,14 @@ export abstract class AbstractTextFileService extends Disposable implements ITex if (sourceMode.language !== PLAINTEXT_MODE_ID && targetMode.language === PLAINTEXT_MODE_ID) { targetTextModel.setMode(sourceMode); // only use if more specific than plain/text } + + // transient properties + const sourceTransientProperties = this.codeEditorService.getTransientModelProperties(sourceTextModel); + if (sourceTransientProperties) { + for (const [key, value] of sourceTransientProperties) { + this.codeEditorService.setTransientModelProperty(targetTextModel, key, value); + } + } } // save model diff --git a/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService.ts b/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService.ts index 0c1c8038bfb2..aa380e043fe6 100644 --- a/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService.ts +++ b/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService.ts @@ -38,6 +38,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { assign } from 'vs/base/common/objects'; import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; +import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; export class NativeTextFileService extends AbstractTextFileService { @@ -55,9 +56,10 @@ export class NativeTextFileService extends AbstractTextFileService { @ITextResourceConfigurationService textResourceConfigurationService: ITextResourceConfigurationService, @IProductService private readonly productService: IProductService, @IFilesConfigurationService filesConfigurationService: IFilesConfigurationService, - @ITextModelService textModelService: ITextModelService + @ITextModelService textModelService: ITextModelService, + @ICodeEditorService codeEditorService: ICodeEditorService ) { - super(fileService, untitledTextEditorService, lifecycleService, instantiationService, modelService, environmentService, historyService, dialogService, fileDialogService, editorService, textResourceConfigurationService, filesConfigurationService, textModelService); + super(fileService, untitledTextEditorService, lifecycleService, instantiationService, modelService, environmentService, historyService, dialogService, fileDialogService, editorService, textResourceConfigurationService, filesConfigurationService, textModelService, codeEditorService); } private _encoding: EncodingOracle | undefined; diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index caceda8fef75..a6eb89007ebc 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -207,7 +207,8 @@ export class TestTextFileService extends NativeTextFileService { @ITextResourceConfigurationService textResourceConfigurationService: ITextResourceConfigurationService, @IProductService productService: IProductService, @IFilesConfigurationService filesConfigurationService: IFilesConfigurationService, - @ITextModelService textModelService: ITextModelService + @ITextModelService textModelService: ITextModelService, + @ICodeEditorService codeEditorService: ICodeEditorService ) { super( fileService, @@ -223,7 +224,8 @@ export class TestTextFileService extends NativeTextFileService { textResourceConfigurationService, productService, filesConfigurationService, - textModelService + textModelService, + codeEditorService ); } @@ -1238,6 +1240,7 @@ export class TestCodeEditorService implements ICodeEditorService { resolveDecorationOptions(_typeKey: string, _writable: boolean): IModelDecorationOptions { return Object.create(null); } setTransientModelProperty(_model: ITextModel, _key: string, _value: any): void { } getTransientModelProperty(_model: ITextModel, _key: string) { } + getTransientModelProperties(_model: ITextModel) { return undefined; } getActiveCodeEditor(): ICodeEditor | null { return null; } openCodeEditor(_input: IResourceInput, _source: ICodeEditor, _sideBySide?: boolean): Promise { return Promise.resolve(null); } }