@@ -125,12 +125,8 @@ export class MultilineTokensBuilder {
125125}
126126
127127export 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
415431export 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