@@ -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