Skip to content

Commit de3d393

Browse files
committed
Added method "Delete" translates to the "delete" operator.
Added method "Void" translates to the "void" operator.
1 parent ee851b8 commit de3d393

File tree

2 files changed

+165
-13
lines changed

2 files changed

+165
-13
lines changed

CSharpToJavaScript/APIs/JS/GlobalObject.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,14 @@ public static bool InequalsStrict(dynamic left, dynamic right)
1414
{
1515
return left != right;
1616
}
17-
17+
[To(ToAttribute.Default)]
18+
public static bool Delete(dynamic arg)
19+
{
20+
return true;
21+
}
22+
[To(ToAttribute.Default)]
23+
public static Undefined Void(dynamic arg)
24+
{
25+
return new Undefined();
26+
}
1827
}

CSharpToJavaScript/Walker.cs

Lines changed: 155 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ public override void VisitToken(SyntaxToken token)
125125
VisitTrailingTrivia(token);
126126
return;
127127
}
128+
case SyntaxKind.InKeyword:
128129
case SyntaxKind.StaticKeyword:
129130
case SyntaxKind.TrueKeyword:
130131
case SyntaxKind.FalseKeyword:
@@ -632,7 +633,7 @@ public override void VisitBlock(BlockSyntax node)
632633
VisitLabeledStatement((LabeledStatementSyntax)asNode);
633634
break;
634635
case SyntaxKind.ForEachVariableStatement:
635-
VisitForEachStatement((ForEachStatementSyntax)asNode);
636+
VisitForEachVariableStatement((ForEachVariableStatementSyntax)asNode);
636637
break;
637638
default:
638639
Log.ErrorLine($"asNode : {kind}\n|{asNode.ToFullString()}|");
@@ -4213,10 +4214,136 @@ public override void VisitFixedStatement(FixedStatementSyntax node)
42134214
}
42144215
public override void VisitForEachVariableStatement(ForEachVariableStatementSyntax node)
42154216
{
4216-
#if DEBUG
4217-
Log.WarningLine($"Not implemented or unlikely to be implemented. Calling base! (FullSpan: {node.FullSpan}|Location{node.GetLocation().GetLineSpan()})\n|{node.ToFullString()}|");
4218-
#endif
4219-
base.VisitForEachVariableStatement(node);
4217+
if (_Options.Debug)
4218+
{
4219+
JSSB.Append("/*");
4220+
string[] strings = node.ToFullString().Split(["\r\n", "\r", "\n"], StringSplitOptions.RemoveEmptyEntries);
4221+
JSSB.Append(string.IsNullOrWhiteSpace(strings[0]) ? strings[1] : strings[0]);
4222+
JSSB.AppendLine("*/");
4223+
}
4224+
4225+
ChildSyntaxList nodesAndTokens = node.ChildNodesAndTokens();
4226+
4227+
for (int i = 0; i < nodesAndTokens.Count; i++)
4228+
{
4229+
SyntaxNode? asNode = nodesAndTokens[i].AsNode();
4230+
4231+
if (asNode != null)
4232+
{
4233+
SyntaxKind kind = asNode.Kind();
4234+
4235+
switch (kind)
4236+
{
4237+
case SyntaxKind.ExpressionStatement:
4238+
VisitExpressionStatement((ExpressionStatementSyntax)asNode);
4239+
break;
4240+
case SyntaxKind.Block:
4241+
VisitBlock((BlockSyntax)asNode);
4242+
break;
4243+
case SyntaxKind.GenericName:
4244+
case SyntaxKind.PredefinedType:
4245+
{
4246+
SyntaxTriviaList _syntaxTrivias = asNode.GetLeadingTrivia();
4247+
4248+
for (int _i = 0; _i < _syntaxTrivias.Count; _i++)
4249+
{
4250+
VisitTrivia(_syntaxTrivias[_i]);
4251+
}
4252+
4253+
if (_Options.UseVarOverLet)
4254+
JSSB.Append("var");
4255+
else
4256+
JSSB.Append("let");
4257+
4258+
_syntaxTrivias = asNode.GetTrailingTrivia();
4259+
for (int _i = 0; _i < _syntaxTrivias.Count; _i++)
4260+
{
4261+
VisitTrivia(_syntaxTrivias[_i]);
4262+
}
4263+
break;
4264+
}
4265+
case SyntaxKind.IdentifierName:
4266+
{
4267+
IdentifierNameSyntax? _ins = asNode as IdentifierNameSyntax;
4268+
if (_ins != null)
4269+
{
4270+
if (_ins.IsVar)
4271+
{
4272+
SyntaxTriviaList _syntaxTrivias = asNode.GetLeadingTrivia();
4273+
4274+
for (int _i = 0; _i < _syntaxTrivias.Count; _i++)
4275+
{
4276+
VisitTrivia(_syntaxTrivias[_i]);
4277+
}
4278+
4279+
if (_Options.UseVarOverLet)
4280+
JSSB.Append("var");
4281+
else
4282+
JSSB.Append("let");
4283+
4284+
_syntaxTrivias = asNode.GetTrailingTrivia();
4285+
for (int _i = 0; _i < _syntaxTrivias.Count; _i++)
4286+
{
4287+
VisitTrivia(_syntaxTrivias[_i]);
4288+
}
4289+
}
4290+
else
4291+
{
4292+
if (IdentifierToken(asNode) == false)
4293+
{
4294+
VisitIdentifierName(_ins);
4295+
}
4296+
}
4297+
}
4298+
else
4299+
{
4300+
Log.ErrorLine($"_ins is null");
4301+
}
4302+
4303+
break;
4304+
}
4305+
case SyntaxKind.SimpleMemberAccessExpression:
4306+
case SyntaxKind.PointerMemberAccessExpression:
4307+
VisitMemberAccessExpression((MemberAccessExpressionSyntax)asNode);
4308+
break;
4309+
default:
4310+
Log.ErrorLine($"asNode : {kind}\n|{asNode.ToFullString()}|");
4311+
break;
4312+
}
4313+
}
4314+
else
4315+
{
4316+
SyntaxToken asToken = nodesAndTokens[i].AsToken();
4317+
SyntaxKind kind = asToken.Kind();
4318+
4319+
switch (kind)
4320+
{
4321+
4322+
case SyntaxKind.IdentifierToken:
4323+
{
4324+
VisitLeadingTrivia(asToken);
4325+
JSSB.Append($"{asToken.Text}");
4326+
VisitTrailingTrivia(asToken);
4327+
break;
4328+
}
4329+
case SyntaxKind.ForEachKeyword:
4330+
{
4331+
VisitLeadingTrivia(asToken);
4332+
JSSB.Append("for");
4333+
VisitTrailingTrivia(asToken);
4334+
break;
4335+
}
4336+
case SyntaxKind.InKeyword:
4337+
case SyntaxKind.CloseParenToken:
4338+
case SyntaxKind.OpenParenToken:
4339+
VisitToken(asToken);
4340+
break;
4341+
default:
4342+
Log.ErrorLine($"asToken : {kind}");
4343+
break;
4344+
}
4345+
}
4346+
}
42204347
}
42214348
public override void VisitForStatement(ForStatementSyntax node)
42224349
{
@@ -4588,8 +4715,10 @@ public override void VisitInvocationExpression(InvocationExpressionSyntax node)
45884715
JSSB.AppendLine("*/");
45894716
}
45904717

