@@ -131,6 +131,7 @@ export function createCompiler(configs: ConfigSet): TsCompiler {
131131 ...serviceHostDebugCtx ,
132132 [ LogContexts . logLevel ] : LogLevels . trace ,
133133 }
134+
134135 const serviceHost = {
135136 getScriptFileNames : ( ) => Object . keys ( memoryCache . versions ) ,
136137 getScriptVersion : ( fileName : string ) => {
@@ -157,12 +158,12 @@ export function createCompiler(configs: ConfigSet): TsCompiler {
157158 }
158159 return ts . ScriptSnapshot . fromString ( contents )
159160 } ,
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 ! ) ,
166167 getNewLine : ( ) => '\n' ,
167168 getCurrentDirectory : ( ) => cwd ,
168169 getCompilationSettings : ( ) => compilerOptions ,
@@ -225,6 +226,22 @@ export function createCompiler(configs: ConfigSet): TsCompiler {
225226 return { cwd, compile, getTypeInfo, extensions, cachedir, ts }
226227}
227228
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+
228245/**
229246 * Internal source output.
230247 */
0 commit comments