Skip to content

Commit 2284559

Browse files
committed
refactor loading Analyzers and Fixers
1 parent 8ae478a commit 2284559

File tree

1 file changed

+22
-17
lines changed

1 file changed

+22
-17
lines changed

src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)