Skip to content

Commit 58b39d7

Browse files
committed
Move indent ranges to ITokenizedModel
1 parent 250d71b commit 58b39d7

6 files changed

Lines changed: 257 additions & 253 deletions

File tree

src/vs/editor/common/editorCommon.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -585,20 +585,6 @@ export interface ITextModel {
585585
*/
586586
getLineContent(lineNumber: number): string;
587587

588-
/**
589-
* @internal
590-
*/
591-
getIndentLevel(lineNumber: number): number;
592-
593-
/**
594-
* @internal
595-
*/
596-
getIndentRanges(): IndentRange[];
597-
598-
/**
599-
* @internal
600-
*/
601-
getLineIndentGuide(lineNumber: number): number;
602588

603589
/**
604590
* Get the text for all lines.
@@ -912,6 +898,21 @@ export interface ITokenizedModel extends ITextModel {
912898
* @internal
913899
*/
914900
matchBracket(position: IPosition): [Range, Range];
901+
902+
/**
903+
* @internal
904+
*/
905+
getIndentLevel(lineNumber: number): number;
906+
907+
/**
908+
* @internal
909+
*/
910+
getIndentRanges(): IndentRange[];
911+
912+
/**
913+
* @internal
914+
*/
915+
getLineIndentGuide(lineNumber: number): number;
915916
}
916917

