@@ -84,8 +84,11 @@ public void StartLoadingSolutionInWorkspace(SharpIdeSolutionModel solutionModel,
8484 {
8585 try
8686 {
87+ CreateWorkspace ( ) ;
8788 await LoadSolutionInWorkspace ( solutionModel , sharpIdeRootFolder ) ;
88- await UpdateSolutionDiagnostics ( ) ;
89+ var diagnosticsTask = UpdateSolutionDiagnostics ( ) ;
90+ LoadCodeActions ( ) ;
91+ await diagnosticsTask ;
8992 }
9093 catch ( Exception e )
9194 {
@@ -100,7 +103,7 @@ public async Task LoadSolutionInWorkspace(SharpIdeSolutionModel solutionModel, S
100103 _sharpIdeSolutionModel = solutionModel ;
101104 var timer = Stopwatch . StartNew ( ) ;
102105
103- if ( _workspace is null ) CreateWorkspace ( ) ;
106+ Guard . Against . Null ( _workspace ) ;
104107
105108 using ( var ___ = SharpIdeOtel . Source . StartActivity ( "RestoreSolution" ) )
106109 {
@@ -131,21 +134,6 @@ public async Task LoadSolutionInWorkspace(SharpIdeSolutionModel solutionModel, S
131134 timer . Stop ( ) ;
132135 _logger . LogInformation ( "RoslynAnalysis: Solution loaded in {ElapsedMilliseconds}ms" , timer . ElapsedMilliseconds ) ;
133136 _solutionLoadedTcs . SetResult ( ) ;
134-
135- using ( var ____ = SharpIdeOtel . Source . StartActivity ( "LoadAnalyzersAndFixers" ) )
136- {
137- foreach ( var assembly in MefHostServices . DefaultAssemblies )
138- {
139- // These could be loaded from the composition via _workspace.CurrentSolution.Services.ExportProvider.GetExports<Lazy<CodeFixProvider, CodeChangeProviderMetadata>>().ToList(),
140- // however we need all the CodeFixProviders/CodeRefactoringProviders immediately on the first code action request, so I would prefer to do it here
141- var fixers = CodeFixProviderLoader . LoadCodeFixProviders ( [ assembly ] , LanguageNames . CSharp ) ;
142- _codeFixProviders . AddRange ( fixers ) ;
143- var refactoringProviders = CodeRefactoringProviderLoader . LoadCodeRefactoringProviders ( [ assembly ] , LanguageNames . CSharp ) ;
144- _codeRefactoringProviders . AddRange ( refactoringProviders ) ;
145- }
146- _codeRefactoringProviders = _codeRefactoringProviders . DistinctBy ( s => s . GetType ( ) . Name ) . ToHashSet ( ) ;
147- _codeFixProviders = _codeFixProviders . DistinctBy ( s => s . GetType ( ) . Name ) . ToHashSet ( ) ;
148- }
149137 }
150138
151139 private void CreateWorkspace ( )
@@ -187,6 +175,23 @@ private void CreateWorkspace()
187175 _msBuildProjectLoader = new CustomMsBuildProjectLoader ( _workspace ) ;
188176 }
189177
178+ private static void LoadCodeActions ( )
179+ {
180+ using var _ = SharpIdeOtel . Source . StartActivity ( ) ;
181+ if ( _codeFixProviders . Count is not 0 || _codeRefactoringProviders . Count is not 0 ) return ;
182+ foreach ( var assembly in MefHostServices . DefaultAssemblies )
183+ {
184+ // These could be loaded from the composition via _workspace.CurrentSolution.Services.ExportProvider.GetExports<Lazy<CodeFixProvider, CodeChangeProviderMetadata>>().ToList(),
185+ // however we need all the CodeFixProviders/CodeRefactoringProviders immediately on the first code action request, so I would prefer to do it here
186+ var fixers = CodeFixProviderLoader . LoadCodeFixProviders ( [ assembly ] , LanguageNames . CSharp ) ;
187+ _codeFixProviders . AddRange ( fixers ) ;
188+ var refactoringProviders = CodeRefactoringProviderLoader . LoadCodeRefactoringProviders ( [ assembly ] , LanguageNames . CSharp ) ;
189+ _codeRefactoringProviders . AddRange ( refactoringProviders ) ;
190+ }
191+ _codeRefactoringProviders = _codeRefactoringProviders . DistinctBy ( s => s . GetType ( ) . Name ) . ToHashSet ( ) ;
192+ _codeFixProviders = _codeFixProviders . DistinctBy ( s => s . GetType ( ) . Name ) . ToHashSet ( ) ;
193+ }
194+
190195 /// Callers should call UpdateSolutionDiagnostics after this
191196 /// Ensure that the SharpIdeSolutionModel has been updated before calling this and any subsequent calls
192197 public async Task ReloadSolution ( CancellationToken cancellationToken = default )
0 commit comments