get code fixes at position

This commit is contained in:
Matt Parker
2025-08-18 19:36:51 +10:00
parent e4e2d95bf8
commit 39b39cddcc
3 changed files with 61 additions and 21 deletions

View File

@@ -35,13 +35,7 @@ public partial class IdeRoot : Control
RoslynAnalysis.StartSolutionAnalysis(path);
var infraProject = solutionModel.AllProjects.Single(s => s.Name == "Infrastructure");
var diFile = infraProject.Files.Single(s => s.Name == "DependencyInjection.cs");
var fileContents = await File.ReadAllTextAsync(diFile.Path);
_sharpIdeCodeEdit.SetText(fileContents);
var syntaxHighlighting = await RoslynAnalysis.GetDocumentSyntaxHighlighting(diFile);
_sharpIdeCodeEdit.ProvideSyntaxHighlighting(syntaxHighlighting);
var diagnostics = await RoslynAnalysis.GetDocumentDiagnostics(diFile);
_sharpIdeCodeEdit.ProvideDiagnostics(diagnostics);
await _sharpIdeCodeEdit.SetSharpIdeFile(diFile);
}
catch (Exception e)
{

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.IO;
using System.Linq;
using Godot;
using Microsoft.Build.Utilities;
@@ -8,6 +9,7 @@ using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Classification;
using Microsoft.CodeAnalysis.Text;
using SharpIDE.Application.Features.Analysis;
using SharpIDE.Application.Features.SolutionDiscovery;
using Task = System.Threading.Tasks.Task;
namespace SharpIDE.Godot;
@@ -21,6 +23,8 @@ public partial class SharpIdeCodeEdit : CodeEdit
private int _selectionStartCol;
private int _selectionEndCol;
private SharpIdeFile _currentFile = null!;
private CustomHighlighter _syntaxHighlighter = new();
private PopupMenu _popupMenu = null!;
@@ -44,6 +48,17 @@ public partial class SharpIdeCodeEdit : CodeEdit
};
this.SyntaxHighlighter = _syntaxHighlighter;
}
public async Task SetSharpIdeFile(SharpIdeFile file)
{
_currentFile = file;
var fileContents = await File.ReadAllTextAsync(_currentFile.Path);
SetText(fileContents);
var syntaxHighlighting = await RoslynAnalysis.GetDocumentSyntaxHighlighting(_currentFile);
SetSyntaxHighlightingModel(syntaxHighlighting);
var diagnostics = await RoslynAnalysis.GetDocumentDiagnostics(_currentFile);
SetDiagnosticsModel(diagnostics);
}
public void UnderlineRange(int line, int caretStartCol, int caretEndCol, Color color, float thickness = 1.5f)
{
@@ -104,11 +119,12 @@ public partial class SharpIdeCodeEdit : CodeEdit
}
}
public void ProvideDiagnostics(ImmutableArray<(FileLinePositionSpan fileSpan, Diagnostic diagnostic)> diagnostics)
private void SetDiagnosticsModel(ImmutableArray<(FileLinePositionSpan fileSpan, Diagnostic diagnostic)> diagnostics)
{
_diagnostics = diagnostics;
}
public void ProvideSyntaxHighlighting(IEnumerable<(FileLinePositionSpan fileSpan, ClassifiedSpan classifiedSpan)> classifiedSpans)
private void SetSyntaxHighlightingModel(IEnumerable<(FileLinePositionSpan fileSpan, ClassifiedSpan classifiedSpan)> classifiedSpans)
{
_syntaxHighlighter.ClassifiedSpans = classifiedSpans;
Callable.From(() =>
@@ -135,14 +151,14 @@ public partial class SharpIdeCodeEdit : CodeEdit
try
{
var linePos = new LinePosition(caretLine, caretColumn);
var diagnostic = _diagnostics.FirstOrDefault(d =>
d.fileSpan.StartLinePosition <= linePos && d.fileSpan.EndLinePosition >= linePos);
if (diagnostic is (_, null)) return;
var codeActions = await RoslynAnalysis.GetCodeFixesAsync(diagnostic.diagnostic);
// var diagnostic = _diagnostics.FirstOrDefault(d =>
// d.fileSpan.StartLinePosition <= linePos && d.fileSpan.EndLinePosition >= linePos);
// if (diagnostic is (_, null)) return;
var codeActions = await RoslynAnalysis.GetCodeFixesForDocumentAtPosition(_currentFile, linePos);
Callable.From(() =>
{
_popupMenu.Clear();
foreach (var (index, (fileSpan, codeAction)) in codeActions.Index())
foreach (var (index, codeAction) in codeActions.Index())
{
_popupMenu.AddItem(codeAction.Title, index);
//_popupMenu.SetItemMetadata(menuItem, codeAction);