diff --git a/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs b/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs index 0070ed0..fa871c6 100644 --- a/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs +++ b/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs @@ -1,4 +1,5 @@ using System.Collections.Immutable; +using System.Collections.ObjectModel; using System.Diagnostics; using Ardalis.GuardClauses; using Microsoft.CodeAnalysis; @@ -11,6 +12,7 @@ using Microsoft.CodeAnalysis.Host.Mef; using Microsoft.CodeAnalysis.MSBuild; using Microsoft.CodeAnalysis.Text; using NuGet.Packaging; +using ObservableCollections; using SharpIDE.Application.Features.SolutionDiscovery; using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence; @@ -19,16 +21,17 @@ namespace SharpIDE.Application.Features.Analysis; public static class RoslynAnalysis { public static MSBuildWorkspace? _workspace; + private static SharpIdeSolutionModel? _sharpIdeSolutionModel; private static HashSet _codeFixProviders = []; private static HashSet _codeRefactoringProviders = []; private static TaskCompletionSource _solutionLoadedTcs = new(); - public static void StartSolutionAnalysis(string solutionFilePath) + public static void StartSolutionAnalysis(SharpIdeSolutionModel solutionModel) { _ = Task.Run(async () => { try { - await Analyse(solutionFilePath); + await Analyse(solutionModel); } catch (Exception e) { @@ -36,9 +39,10 @@ public static class RoslynAnalysis } }); } - public static async Task Analyse(string solutionFilePath) + public static async Task Analyse(SharpIdeSolutionModel solutionModel) { Console.WriteLine($"RoslynAnalysis: Loading solution"); + _sharpIdeSolutionModel = solutionModel; var timer = Stopwatch.StartNew(); if (_workspace is null) { @@ -47,7 +51,7 @@ public static class RoslynAnalysis _workspace ??= MSBuildWorkspace.Create(host); _workspace.RegisterWorkspaceFailedHandler(o => throw new InvalidOperationException($"Workspace failed: {o.Diagnostic.Message}")); } - var solution = await _workspace.OpenSolutionAsync(solutionFilePath, new Progress()); + var solution = await _workspace.OpenSolutionAsync(_sharpIdeSolutionModel.FilePath, new Progress()); timer.Stop(); Console.WriteLine($"RoslynAnalysis: Solution loaded in {timer.ElapsedMilliseconds}ms"); _solutionLoadedTcs.SetResult(); @@ -77,20 +81,14 @@ public static class RoslynAnalysis _codeFixProviders = _codeFixProviders.DistinctBy(s => s.GetType().Name).ToHashSet(); _codeRefactoringProviders = _codeRefactoringProviders.DistinctBy(s => s.GetType().Name).ToHashSet(); + foreach (var project in _sharpIdeSolutionModel.AllProjects) + { + var projectDiagnostics = await GetProjectDiagnostics(project); + project.Diagnostics.Clear(); + project.Diagnostics.AddRange(projectDiagnostics); + } foreach (var project in solution.Projects) { - //Console.WriteLine($"Project: {project.Name}"); - var compilation = await project.GetCompilationAsync(); - Guard.Against.Null(compilation, nameof(compilation)); - - var diagnostics = compilation.GetDiagnostics(); - var nonHiddenDiagnostics = diagnostics.Where(d => d.Severity is not DiagnosticSeverity.Hidden).ToList(); - // - foreach (var diagnostic in nonHiddenDiagnostics) - { - Console.WriteLine(diagnostic); - // Optionally run CodeFixProviders here - } // foreach (var document in project.Documents) // { // var semanticModel = await document.GetSemanticModelAsync(); diff --git a/src/SharpIDE.Application/Features/SolutionDiscovery/VsPersistence/SharpIdeModels.cs b/src/SharpIDE.Application/Features/SolutionDiscovery/VsPersistence/SharpIdeModels.cs index 0920a2a..47e4aef 100644 --- a/src/SharpIDE.Application/Features/SolutionDiscovery/VsPersistence/SharpIdeModels.cs +++ b/src/SharpIDE.Application/Features/SolutionDiscovery/VsPersistence/SharpIdeModels.cs @@ -1,8 +1,10 @@ using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; using System.Threading.Channels; -using Microsoft.Build.Evaluation; +using Microsoft.CodeAnalysis; +using ObservableCollections; using SharpIDE.Application.Features.Evaluation; +using Project = Microsoft.Build.Evaluation.Project; namespace SharpIDE.Application.Features.SolutionDiscovery.VsPersistence; @@ -110,4 +112,6 @@ public class SharpIdeProjectModel : ISharpIdeNode, IExpandableSharpIdeNode, IChi public event Func ProjectStoppedRunning = () => Task.CompletedTask; public void InvokeProjectStoppedRunning() => ProjectStoppedRunning.Invoke(); + + public ObservableHashSet Diagnostics { get; internal set; } = []; } diff --git a/src/SharpIDE.Application/SharpIDE.Application.csproj b/src/SharpIDE.Application/SharpIDE.Application.csproj index 40004f8..62c6dc3 100644 --- a/src/SharpIDE.Application/SharpIDE.Application.csproj +++ b/src/SharpIDE.Application/SharpIDE.Application.csproj @@ -24,5 +24,6 @@ + diff --git a/src/SharpIDE.Godot/Features/Problems/ProblemsPanelProjectEntry.cs b/src/SharpIDE.Godot/Features/Problems/ProblemsPanelProjectEntry.cs index 60d0235..c6f608a 100644 --- a/src/SharpIDE.Godot/Features/Problems/ProblemsPanelProjectEntry.cs +++ b/src/SharpIDE.Godot/Features/Problems/ProblemsPanelProjectEntry.cs @@ -1,4 +1,5 @@ using Godot; +using R3; using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence; namespace SharpIDE.Godot.Features.Problems; @@ -10,5 +11,9 @@ public partial class ProblemsPanelProjectEntry : MarginContainer public override void _Ready() { GetNode