use ImmutableArray
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user