4591-
bool _isEqualsStrict = false;
4592-
bool _isInequalsStrict = false;
4718+
bool isEqualsStrict = false;
4719+
bool isInequalsStrict = false;
4720+
bool isDelete = false;
4721+
bool isVoid = false;
45934722

45944723
ChildSyntaxList nodesAndTokens = node.ChildNodesAndTokens();
45954724

@@ -4607,28 +4736,42 @@ public override void VisitInvocationExpression(InvocationExpressionSyntax node)
46074736
{
46084737
IdentifierNameSyntax _identifier = (IdentifierNameSyntax)asNode;
46094738
if (_identifier.Identifier.Text == "EqualsStrict")
4610-
_isEqualsStrict = true;
4611-
else if(_identifier.Identifier.Text == "InequalsStrict")
4612-
_isInequalsStrict = true;
4739+
isEqualsStrict = true;
4740+
else if (_identifier.Identifier.Text == "InequalsStrict")
4741+
isInequalsStrict = true;
4742+
else if (_identifier.Identifier.Text == "Delete")
4743+
isDelete = true;
4744+
else if (_identifier.Identifier.Text == "Void")
4745+
isVoid = true;
46134746
else
46144747
VisitIdentifierName(_identifier);
46154748
break;
46164749
}
46174750
case SyntaxKind.ArgumentList:
46184751
{
46194752
ArgumentListSyntax _arguments = (ArgumentListSyntax)asNode;
4620-
if (_isEqualsStrict)
4753+
if (isEqualsStrict)
46214754
{
46224755
VisitArgument(_arguments.Arguments[0]);
46234756
JSSB.Append("===");
46244757
VisitArgument(_arguments.Arguments[1]);
46254758
}
4626-
else if (_isInequalsStrict)
4759+
else if (isInequalsStrict)
46274760
{
46284761
VisitArgument(_arguments.Arguments[0]);
46294762
JSSB.Append("!==");
46304763
VisitArgument(_arguments.Arguments[1]);
46314764
}
4765+
else if (isDelete)
4766+
{
4767+
JSSB.Append("delete ");
4768+
VisitArgument(_arguments.Arguments[0]);
4769+
}
4770+
else if (isVoid)
4771+
{
4772+
JSSB.Append("void ");
4773+
VisitArgument(_arguments.Arguments[0]);
4774+
}
46324775
else
46334776
VisitArgumentList(_arguments);
46344777
break;

0 commit comments

Comments
 (0)