get project diagnostics

This commit is contained in:
Matt Parker
2025-08-17 11:16:53 +10:00
parent eecc0ed388
commit de89cfb1e9
4 changed files with 50 additions and 3 deletions

View File

@@ -10,6 +10,7 @@ using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.MSBuild;
using Microsoft.CodeAnalysis.Text;
using NuGet.Packaging;
using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence;
namespace SharpIDE.Application.Features.Analysis;
@@ -18,6 +19,7 @@ public static class RoslynAnalysis
private static MSBuildWorkspace? _workspace;
private static HashSet<CodeFixProvider> _codeFixProviders = [];
private static HashSet<CodeRefactoringProvider> _codeRefactoringProviders = [];
private static TaskCompletionSource _solutionLoadedTcs = new();
public static void StartSolutionAnalysis(string solutionFilePath)
{
_ = Task.Run(async () =>
@@ -46,7 +48,7 @@ public static class RoslynAnalysis
var solution = await _workspace.OpenSolutionAsync(solutionFilePath, new Progress());
timer.Stop();
Console.WriteLine($"RoslynAnalysis: Solution loaded in {timer.ElapsedMilliseconds}ms");
Console.WriteLine();
_solutionLoadedTcs.SetResult();
foreach (var assembly in MefHostServices.DefaultAssemblies)
{
@@ -110,6 +112,18 @@ public static class RoslynAnalysis
Console.WriteLine("RoslynAnalysis: Analysis completed.");
}
public static async Task<ImmutableArray<Diagnostic>> GetProjectDiagnostics(SharpIdeProjectModel projectModel)
{
await _solutionLoadedTcs.Task;
var cancellationToken = CancellationToken.None;
var project = _workspace!.CurrentSolution.Projects.Single(s => s.FilePath == projectModel.FilePath);
var compilation = await project.GetCompilationAsync(cancellationToken);
Guard.Against.Null(compilation, nameof(compilation));
var diagnostics = compilation.GetDiagnostics(cancellationToken);
return diagnostics.Where(d => d.Severity is not DiagnosticSeverity.Hidden).ToImmutableArray();
}
public static async Task<ImmutableArray<CodeAction>> GetCodeFixesAsync(Document document, Diagnostic diagnostic)
{
var cancellationToken = CancellationToken.None;

View File

@@ -1,6 +1,9 @@
@using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence
<MudStack Style="height: 100%">
<MudStack Style="height: 100%; overflow-y: scroll">
@foreach (var project in SolutionModel.AllProjects)
{
<ProjectProblemComponent ProjectModel="@project" />
}
</MudStack>
@code {

View File

@@ -0,0 +1,29 @@
@using System.Collections.Immutable
@using Microsoft.CodeAnalysis
@using SharpIDE.Application.Features.Analysis
@using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence
@if (_diagnostics.Length is not 0)
{
@ProjectModel.Name
@foreach(var diagnostic in _diagnostics)
{
<div>
<strong>@diagnostic.Id</strong>: @diagnostic.GetMessage()
</div>
}
}
@code {
[Parameter, EditorRequired]
public SharpIdeProjectModel ProjectModel { get; set; } = null!;
private ImmutableArray<Diagnostic> _diagnostics = [];
protected override async Task OnInitializedAsync()
{
var diagnostics = await RoslynAnalysis.GetProjectDiagnostics(ProjectModel);
_diagnostics = diagnostics;
}
}

View File

@@ -4,6 +4,7 @@
@using SharpIDE.Application.Features.Events
@using SharpIDE.Application.Features.SolutionDiscovery
@using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence
@using SharpIDE.Photino.Components.Problems
@using SharpIDE.Photino.Models
@inherits LayoutComponentBase