Browse Source

Fix #2349: Use proper ExpressionType with DynamicCompoundAssign.

pull/2352/head
Siegfried Pammer 4 years ago
parent
commit
d2fc380e0e
  1. 6
      ICSharpCode.Decompiler.Tests/CorrectnessTestRunner.cs
  2. 1
      ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj
  3. 35
      ICSharpCode.Decompiler.Tests/TestCases/Correctness/DynamicTests.cs
  4. 2
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/CompoundAssignmentTest.cs
  5. 26
      ICSharpCode.Decompiler/IL/Transforms/TransformAssignment.cs

6
ICSharpCode.Decompiler.Tests/CorrectnessTestRunner.cs

@ -331,6 +331,12 @@ namespace ICSharpCode.Decompiler.Tests @@ -331,6 +331,12 @@ namespace ICSharpCode.Decompiler.Tests
RunCS(options: options);
}
[Test]
public void DynamicTests([ValueSource(nameof(noMonoOptions))] CompilerOptions options)
{
RunCS(options: options);
}
[Test]
public void MiniJSON([ValueSource(nameof(defaultOptions))] CompilerOptions options)
{

1
ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj

@ -105,6 +105,7 @@ @@ -105,6 +105,7 @@
<Compile Include="ProjectDecompiler\TargetFrameworkTests.cs" />
<Compile Include="TestAssemblyResolver.cs" />
<Compile Include="TestCases\Correctness\DeconstructionTests.cs" />
<Compile Include="TestCases\Correctness\DynamicTests.cs" />
<Compile Include="TestCases\Correctness\StringConcat.cs" />
<None Include="TestCases\ILPretty\Issue2260SwitchString.cs" />
<None Include="TestCases\Pretty\Records.cs" />

35
ICSharpCode.Decompiler.Tests/TestCases/Correctness/DynamicTests.cs

@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
using System;
namespace ICSharpCode.Decompiler.Tests.TestCases.Correctness
{
class DynamicTests
{
delegate void RefAction<T>(ref T arg);
static void Main(string[] args)
{
PrintResult((ref dynamic x) => x = x + 2.0, 5.0);
PrintResult((ref dynamic x) => x = x + 2.0, 5);
PrintResult((ref dynamic x) => x = x + 2, 5.0);
PrintResult((ref dynamic x) => x = x + 2, 5);
PrintResult((ref dynamic x) => x = x - 2.0, 5.0);
PrintResult((ref dynamic x) => x = x - 2.0, 5);
PrintResult((ref dynamic x) => x = x - 2, 5.0);
PrintResult((ref dynamic x) => x = x - 2, 5);
PrintResult((ref dynamic x) => x = x * 2.0, 5.0);
PrintResult((ref dynamic x) => x = x * 2.0, 5);
PrintResult((ref dynamic x) => x = x * 2, 5.0);
PrintResult((ref dynamic x) => x = x * 2, 5);
PrintResult((ref dynamic x) => x = x / 2.0, 5.0);
PrintResult((ref dynamic x) => x = x / 2.0, 5);
PrintResult((ref dynamic x) => x = x / 2, 5.0);
PrintResult((ref dynamic x) => x = x / 2, 5);
}
private static void PrintResult(RefAction<dynamic> p, dynamic arg)
{
p(ref arg);
Console.WriteLine(arg);
}
}
}

2
ICSharpCode.Decompiler.Tests/TestCases/Pretty/CompoundAssignmentTest.cs

@ -4529,7 +4529,7 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -4529,7 +4529,7 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
return M()[name] -= 2u;
}
public uint CompoundAssignIndexerComplexIndex(string name)
public uint CompoundAssignIndexerComplexIndex()
{
return M()[ToString()] -= 2u;
}

26
ICSharpCode.Decompiler/IL/Transforms/TransformAssignment.cs

@ -19,9 +19,9 @@ @@ -19,9 +19,9 @@
using System;
using System.Diagnostics;
using System.Linq;
using System.Linq.Expressions;
using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.Decompiler.TypeSystem.Implementation;
using ICSharpCode.Decompiler.Util;
namespace ICSharpCode.Decompiler.IL.Transforms
@ -384,7 +384,29 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -384,7 +384,29 @@ namespace ICSharpCode.Decompiler.IL.Transforms
return false;
context.Step($"Compound assignment (dynamic binary)", compoundStore);
finalizeMatch?.Invoke(context);
newInst = new DynamicCompoundAssign(dynamicBinaryOp.Operation, dynamicBinaryOp.BinderFlags, target, dynamicBinaryOp.LeftArgumentInfo, dynamicBinaryOp.Right, dynamicBinaryOp.RightArgumentInfo, targetKind);
newInst = new DynamicCompoundAssign(ToCompound(dynamicBinaryOp.Operation), dynamicBinaryOp.BinderFlags, target, dynamicBinaryOp.LeftArgumentInfo, dynamicBinaryOp.Right, dynamicBinaryOp.RightArgumentInfo, targetKind);
static ExpressionType ToCompound(ExpressionType from)
{
return from switch
{
ExpressionType.Add => ExpressionType.AddAssign,
ExpressionType.AddChecked => ExpressionType.AddAssignChecked,
ExpressionType.And => ExpressionType.AndAssign,
ExpressionType.Divide => ExpressionType.DivideAssign,
ExpressionType.ExclusiveOr => ExpressionType.ExclusiveOrAssign,
ExpressionType.LeftShift => ExpressionType.LeftShiftAssign,
ExpressionType.Modulo => ExpressionType.ModuloAssign,
ExpressionType.Multiply => ExpressionType.MultiplyAssign,
ExpressionType.MultiplyChecked => ExpressionType.MultiplyAssignChecked,
ExpressionType.Or => ExpressionType.OrAssign,
ExpressionType.Power => ExpressionType.PowerAssign,
ExpressionType.RightShift => ExpressionType.RightShiftAssign,
ExpressionType.Subtract => ExpressionType.SubtractAssign,
ExpressionType.SubtractChecked => ExpressionType.SubtractAssignChecked,
_ => from
};
}
}
else if (setterValue is Call concatCall && UserDefinedCompoundAssign.IsStringConcat(concatCall.Method))
{

Loading…
Cancel
Save