Skip to content

Commit 4ea0650

Browse files
authored
Merge pull request #520 from Orden4/base/fix-for-loops
Improvements to for loop handling
2 parents 502919a + 168d4ff commit 4ea0650

File tree

2 files changed

+333
-28
lines changed

2 files changed

+333
-28
lines changed

CSharp.lua/LuaSyntaxNodeTransform.Helper.cs

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1572,32 +1572,24 @@ private bool IsNumericalForVariableMatch(ExpressionSyntax node, SyntaxToken iden
15721572
return false;
15731573
}
15741574

1575-
private bool IsNumericalForLess(SyntaxKind kind, out bool isLess) {
1575+
private bool IsNumericalForLess(SyntaxKind kind) {
15761576
switch (kind) {
15771577
case SyntaxKind.NotEqualsExpression:
15781578
case SyntaxKind.LessThanExpression:
1579-
isLess = true;
1580-
return true;
15811579
case SyntaxKind.LessThanOrEqualExpression:
1582-
isLess = false;
15831580
return true;
15841581
default:
1585-
isLess = false;
15861582
return false;
15871583
}
15881584
}
15891585

1590-
private bool IsNumericalForGreater(SyntaxKind kind, out bool isGreater) {
1586+
private bool IsNumericalForGreater(SyntaxKind kind) {
15911587
switch (kind) {
15921588
case SyntaxKind.NotEqualsExpression:
15931589
case SyntaxKind.GreaterThanExpression:
1594-
isGreater = true;
1595-
return true;
15961590
case SyntaxKind.GreaterThanOrEqualExpression:
1597-
isGreater = false;
15981591
return true;
15991592
default:
1600-
isGreater = false;
16011593
return false;
16021594
}
16031595
}
@@ -1802,6 +1794,30 @@ private LuaNumericalForStatementSyntax GetNumericalForStatement(ForStatementSynt
18021794
goto Fail;
18031795
}
18041796

1797+
if (conditionKind is SyntaxKind.GreaterThanExpression or SyntaxKind.LessThanExpression) {
1798+
var typeInfo = semanticModel_.GetTypeInfo(node.Declaration.Type);
1799+
if (!Utility.IsCastIntegerType(typeInfo.Type))
1800+
goto Fail;
1801+
}
1802+
1803+
foreach (var descendant in node.Statement.DescendantNodesAndSelf()) {
1804+
if (descendant is PrefixUnaryExpressionSyntax prefix) {
1805+
if (prefix.Kind() is SyntaxKind.PreDecrementExpression or SyntaxKind.PreIncrementExpression &&
1806+
prefix.Operand is IdentifierNameSyntax name && variable.Identifier.ValueText == name.Identifier.ValueText)
1807+
goto Fail;
1808+
} else if (descendant is PostfixUnaryExpressionSyntax postfix) {
1809+
if (postfix.Kind() is SyntaxKind.PostDecrementExpression or SyntaxKind.PostIncrementExpression &&
1810+
postfix.Operand is IdentifierNameSyntax name && variable.Identifier.ValueText == name.Identifier.ValueText)
1811+
goto Fail;
1812+
} else if (descendant is AssignmentExpressionSyntax assignment) {
1813+
if (assignment.Left is IdentifierNameSyntax name && variable.Identifier.ValueText == name.Identifier.ValueText)
1814+
goto Fail;
1815+
} else if (descendant is ArgumentSyntax argument) {
1816+
if (argument.RefKindKeyword != default && argument.Expression is IdentifierNameSyntax name && variable.Identifier.ValueText == name.Identifier.ValueText)
1817+
goto Fail;
1818+
}
1819+
}
1820+
18051821
var condition = (BinaryExpressionSyntax)node.Condition;
18061822
if (!IsNumericalForVariableMatch(condition.Left, variable.Identifier)) {
18071823
goto Fail;
@@ -1813,7 +1829,6 @@ private LuaNumericalForStatementSyntax GetNumericalForStatement(ForStatementSynt
18131829
}
18141830

18151831
LuaExpressionSyntax stepExpression;
1816-
bool hasNoEqual;
18171832
var increment = node.Incrementors.First();
18181833
switch (increment.Kind()) {
18191834
case SyntaxKind.PreIncrementExpression:
@@ -1830,12 +1845,12 @@ private LuaNumericalForStatementSyntax GetNumericalForStatement(ForStatementSynt
18301845
goto Fail;
18311846
}
18321847
if (increment.IsKind(SyntaxKind.PreIncrementExpression) || increment.IsKind(SyntaxKind.PostIncrementExpression)) {
1833-
if (!IsNumericalForLess(conditionKind, out hasNoEqual)) {
1848+
if (!IsNumericalForLess(conditionKind)) {
18341849
goto Fail;
18351850
}
18361851
stepExpression = 1;
18371852
} else {
1838-
if (!IsNumericalForGreater(conditionKind, out hasNoEqual)) {
1853+
if (!IsNumericalForGreater(conditionKind)) {
18391854
goto Fail;
18401855
}
18411856
stepExpression = -1;
@@ -1855,11 +1870,11 @@ private LuaNumericalForStatementSyntax GetNumericalForStatement(ForStatementSynt
18551870
}
18561871

18571872
if (increment.IsKind(SyntaxKind.AddAssignmentExpression)) {
1858-
if (!IsNumericalForLess(conditionKind, out hasNoEqual)) {
1873+
if (!IsNumericalForLess(conditionKind)) {
18591874
goto Fail;
18601875
}
18611876
} else {
1862-
if (!IsNumericalForGreater(conditionKind, out hasNoEqual)) {
1877+
if (!IsNumericalForGreater(conditionKind)) {
18631878
goto Fail;
18641879
}
18651880
if (stepExpression is LuaNumberLiteralExpressionSyntax numberLiteral) {
@@ -1881,21 +1896,18 @@ private LuaNumericalForStatementSyntax GetNumericalForStatement(ForStatementSynt
18811896
CheckLocalVariableName(ref identifier, variable);
18821897

18831898
var startExpression = variable.Initializer.Value.AcceptExpression(this);
1884-
if (hasNoEqual) {
1899+
1900+
if (conditionKind == SyntaxKind.GreaterThanExpression) {
18851901
if (limitExpression is LuaNumberLiteralExpressionSyntax limitLiteral) {
1886-
if (stepExpression is LuaNumberLiteralExpressionSyntax numberLiteral) {
1887-
limitExpression = new LuaIdentifierLiteralExpressionSyntax((limitLiteral.Number - numberLiteral.Number).ToString());
1888-
} else {
1889-
limitExpression = limitExpression.Sub(stepExpression);
1890-
}
1902+
limitExpression = limitLiteral.Number + 1;
18911903
} else {
1892-
if (stepExpression is LuaNumberLiteralExpressionSyntax numberLiteral) {
1893-
limitExpression = numberLiteral.Number > 0
1894-
? limitExpression.Sub(stepExpression)
1895-
: limitExpression.Plus((-numberLiteral.Number).ToString());
1896-
} else {
1897-
limitExpression = limitExpression.Sub(stepExpression);
1898-
}
1904+
limitExpression = limitExpression.Plus(1);
1905+
}
1906+
} else if (conditionKind == SyntaxKind.LessThanExpression) {
1907+
if (limitExpression is LuaNumberLiteralExpressionSyntax limitLiteral) {
1908+
limitExpression = limitLiteral.Number - 1;
1909+
} else {
1910+
limitExpression = limitExpression.Sub(1);
18991911
}
19001912
}
19011913

0 commit comments

Comments
 (0)