@@ -1211,11 +1211,14 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput
12111211 keepAssemblyContents, keepAllBackgroundResolutions, maxTimeShareMilliseconds) =
12121212
12131213 let tcConfigP = TcConfigProvider.Constant tcConfig
1214- let importsInvalidated = new Event< string>()
12151214 let fileParsed = new Event< string>()
12161215 let beforeFileChecked = new Event< string>()
12171216 let fileChecked = new Event< string>()
12181217 let projectChecked = new Event< unit>()
1218+ #if ! NO_ EXTENSIONTYPING
1219+ let importsInvalidatedByTypeProvider = new Event< string>()
1220+ #endif
1221+ let mutable currentTcImportsOpt = None
12191222
12201223 // Check for the existence of loaded sources and prepend them to the sources list if present.
12211224 let sourceFiles = tcConfig.GetAvailableLoadedSources() @ ( sourceFiles |> List.map ( fun s -> rangeStartup, s))
@@ -1242,42 +1245,19 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput
12421245 for (_, f, _) in sourceFiles do
12431246 yield f |]
12441247
1245- // The IncrementalBuilder needs to hold up to one item that needs to be disposed, which is the tcImports for the incremental
1246- // build.
1247- let mutable cleanupItem = None: TcImports option
1248- let disposeCleanupItem () =
1249- match cleanupItem with
1250- | None -> ()
1251- | Some item ->
1252- cleanupItem <- None
1253- dispose item
1254-
1255- let setCleanupItem x =
1256- assert cleanupItem.IsNone
1257- cleanupItem <- Some x
1258-
1259- let mutable disposed = false
1260- let assertNotDisposed () =
1261- if disposed then
1262- System.Diagnostics.Debug.Assert( false , " IncrementalBuild object has already been disposed!" )
1263-
1264- let mutable referenceCount = 0
1265-
12661248 //----------------------------------------------------
12671249 // START OF BUILD TASK FUNCTIONS
12681250
12691251 /// This is a build task function that gets placed into the build rules as the computation for a VectorStamp
12701252 ///
12711253 /// Get the timestamp of the given file name.
12721254 let StampFileNameTask ( cache : TimeStampCache ) _ctok ( _m : range , filename : string , _isLastCompiland ) =
1273- assertNotDisposed()
12741255 cache.GetFileTimeStamp filename
12751256
12761257 /// This is a build task function that gets placed into the build rules as the computation for a VectorMap
12771258 ///
12781259 /// Parse the given file and return the given input.
12791260 let ParseTask ctok ( sourceRange : range , filename : string , isLastCompiland ) =
1280- assertNotDisposed()
12811261 DoesNotRequireCompilerThreadTokenAndCouldPossiblyBeMadeConcurrent ctok
12821262
12831263 let errorLogger = CompilationErrorLogger( " ParseTask" , tcConfig.errorSeverityOptions)
@@ -1300,7 +1280,6 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput
13001280 ///
13011281 /// Timestamps of referenced assemblies are taken from the file's timestamp.
13021282 let StampReferencedAssemblyTask ( cache : TimeStampCache ) ctok ( _ref , timeStamper ) =
1303- assertNotDisposed()
13041283 timeStamper cache ctok
13051284
13061285
@@ -1309,18 +1288,13 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput
13091288 // Link all the assemblies together and produce the input typecheck accumulator
13101289 let CombineImportedAssembliesTask ctok _ : Cancellable < TypeCheckAccumulator > =
13111290 cancellable {
1312- assertNotDisposed()
13131291 let errorLogger = CompilationErrorLogger( " CombineImportedAssembliesTask" , tcConfig.errorSeverityOptions)
13141292 // Return the disposable object that cleans up
13151293 use _holder = new CompilationGlobalsScope( errorLogger, BuildPhase.Parameter)
13161294
13171295 let! tcImports =
13181296 cancellable {
13191297 try
1320- // We dispose any previous tcImports, for the case where a dependency changed which caused this part
1321- // of the partial build to be re-evaluated.
1322- disposeCleanupItem()
1323-
13241298 let! tcImports = TcImports.BuildNonFrameworkTcImports( ctok, tcConfigP, tcGlobals, frameworkTcImports, nonFrameworkResolutions, unresolvedReferences)
13251299#if ! NO_ EXTENSIONTYPING
13261300 tcImports.GetCcusExcludingBase() |> Seq.iter ( fun ccu ->
@@ -1338,19 +1312,13 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput
13381312 //
13391313 // In the invalidation handler we use a weak reference to allow the IncrementalBuilder to
13401314 // be collected if, for some reason, a TP instance is not disposed or not GC'd.
1341- let capturedImportsInvalidated = WeakReference<_>( importsInvalidated )
1315+ let capturedImportsInvalidated = WeakReference<_>( importsInvalidatedByTypeProvider )
13421316 ccu.Deref.InvalidateEvent.Add( fun msg ->
13431317 match capturedImportsInvalidated.TryGetTarget() with
13441318 | true , tg -> tg.Trigger msg
1345- | _ -> ()))
1319+ | _ -> ()))
13461320#endif
1347-
1348-
1349- // The tcImports must be cleaned up if this builder ever gets disposed. We also dispose any previous
1350- // tcImports should we be re-creating an entry because a dependency changed which caused this part
1351- // of the partial build to be re-evaluated.
1352- setCleanupItem tcImports
1353-
1321+ currentTcImportsOpt <- Some tcImports
13541322 return tcImports
13551323 with e ->
13561324 System.Diagnostics.Debug.Assert( false , sprintf " Could not BuildAllReferencedDllTcImports %A " e)
@@ -1390,7 +1358,6 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput
13901358 ///
13911359 /// Type check all files.
13921360 let TypeCheckTask ctok ( tcAcc : TypeCheckAccumulator ) input : Eventually < TypeCheckAccumulator > =
1393- assertNotDisposed()
13941361 match input with
13951362 | Some input, _ sourceRange, filename, parseErrors->
13961363 IncrementalBuilderEventTesting.MRU.Add( IncrementalBuilderEventTesting.IBETypechecked filename)
@@ -1462,7 +1429,6 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput
14621429 /// Finish up the typechecking to produce outputs for the rest of the compilation process
14631430 let FinalizeTypeCheckTask ctok ( tcStates : TypeCheckAccumulator []) =
14641431 cancellable {
1465- assertNotDisposed()
14661432 DoesNotRequireCompilerThreadTokenAndCouldPossiblyBeMadeConcurrent ctok
14671433
14681434 let errorLogger = CompilationErrorLogger( " CombineImportedAssembliesTask" , tcConfig.errorSeverityOptions)
@@ -1581,21 +1547,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput
15811547 partialBuild <- b
15821548
15831549 let MaxTimeStampInDependencies cache ( ctok : CompilationThreadToken ) ( output : INode ) =
1584- IncrementalBuild.MaxTimeStampInDependencies cache ctok output.Name partialBuild
1585-
1586- member this.IncrementUsageCount () =
1587- assertNotDisposed()
1588- System.Threading.Interlocked.Increment(& referenceCount) |> ignore
1589- { new System.IDisposable with member __.Dispose () = this.DecrementUsageCount() }
1590-
1591- member __.DecrementUsageCount () =
1592- assertNotDisposed()
1593- let currentValue = System.Threading.Interlocked.Decrement(& referenceCount)
1594- if currentValue = 0 then
1595- disposed <- true
1596- disposeCleanupItem()
1597-
1598- member __.IsAlive = referenceCount > 0
1550+ IncrementalBuild.MaxTimeStampInDependencies cache ctok output.Name partialBuild
15991551
16001552 member __.TcConfig = tcConfig
16011553
@@ -1607,21 +1559,14 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput
16071559
16081560 member __.ProjectChecked = projectChecked.Publish
16091561
1610- member __.ImportedCcusInvalidated = importsInvalidated.Publish
1611-
1612- member __.AllDependenciesDeprecated = allDependencies
1613-
16141562#if ! NO_ EXTENSIONTYPING
1615- member __.ThereAreLiveTypeProviders =
1616- let liveTPs =
1617- match cleanupItem with
1618- | None -> []
1619- | Some tcImports -> [ for ia in tcImports.GetImportedAssemblies() do yield ! ia.TypeProviders]
1620- match liveTPs with
1621- | [] -> false
1622- | _ -> true
1563+ member __.ImportsInvalidatedByTypeProvider = importsInvalidatedByTypeProvider.Publish
16231564#endif
16241565
1566+ member __.TryGetCurrentTcImports () = currentTcImportsOpt
1567+
1568+ member __.AllDependenciesDeprecated = allDependencies
1569+
16251570 member __.Step ( ctok : CompilationThreadToken ) =
16261571 cancellable {
16271572 let cache = TimeStampCache defaultTimeStamp // One per step
@@ -1808,6 +1753,14 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput
18081753 // Never open PDB files for the language service, even if --standalone is specified
18091754 tcConfigB.openDebugInformationForLaterStaticLinking <- false
18101755
1756+ tcConfigB.compilationThread <-
1757+ { new ICompilationThread with
1758+ member __.EnqueueWork work =
1759+ Reactor.Singleton.EnqueueOp ( " Unknown" , " ICompilationThread.EnqueueWork" , " work" , fun ctok ->
1760+ work ctok
1761+ )
1762+ }
1763+
18111764 tcConfigB, sourceFilesNew
18121765
18131766 match loadClosureOpt with
@@ -1887,11 +1840,3 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput
18871840
18881841 return builderOpt, diagnostics
18891842 }
1890-
1891- static member KeepBuilderAlive ( builderOpt : IncrementalBuilder option ) =
1892- match builderOpt with
1893- | Some builder -> builder.IncrementUsageCount()
1894- | None -> { new System.IDisposable with member __.Dispose () = () }
1895-
1896- member __.IsBeingKeptAliveApartFromCacheEntry = ( referenceCount >= 2 )
1897-
0 commit comments