Skip to content

Commit 29b1e39

Browse files
perf: check for // csharpier-ignore
1 parent 196050a commit 29b1e39

File tree

11 files changed

+103
-45
lines changed

11 files changed

+103
-45
lines changed

Src/CSharpier.Core/CSharp/CSharpFormatter.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public static Task<CodeFormatterResult> FormatAsync(
4444
syntaxTree,
4545
(options ?? new()).ToPrinterOptions(),
4646
SourceCodeKind.Regular,
47-
true,
47+
new PrintingContext.CodeInformation(true, true),
4848
cancellationToken
4949
);
5050
}
@@ -68,13 +68,14 @@ CancellationToken cancellationToken
6868
)
6969
{
7070
var initialSymbolSet = Array.Empty<string>();
71-
var hasPreprocessorSymbols = code.Contains("#if");
71+
72+
var codeInformation = CSharpScanner.Scan(code);
7273

7374
return FormatAsync(
7475
ParseText(code, initialSymbolSet, sourceCodeKind, cancellationToken),
7576
printerOptions,
7677
sourceCodeKind,
77-
hasPreprocessorSymbols,
78+
codeInformation,
7879
cancellationToken
7980
);
8081
}
@@ -102,7 +103,7 @@ internal static async Task<CodeFormatterResult> FormatAsync(
102103
SyntaxTree syntaxTree,
103104
PrinterOptions printerOptions,
104105
SourceCodeKind sourceCodeKind,
105-
bool hasPreprocessorSymbols,
106+
PrintingContext.CodeInformation information,
106107
CancellationToken cancellationToken
107108
)
108109
{
@@ -160,6 +161,7 @@ bool TryGetCompilationFailure(out CodeFormatterResult compilationResult)
160161
IndentSize = printerOptions.IndentSize,
161162
UseTabs = printerOptions.UseTabs,
162163
},
164+
Information = information,
163165
};
164166
var document = Node.Print(rootNode, printingContext);
165167
var formattedCode = DocPrinter.DocPrinter.Print(document, printerOptions, lineEnding);
@@ -169,7 +171,7 @@ bool TryGetCompilationFailure(out CodeFormatterResult compilationResult)
169171
.ReorderedUsingsWithDisabledText;
170172
var movedTrailingTrivia = printingContext.State.MovedTrailingTrivia;
171173

