@@ -77,7 +77,7 @@ type InteractiveChecker internal (tcConfig, tcGlobals, tcImports, tcInitialState
77
77
let tcInitialEnv = GetInitialTcEnv ( assemblyName, rangeStartup, tcConfig, tcImports, tcGlobals)
78
78
let tcInitialState = GetInitialTcState ( rangeStartup, assemblyName, tcConfig, tcGlobals, tcImports, niceNameGen, tcInitialEnv)
79
79
80
- let reactorOps =
80
+ let reactorOps =
81
81
{ new IReactorOperations with
82
82
member __.EnqueueAndAwaitOpAsync ( userOpName , opName , opArg , op ) =
83
83
async.Return ( Cancellable.runWithoutCancellation ( op ctok))
@@ -115,11 +115,11 @@ type InteractiveChecker internal (tcConfig, tcGlobals, tcImports, tcInitialState
115
115
// restore all cached typecheck entries above file
116
116
cachedAbove |> Array.iter ( fun ( key , value ) -> checkCache.TryAdd( key, value) |> ignore)
117
117
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
120
120
parseCache.GetOrAdd( parseCacheKey, fun _ ->
121
121
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)
123
123
let dependencyFiles = [||] // interactions have no dependencies
124
124
FSharpParseFileResults ( parseErrors, parseTreeOpt, anyErrors, dependencyFiles) )
125
125
@@ -196,11 +196,12 @@ type InteractiveChecker internal (tcConfig, tcGlobals, tcImports, tcInitialState
196
196
/// Parses and checks the whole project, good for compilers (Fable etc.)
197
197
/// Does not retain name resolutions and symbol uses which are quite memory hungry (so no intellisense etc.).
198
198
/// 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 > ) =
200
200
// parse files
201
201
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))
204
205
205
206
// type check files
206
207
let tcState , topAttrs , tcImplFiles , _tcEnvAtEnd , _moduleNamesDict , tcErrors =
@@ -227,7 +228,7 @@ type InteractiveChecker internal (tcConfig, tcGlobals, tcImports, tcInitialState
227
228
228
229
// parse files before file
229
230
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)
231
232
let parseResults = Array.zip fileNamesBeforeFile sourcesBeforeFile |> Array.map parseFile
232
233
233
234
// type check files before file
0 commit comments