917918
/**

src/vs/editor/common/model/indentRanges.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
'use strict';
77

8-
import { ITextModel } from 'vs/editor/common/editorCommon';
8+
import { ITokenizedModel } from 'vs/editor/common/editorCommon';
99

1010
export class IndentRange {
1111
_indentRangeBrand: void;
@@ -29,7 +29,7 @@ export class IndentRange {
2929
}
3030
}
3131

32-
export function computeRanges(model: ITextModel, minimumRangeSize: number = 1): IndentRange[] {
32+
export function computeRanges(model: ITokenizedModel, minimumRangeSize: number = 1): IndentRange[] {
3333

3434
let result: IndentRange[] = [];
3535

src/vs/editor/common/model/textModel.ts

Lines changed: 0 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import { ModelLine, IModelLine, MinimalModelLine } from 'vs/editor/common/model/
1313
import { guessIndentation } from 'vs/editor/common/model/indentationGuesser';
1414
import { EDITOR_MODEL_DEFAULTS } from 'vs/editor/common/config/editorOptions';
1515
import { PrefixSumComputer } from 'vs/editor/common/viewModel/prefixSumComputer';
16-
import { IndentRange, computeRanges } from 'vs/editor/common/model/indentRanges';
1716
import { TextModelSearch, SearchParams } from 'vs/editor/common/model/textModelSearch';
1817
import { TextSource, ITextSource, IRawTextSource, RawTextSource } from 'vs/editor/common/model/textSource';
1918
import { IDisposable } from 'vs/base/common/lifecycle';
@@ -85,7 +84,6 @@ export class TextModel implements editorCommon.ITextModel {
8584
protected _isDisposing: boolean;
8685
protected _options: editorCommon.TextModelResolvedOptions;
8786
protected _lineStarts: PrefixSumComputer;
88-
private _indentRanges: IndentRange[];
8987

9088
private _versionId: number;
9189
/**
@@ -513,65 +511,6 @@ export class TextModel implements editorCommon.ITextModel {
513511
return this._lines[lineNumber - 1].getIndentLevel();
514512
}
515513

516-
protected _resetIndentRanges(): void {
517-
this._indentRanges = null;
518-
}
519-
520-
private _getIndentRanges(): IndentRange[] {
521-
if (!this._indentRanges) {
522-
this._indentRanges = computeRanges(this);
523-
}
524-
return this._indentRanges;
525-
}
526-
527-
public getIndentRanges(): IndentRange[] {
528-
this._assertNotDisposed();
529-
let indentRanges = this._getIndentRanges();
530-
return IndentRange.deepCloneArr(indentRanges);
531-
}
532-
533-
private _toValidLineIndentGuide(lineNumber: number, indentGuide: number): number {
534-
let lineIndentLevel = this._lines[lineNumber - 1].getIndentLevel();
535-
if (lineIndentLevel === -1) {
536-
return indentGuide;
537-
}
538-
let maxIndentGuide = Math.ceil(lineIndentLevel / this._options.tabSize);
539-
return Math.min(maxIndentGuide, indentGuide);
540-
}
541-
542-
public getLineIndentGuide(lineNumber: number): number {
543-
this._assertNotDisposed();
544-
if (lineNumber < 1 || lineNumber > this.getLineCount()) {
545-
throw new Error('Illegal value ' + lineNumber + ' for `lineNumber`');
546-
}
547-
548-
let indentRanges = this._getIndentRanges();
549-
550-
for (let i = indentRanges.length - 1; i >= 0; i--) {
551-
let rng = indentRanges[i];
552-
553-
if (rng.startLineNumber === lineNumber) {
554-
return this._toValidLineIndentGuide(lineNumber, Math.ceil(rng.indent / this._options.tabSize));
555-
}
556-
if (rng.startLineNumber < lineNumber && lineNumber <= rng.endLineNumber) {
557-
return this._toValidLineIndentGuide(lineNumber, 1 + Math.floor(rng.indent / this._options.tabSize));
558-
}
559-
if (rng.endLineNumber + 1 === lineNumber) {
560-
let bestIndent = rng.indent;
561-
while (i > 0) {
562-
i--;
563-
rng = indentRanges[i];
564-
if (rng.endLineNumber + 1 === lineNumber) {
565-
bestIndent = rng.indent;
566-
}
567-
}
568-
return this._toValidLineIndentGuide(lineNumber, Math.ceil(bestIndent / this._options.tabSize));
569-
}
570-
}
571-
572-
return 0;
573-
}
574-
575514
public getLinesContent(): string[] {
576515
this._assertNotDisposed();
577516
var r: string[] = [];
@@ -785,7 +724,6 @@ export class TextModel implements editorCommon.ITextModel {
785724
this._EOL = textSource.EOL;
786725
this._lines = modelLines;
787726
this._lineStarts = null;
788-
this._resetIndentRanges();
789727
}
790728

791729
private _getEndOfLine(eol: editorCommon.EndOfLinePreference): string {

src/vs/editor/common/model/textModelWithTokens.ts

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { getWordAtText } from 'vs/editor/common/model/wordHelper';
2222
import { TokenizationResult2 } from 'vs/editor/common/core/token';
2323
import { ITextSource, IRawTextSource } from 'vs/editor/common/model/textSource';
2424
import * as textModelEvents from 'vs/editor/common/model/textModelEvents';
25+
import { IndentRange, computeRanges } from 'vs/editor/common/model/indentRanges';
2526

2627
class ModelTokensChangedEventBuilder {
2728

@@ -69,6 +70,8 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke
6970
private _invalidLineStartIndex: number;
7071
private _lastState: IState;
7172

73+
private _indentRanges: IndentRange[];
74+
7275
private _revalidateTokensTimeout: number;
7376

7477
constructor(rawTextSource: IRawTextSource, creationOptions: editorCommon.ITextModelCreationOptions, languageIdentifier: LanguageIdentifier) {
@@ -96,6 +99,7 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke
9699
this._revalidateTokensTimeout = -1;
97100

98101
this._resetTokenizationState();
102+
this._resetIndentRanges();
99103
}
100104

101105
public dispose(): void {
@@ -114,6 +118,7 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke
114118
super._resetValue(newValue);
115119
// Cancel tokenization, clear all tokens and begin tokenizing
116120
this._resetTokenizationState();
121+
this._resetIndentRanges();
117122
}
118123

119124
protected _resetTokenizationState(): void {
@@ -225,6 +230,7 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke
225230

226231
// Cancel tokenization, clear all tokens and begin tokenizing
227232
this._resetTokenizationState();
233+
this._resetIndentRanges();
228234

229235
this.emitModelTokensChangedEvent({
230236
ranges: [{
@@ -814,4 +820,63 @@ export class TextModelWithTokens extends TextModel implements editorCommon.IToke
814820
isOpen: modeBrackets.textIsOpenBracket[text]
815821
};
816822
}
823+
824+
protected _resetIndentRanges(): void {
825+
this._indentRanges = null;
826+
}
827+
828+
private _getIndentRanges(): IndentRange[] {
829+
if (!this._indentRanges) {
830+
this._indentRanges = computeRanges(this);
831+
}
832+
return this._indentRanges;
833+
}
834+
835+
public getIndentRanges(): IndentRange[] {
836+
this._assertNotDisposed();
837+
let indentRanges = this._getIndentRanges();
838+
return IndentRange.deepCloneArr(indentRanges);
839+
}
840+
841+
public getLineIndentGuide(lineNumber: number): number {
842+
this._assertNotDisposed();
843+
if (lineNumber < 1 || lineNumber > this.getLineCount()) {
844+
throw new Error('Illegal value ' + lineNumber + ' for `lineNumber`');
845+
}
846+
847+
let indentRanges = this._getIndentRanges();
848+
849+
for (let i = indentRanges.length - 1; i >= 0; i--) {
850+
let rng = indentRanges[i];
851+
852+
if (rng.startLineNumber === lineNumber) {
853+
return this._toValidLineIndentGuide(lineNumber, Math.ceil(rng.indent / this._options.tabSize));
854+
}
855+
if (rng.startLineNumber < lineNumber && lineNumber <= rng.endLineNumber) {
856+
return this._toValidLineIndentGuide(lineNumber, 1 + Math.floor(rng.indent / this._options.tabSize));
857+
}
858+
if (rng.endLineNumber + 1 === lineNumber) {
859+
let bestIndent = rng.indent;
860+
while (i > 0) {
861+
i--;
862+
rng = indentRanges[i];
863+
if (rng.endLineNumber + 1 === lineNumber) {
864+
bestIndent = rng.indent;
865+
}
866+
}
867+
return this._toValidLineIndentGuide(lineNumber, Math.ceil(bestIndent / this._options.tabSize));
868+
}
869+
}
870+
871+
return 0;
872+
}
873+
874+
private _toValidLineIndentGuide(lineNumber: number, indentGuide: number): number {
875+
let lineIndentLevel = this._lines[lineNumber - 1].getIndentLevel();
876+
if (lineIndentLevel === -1) {
877+
return indentGuide;
878+
}
879+
let maxIndentGuide = Math.ceil(lineIndentLevel / this._options.tabSize);
880+
return Math.min(maxIndentGuide, indentGuide);
881+
}
817882
}

0 commit comments

Comments
 (0)