Skip to content

Commit

Permalink
Bug fix Jass Parser converting -2147483648 to --2147483648
Browse files Browse the repository at this point in the history
  • Loading branch information
speige committed Dec 17, 2024
1 parent d9359e6 commit 766b719
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ setVariableStatement.Indexer is JassVariableReferenceExpressionSyntax i &&

var variableDefinition = mapTriggers.Variables.Single(v => string.Equals(v.Name, variableName, StringComparison.Ordinal));

variableDefinition.ArraySize = arraySize;
variableDefinition.ArraySize = (int)arraySize;

if (TryDecompileVariableDefinitionInitialValue(setVariableStatement.Value.Expression, variableDefinition.Type, out var initialValue))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public static bool TryGetIntegerExpressionValue(this IExpressionSyntax expressio
switch (expression)
{
case JassDecimalLiteralExpressionSyntax decimalLiteralExpression:
value = decimalLiteralExpression.Value;
value = (int)decimalLiteralExpression.Value;
return true;

case JassOctalLiteralExpressionSyntax octalLiteralExpression:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,17 @@ internal partial class JassParser
{
internal static Parser<char, IExpressionSyntax> GetDecimalLiteralExpressionParser()
{
return Try(UnsignedInt(10))
.Select<IExpressionSyntax>(value => new JassDecimalLiteralExpressionSyntax(value))
return Try(UnsignedLong(10)
.Bind(value =>
value - 1 == int.MaxValue
? Parser<char>.Return<IExpressionSyntax>(new JassDecimalLiteralExpressionSyntax(value))
: Parser<char>.Fail<IExpressionSyntax>("Edge case only. Fall-through to UnsignedInt")
))
.Or(
Try(UnsignedInt(10)
.Select<IExpressionSyntax>(value => new JassDecimalLiteralExpressionSyntax(value)))
)
.Labelled("decimal literal");
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,25 @@
// </copyright>
// ------------------------------------------------------------------------------

using System;
using System.Globalization;

namespace War3Net.CodeAnalysis.Jass.Syntax
{
public class JassDecimalLiteralExpressionSyntax : IExpressionSyntax
{
public JassDecimalLiteralExpressionSyntax(int value)
public JassDecimalLiteralExpressionSyntax(long value)
{
if (value < Int32.MinValue || value-1 > Int32.MaxValue)
{
//workaround to allow -2147483648 to be wrapped as new JassUnaryExpressionSyntax(UnaryOperatorType.Minus, new JassDecimalLiteralExpressionSyntax(2147483648))
throw new ArgumentException();
}

Value = value;
}

public int Value { get; init; }
public long Value { get; init; }

public bool Equals(IExpressionSyntax? other)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,9 @@ public void TestExpressionParser(string expression, IExpressionSyntax? expected
#endregion

#region UnaryExpression
yield return new object?[] { @"-2147483647", new JassUnaryExpressionSyntax(UnaryOperatorType.Minus, new JassDecimalLiteralExpressionSyntax(2147483647)) };
yield return new object?[] { @"-2147483648", new JassUnaryExpressionSyntax(UnaryOperatorType.Minus, new JassDecimalLiteralExpressionSyntax(2147483648)) };
yield return new object?[] { @"--2147483648", new JassUnaryExpressionSyntax(UnaryOperatorType.Minus, new JassUnaryExpressionSyntax(UnaryOperatorType.Minus, new JassDecimalLiteralExpressionSyntax(2147483648))) };
yield return new object?[] { @"+6", new JassUnaryExpressionSyntax(UnaryOperatorType.Plus, new JassDecimalLiteralExpressionSyntax(6)) };
yield return new object?[] { @"-7", new JassUnaryExpressionSyntax(UnaryOperatorType.Minus, new JassDecimalLiteralExpressionSyntax(7)) };
yield return new object?[] { @"+ 6", new JassUnaryExpressionSyntax(UnaryOperatorType.Plus, new JassDecimalLiteralExpressionSyntax(6)) };
Expand Down

0 comments on commit 766b719

Please sign in to comment.