From c18c450b038c1f1bc70deed8ca9ee83028792627 Mon Sep 17 00:00:00 2001 From: Alexandru Dima Date: Tue, 13 Dec 2022 12:52:39 +0100 Subject: [PATCH] Updating `tabSize` should also update `indentSize` if `indentSize` is configured to be equal to `tabSize` (#168984) Updating `tabSize` should also update `indentSize` if `indentSize` is configured to be equal to `tabSize` (#168836) --- src/vs/editor/common/model.ts | 20 +++++++++++++++---- src/vs/editor/common/model/textModel.ts | 14 +++---------- src/vs/editor/common/services/modelService.ts | 2 +- .../test/common/model/textModel.test.ts | 17 ++++++++++++++++ src/vs/editor/test/common/testTextModel.ts | 2 +- src/vs/monaco.d.ts | 3 ++- .../workbench/api/browser/mainThreadEditor.ts | 6 +----- 7 files changed, 41 insertions(+), 23 deletions(-) diff --git a/src/vs/editor/common/model.ts b/src/vs/editor/common/model.ts index 861ad5b5832527..109d553e7d2efb 100644 --- a/src/vs/editor/common/model.ts +++ b/src/vs/editor/common/model.ts @@ -424,24 +424,35 @@ export class TextModelResolvedOptions { readonly tabSize: number; readonly indentSize: number; + private readonly _indentSizeIsTabSize: boolean; readonly insertSpaces: boolean; readonly defaultEOL: DefaultEndOfLine; readonly trimAutoWhitespace: boolean; readonly bracketPairColorizationOptions: BracketPairColorizationOptions; + public get originalIndentSize(): number | 'tabSize' { + return this._indentSizeIsTabSize ? 'tabSize' : this.indentSize; + } + /** * @internal */ constructor(src: { tabSize: number; - indentSize: number; + indentSize: number | 'tabSize'; insertSpaces: boolean; defaultEOL: DefaultEndOfLine; trimAutoWhitespace: boolean; bracketPairColorizationOptions: BracketPairColorizationOptions; }) { this.tabSize = Math.max(1, src.tabSize | 0); - this.indentSize = Math.max(1, src.indentSize | 0); + if (src.indentSize === 'tabSize') { + this.indentSize = this.tabSize; + this._indentSizeIsTabSize = true; + } else { + this.indentSize = Math.max(1, src.indentSize | 0); + this._indentSizeIsTabSize = false; + } this.insertSpaces = Boolean(src.insertSpaces); this.defaultEOL = src.defaultEOL | 0; this.trimAutoWhitespace = Boolean(src.trimAutoWhitespace); @@ -454,6 +465,7 @@ export class TextModelResolvedOptions { public equals(other: TextModelResolvedOptions): boolean { return ( this.tabSize === other.tabSize + && this._indentSizeIsTabSize === other._indentSizeIsTabSize && this.indentSize === other.indentSize && this.insertSpaces === other.insertSpaces && this.defaultEOL === other.defaultEOL @@ -480,7 +492,7 @@ export class TextModelResolvedOptions { */ export interface ITextModelCreationOptions { tabSize: number; - indentSize: number; + indentSize: number | 'tabSize'; insertSpaces: boolean; detectIndentation: boolean; trimAutoWhitespace: boolean; @@ -497,7 +509,7 @@ export interface BracketPairColorizationOptions { export interface ITextModelUpdateOptions { tabSize?: number; - indentSize?: number; + indentSize?: number | 'tabSize'; insertSpaces?: boolean; trimAutoWhitespace?: boolean; bracketColorizationOptions?: BracketPairColorizationOptions; diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 9447ad435700e8..f6cfde8a2b9c6e 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -193,7 +193,7 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati const guessedIndentation = guessIndentation(textBuffer, options.tabSize, options.insertSpaces); return new model.TextModelResolvedOptions({ tabSize: guessedIndentation.tabSize, - indentSize: guessedIndentation.tabSize, // TODO@Alex: guess indentSize independent of tabSize + indentSize: 'tabSize', // TODO@Alex: guess indentSize independent of tabSize insertSpaces: guessedIndentation.insertSpaces, trimAutoWhitespace: options.trimAutoWhitespace, defaultEOL: options.defaultEOL, @@ -201,15 +201,7 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati }); } - return new model.TextModelResolvedOptions({ - tabSize: options.tabSize, - indentSize: options.indentSize, - insertSpaces: options.insertSpaces, - trimAutoWhitespace: options.trimAutoWhitespace, - defaultEOL: options.defaultEOL, - bracketPairColorizationOptions: options.bracketPairColorizationOptions, - }); - + return new model.TextModelResolvedOptions(options); } //#region Events @@ -629,7 +621,7 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati public updateOptions(_newOpts: model.ITextModelUpdateOptions): void { this._assertNotDisposed(); const tabSize = (typeof _newOpts.tabSize !== 'undefined') ? _newOpts.tabSize : this._options.tabSize; - const indentSize = (typeof _newOpts.indentSize !== 'undefined') ? _newOpts.indentSize : this._options.indentSize; + const indentSize = (typeof _newOpts.indentSize !== 'undefined') ? _newOpts.indentSize : this._options.originalIndentSize; const insertSpaces = (typeof _newOpts.insertSpaces !== 'undefined') ? _newOpts.insertSpaces : this._options.insertSpaces; const trimAutoWhitespace = (typeof _newOpts.trimAutoWhitespace !== 'undefined') ? _newOpts.trimAutoWhitespace : this._options.trimAutoWhitespace; const bracketPairColorizationOptions = (typeof _newOpts.bracketColorizationOptions !== 'undefined') ? _newOpts.bracketColorizationOptions : this._options.bracketPairColorizationOptions; diff --git a/src/vs/editor/common/services/modelService.ts b/src/vs/editor/common/services/modelService.ts index 9df6c050c1f758..56b329f32e4b0d 100644 --- a/src/vs/editor/common/services/modelService.ts +++ b/src/vs/editor/common/services/modelService.ts @@ -191,7 +191,7 @@ export class ModelService extends Disposable implements IModelService { } } - let indentSize = tabSize; + let indentSize: number | 'tabSize' = 'tabSize'; if (config.editor && typeof config.editor.indentSize !== 'undefined' && config.editor.indentSize !== 'tabSize') { const parsedIndentSize = parseInt(config.editor.indentSize, 10); if (!isNaN(parsedIndentSize)) { diff --git a/src/vs/editor/test/common/model/textModel.test.ts b/src/vs/editor/test/common/model/textModel.test.ts index 225cea65b17182..e060a9b4466b9f 100644 --- a/src/vs/editor/test/common/model/textModel.test.ts +++ b/src/vs/editor/test/common/model/textModel.test.ts @@ -1046,6 +1046,23 @@ suite('Editor Model - TextModel', () => { assert.strictEqual(m.getValueInRange(new Range(NaN, NaN, NaN, NaN)), ''); m.dispose(); }); + + test('issue #168836: updating tabSize should also update indentSize when indentSize is set to "tabSize"', () => { + const m = createTextModel('some text', null, { + tabSize: 2, + indentSize: 'tabSize' + }); + assert.strictEqual(m.getOptions().tabSize, 2); + assert.strictEqual(m.getOptions().indentSize, 2); + assert.strictEqual(m.getOptions().originalIndentSize, 'tabSize'); + m.updateOptions({ + tabSize: 4 + }); + assert.strictEqual(m.getOptions().tabSize, 4); + assert.strictEqual(m.getOptions().indentSize, 4); + assert.strictEqual(m.getOptions().originalIndentSize, 'tabSize'); + m.dispose(); + }); }); suite('TextModel.mightContainRTL', () => { diff --git a/src/vs/editor/test/common/testTextModel.ts b/src/vs/editor/test/common/testTextModel.ts index b445b6452ed553..f513fa490ca7d4 100644 --- a/src/vs/editor/test/common/testTextModel.ts +++ b/src/vs/editor/test/common/testTextModel.ts @@ -47,7 +47,7 @@ export function withEditorModel(text: string[], callback: (model: TextModel) => export interface IRelaxedTextModelCreationOptions { tabSize?: number; - indentSize?: number; + indentSize?: number | 'tabSize'; insertSpaces?: boolean; detectIndentation?: boolean; trimAutoWhitespace?: boolean; diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 7109bbf5b2ab1a..37142520b9ac94 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -1778,6 +1778,7 @@ declare namespace monaco.editor { readonly defaultEOL: DefaultEndOfLine; readonly trimAutoWhitespace: boolean; readonly bracketPairColorizationOptions: BracketPairColorizationOptions; + get originalIndentSize(): number | 'tabSize'; } export interface BracketPairColorizationOptions { @@ -1787,7 +1788,7 @@ declare namespace monaco.editor { export interface ITextModelUpdateOptions { tabSize?: number; - indentSize?: number; + indentSize?: number | 'tabSize'; insertSpaces?: boolean; trimAutoWhitespace?: boolean; bracketColorizationOptions?: BracketPairColorizationOptions; diff --git a/src/vs/workbench/api/browser/mainThreadEditor.ts b/src/vs/workbench/api/browser/mainThreadEditor.ts index cbc28f4d953f86..b719c63d06a3a5 100644 --- a/src/vs/workbench/api/browser/mainThreadEditor.ts +++ b/src/vs/workbench/api/browser/mainThreadEditor.ts @@ -379,11 +379,7 @@ export class MainThreadTextEditor { newOpts.tabSize = newConfiguration.tabSize; } if (typeof newConfiguration.indentSize !== 'undefined') { - if (newConfiguration.indentSize === 'tabSize') { - newOpts.indentSize = newOpts.tabSize || creationOpts.tabSize; - } else { - newOpts.indentSize = newConfiguration.indentSize; - } + newOpts.indentSize = newConfiguration.indentSize; } this._model.updateOptions(newOpts); }