Skip to content

Commit 67fbbe4

Browse files
committed
Move getLineTokens into IEncodedTokens
1 parent 153a1ba commit 67fbbe4

1 file changed

Lines changed: 42 additions & 66 deletions

File tree

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

Lines changed: 42 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,8 @@ export class MultilineTokensBuilder {
125125
}
126126

127127
export interface IEncodedTokens {
128-
getTokenCount(): number;
129-
getDeltaLine(tokenIndex: number): number;
130128
getMaxDeltaLine(): number;
131-
getStartCharacter(tokenIndex: number): number;
132-
getEndCharacter(tokenIndex: number): number;
133-
getMetadata(tokenIndex: number): number;
129+
getLineTokens(deltaLine: number): LineTokens2 | null;
134130

135131
clear(): void;
136132
acceptDeleteRange(horizontalShiftForFirstLineTokens: number, startDeltaLine: number, startCharacter: number, endDeltaLine: number, endCharacter: number): void;
@@ -145,7 +141,7 @@ export class SparseEncodedTokens implements IEncodedTokens {
145141
* 4*i+2 endCharacter (from the line start)
146142
* 4*i+3 metadata
147143
*/
148-
private _tokens: Uint32Array;
144+
private readonly _tokens: Uint32Array;
149145
private _tokenCount: number;
150146

151147
constructor(tokens: Uint32Array) {
@@ -154,31 +150,51 @@ export class SparseEncodedTokens implements IEncodedTokens {
154150
}
155151

156152
public getMaxDeltaLine(): number {
157-
const tokenCount = this.getTokenCount();
153+
const tokenCount = this._getTokenCount();
158154
if (tokenCount === 0) {
159155
return -1;
160156
}
161-
return this.getDeltaLine(tokenCount - 1);
157+
return this._getDeltaLine(tokenCount - 1);
162158
}
163159

164-
public getTokenCount(): number {
160+
private _getTokenCount(): number {
165161
return this._tokenCount;
166162
}
167163

168-
public getDeltaLine(tokenIndex: number): number {
164+
private _getDeltaLine(tokenIndex: number): number {
169165
return this._tokens[4 * tokenIndex];
170166
}
171167

172-
public getStartCharacter(tokenIndex: number): number {
173-
return this._tokens[4 * tokenIndex + 1];
174-
}
168+
public getLineTokens(deltaLine: number): LineTokens2 | null {
169+
let low = 0;
170+
let high = this._getTokenCount() - 1;
175171

176-
public getEndCharacter(tokenIndex: number): number {
177-
return this._tokens[4 * tokenIndex + 2];
178-
}
172+
while (low < high) {
173+
const mid = low + Math.floor((high - low) / 2);
174+
const midDeltaLine = this._getDeltaLine(mid);
179175

180-
public getMetadata(tokenIndex: number): number {
181-
return this._tokens[4 * tokenIndex + 3];
176+
if (midDeltaLine < deltaLine) {
177+
low = mid + 1;
178+
} else if (midDeltaLine > deltaLine) {
179+
high = mid - 1;
180+
} else {
181+
let min = mid;
182+
while (min > low && this._getDeltaLine(min - 1) === deltaLine) {
183+
min--;
184+
}
185+
let max = mid;
186+
while (max < high && this._getDeltaLine(max + 1) === deltaLine) {
187+
max++;
188+
}
189+
return new LineTokens2(this._tokens.subarray(4 * min, 4 * max + 4));
190+
}
191+
}
192+
193+
if (this._getDeltaLine(low) === deltaLine) {
194+
return new LineTokens2(this._tokens.subarray(4 * low, 4 * low + 4));
195+
}
196+
197+
return null;
182198
}
183199

184200
public clear(): void {
@@ -414,30 +430,26 @@ export class SparseEncodedTokens implements IEncodedTokens {
414430

415431
export class LineTokens2 {
416432

417-
private readonly _actual: IEncodedTokens;
418-
private readonly _startTokenIndex: number;
419-
private readonly _endTokenIndex: number;
433+
private readonly _tokens: Uint32Array;
420434

421-
constructor(actual: IEncodedTokens, startTokenIndex: number, endTokenIndex: number) {
422-
this._actual = actual;
423-
this._startTokenIndex = startTokenIndex;
424-
this._endTokenIndex = endTokenIndex;
435+
constructor(tokens: Uint32Array) {
436+
this._tokens = tokens;
425437
}
426438

427439
public getCount(): number {
428-
return this._endTokenIndex - this._startTokenIndex + 1;
440+
return this._tokens.length / 4;
429441
}
430442

431443
public getStartCharacter(tokenIndex: number): number {
432-
return this._actual.getStartCharacter(this._startTokenIndex + tokenIndex);
444+
return this._tokens[4 * tokenIndex + 1];
433445
}
434446

435447
public getEndCharacter(tokenIndex: number): number {
436-
return this._actual.getEndCharacter(this._startTokenIndex + tokenIndex);
448+
return this._tokens[4 * tokenIndex + 2];
437449
}
438450

439451
public getMetadata(tokenIndex: number): number {
440-
return this._actual.getMetadata(this._startTokenIndex + tokenIndex);
452+
return this._tokens[4 * tokenIndex + 3];
441453
}
442454
}
443455

@@ -459,47 +471,11 @@ export class MultilineTokens2 {
459471

460472
public getLineTokens(lineNumber: number): LineTokens2 | null {
461473
if (this.startLineNumber <= lineNumber && lineNumber <= this.endLineNumber) {
462-
const findResult = MultilineTokens2._findTokensWithLine(this.tokens, lineNumber - this.startLineNumber);
463-
if (findResult) {
464-
const [startTokenIndex, endTokenIndex] = findResult;
465-
return new LineTokens2(this.tokens, startTokenIndex, endTokenIndex);
466-
}
474+
return this.tokens.getLineTokens(lineNumber - this.startLineNumber);
467475
}
468476
return null;
469477
}
470478

471-
private static _findTokensWithLine(tokens: IEncodedTokens, deltaLine: number): [number, number] | null {
472-
let low = 0;
473-
let high = tokens.getTokenCount() - 1;
474-
475-
while (low < high) {
476-
const mid = low + Math.floor((high - low) / 2);
477-
const midDeltaLine = tokens.getDeltaLine(mid);
478-
479-
if (midDeltaLine < deltaLine) {
480-
low = mid + 1;
481-
} else if (midDeltaLine > deltaLine) {
482-
high = mid - 1;
483-
} else {
484-
let min = mid;
485-
while (min > low && tokens.getDeltaLine(min - 1) === deltaLine) {
486-
min--;
487-
}
488-
let max = mid;
489-
while (max < high && tokens.getDeltaLine(max + 1) === deltaLine) {
490-
max++;
491-
}
492-
return [min, max];
493-
}
494-
}
495-
496-
if (tokens.getDeltaLine(low) === deltaLine) {
497-
return [low, low];
498-
}
499-
500-
return null;
501-
}
502-
503479
public applyEdit(range: IRange, text: string): void {
504480
const [eolCount, firstLineLength, lastLineLength] = countEOL(text);
505481
this.acceptEdit(range, eolCount, firstLineLength, lastLineLength, text.length > 0 ? text.charCodeAt(0) : CharCode.Null);

0 commit comments

Comments
 (0)