@@ -77,7 +77,7 @@ type InteractiveChecker internal (tcConfig, tcGlobals, tcImports, tcInitialState
7777 let tcInitialEnv = GetInitialTcEnv ( assemblyName, rangeStartup, tcConfig, tcImports, tcGlobals)
7878 let tcInitialState = GetInitialTcState ( rangeStartup, assemblyName, tcConfig, tcGlobals, tcImports, niceNameGen, tcInitialEnv)
7979
80- let reactorOps =
80+ let reactorOps =
8181 { new IReactorOperations with
8282 member __.EnqueueAndAwaitOpAsync ( userOpName , opName , opArg , op ) =
8383 async.Return ( Cancellable.runWithoutCancellation ( op ctok))
@@ -115,11 +115,11 @@ type InteractiveChecker internal (tcConfig, tcGlobals, tcImports, tcInitialState
115115 // restore all cached typecheck entries above file
116116 cachedAbove |> Array.iter ( fun ( key , value ) -> checkCache.TryAdd( key, value) |> ignore)
117117
118- member private x.ParseFile ( fileName : string , source : string , parsingOptions : FSharpParsingOptions ) =
119- let parseCacheKey = fileName, hash source
118+ member private x.ParseFile ( fileName : string , sourceHash : int , source : Lazy < string > , parsingOptions : FSharpParsingOptions ) =
119+ let parseCacheKey = fileName, sourceHash
120120 parseCache.GetOrAdd( parseCacheKey, fun _ ->
121121 x.ClearStaleCache( fileName, parsingOptions)
122- let parseErrors , parseTreeOpt , anyErrors = Parser.parseFile ( source, fileName, parsingOptions, userOpName)
122+ let parseErrors , parseTreeOpt , anyErrors = Parser.parseFile ( source.Value , fileName, parsingOptions, userOpName)
123123 let dependencyFiles = [||] // interactions have no dependencies
124124 FSharpParseFileResults ( parseErrors, parseTreeOpt, anyErrors, dependencyFiles) )
125125
@@ -196,11 +196,12 @@ type InteractiveChecker internal (tcConfig, tcGlobals, tcImports, tcInitialState
196196 /// Parses and checks the whole project, good for compilers (Fable etc.)
197197 /// Does not retain name resolutions and symbol uses which are quite memory hungry (so no intellisense etc.).
198198 /// Already parsed files will be cached so subsequent compilations will be faster.
199- member x.ParseAndCheckProject ( projectFileName : string , fileNames : string [], sources : string [] ) =
199+ member x.ParseAndCheckProject ( projectFileName : string , fileNames : string [], sourceReader : string -> int * Lazy < string > ) =
200200 // parse files
201201 let parsingOptions = FSharpParsingOptions.FromTcConfig( tcConfig, fileNames, false )
202- let parseFile ( fileName , source ) = x.ParseFile ( fileName, source, parsingOptions)
203- let parseResults = Array.zip fileNames sources |> Array.map parseFile
202+ let parseResults = fileNames |> Array.map ( fun fileName ->
203+ let sourceHash , source = sourceReader fileName
204+ x.ParseFile( fileName, sourceHash, source, parsingOptions))
204205
205206 // type check files
206207 let tcState , topAttrs , tcImplFiles , _tcEnvAtEnd , _moduleNamesDict , tcErrors =
@@ -227,7 +228,7 @@ type InteractiveChecker internal (tcConfig, tcGlobals, tcImports, tcInitialState
227228
228229 // parse files before file
229230 let parsingOptions = FSharpParsingOptions.FromTcConfig( tcConfig, fileNames, false )
230- let parseFile ( fileName , source ) = x.ParseFile ( fileName, source, parsingOptions)
231+ let parseFile ( fileName , source ) = x.ParseFile ( fileName, hash source , lazy source, parsingOptions)
231232 let parseResults = Array.zip fileNamesBeforeFile sourcesBeforeFile |> Array.map parseFile
232233
233234 // type check files before file
0 commit comments