display projects for problems

This commit is contained in:
Matt Parker
2025-09-12 18:21:04 +10:00
parent 598331cc3b
commit 296dd306b4
7 changed files with 28 additions and 19 deletions

View File

@@ -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<CodeFixProvider> _codeFixProviders = [];
private static HashSet<CodeRefactoringProvider> _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();

View File

@@ -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<Task> ProjectStoppedRunning = () => Task.CompletedTask;
public void InvokeProjectStoppedRunning() => ProjectStoppedRunning.Invoke();
public ObservableHashSet<Diagnostic> Diagnostics { get; internal set; } = [];
}

View File

@@ -24,5 +24,6 @@
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="5.0.0-2.25459.108" PrivateAssets="all" />
<PackageReference Include="Microsoft.VisualStudio.SolutionPersistence" Version="1.0.52" />
<PackageReference Include="NuGet.Protocol" Version="7.0.0-preview.1.46008" />
<PackageReference Include="ObservableCollections" Version="3.3.4" />
</ItemGroup>
</Project>

View File

@@ -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<Label>("Label").Text = Project?.Name ?? "NULL";
if (Project is null) return;
Observable.EveryValueChanged(this, s => s.Project.Diagnostics.Count)
.Subscribe(s => Visible = s is not 0);
}
}

View File

@@ -76,7 +76,7 @@ public partial class IdeRoot : Control
_sharpIdeCodeEdit.Solution = solutionModel;
_bottomPanelManager.Solution = solutionModel;
Callable.From(_solutionExplorerPanel.RepopulateTree).CallDeferred();
RoslynAnalysis.StartSolutionAnalysis(path);
RoslynAnalysis.StartSolutionAnalysis(solutionModel);
var tasks = solutionModel.AllProjects.Select(p => p.MsBuildEvaluationProjectTask).ToList();
await Task.WhenAll(tasks).ConfigureAwait(false);

View File

@@ -10,6 +10,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="ObservableCollections" Version="3.3.4" />
<PackageReference Include="ObservableCollections.R3" Version="3.3.4" />
<PackageReference Include="R3" Version="1.3.0" />
</ItemGroup>
</Project>

View File

@@ -182,7 +182,7 @@
var solutionModel = await VsPersistenceMapper.GetSolutionModel(_solutionFilePath);
_solutionModel = solutionModel;
RoslynAnalysis.StartSolutionAnalysis(_solutionFilePath);
RoslynAnalysis.StartSolutionAnalysis(solutionModel);
}
private CancellationTokenSource? _cancellationTokenSource = null!;