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.Immutable;
using System.Collections.ObjectModel;
using System.Diagnostics; using System.Diagnostics;
using Ardalis.GuardClauses; using Ardalis.GuardClauses;
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis;
@@ -11,6 +12,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 ObservableCollections;
using SharpIDE.Application.Features.SolutionDiscovery; using SharpIDE.Application.Features.SolutionDiscovery;
using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence; using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence;
@@ -19,16 +21,17 @@ namespace SharpIDE.Application.Features.Analysis;
public static class RoslynAnalysis public static class RoslynAnalysis
{ {
public static MSBuildWorkspace? _workspace; public static MSBuildWorkspace? _workspace;
private static SharpIdeSolutionModel? _sharpIdeSolutionModel;
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(); private static TaskCompletionSource _solutionLoadedTcs = new();
public static void StartSolutionAnalysis(string solutionFilePath) public static void StartSolutionAnalysis(SharpIdeSolutionModel solutionModel)
{ {
_ = Task.Run(async () => _ = Task.Run(async () =>
{ {
try try
{ {
await Analyse(solutionFilePath); await Analyse(solutionModel);
} }
catch (Exception e) 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"); Console.WriteLine($"RoslynAnalysis: Loading solution");
_sharpIdeSolutionModel = solutionModel;
var timer = Stopwatch.StartNew(); var timer = Stopwatch.StartNew();
if (_workspace is null) if (_workspace is null)
{ {
@@ -47,7 +51,7 @@ public static class RoslynAnalysis
_workspace ??= MSBuildWorkspace.Create(host); _workspace ??= MSBuildWorkspace.Create(host);
_workspace.RegisterWorkspaceFailedHandler(o => throw new InvalidOperationException($"Workspace failed: {o.Diagnostic.Message}")); _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(); timer.Stop();
Console.WriteLine($"RoslynAnalysis: Solution loaded in {timer.ElapsedMilliseconds}ms"); Console.WriteLine($"RoslynAnalysis: Solution loaded in {timer.ElapsedMilliseconds}ms");
_solutionLoadedTcs.SetResult(); _solutionLoadedTcs.SetResult();
@@ -77,20 +81,14 @@ public static class RoslynAnalysis
_codeFixProviders = _codeFixProviders.DistinctBy(s => s.GetType().Name).ToHashSet(); _codeFixProviders = _codeFixProviders.DistinctBy(s => s.GetType().Name).ToHashSet();
_codeRefactoringProviders = _codeRefactoringProviders.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) 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) // foreach (var document in project.Documents)
// { // {
// var semanticModel = await document.GetSemanticModelAsync(); // var semanticModel = await document.GetSemanticModelAsync();

View File

@@ -1,8 +1,10 @@
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Threading.Channels; using System.Threading.Channels;
using Microsoft.Build.Evaluation; using Microsoft.CodeAnalysis;
using ObservableCollections;
using SharpIDE.Application.Features.Evaluation; using SharpIDE.Application.Features.Evaluation;
using Project = Microsoft.Build.Evaluation.Project;
namespace SharpIDE.Application.Features.SolutionDiscovery.VsPersistence; namespace SharpIDE.Application.Features.SolutionDiscovery.VsPersistence;
@@ -110,4 +112,6 @@ public class SharpIdeProjectModel : ISharpIdeNode, IExpandableSharpIdeNode, IChi
public event Func<Task> ProjectStoppedRunning = () => Task.CompletedTask; public event Func<Task> ProjectStoppedRunning = () => Task.CompletedTask;
public void InvokeProjectStoppedRunning() => ProjectStoppedRunning.Invoke(); 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.CodeAnalysis.Workspaces.MSBuild" Version="5.0.0-2.25459.108" PrivateAssets="all" />
<PackageReference Include="Microsoft.VisualStudio.SolutionPersistence" Version="1.0.52" /> <PackageReference Include="Microsoft.VisualStudio.SolutionPersistence" Version="1.0.52" />
<PackageReference Include="NuGet.Protocol" Version="7.0.0-preview.1.46008" /> <PackageReference Include="NuGet.Protocol" Version="7.0.0-preview.1.46008" />
<PackageReference Include="ObservableCollections" Version="3.3.4" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -1,4 +1,5 @@
using Godot; using Godot;
using R3;
using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence; using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence;
namespace SharpIDE.Godot.Features.Problems; namespace SharpIDE.Godot.Features.Problems;
@@ -10,5 +11,9 @@ public partial class ProblemsPanelProjectEntry : MarginContainer
public override void _Ready() public override void _Ready()
{ {
GetNode<Label>("Label").Text = Project?.Name ?? "NULL"; 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; _sharpIdeCodeEdit.Solution = solutionModel;
_bottomPanelManager.Solution = solutionModel; _bottomPanelManager.Solution = solutionModel;
Callable.From(_solutionExplorerPanel.RepopulateTree).CallDeferred(); Callable.From(_solutionExplorerPanel.RepopulateTree).CallDeferred();
RoslynAnalysis.StartSolutionAnalysis(path); RoslynAnalysis.StartSolutionAnalysis(solutionModel);
var tasks = solutionModel.AllProjects.Select(p => p.MsBuildEvaluationProjectTask).ToList(); var tasks = solutionModel.AllProjects.Select(p => p.MsBuildEvaluationProjectTask).ToList();
await Task.WhenAll(tasks).ConfigureAwait(false); await Task.WhenAll(tasks).ConfigureAwait(false);

View File

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

View File

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