diff --git a/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs b/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs index 71eec36..d478212 100644 --- a/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs +++ b/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs @@ -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 _codeFixProviders = []; private static HashSet _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> 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> GetCodeFixesAsync(Document document, Diagnostic diagnostic) { var cancellationToken = CancellationToken.None; diff --git a/src/SharpIDE.Photino/Components/ProblemsPanel.razor b/src/SharpIDE.Photino/Components/Problems/ProblemsPanel.razor similarity index 53% rename from src/SharpIDE.Photino/Components/ProblemsPanel.razor rename to src/SharpIDE.Photino/Components/Problems/ProblemsPanel.razor index 043a379..6d36189 100644 --- a/src/SharpIDE.Photino/Components/ProblemsPanel.razor +++ b/src/SharpIDE.Photino/Components/Problems/ProblemsPanel.razor @@ -1,6 +1,9 @@ @using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence - - + + @foreach (var project in SolutionModel.AllProjects) + { + + } @code { diff --git a/src/SharpIDE.Photino/Components/Problems/ProjectProblemComponent.razor b/src/SharpIDE.Photino/Components/Problems/ProjectProblemComponent.razor new file mode 100644 index 0000000..3a9fbae --- /dev/null +++ b/src/SharpIDE.Photino/Components/Problems/ProjectProblemComponent.razor @@ -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) + { +
+ @diagnostic.Id: @diagnostic.GetMessage() +
+ } +} + +@code { + [Parameter, EditorRequired] + public SharpIdeProjectModel ProjectModel { get; set; } = null!; + + private ImmutableArray _diagnostics = []; + + protected override async Task OnInitializedAsync() + { + var diagnostics = await RoslynAnalysis.GetProjectDiagnostics(ProjectModel); + _diagnostics = diagnostics; + } + +} diff --git a/src/SharpIDE.Photino/Layout/MainLayout.razor b/src/SharpIDE.Photino/Layout/MainLayout.razor index 67703f9..0feecf4 100644 --- a/src/SharpIDE.Photino/Layout/MainLayout.razor +++ b/src/SharpIDE.Photino/Layout/MainLayout.razor @@ -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