@@ -131,6 +131,7 @@ export function createCompiler(configs: ConfigSet): TsCompiler {
131
131
...serviceHostDebugCtx ,
132
132
[ LogContexts . logLevel ] : LogLevels . trace ,
133
133
}
134
+
134
135
const serviceHost = {
135
136
getScriptFileNames : ( ) => Object . keys ( memoryCache . versions ) ,
136
137
getScriptVersion : ( fileName : string ) => {
@@ -157,12 +158,12 @@ export function createCompiler(configs: ConfigSet): TsCompiler {
157
158
}
158
159
return ts . ScriptSnapshot . fromString ( contents )
159
160
} ,
160
- fileExists : ts . sys . fileExists ,
161
- readFile : logger . wrap ( serviceHostTraceCtx , 'readFile' , ts . sys . readFile ) ,
162
- readDirectory : ts . sys . readDirectory ,
163
- getDirectories : ts . sys . getDirectories ,
164
- directoryExists : ts . sys . directoryExists ,
165
- realpath : ts . sys . realpath ,
161
+ fileExists : memoize ( ts . sys . fileExists ) ,
162
+ readFile : logger . wrap ( serviceHostTraceCtx , 'readFile' , memoize ( ts . sys . readFile ) ) ,
163
+ readDirectory : memoize ( ts . sys . readDirectory ) ,
164
+ getDirectories : memoize ( ts . sys . getDirectories ) ,
165
+ directoryExists : memoize ( ts . sys . directoryExists ) ,
166
+ realpath : memoize ( ts . sys . realpath ! ) ,
166
167
getNewLine : ( ) => '\n' ,
167
168
getCurrentDirectory : ( ) => cwd ,
168
169
getCompilationSettings : ( ) => compilerOptions ,
@@ -225,6 +226,22 @@ export function createCompiler(configs: ConfigSet): TsCompiler {
225
226
return { cwd, compile, getTypeInfo, extensions, cachedir, ts }
226
227
}
227
228
229
+ type AnyFn = ( ...args : any [ ] ) => any
230
+ function memoize < T extends AnyFn = AnyFn > ( fn : T ) : T {
231
+ const cache = new Map ( )
232
+
233
+ return ( ( arg : string ) => {
234
+ const entry = cache . get ( arg )
235
+ if ( entry !== undefined ) {
236
+ return entry
237
+ }
238
+
239
+ const res = fn ( arg )
240
+ cache . set ( arg , res )
241
+ return res
242
+ } ) as T
243
+ }
244
+
228
245
/**
229
246
* Internal source output.
230
247
*/
0 commit comments