From 8ce2d77be30b62f6838b06787db8b36d7e3cc5d1 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 4 Jun 2020 21:55:33 +0200 Subject: [PATCH] Fixes #99027: Add support for storing properties that survive text buffer diposing --- .../services/abstractCodeEditorService.ts | 24 +++++++++++++++++++ .../browser/services/codeEditorService.ts | 4 ++++ .../unusualLineTerminators.ts | 4 ++-- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/browser/services/abstractCodeEditorService.ts b/src/vs/editor/browser/services/abstractCodeEditorService.ts index 2aeb0b21b42..7d2f5067574 100644 --- a/src/vs/editor/browser/services/abstractCodeEditorService.ts +++ b/src/vs/editor/browser/services/abstractCodeEditorService.ts @@ -10,6 +10,7 @@ import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService import { IDecorationRenderOptions } from 'vs/editor/common/editorCommon'; import { IModelDecorationOptions, ITextModel } from 'vs/editor/common/model'; import { IResourceEditorInput } from 'vs/platform/editor/common/editor'; +import { URI } from 'vs/base/common/uri'; export abstract class AbstractCodeEditorService extends Disposable implements ICodeEditorService { @@ -94,6 +95,29 @@ export abstract class AbstractCodeEditorService extends Disposable implements IC abstract resolveDecorationOptions(decorationTypeKey: string | undefined, writable: boolean): IModelDecorationOptions; private readonly _transientWatchers: { [uri: string]: ModelTransientSettingWatcher; } = {}; + private readonly _modelProperties = new Map>(); + + public setModelProperty(resource: URI, key: string, value: any): void { + const key1 = resource.toString(); + let dest: Map; + if (this._modelProperties.has(key1)) { + dest = this._modelProperties.get(key1)!; + } else { + dest = new Map(); + this._modelProperties.set(key1, dest); + } + + dest.set(key, value); + } + + public getModelProperty(resource: URI, key: string): any { + const key1 = resource.toString(); + if (this._modelProperties.has(key1)) { + const innerMap = this._modelProperties.get(key1)!; + return innerMap.get(key); + } + return undefined; + } public setTransientModelProperty(model: ITextModel, key: string, value: any): void { const uri = model.uri.toString(); diff --git a/src/vs/editor/browser/services/codeEditorService.ts b/src/vs/editor/browser/services/codeEditorService.ts index c38fccad1ff..937875bb767 100644 --- a/src/vs/editor/browser/services/codeEditorService.ts +++ b/src/vs/editor/browser/services/codeEditorService.ts @@ -9,6 +9,7 @@ import { IDecorationRenderOptions } from 'vs/editor/common/editorCommon'; import { IModelDecorationOptions, ITextModel } from 'vs/editor/common/model'; import { IResourceEditorInput } from 'vs/platform/editor/common/editor'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { URI } from 'vs/base/common/uri'; export const ICodeEditorService = createDecorator('codeEditorService'); @@ -41,6 +42,9 @@ export interface ICodeEditorService { removeDecorationType(key: string): void; resolveDecorationOptions(typeKey: string, writable: boolean): IModelDecorationOptions; + setModelProperty(resource: URI, key: string, value: any): void; + getModelProperty(resource: URI, key: string): any; + setTransientModelProperty(model: ITextModel, key: string, value: any): void; getTransientModelProperty(model: ITextModel, key: string): any; getTransientModelProperties(model: ITextModel): [string, any][] | undefined; diff --git a/src/vs/editor/contrib/unusualLineTerminators/unusualLineTerminators.ts b/src/vs/editor/contrib/unusualLineTerminators/unusualLineTerminators.ts index 0a7464eb0d4..cbd5efdbd4d 100644 --- a/src/vs/editor/contrib/unusualLineTerminators/unusualLineTerminators.ts +++ b/src/vs/editor/contrib/unusualLineTerminators/unusualLineTerminators.ts @@ -16,11 +16,11 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; const ignoreUnusualLineTerminators = 'ignoreUnusualLineTerminators'; function writeIgnoreState(codeEditorService: ICodeEditorService, model: ITextModel, state: boolean): void { - codeEditorService.setTransientModelProperty(model, ignoreUnusualLineTerminators, state); + codeEditorService.setModelProperty(model.uri, ignoreUnusualLineTerminators, state); } function readIgnoreState(codeEditorService: ICodeEditorService, model: ITextModel): boolean | undefined { - return codeEditorService.getTransientModelProperty(model, ignoreUnusualLineTerminators); + return codeEditorService.getModelProperty(model.uri, ignoreUnusualLineTerminators); } class UnusualLineTerminatorsDetector extends Disposable implements IEditorContribution { -- GitLab