Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: convert Node.Print to use switch (node.Kind()) #1509

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
198 changes: 192 additions & 6 deletions Src/CSharpier.Generators/NodePrinterGenerator.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System.IO;
using System.Linq;
using Generators;
using Generators;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace CSharpier.Generators;

Expand All @@ -10,6 +10,188 @@ public class NodePrinterGenerator : TemplatedGenerator
{
protected override string SourceName => "Node";

private static Dictionary<string, string[]> SpecialCase = new()
{
{
nameof(AssignmentExpressionSyntax),
new[]
{
nameof(SyntaxKind.SimpleAssignmentExpression),
nameof(SyntaxKind.AddAssignmentExpression),
nameof(SyntaxKind.SubtractAssignmentExpression),
nameof(SyntaxKind.MultiplyAssignmentExpression),
nameof(SyntaxKind.DivideAssignmentExpression),
nameof(SyntaxKind.ModuloAssignmentExpression),
nameof(SyntaxKind.AndAssignmentExpression),
nameof(SyntaxKind.ExclusiveOrAssignmentExpression),
nameof(SyntaxKind.OrAssignmentExpression),
nameof(SyntaxKind.LeftShiftAssignmentExpression),
nameof(SyntaxKind.RightShiftAssignmentExpression),
nameof(SyntaxKind.UnsignedRightShiftAssignmentExpression),
nameof(SyntaxKind.CoalesceAssignmentExpression),
}
},
{
nameof(BaseExpressionColonSyntax),
new[] { nameof(SyntaxKind.ExpressionColon), nameof(SyntaxKind.NameColon) }
},
{
nameof(BaseFieldDeclarationSyntax),
new[] { nameof(SyntaxKind.FieldDeclaration), nameof(SyntaxKind.EventFieldDeclaration) }
},
{
nameof(BaseMethodDeclarationSyntax),
new[]
{
nameof(SyntaxKind.MethodDeclaration),
nameof(SyntaxKind.OperatorDeclaration),
nameof(SyntaxKind.ConversionOperatorDeclaration),
nameof(SyntaxKind.ConstructorDeclaration),
nameof(SyntaxKind.DestructorDeclaration),
}
},
{
nameof(BasePropertyDeclarationSyntax),
new[]
{
nameof(SyntaxKind.PropertyDeclaration),
nameof(SyntaxKind.EventDeclaration),
nameof(SyntaxKind.IndexerDeclaration),
}
},
{
nameof(BaseTypeDeclarationSyntax),
new[]
{
nameof(SyntaxKind.ClassDeclaration),
nameof(SyntaxKind.StructDeclaration),
nameof(SyntaxKind.InterfaceDeclaration),
nameof(SyntaxKind.RecordDeclaration),
nameof(SyntaxKind.RecordStructDeclaration),
nameof(SyntaxKind.EnumDeclaration),
}
},
{
nameof(BinaryExpressionSyntax),
new[]
{
nameof(SyntaxKind.AddExpression),
nameof(SyntaxKind.SubtractExpression),
nameof(SyntaxKind.MultiplyExpression),
nameof(SyntaxKind.DivideExpression),
nameof(SyntaxKind.ModuloExpression),
nameof(SyntaxKind.LeftShiftExpression),
nameof(SyntaxKind.RightShiftExpression),
nameof(SyntaxKind.UnsignedRightShiftExpression),
nameof(SyntaxKind.LogicalOrExpression),
nameof(SyntaxKind.LogicalAndExpression),
nameof(SyntaxKind.BitwiseOrExpression),
nameof(SyntaxKind.BitwiseAndExpression),
nameof(SyntaxKind.ExclusiveOrExpression),
nameof(SyntaxKind.EqualsExpression),
nameof(SyntaxKind.NotEqualsExpression),
nameof(SyntaxKind.LessThanExpression),
nameof(SyntaxKind.LessThanOrEqualExpression),
nameof(SyntaxKind.GreaterThanExpression),
nameof(SyntaxKind.GreaterThanOrEqualExpression),
nameof(SyntaxKind.IsExpression),
nameof(SyntaxKind.AsExpression),
nameof(SyntaxKind.CoalesceExpression),
}
},
{
nameof(BinaryPatternSyntax),
new[] { nameof(SyntaxKind.OrPattern), nameof(SyntaxKind.AndPattern) }
},
{
nameof(CheckedExpressionSyntax),
new[] { nameof(SyntaxKind.CheckedExpression), nameof(SyntaxKind.UncheckedExpression) }
},
{
nameof(CheckedStatementSyntax),
new[] { nameof(SyntaxKind.CheckedStatement), nameof(SyntaxKind.UncheckedStatement) }
},
{
nameof(ClassOrStructConstraintSyntax),
new[] { nameof(SyntaxKind.ClassConstraint), nameof(SyntaxKind.StructConstraint) }
},
{
nameof(CommonForEachStatementSyntax),
new[]
{
nameof(SyntaxKind.ForEachStatement),
nameof(SyntaxKind.ForEachVariableStatement),
}
},
{
nameof(InitializerExpressionSyntax),
new[]
{
nameof(SyntaxKind.ObjectInitializerExpression),
nameof(SyntaxKind.CollectionInitializerExpression),
nameof(SyntaxKind.ArrayInitializerExpression),
nameof(SyntaxKind.ComplexElementInitializerExpression),
nameof(SyntaxKind.WithInitializerExpression),
}
},
{
nameof(LiteralExpressionSyntax),
new[]
{
nameof(SyntaxKind.ArgListExpression),
nameof(SyntaxKind.NumericLiteralExpression),
nameof(SyntaxKind.StringLiteralExpression),
nameof(SyntaxKind.Utf8StringLiteralExpression),
nameof(SyntaxKind.CharacterLiteralExpression),
nameof(SyntaxKind.TrueLiteralExpression),
nameof(SyntaxKind.FalseLiteralExpression),
nameof(SyntaxKind.NullLiteralExpression),
nameof(SyntaxKind.DefaultLiteralExpression),
}
},
{
nameof(MemberAccessExpressionSyntax),
new[]
{
nameof(SyntaxKind.SimpleMemberAccessExpression),
nameof(SyntaxKind.PointerMemberAccessExpression),
}
},
{
nameof(PostfixUnaryExpressionSyntax),
new[]
{
nameof(SyntaxKind.PostIncrementExpression),
nameof(SyntaxKind.PostDecrementExpression),
nameof(SyntaxKind.SuppressNullableWarningExpression),
}
},
{
nameof(PrefixUnaryExpressionSyntax),
new[]
{
nameof(SyntaxKind.UnaryPlusExpression),
nameof(SyntaxKind.UnaryMinusExpression),
nameof(SyntaxKind.BitwiseNotExpression),
nameof(SyntaxKind.LogicalNotExpression),
nameof(SyntaxKind.PreIncrementExpression),
nameof(SyntaxKind.PreDecrementExpression),
nameof(SyntaxKind.AddressOfExpression),
nameof(SyntaxKind.PointerIndirectionExpression),
nameof(SyntaxKind.IndexExpression),
}
},
{ nameof(UnaryPatternSyntax), new[] { nameof(SyntaxKind.NotPattern) } },
{
nameof(YieldStatementSyntax),
new[]
{
nameof(SyntaxKind.YieldReturnStatement),
nameof(SyntaxKind.YieldBreakStatement),
}
},
};

protected override object GetModel(GeneratorExecutionContext context)
{
var nodeTypes = context
Expand All @@ -18,12 +200,16 @@ protected override object GetModel(GeneratorExecutionContext context)
.Select(fileName => new
{
PrinterName = fileName,
SyntaxNodeName = fileName + "Syntax",
VariableName = char.ToLower(fileName[0]) + fileName[1..],
SyntaxNodeName = $"{fileName}Syntax",
SyntaxKinds = SpecialCase.TryGetValue($"{fileName}Syntax", out var kinds)
? string.Join(" or ", kinds.Select(x => $"SyntaxKind.{x}"))
: $"SyntaxKind.{fileName}",
})
.OrderBy(o => o.SyntaxNodeName)
.ToArray();

return new { NodeTypes = nodeTypes };
var syntaxNodeTypes = string.Join(" or ", nodeTypes.Select(x => x.SyntaxNodeName));

return new { NodeTypes = nodeTypes, SyntaxNodeTypes = syntaxNodeTypes };
}
}
8 changes: 5 additions & 3 deletions Src/CSharpier.Generators/NodePrinterGenerator.sbntxt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Diagnostics;
using CSharpier.DocTypes;
using CSharpier.SyntaxPrinter;
using CSharpier.SyntaxPrinter.SyntaxNodePrinters;
Expand Down Expand Up @@ -29,13 +30,14 @@ namespace CSharpier.SyntaxPrinter
context.State.PrintingDepth++;
try
{
switch (syntaxNode)
switch ((SyntaxKind)syntaxNode.RawKind)
{
{{- for nodeType in NodeTypes }}
case {{ nodeType.SyntaxNodeName }} {{ nodeType.VariableName }}:
return {{ nodeType.PrinterName }}.Print({{ nodeType.VariableName }}, context);
case {{ nodeType.SyntaxKinds }}:
return {{ nodeType.PrinterName }}.Print(({{ nodeType.SyntaxNodeName }})syntaxNode, context);
{{- end }}
default:
Debug.Assert(syntaxNode is not ({{- SyntaxNodeTypes -}}));
return UnhandledNode.Print(syntaxNode, context);
}
}
Expand Down