172-
if (hasPreprocessorSymbols)
174+
if (printingContext.Information.HasPreprocessorSymbols)
173175
{
174176
foreach (var symbolSet in PreprocessorSymbols.GetSets(syntaxTree))
175177
{
@@ -193,6 +195,7 @@ bool TryGetCompilationFailure(out CodeFormatterResult compilationResult)
193195
IndentSize = printerOptions.IndentSize,
194196
UseTabs = printerOptions.UseTabs,
195197
},
198+
Information = printingContext.Information,
196199
};
197200
document = Node.Print(
198201
await syntaxTree.GetRootAsync(cancellationToken),
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System.Buffers;
2+
using CSharpier.Core.CSharp.SyntaxPrinter;
3+
4+
namespace CSharpier.Core.CSharp;
5+
6+
internal static class CSharpScanner
7+
{
8+
private const string IfPreprocessor = "#if";
9+
private const string CSharpierIgnore = "// csharpier-ignore";
10+
11+
#if NET9_0_OR_GREATER
12+
private static readonly SearchValues<string> KeyValues = SearchValues.Create([IfPreprocessor, CSharpierIgnore], StringComparison.Ordinal);
13+
public static PrintingContext.CodeInformation Scan(string code)
14+
{
15+
var index = code.AsSpan().IndexOfAny(KeyValues);
16+
if (index < 0)
17+
{
18+
return new PrintingContext.CodeInformation(false, false);
19+
}
20+
21+
var slice = code.AsSpan(index);
22+
if (slice.StartsWith(IfPreprocessor))
23+
{
24+
return new PrintingContext.CodeInformation(true, slice.Contains(CSharpierIgnore.AsSpan(), StringComparison.Ordinal));
25+
}
26+
27+
return new PrintingContext.CodeInformation(slice.Contains(IfPreprocessor.AsSpan(), StringComparison.Ordinal), true);
28+
}
29+
#else
30+
public static PrintingContext.CodeInformation Scan(string code)
31+
{
32+
var hasPreprocessor = code.Contains(IfPreprocessor);
33+
var hasCSharpierIgnore = code.Contains(CSharpierIgnore);
34+
return new PrintingContext.CodeInformation(hasPreprocessor, hasCSharpierIgnore);
35+
}
36+
#endif
37+
}

Src/CSharpier.Core/CSharp/SyntaxPrinter/CSharpierIgnore.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,18 @@ PrintingContext context
7878

7979
foreach (var node in list)
8080
{
81-
if (Token.HasLeadingCommentMatching(node, IgnoreEndRegex))
81+
if (context.Information.HasCSharpierIgnore)
8282
{
83-
statements.Add(unFormattedCode.AsSpan().Trim().ToString());
84-
unFormattedCode.Clear();
85-
printUnformatted = false;
86-
}
87-
else if (Token.HasLeadingCommentMatching(node, IgnoreStartRegex))
88-
{
89-
printUnformatted = true;
83+
if (Token.HasLeadingCommentMatching(node, IgnoreEndRegex))
84+
{
85+
statements.Add(unFormattedCode.AsSpan().Trim().ToString());
86+
unFormattedCode.Clear();
87+
printUnformatted = false;
88+
}
89+
else if (Token.HasLeadingCommentMatching(node, IgnoreStartRegex))
90+
{
91+
printUnformatted = true;
92+
}
9093
}
9194

9295
if (printUnformatted)

Src/CSharpier.Core/CSharp/SyntaxPrinter/MembersWithForcedLines.cs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,21 +34,24 @@ public static List<Doc> Print<T>(
3434
var skipAddingLineBecauseIgnoreEnded = false;
3535
var member = members[memberIndex];
3636

37-
if (Token.HasLeadingCommentMatching(member, CSharpierIgnore.IgnoreEndRegex))
37+
if (context.Information.HasCSharpierIgnore)
3838
{
39-
skipAddingLineBecauseIgnoreEnded = true;
40-
result.Add(unFormattedCode.AsSpan().Trim().ToString());
41-
unFormattedCode.Clear();
42-
printUnformatted = false;
43-
}
44-
else if (Token.HasLeadingCommentMatching(member, CSharpierIgnore.IgnoreStartRegex))
45-
{
46-
if (!printUnformatted && memberIndex > 0)
39+
if (Token.HasLeadingCommentMatching(member, CSharpierIgnore.IgnoreEndRegex))
40+
{
41+
skipAddingLineBecauseIgnoreEnded = true;
42+
result.Add(unFormattedCode.AsSpan().Trim().ToString());
43+
unFormattedCode.Clear();
44+
printUnformatted = false;
45+
}
46+
else if (Token.HasLeadingCommentMatching(member, CSharpierIgnore.IgnoreStartRegex))
4747
{
48-
result.Add(Doc.HardLine);
49-
result.Add(ExtraNewLines.Print(member));
48+
if (!printUnformatted && memberIndex > 0)
49+
{
50+
result.Add(Doc.HardLine);
51+
result.Add(ExtraNewLines.Print(member));
52+
}
53+
printUnformatted = true;
5054
}
51-
printUnformatted = true;
5255
}
5356

5457
if (printUnformatted)

Src/CSharpier.Core/CSharp/SyntaxPrinter/PrintingContext.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ namespace CSharpier.Core.CSharp.SyntaxPrinter;
77
internal class PrintingContext
88
{
99
public required PrintingContextOptions Options { get; init; }
10+
public required CodeInformation Information { get; init; }
1011
public PrintingContextState State { get; } = new();
1112

1213
private readonly Dictionary<string, int> groupNumberByValue = [];
@@ -59,4 +60,6 @@ public class PrintingContextState
5960
}
6061

6162
public record TrailingCommaContext(SyntaxTrivia TrailingComment, Doc PrintedTrailingComma);
63+
64+
public record struct CodeInformation(bool HasPreprocessorSymbols, bool HasCSharpierIgnore);
6265
}

Src/CSharpier.Core/CSharp/SyntaxPrinter/SeparatedSyntaxList.cs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,19 +56,22 @@ private static Doc Print<T>(
5656
{
5757
var member = list[x];
5858

59-
if (Token.HasLeadingCommentMatching(member, CSharpierIgnore.IgnoreEndRegex))
59+
if (context.Information.HasCSharpierIgnore)
6060
{
61-
docs.Append(unFormattedCode.AsSpan().Trim().ToString());
62-
unFormattedCode.Clear();
63-
printUnformatted = false;
64-
}
65-
else if (Token.HasLeadingCommentMatching(member, CSharpierIgnore.IgnoreStartRegex))
66-
{
67-
if (!printUnformatted && x > 0)
61+
if (Token.HasLeadingCommentMatching(member, CSharpierIgnore.IgnoreEndRegex))
62+
{
63+
docs.Append(unFormattedCode.AsSpan().Trim().ToString());
64+
unFormattedCode.Clear();
65+
printUnformatted = false;
66+
}
67+
else if (Token.HasLeadingCommentMatching(member, CSharpierIgnore.IgnoreStartRegex))
6868
{
69-
docs.Append(Doc.HardLine);
69+
if (!printUnformatted && x > 0)
70+
{
71+
docs.Append(Doc.HardLine);
72+
}
73+
printUnformatted = true;
7074
}
71-
printUnformatted = true;
7275
}
7376

7477
if (printUnformatted)

Src/CSharpier.Core/CSharp/SyntaxPrinter/SyntaxNodePrinters/AttributeList.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ internal static class AttributeList
88
{
99
public static Doc Print(AttributeListSyntax node, PrintingContext context)
1010
{
11-
if (node.Parent is BaseMethodDeclarationSyntax && CSharpierIgnore.HasIgnoreComment(node))
11+
if (context.Information.HasCSharpierIgnore && node.Parent is BaseMethodDeclarationSyntax && CSharpierIgnore.HasIgnoreComment(node))
1212
{
1313
return CSharpierIgnore.PrintWithoutFormatting(node, context).Trim();
1414
}

Src/CSharpier.Core/CSharp/SyntaxPrinter/SyntaxNodePrinters/BaseMethodDeclaration.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,19 +118,22 @@ void PrintMethodUnformattedWithoutAttributes(SyntaxTriviaList syntaxTriviaList)
118118
);
119119
}
120120

121-
if (modifiers is { Count: > 0 })
121+
if (context.Information.HasCSharpierIgnore)
122122
{
123-
if (CSharpierIgnore.HasIgnoreComment(modifiers.Value[0]))
123+
if (modifiers is { Count: > 0 })
124124
{
125-
PrintMethodUnformattedWithoutAttributes(modifiers.Value[0].LeadingTrivia);
125+
if (CSharpierIgnore.HasIgnoreComment(modifiers.Value[0]))
126+
{
127+
PrintMethodUnformattedWithoutAttributes(modifiers.Value[0].LeadingTrivia);
128+
return Doc.Group(docs);
129+
}
130+
}
131+
else if (returnType is not null && CSharpierIgnore.HasIgnoreComment(returnType))
132+
{
133+
PrintMethodUnformattedWithoutAttributes(returnType.GetLeadingTrivia());
126134
return Doc.Group(docs);
127135
}
128136
}
129-
else if (returnType is not null && CSharpierIgnore.HasIgnoreComment(returnType))
130-
{
131-
PrintMethodUnformattedWithoutAttributes(returnType.GetLeadingTrivia());
132-
return Doc.Group(docs);
133-
}
134137
}
135138

136139
if (modifiers is { Count: > 0 })

Src/CSharpier.Core/Xml/XmlFormatter.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ PrinterOptions printerOptions
3636
IndentSize = printerOptions.IndentSize,
3737
UseTabs = printerOptions.UseTabs,
3838
},
39+
Information = new PrintingContext.CodeInformation(false, false)
3940
};
4041
var doc = Node.Print(rootNode, printingContext);
4142
var formattedXml = DocPrinter.DocPrinter.Print(doc, printerOptions, lineEnding);

Src/CSharpier.Generators/NodePrinterGenerator.sbntxt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace CSharpier.Core.CSharp.SyntaxPrinter
2424
throw new InTooDeepException();
2525
}
2626

27-
if (CSharpierIgnore.IsNodeIgnored(syntaxNode))
27+
if (context.Information.HasCSharpierIgnore && CSharpierIgnore.IsNodeIgnored(syntaxNode))
2828
{
2929
return CSharpierIgnore.PrintWithoutFormatting(syntaxNode, context).Trim();
3030
}

0 commit comments

Comments
 (0)