Skip to content

Commit eb0abf7

Browse files
perf: fast comparison using FullSpan and source code
1 parent d8eed86 commit eb0abf7

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

Src/CSharpier.Cli/CommandLineFormatter.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,10 @@ CancellationToken cancellationToken
479479
{
480480
IFormattingValidator? formattingValidator = null;
481481

482-
if (printerOptions.Formatter is Formatter.CSharp or Formatter.CSharpScript)
482+
if (
483+
printerOptions.Formatter is Formatter.CSharp or Formatter.CSharpScript
484+
&& fileToFormatInfo.FileContents != codeFormattingResult.Code
485+
)
483486
{
484487
var sourceCodeKind =
485488
printerOptions.Formatter is Formatter.CSharpScript

Src/CSharpier.Core/CSharp/SyntaxNodeComparer.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,17 @@ private CompareResult Compare(SyntaxTrivia originalTrivia, SyntaxTrivia formatte
322322
: NotEqual(originalTrivia.Span, formattedTrivia.Span);
323323
}
324324

325+
private bool CompareFullSpan(SyntaxNode originalStart, SyntaxNode formattedStart)
326+
{
327+
var originalSpan = OriginalSourceCode
328+
.AsSpan()
329+
.Slice(originalStart.FullSpan.Start, originalStart.FullSpan.Length);
330+
var formattedSpan = NewSourceCode
331+
.AsSpan()
332+
.Slice(formattedStart.FullSpan.Start, formattedStart.FullSpan.Length);
333+
return originalSpan == formattedSpan;
334+
}
335+
325336
private static CompareResult CompareComment(
326337
string originalComment,
327338
string formattedComment,

Src/CSharpier.Generators/SyntaxNodeComparerGenerator.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,18 @@ private static void GenerateMethod(StringBuilder sourceBuilder, INamedTypeSymbol
141141
"""
142142
);
143143

144+
if (
145+
type.BaseType?.ToDisplayString()
146+
== "Microsoft.CodeAnalysis.CSharp.Syntax.TypeDeclarationSyntax"
147+
|| type.ToDisplayString()
148+
== "Microsoft.CodeAnalysis.CSharp.Syntax.MethodDeclarationSyntax"
149+
)
150+
{
151+
sourceBuilder.AppendLine(
152+
$" if (CompareFullSpan(originalNode, formattedNode)) return Equal;"
153+
);
154+
}
155+
144156
foreach (var propertySymbol in type.GetAllProperties().OrderBy(o => o.Name))
145157
{
146158
var propertyName = propertySymbol.Name;

0 commit comments

Comments
 (0)