diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index e7fef0ea146..13e766b5680 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -488,6 +488,15 @@ export class TextModel extends OrderGuaranteeEventEmitter implements editorCommo return IndentRange.deepCloneArr(indentRanges); } + private _toValidLineIndentGuide(lineNumber:number, indentGuide:number): number { + let lineIndentLevel = this._lines[lineNumber - 1].getIndentLevel(); + if (lineIndentLevel === -1) { + return indentGuide; + } + let maxIndentGuide = Math.ceil(lineIndentLevel / this._options.tabSize); + return Math.min(maxIndentGuide, indentGuide); + } + public getLineIndentGuide(lineNumber:number): number { if (lineNumber < 1 || lineNumber > this.getLineCount()) { throw new Error('Illegal value ' + lineNumber + ' for `lineNumber`'); @@ -499,10 +508,10 @@ export class TextModel extends OrderGuaranteeEventEmitter implements editorCommo let rng = indentRanges[i]; if (rng.startLineNumber === lineNumber) { - return Math.ceil(rng.indent / this._options.tabSize); + return this._toValidLineIndentGuide(lineNumber, Math.ceil(rng.indent / this._options.tabSize)); } if (rng.startLineNumber < lineNumber && lineNumber <= rng.endLineNumber) { - return 1 + Math.floor(rng.indent / this._options.tabSize); + return this._toValidLineIndentGuide(lineNumber, 1 + Math.floor(rng.indent / this._options.tabSize)); } if (rng.endLineNumber + 1 === lineNumber) { let bestIndent = rng.indent; @@ -513,7 +522,7 @@ export class TextModel extends OrderGuaranteeEventEmitter implements editorCommo bestIndent = rng.indent; } } - return Math.ceil(bestIndent / this._options.tabSize); + return this._toValidLineIndentGuide(lineNumber, Math.ceil(bestIndent / this._options.tabSize)); } } diff --git a/src/vs/editor/test/common/model/textModel.test.ts b/src/vs/editor/test/common/model/textModel.test.ts index b9ddc6462df..0dcfe908a42 100644 --- a/src/vs/editor/test/common/model/textModel.test.ts +++ b/src/vs/editor/test/common/model/textModel.test.ts @@ -721,4 +721,12 @@ suite('TextModel.getLineIndentGuide', () => { [0, '}'], ]); }); + + test('issue #12398 - Problem in indent guidelines', () => { + assertIndentGuides([ + [2, '\t\t.bla'], + [3, '\t\t\tlabel(for)'], + [0, 'include script'], + ]); + }); });