@@ -93,6 +93,12 @@ namespace ts {
93
93
reportStats ( ) : string ;
94
94
}
95
95
96
+ /*@internal */
97
+ export interface ExternalDocumentCache {
98
+ setDocument ( key : DocumentRegistryBucketKey , path : Path , sourceFile : SourceFile ) : void ;
99
+ getDocument ( key : DocumentRegistryBucketKey , path : Path ) : SourceFile | undefined ;
100
+ }
101
+
96
102
export type DocumentRegistryBucketKey = string & { __bucketKey : any } ;
97
103
98
104
interface DocumentRegistryEntry {
@@ -102,10 +108,14 @@ namespace ts {
102
108
// language services are referencing the file, then the file can be removed from the
103
109
// registry.
104
110
languageServiceRefCount : number ;
105
- owners : string [ ] ;
106
111
}
107
112
108
- export function createDocumentRegistry ( useCaseSensitiveFileNames ?: boolean , currentDirectory = "" ) : DocumentRegistry {
113
+ export function createDocumentRegistry ( useCaseSensitiveFileNames ?: boolean , currentDirectory ?: string ) : DocumentRegistry {
114
+ return createDocumentRegistryInternal ( useCaseSensitiveFileNames , currentDirectory ) ;
115
+ }
116
+
117
+ /*@internal */
118
+ export function createDocumentRegistryInternal ( useCaseSensitiveFileNames ?: boolean , currentDirectory = "" , externalCache ?: ExternalDocumentCache ) : DocumentRegistry {
109
119
// Maps from compiler setting target (ES3, ES5, etc.) to all the cached documents we have
110
120
// for those settings.
111
121
const buckets = createMap < Map < DocumentRegistryEntry > > ( ) ;
@@ -126,12 +136,11 @@ namespace ts {
126
136
function reportStats ( ) {
127
137
const bucketInfoArray = arrayFrom ( buckets . keys ( ) ) . filter ( name => name && name . charAt ( 0 ) === "_" ) . map ( name => {
128
138
const entries = buckets . get ( name ) ;
129
- const sourceFiles : { name : string ; refCount : number ; references : string [ ] ; } [ ] = [ ] ;
139
+ const sourceFiles : { name : string ; refCount : number ; } [ ] = [ ] ;
130
140
entries . forEach ( ( entry , name ) => {
131
141
sourceFiles . push ( {
132
142
name,
133
- refCount : entry . languageServiceRefCount ,
134
- references : entry . owners . slice ( 0 )
143
+ refCount : entry . languageServiceRefCount
135
144
} ) ;
136
145
} ) ;
137
146
sourceFiles . sort ( ( x , y ) => y . refCount - x . refCount ) ;
@@ -176,14 +185,26 @@ namespace ts {
176
185
const bucket = getBucketForCompilationSettings ( key , /*createIfMissing*/ true ) ;
177
186
let entry = bucket . get ( path ) ;
178
187
const scriptTarget = scriptKind === ScriptKind . JSON ? ScriptTarget . JSON : compilationSettings . target ;
188
+ if ( ! entry && externalCache ) {
189
+ const sourceFile = externalCache . getDocument ( key , path ) ;
190
+ if ( sourceFile ) {
191
+ entry = {
192
+ sourceFile,
193
+ languageServiceRefCount : 1
194
+ } ;
195
+ bucket . set ( path , entry ) ;
196
+ }
197
+ }
198
+
179
199
if ( ! entry ) {
180
200
// Have never seen this file with these settings. Create a new source file for it.
181
201
const sourceFile = createLanguageServiceSourceFile ( fileName , scriptSnapshot , scriptTarget , version , /*setNodeParents*/ false , scriptKind ) ;
182
-
202
+ if ( externalCache ) {
203
+ externalCache . setDocument ( key , path , sourceFile ) ;
204
+ }
183
205
entry = {
184
206
sourceFile,
185
207
languageServiceRefCount : 1 ,
186
- owners : [ ]
187
208
} ;
188
209
bucket . set ( path , entry ) ;
189
210
}
@@ -194,6 +215,9 @@ namespace ts {
194
215
if ( entry . sourceFile . version !== version ) {
195
216
entry . sourceFile = updateLanguageServiceSourceFile ( entry . sourceFile , scriptSnapshot , version ,
196
217
scriptSnapshot . getChangeRange ( entry . sourceFile . scriptSnapshot ) ) ;
218
+ if ( externalCache ) {
219
+ externalCache . setDocument ( key , path , entry . sourceFile ) ;
220
+ }
197
221
}
198
222
199
223
// If we're acquiring, then this is the first time this LS is asking for this document.
0 commit comments