Skip to content

Commit d2dc159

Browse files
committed
C# enums => JS const objects.
Added modulus/percent token. C# .? => JS .? C# ?? => JS ?? Lambda "()=>..." in arguments. Variable declaration with comma. C# Console.Write => JS console.log C# List.FindLast => JS Array.findLast C# string.Length => JS string.length C# Math.Sqrt => JS Math.sqrt
1 parent 13cf989 commit d2dc159

File tree

1 file changed

+159
-15
lines changed

1 file changed

+159
-15
lines changed

CSharpToJavaScript/Walker.cs

Lines changed: 159 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ internal class Walker : CSharpSyntaxWalker, ILog
3333
private bool _PropertyStatic = false;
3434
private bool _ConstKeyword = false;
3535

36+
private int _EnumMembers = 0;
37+
3638
public Walker(CSTOJSOptions options, SemanticModel? model) : base(SyntaxWalkerDepth.Trivia)
3739
{
3840
_Log = this;
@@ -125,6 +127,8 @@ public override void VisitToken(SyntaxToken token)
125127
case SyntaxKind.QuestionToken:
126128
case SyntaxKind.LessThanEqualsToken:
127129
case SyntaxKind.ConstKeyword:
130+
case SyntaxKind.PercentToken:
131+
case SyntaxKind.QuestionQuestionToken:
128132
case SyntaxKind.EndOfFileToken:
129133
{
130134
VisitLeadingTrivia(token);
@@ -227,7 +231,6 @@ public override void VisitClassDeclaration(ClassDeclarationSyntax node)
227231
switch (kind)
228232
{
229233
case SyntaxKind.InternalKeyword:
230-
break;
231234
case SyntaxKind.PublicKeyword:
232235
VisitLeadingTrivia(asToken);
233236
break;
@@ -516,6 +519,7 @@ public override void VisitExpressionStatement(ExpressionStatementSyntax node)
516519

517520
switch (kind)
518521
{
522+
case SyntaxKind.ConditionalAccessExpression:
519523
case SyntaxKind.PostDecrementExpression:
520524
case SyntaxKind.InvocationExpression:
521525
case SyntaxKind.SimpleAssignmentExpression:
@@ -570,6 +574,8 @@ public override void VisitArgument(ArgumentSyntax node)
570574

571575
switch (kind)
572576
{
577+
case SyntaxKind.SimpleLambdaExpression:
578+
case SyntaxKind.SubtractExpression:
573579
case SyntaxKind.EqualsExpression:
574580
case SyntaxKind.AsExpression:
575581
case SyntaxKind.MultiplyExpression:
@@ -592,21 +598,15 @@ public override void VisitArgument(ArgumentSyntax node)
592598
VisitImplicitObjectCreationExpression(asNode as ImplicitObjectCreationExpressionSyntax);
593599
break;
594600
case SyntaxKind.AnonymousObjectCreationExpression:
595-
{
596-
VisitAnonymousObjectCreationExpression(asNode as AnonymousObjectCreationExpressionSyntax);
597-
break;
598-
}
601+
VisitAnonymousObjectCreationExpression(asNode as AnonymousObjectCreationExpressionSyntax);
602+
break;
599603
case SyntaxKind.SimpleMemberAccessExpression:
600604
case SyntaxKind.ElementAccessExpression:
601-
{
602-
Visit(asNode);
603-
break;
604-
}
605+
Visit(asNode);
606+
break;
605607
case SyntaxKind.IdentifierName:
606-
{
607-
VisitIdentifierName(asNode as IdentifierNameSyntax);
608-
break;
609-
}
608+
VisitIdentifierName(asNode as IdentifierNameSyntax);
609+
break;
610610
default:
611611
_Log.ErrorLine($"asNode : {kind}");
612612
break;
@@ -671,6 +671,121 @@ public override void VisitAnonymousObjectCreationExpression(AnonymousObjectCreat
671671
}
672672
}
673673

674+
public override void VisitEnumDeclaration(EnumDeclarationSyntax node)
675+
{
676+
ChildSyntaxList nodesAndTokens = node.ChildNodesAndTokens();
677+
678+
for (int i = 0; i < nodesAndTokens.Count; i++)
679+
{
680+
SyntaxNode? asNode = nodesAndTokens[i].AsNode();
681+
682+
if (asNode != null)
683+
{
684+
SyntaxKind kind = asNode.Kind();
685+
686+
switch (kind)
687+
{
688+
case SyntaxKind.EnumMemberDeclaration:
689+
VisitEnumMemberDeclaration(asNode as EnumMemberDeclarationSyntax);
690+
break;
691+
default:
692+
_Log.ErrorLine($"asNode : {kind}");
693+
break;
694+
}
695+
}
696+
else
697+
{
698+
SyntaxToken asToken = nodesAndTokens[i].AsToken();
699+
SyntaxKind kind = asToken.Kind();
700+
701+
switch (kind)
702+
{
703+
case SyntaxKind.PrivateKeyword:
704+
case SyntaxKind.PublicKeyword:
705+
VisitLeadingTrivia(asToken);
706+
break;
707+
case SyntaxKind.EnumKeyword:
708+
{
709+
VisitLeadingTrivia(asToken);
710+
JSSB.Append("const");
711+
VisitTrailingTrivia(asToken);
712+
break;
713+
}
714+
case SyntaxKind.IdentifierToken:
715+
VisitLeadingTrivia(asToken);
716+
VisitToken(asToken.WithoutTrivia());
717+
JSSB.Append(" = ");
718+
VisitTrailingTrivia(asToken);
719+
break;
720+
case SyntaxKind.CommaToken:
721+
case SyntaxKind.OpenBraceToken:
722+
VisitToken(asToken);
723+
break;
724+
case SyntaxKind.CloseBraceToken:
725+
{
726+
VisitToken(asToken);
727+
_EnumMembers = 0;
728+
break;
729+
}
730+
default:
731+
_Log.ErrorLine($"asToken : {kind}");
732+
break;
733+
}
734+
}
735+
}
736+
}
737+
738+
public override void VisitEnumMemberDeclaration(EnumMemberDeclarationSyntax node)
739+
{
740+
ChildSyntaxList nodesAndTokens = node.ChildNodesAndTokens();
741+
742+
for (int i = 0; i < nodesAndTokens.Count; i++)
743+
{
744+
SyntaxNode? asNode = nodesAndTokens[i].AsNode();
745+
746+
if (asNode != null)
747+
{
748+
SyntaxKind kind = asNode.Kind();
749+
750+
switch (kind)
751+
{
752+
case SyntaxKind.EqualsValueClause:
753+
JSSB.Append(": ");
754+
VisitLiteralExpression(((asNode as EqualsValueClauseSyntax).Value as LiteralExpressionSyntax));
755+
break;
756+
default:
757+
_Log.ErrorLine($"asNode : {kind}");
758+
break;
759+
}
760+
}
761+
else
762+
{
763+
SyntaxToken asToken = nodesAndTokens[i].AsToken();
764+
SyntaxKind kind = asToken.Kind();
765+
766+
switch (kind)
767+
{
768+
case SyntaxKind.IdentifierToken:
769+
{
770+
if (nodesAndTokens.Count == 1)
771+
{
772+
VisitLeadingTrivia(asToken);
773+
VisitToken(asToken.WithoutTrivia());
774+
JSSB.Append($" : {_EnumMembers++}");
775+
VisitTrailingTrivia(asToken);
776+
}
777+
else
778+
VisitToken(asToken);
779+
break;
780+
}
781+
default:
782+
_Log.ErrorLine($"asToken : {kind}");
783+
break;
784+
}
785+
}
786+
}
787+
}
788+
674789
public override void VisitNameEquals(NameEqualsSyntax node)
675790
{
676791
ChildSyntaxList nodesAndTokens = node.ChildNodesAndTokens();
@@ -1240,6 +1355,7 @@ public override void VisitVariableDeclaration(VariableDeclarationSyntax node)
12401355

12411356
switch (kind)
12421357
{
1358+
case SyntaxKind.CommaToken:
12431359
case SyntaxKind.SemicolonToken:
12441360
VisitToken(asToken);
12451361
break;
@@ -1563,6 +1679,7 @@ public override void VisitParenthesizedExpression(ParenthesizedExpressionSyntax
15631679

15641680
switch (kind)
15651681
{
1682+
case SyntaxKind.CoalesceExpression:
15661683
case SyntaxKind.LogicalOrExpression:
15671684
case SyntaxKind.AddExpression:
15681685
Visit(asNode);
@@ -1621,6 +1738,7 @@ public override void VisitCastExpression(CastExpressionSyntax node)
16211738
{
16221739
case SyntaxKind.PredefinedType:
16231740
break;
1741+
case SyntaxKind.InvocationExpression:
16241742
case SyntaxKind.SimpleMemberAccessExpression:
16251743
Visit(asNode);
16261744
break;
@@ -2518,7 +2636,9 @@ private bool BuiltInTypesGenerics(SyntaxNode nodeL, ISymbol symbol)
25182636
JSSB.Append($"{toAttribute.Convert(node.Identifier.Text)}");
25192637
return true;
25202638
}
2521-
case string _str when _str.Contains(nameof(Console.WriteLine)):
2639+
case string _str when
2640+
_str.Contains(nameof(Console.WriteLine)) ||
2641+
_str.Contains(nameof(Console.Write)):
25222642
{
25232643
JSSB.Append($"log");
25242644
return true;
@@ -2538,7 +2658,9 @@ private bool BuiltInTypesGenerics(SyntaxNode nodeL, ISymbol symbol)
25382658
JSSB.Append($"Array");
25392659
return true;
25402660
}
2541-
case string _str when _str.Contains(nameof(List<dynamic>.Sort)):
2661+
case string _str when
2662+
_str.Contains(nameof(List<dynamic>.Sort)) ||
2663+
_str.Contains(nameof(List<dynamic>.FindLast)):
25422664
{
25432665
toAttribute.To = ToAttribute.FirstCharToLowerCase;
25442666
JSSB.Append($"{toAttribute.Convert(node.Identifier.Text)}");
@@ -2575,6 +2697,7 @@ private bool BuiltInTypesGenerics(SyntaxNode nodeL, ISymbol symbol)
25752697
return true;
25762698
}
25772699
case string _str when
2700+
_str.Contains(nameof(string.Length)) ||
25782701
_str.Contains(nameof(string.Trim)) ||
25792702
_str.Contains(nameof(string.Substring)) ||
25802703
_str.Contains(nameof(string.StartsWith)) ||
@@ -2620,6 +2743,27 @@ private bool BuiltInTypesGenerics(SyntaxNode nodeL, ISymbol symbol)
26202743
return false;
26212744
}
26222745
}
2746+
case string str when str.Contains(nameof(Math)):
2747+
{
2748+
string _name = symbol.Name;
2749+
switch (_name)
2750+
{
2751+
case string _str when _str == typeName:
2752+
{
2753+
JSSB.Append(nameof(Math));
2754+
return true;
2755+
}
2756+
case string _str when _str.Contains(nameof(Math.Sqrt)):
2757+
{
2758+
toAttribute.To = ToAttribute.FirstCharToLowerCase;
2759+
JSSB.Append($"{toAttribute.Convert(node.Identifier.Text)}");
2760+
return true;
2761+
}
2762+
default:
2763+
_Log.WarningLine($"WARNING! node: \"{node}\", typeSymbol: \"{typeSymbol}\", symbol: \"{symbol}\", Is not supported! USE \"CustomCSNamesToJS\"");
2764+
return false;
2765+
}
2766+
}
26232767
default:
26242768
_Log.WarningLine($"WARNING! typeSymbol: \"{typeSymbol}\" Is not supported! USE \"CustomCSNamesToJS\"");
26252769
return false;

0 commit comments

Comments
 (0)