use ImmutableArray

This commit is contained in:
Matt Parker
2025-10-17 22:50:17 +10:00
parent b6060e34f5
commit 6a20f75f39
3 changed files with 12 additions and 12 deletions

View File

@@ -333,7 +333,7 @@ public static class RoslynAnalysis
} }
public record SharpIdeRazorMappedClassifiedSpan(SharpIdeRazorSourceSpan SourceSpanInRazor, string CsharpClassificationType); public record SharpIdeRazorMappedClassifiedSpan(SharpIdeRazorSourceSpan SourceSpanInRazor, string CsharpClassificationType);
public static async Task<IEnumerable<SharpIdeRazorClassifiedSpan>> GetRazorDocumentSyntaxHighlighting(SharpIdeFile fileModel, CancellationToken cancellationToken = default) public static async Task<ImmutableArray<SharpIdeRazorClassifiedSpan>> GetRazorDocumentSyntaxHighlighting(SharpIdeFile fileModel, CancellationToken cancellationToken = default)
{ {
using var _ = SharpIdeOtel.Source.StartActivity($"{nameof(RoslynAnalysis)}.{nameof(GetRazorDocumentSyntaxHighlighting)}"); using var _ = SharpIdeOtel.Source.StartActivity($"{nameof(RoslynAnalysis)}.{nameof(GetRazorDocumentSyntaxHighlighting)}");
await _solutionLoadedTcs.Task; await _solutionLoadedTcs.Task;
@@ -434,14 +434,14 @@ public static class RoslynAnalysis
..roslynMappedSpans.Select(s => new SharpIdeRazorClassifiedSpan(s!.SourceSpanInRazor, SharpIdeRazorSpanKind.Code, s.CsharpClassificationType)), ..roslynMappedSpans.Select(s => new SharpIdeRazorClassifiedSpan(s!.SourceSpanInRazor, SharpIdeRazorSpanKind.Code, s.CsharpClassificationType)),
..semanticRangeRazorSpans ..semanticRangeRazorSpans
]; ];
sharpIdeRazorSpans = sharpIdeRazorSpans.OrderBy(s => s.Span.AbsoluteIndex).ToList(); var result = sharpIdeRazorSpans.OrderBy(s => s.Span.AbsoluteIndex).ToImmutableArray();
timer.Stop(); timer.Stop();
Console.WriteLine($"RoslynAnalysis: Razor syntax highlighting for {fileModel.Name} took {timer.ElapsedMilliseconds}ms"); Console.WriteLine($"RoslynAnalysis: Razor syntax highlighting for {fileModel.Name} took {timer.ElapsedMilliseconds}ms");
return sharpIdeRazorSpans; return result;
} }
// This is expensive for files that have just been updated, making it suboptimal for real-time highlighting // This is expensive for files that have just been updated, making it suboptimal for real-time highlighting
public static async Task<IEnumerable<SharpIdeClassifiedSpan>> GetDocumentSyntaxHighlighting(SharpIdeFile fileModel, CancellationToken cancellationToken = default) public static async Task<ImmutableArray<SharpIdeClassifiedSpan>> GetDocumentSyntaxHighlighting(SharpIdeFile fileModel, CancellationToken cancellationToken = default)
{ {
using var _ = SharpIdeOtel.Source.StartActivity($"{nameof(RoslynAnalysis)}.{nameof(GetDocumentSyntaxHighlighting)}"); using var _ = SharpIdeOtel.Source.StartActivity($"{nameof(RoslynAnalysis)}.{nameof(GetDocumentSyntaxHighlighting)}");
await _solutionLoadedTcs.Task; await _solutionLoadedTcs.Task;
@@ -459,7 +459,7 @@ public static class RoslynAnalysis
var root = await syntaxTree!.GetRootAsync(cancellationToken); var root = await syntaxTree!.GetRootAsync(cancellationToken);
var classifiedSpans = await Classifier.GetClassifiedSpansAsync(document, root.FullSpan, cancellationToken); var classifiedSpans = await Classifier.GetClassifiedSpansAsync(document, root.FullSpan, cancellationToken);
var result = classifiedSpans.Select(s => new SharpIdeClassifiedSpan(syntaxTree.GetMappedLineSpan(s.TextSpan).Span, s)).ToList(); var result = classifiedSpans.Select(s => new SharpIdeClassifiedSpan(syntaxTree.GetMappedLineSpan(s.TextSpan).Span, s)).ToImmutableArray();
return result; return result;
} }

View File

@@ -17,19 +17,19 @@ public partial class CustomHighlighter : SyntaxHighlighter
private System.Collections.Generic.Dictionary<int, ImmutableArray<SharpIdeClassifiedSpan>> _classifiedSpansByLine = []; private System.Collections.Generic.Dictionary<int, ImmutableArray<SharpIdeClassifiedSpan>> _classifiedSpansByLine = [];
public void SetHighlightingData(IEnumerable<SharpIdeClassifiedSpan> classifiedSpans, IEnumerable<SharpIdeRazorClassifiedSpan> razorClassifiedSpans) public void SetHighlightingData(ImmutableArray<SharpIdeClassifiedSpan> classifiedSpans, ImmutableArray<SharpIdeRazorClassifiedSpan> razorClassifiedSpans)
{ {
// separate each line here // separate each line here
var razorSpansForLine = razorClassifiedSpans var razorSpansForLine = razorClassifiedSpans
.Where(s => s.Span.Length is not 0) .Where(s => s.Span.Length is not 0)
.GroupBy(s => s.Span.LineIndex) .GroupBy(s => s.Span.LineIndex);
.ToList();
_razorClassifiedSpansByLine = razorSpansForLine.ToDictionary(g => g.Key, g => g.ToImmutableArray()); _razorClassifiedSpansByLine = razorSpansForLine.ToDictionary(g => g.Key, g => g.ToImmutableArray());
var spansGroupedByFileSpan = classifiedSpans var spansGroupedByFileSpan = classifiedSpans
.Where(s => s.ClassifiedSpan.TextSpan.Length is not 0) .Where(s => s.ClassifiedSpan.TextSpan.Length is not 0)
.GroupBy(span => span.FileSpan.Start.Line) .GroupBy(span => span.FileSpan.Start.Line);
.ToList();
_classifiedSpansByLine = spansGroupedByFileSpan.ToDictionary(g => g.Key, g => g.ToImmutableArray()); _classifiedSpansByLine = spansGroupedByFileSpan.ToDictionary(g => g.Key, g => g.ToImmutableArray());
} }

View File

@@ -454,7 +454,7 @@ public partial class SharpIdeCodeEdit : CodeEdit
} }
[RequiresGodotUiThread] [RequiresGodotUiThread]
private void SetSyntaxHighlightingModel(IEnumerable<SharpIdeClassifiedSpan> classifiedSpans, IEnumerable<SharpIdeRazorClassifiedSpan> razorClassifiedSpans) private void SetSyntaxHighlightingModel(ImmutableArray<SharpIdeClassifiedSpan> classifiedSpans, ImmutableArray<SharpIdeRazorClassifiedSpan> razorClassifiedSpans)
{ {
_syntaxHighlighter.SetHighlightingData(classifiedSpans, razorClassifiedSpans); _syntaxHighlighter.SetHighlightingData(classifiedSpans, razorClassifiedSpans);
//_syntaxHighlighter.ClearHighlightingCache(); //_syntaxHighlighter.ClearHighlightingCache();