From 6a20f75f39450acc54f7756ffecda7bccdf8b6b0 Mon Sep 17 00:00:00 2001 From: Matt Parker <61717342+MattParkerDev@users.noreply.github.com> Date: Fri, 17 Oct 2025 22:50:17 +1000 Subject: [PATCH] use ImmutableArray --- .../Features/Analysis/RoslynAnalysis.cs | 10 +++++----- .../Features/CodeEditor/CustomSyntaxHighlighter.cs | 12 ++++++------ .../Features/CodeEditor/SharpIdeCodeEdit.cs | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs b/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs index b0cd2c1..b7ed562 100644 --- a/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs +++ b/src/SharpIDE.Application/Features/Analysis/RoslynAnalysis.cs @@ -333,7 +333,7 @@ public static class RoslynAnalysis } public record SharpIdeRazorMappedClassifiedSpan(SharpIdeRazorSourceSpan SourceSpanInRazor, string CsharpClassificationType); - public static async Task> GetRazorDocumentSyntaxHighlighting(SharpIdeFile fileModel, CancellationToken cancellationToken = default) + public static async Task> GetRazorDocumentSyntaxHighlighting(SharpIdeFile fileModel, CancellationToken cancellationToken = default) { using var _ = SharpIdeOtel.Source.StartActivity($"{nameof(RoslynAnalysis)}.{nameof(GetRazorDocumentSyntaxHighlighting)}"); await _solutionLoadedTcs.Task; @@ -434,14 +434,14 @@ public static class RoslynAnalysis ..roslynMappedSpans.Select(s => new SharpIdeRazorClassifiedSpan(s!.SourceSpanInRazor, SharpIdeRazorSpanKind.Code, s.CsharpClassificationType)), ..semanticRangeRazorSpans ]; - sharpIdeRazorSpans = sharpIdeRazorSpans.OrderBy(s => s.Span.AbsoluteIndex).ToList(); + var result = sharpIdeRazorSpans.OrderBy(s => s.Span.AbsoluteIndex).ToImmutableArray(); timer.Stop(); 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 - public static async Task> GetDocumentSyntaxHighlighting(SharpIdeFile fileModel, CancellationToken cancellationToken = default) + public static async Task> GetDocumentSyntaxHighlighting(SharpIdeFile fileModel, CancellationToken cancellationToken = default) { using var _ = SharpIdeOtel.Source.StartActivity($"{nameof(RoslynAnalysis)}.{nameof(GetDocumentSyntaxHighlighting)}"); await _solutionLoadedTcs.Task; @@ -459,7 +459,7 @@ public static class RoslynAnalysis var root = await syntaxTree!.GetRootAsync(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; } diff --git a/src/SharpIDE.Godot/Features/CodeEditor/CustomSyntaxHighlighter.cs b/src/SharpIDE.Godot/Features/CodeEditor/CustomSyntaxHighlighter.cs index 34545ac..32e5e1b 100644 --- a/src/SharpIDE.Godot/Features/CodeEditor/CustomSyntaxHighlighter.cs +++ b/src/SharpIDE.Godot/Features/CodeEditor/CustomSyntaxHighlighter.cs @@ -17,19 +17,19 @@ public partial class CustomHighlighter : SyntaxHighlighter private System.Collections.Generic.Dictionary> _classifiedSpansByLine = []; - public void SetHighlightingData(IEnumerable classifiedSpans, IEnumerable razorClassifiedSpans) + public void SetHighlightingData(ImmutableArray classifiedSpans, ImmutableArray razorClassifiedSpans) { // separate each line here var razorSpansForLine = razorClassifiedSpans .Where(s => s.Span.Length is not 0) - .GroupBy(s => s.Span.LineIndex) - .ToList(); - _razorClassifiedSpansByLine = razorSpansForLine.ToDictionary(g => g.Key, g => g.ToImmutableArray()); + .GroupBy(s => s.Span.LineIndex); + _razorClassifiedSpansByLine = razorSpansForLine.ToDictionary(g => g.Key, g => g.ToImmutableArray()); + var spansGroupedByFileSpan = classifiedSpans .Where(s => s.ClassifiedSpan.TextSpan.Length is not 0) - .GroupBy(span => span.FileSpan.Start.Line) - .ToList(); + .GroupBy(span => span.FileSpan.Start.Line); + _classifiedSpansByLine = spansGroupedByFileSpan.ToDictionary(g => g.Key, g => g.ToImmutableArray()); } diff --git a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs index 8f64461..cd0cfb8 100644 --- a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs +++ b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs @@ -454,7 +454,7 @@ public partial class SharpIdeCodeEdit : CodeEdit } [RequiresGodotUiThread] - private void SetSyntaxHighlightingModel(IEnumerable classifiedSpans, IEnumerable razorClassifiedSpans) + private void SetSyntaxHighlightingModel(ImmutableArray classifiedSpans, ImmutableArray razorClassifiedSpans) { _syntaxHighlighter.SetHighlightingData(classifiedSpans, razorClassifiedSpans); //_syntaxHighlighter.ClearHighlightingCache();