22// Licensed under the MIT license. See License.txt in the project root for license information.
33
44using System . Composition ;
5+ using Microsoft . AspNetCore . Razor ;
56using Microsoft . CodeAnalysis ;
67using Microsoft . CodeAnalysis . ExternalAccess . Razor . Features ;
78using Microsoft . Extensions . Logging ;
@@ -14,9 +15,9 @@ internal sealed class WorkspaceService(ILoggerFactory loggerFactory) : RazorWork
1415{
1516 private readonly ILoggerFactory _loggerFactory = loggerFactory ;
1617 private readonly ILogger _logger = loggerFactory . CreateLogger < WorkspaceService > ( ) ;
17- private Lock _initializeLock = new ( ) ;
18+ private readonly Lock _initializeLock = new ( ) ;
1819 private RazorWorkspaceListener ? _razorWorkspaceListener ;
19- private HashSet < ProjectId > _projectIdWithDynamicFiles = [ ] ;
20+ private HashSet < ProjectId > ? _projectIdWithDynamicFiles = [ ] ;
2021
2122 public override void Initialize ( Workspace workspace , string pipeName )
2223 {
@@ -33,9 +34,9 @@ public override void Initialize(Workspace workspace, string pipeName)
3334 _razorWorkspaceListener = new RazorWorkspaceListener ( _loggerFactory ) ;
3435 _razorWorkspaceListener . EnsureInitialized ( workspace , pipeName ) ;
3536
36- projectsToInitialize = _projectIdWithDynamicFiles ;
37- // May as well clear out the collection, it will never get used again anyway.
38- _projectIdWithDynamicFiles = [ ] ;
37+ // _projectIdWithDynamicFiles won't be used again after initialization is done
38+ projectsToInitialize = _projectIdWithDynamicFiles . AssumeNotNull ( ) ;
39+ _projectIdWithDynamicFiles = null ;
3940 }
4041
4142 foreach ( var projectId in projectsToInitialize )
@@ -47,6 +48,24 @@ public override void Initialize(Workspace workspace, string pipeName)
4748
4849 public override void NotifyDynamicFile ( ProjectId projectId )
4950 {
50- _razorWorkspaceListener ? . NotifyDynamicFile ( projectId ) ;
51+ if ( _razorWorkspaceListener is null )
52+ {
53+ lock ( _initializeLock )
54+ {
55+ if ( _razorWorkspaceListener is not null )
56+ {
57+ _razorWorkspaceListener . NotifyDynamicFile ( projectId ) ;
58+ return ;
59+ }
60+
61+ _projectIdWithDynamicFiles
62+ . AssumeNotNull ( )
63+ . Add ( projectId ) ;
64+ }
65+ }
66+ else
67+ {
68+ _razorWorkspaceListener ? . NotifyDynamicFile ( projectId ) ;
69+ }
5170 }
5271}
0 commit comments