display projects for problems
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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; } = [];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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!;
|
||||||
|
|||||||
Reference in New Issue
Block a user