@@ -203,57 +203,27 @@ namespace ts.server {
203203 }
204204
205205 class ModuleBuilderFileInfo extends BuilderFileInfo {
206- references : ModuleBuilderFileInfo [ ] = [ ] ;
207- referencedBy : ModuleBuilderFileInfo [ ] = [ ] ;
206+ references = createSortedArray < ModuleBuilderFileInfo > ( ) ;
207+ readonly referencedBy = createSortedArray < ModuleBuilderFileInfo > ( ) ;
208208 scriptVersionForReferences : string ;
209209
210- static compareFileInfos ( lf : ModuleBuilderFileInfo , rf : ModuleBuilderFileInfo ) : number {
211- const l = lf . scriptInfo . fileName ;
212- const r = rf . scriptInfo . fileName ;
213- return ( l < r ? - 1 : ( l > r ? 1 : 0 ) ) ;
214- }
215-
216- static addToReferenceList ( array : ModuleBuilderFileInfo [ ] , fileInfo : ModuleBuilderFileInfo ) {
217- if ( array . length === 0 ) {
218- array . push ( fileInfo ) ;
219- return ;
220- }
221-
222- const insertIndex = binarySearch ( array , fileInfo , ModuleBuilderFileInfo . compareFileInfos ) ;
223- if ( insertIndex < 0 ) {
224- array . splice ( ~ insertIndex , 0 , fileInfo ) ;
225- }
226- }
227-
228- static removeFromReferenceList ( array : ModuleBuilderFileInfo [ ] , fileInfo : ModuleBuilderFileInfo ) {
229- if ( ! array || array . length === 0 ) {
230- return ;
231- }
232-
233- if ( array [ 0 ] === fileInfo ) {
234- array . splice ( 0 , 1 ) ;
235- return ;
236- }
237-
238- const removeIndex = binarySearch ( array , fileInfo , ModuleBuilderFileInfo . compareFileInfos ) ;
239- if ( removeIndex >= 0 ) {
240- array . splice ( removeIndex , 1 ) ;
241- }
210+ static compareFileInfos ( lf : ModuleBuilderFileInfo , rf : ModuleBuilderFileInfo ) : Comparison {
211+ return compareStrings ( lf . scriptInfo . fileName , rf . scriptInfo . fileName ) ;
242212 }
243213
244214 addReferencedBy ( fileInfo : ModuleBuilderFileInfo ) : void {
245- ModuleBuilderFileInfo . addToReferenceList ( this . referencedBy , fileInfo ) ;
215+ insertSorted ( this . referencedBy , fileInfo , ModuleBuilderFileInfo . compareFileInfos ) ;
246216 }
247217
248218 removeReferencedBy ( fileInfo : ModuleBuilderFileInfo ) : void {
249- ModuleBuilderFileInfo . removeFromReferenceList ( this . referencedBy , fileInfo ) ;
219+ removeSorted ( this . referencedBy , fileInfo , ModuleBuilderFileInfo . compareFileInfos ) ;
250220 }
251221
252222 removeFileReferences ( ) {
253223 for ( const reference of this . references ) {
254224 reference . removeReferencedBy ( this ) ;
255225 }
256- this . references = [ ] ;
226+ this . references = createSortedArray < ModuleBuilderFileInfo > ( ) ;
257227 }
258228 }
259229
@@ -270,16 +240,13 @@ namespace ts.server {
270240 super . clear ( ) ;
271241 }
272242
273- private getReferencedFileInfos ( fileInfo : ModuleBuilderFileInfo ) : ModuleBuilderFileInfo [ ] {
243+ private getReferencedFileInfos ( fileInfo : ModuleBuilderFileInfo ) : SortedArray < ModuleBuilderFileInfo > {
274244 if ( ! fileInfo . isExternalModuleOrHasOnlyAmbientExternalModules ( ) ) {
275- return [ ] ;
245+ return createSortedArray ( ) ;
276246 }
277247
278248 const referencedFilePaths = this . project . getReferencedFiles ( fileInfo . scriptInfo . path ) ;
279- if ( referencedFilePaths . length > 0 ) {
280- return map < Path , ModuleBuilderFileInfo > ( referencedFilePaths , f => this . getOrCreateFileInfo ( f ) ) . sort ( ModuleBuilderFileInfo . compareFileInfos ) ;
281- }
282- return [ ] ;
249+ return toSortedArray ( referencedFilePaths . map ( f => this . getOrCreateFileInfo ( f ) ) , ModuleBuilderFileInfo . compareFileInfos ) ;
283250 }
284251
285252 protected ensureFileInfoIfInProject ( _scriptInfo : ScriptInfo ) {
@@ -319,39 +286,15 @@ namespace ts.server {
319286
320287 const newReferences = this . getReferencedFileInfos ( fileInfo ) ;
321288 const oldReferences = fileInfo . references ;
322-
323- let oldIndex = 0 ;
324- let newIndex = 0 ;
325- while ( oldIndex < oldReferences . length && newIndex < newReferences . length ) {
326- const oldReference = oldReferences [ oldIndex ] ;
327- const newReference = newReferences [ newIndex ] ;
328- const compare = ModuleBuilderFileInfo . compareFileInfos ( oldReference , newReference ) ;
329- if ( compare < 0 ) {
289+ enumerateInsertsAndDeletes ( newReferences , oldReferences ,
290+ /*inserted*/ newReference => newReference . addReferencedBy ( fileInfo ) ,
291+ /*deleted*/ oldReference => {
330292 // New reference is greater then current reference. That means
331293 // the current reference doesn't exist anymore after parsing. So delete
332294 // references.
333295 oldReference . removeReferencedBy ( fileInfo ) ;
334- oldIndex ++ ;
335- }
336- else if ( compare > 0 ) {
337- // A new reference info. Add it.
338- newReference . addReferencedBy ( fileInfo ) ;
339- newIndex ++ ;
340- }
341- else {
342- // Equal. Go to next
343- oldIndex ++ ;
344- newIndex ++ ;
345- }
346- }
347- // Clean old references
348- for ( let i = oldIndex ; i < oldReferences . length ; i ++ ) {
349- oldReferences [ i ] . removeReferencedBy ( fileInfo ) ;
350- }
351- // Update new references
352- for ( let i = newIndex ; i < newReferences . length ; i ++ ) {
353- newReferences [ i ] . addReferencedBy ( fileInfo ) ;
354- }
296+ } ,
297+ /*compare*/ ModuleBuilderFileInfo . compareFileInfos ) ;
355298
356299 fileInfo . references = newReferences ;
357300 fileInfo . scriptVersionForReferences = fileInfo . scriptInfo . getLatestVersion ( ) ;
0 commit comments