get project diagnostics
This commit is contained in:
@@ -10,6 +10,7 @@ using Microsoft.CodeAnalysis.Host.Mef;
|
|||||||
using Microsoft.CodeAnalysis.MSBuild;
|
using Microsoft.CodeAnalysis.MSBuild;
|
||||||
using Microsoft.CodeAnalysis.Text;
|
using Microsoft.CodeAnalysis.Text;
|
||||||
using NuGet.Packaging;
|
using NuGet.Packaging;
|
||||||
|
using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence;
|
||||||
|
|
||||||
namespace SharpIDE.Application.Features.Analysis;
|
namespace SharpIDE.Application.Features.Analysis;
|
||||||
|
|
||||||
@@ -18,6 +19,7 @@ public static class RoslynAnalysis
|
|||||||
private static MSBuildWorkspace? _workspace;
|
private static MSBuildWorkspace? _workspace;
|
||||||
private static HashSet<CodeFixProvider> _codeFixProviders = [];
|
private static HashSet<CodeFixProvider> _codeFixProviders = [];
|
||||||
private static HashSet<CodeRefactoringProvider> _codeRefactoringProviders = [];
|
private static HashSet<CodeRefactoringProvider> _codeRefactoringProviders = [];
|
||||||
|
private static TaskCompletionSource _solutionLoadedTcs = new();
|
||||||
public static void StartSolutionAnalysis(string solutionFilePath)
|
public static void StartSolutionAnalysis(string solutionFilePath)
|
||||||
{
|
{
|
||||||
_ = Task.Run(async () =>
|
_ = Task.Run(async () =>
|
||||||
@@ -46,7 +48,7 @@ public static class RoslynAnalysis
|
|||||||
var solution = await _workspace.OpenSolutionAsync(solutionFilePath, new Progress());
|
var solution = await _workspace.OpenSolutionAsync(solutionFilePath, new Progress());
|
||||||
timer.Stop();
|
timer.Stop();
|
||||||
Console.WriteLine($"RoslynAnalysis: Solution loaded in {timer.ElapsedMilliseconds}ms");
|
Console.WriteLine($"RoslynAnalysis: Solution loaded in {timer.ElapsedMilliseconds}ms");
|
||||||
Console.WriteLine();
|
_solutionLoadedTcs.SetResult();
|
||||||
|
|
||||||
foreach (var assembly in MefHostServices.DefaultAssemblies)
|
foreach (var assembly in MefHostServices.DefaultAssemblies)
|
||||||
{
|
{
|
||||||
@@ -110,6 +112,18 @@ public static class RoslynAnalysis
|
|||||||
Console.WriteLine("RoslynAnalysis: Analysis completed.");
|
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)
|
public static async Task<ImmutableArray<CodeAction>> GetCodeFixesAsync(Document document, Diagnostic diagnostic)
|
||||||
{
|
{
|
||||||
var cancellationToken = CancellationToken.None;
|
var cancellationToken = CancellationToken.None;
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
@using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence
|
@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>
|
</MudStack>
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
@using SharpIDE.Application.Features.Events
|
@using SharpIDE.Application.Features.Events
|
||||||
@using SharpIDE.Application.Features.SolutionDiscovery
|
@using SharpIDE.Application.Features.SolutionDiscovery
|
||||||
@using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence
|
@using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence
|
||||||
|
@using SharpIDE.Photino.Components.Problems
|
||||||
@using SharpIDE.Photino.Models
|
@using SharpIDE.Photino.Models
|
||||||
@inherits LayoutComponentBase
|
@inherits LayoutComponentBase
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user