Browse Source

Add FlattenSwitchBlocks transform + update test cases.

pull/887/head
Siegfried Pammer 8 years ago
parent
commit
7ae44fcdc6
  1. 512
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/Switch.cs
  2. 2
      ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs
  3. 6
      ICSharpCode.Decompiler/CSharp/Transforms/FlattenSwitchBlocks.cs
  4. 1
      ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj

512
ICSharpCode.Decompiler.Tests/TestCases/Pretty/Switch.cs

@ -43,154 +43,117 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -43,154 +43,117 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
{
Console.WriteLine("SparseIntegerSwitch: " + i);
switch (i) {
case -10000000: {
return "-10 mln";
}
case -100: {
return "-hundred";
}
case -1: {
return "-1";
}
case 0: {
return "0";
}
case 1: {
return "1";
}
case 2: {
return "2";
}
case 4: {
return "4";
}
case 100: {
return "hundred";
}
case 10000: {
return "ten thousand";
}
case 10001: {
return "ten thousand and one";
}
case 2147483647: {
return "int.MaxValue";
}
default: {
return "something else";
}
case -10000000:
return "-10 mln";
case -100:
return "-hundred";
case -1:
return "-1";
case 0:
return "0";
case 1:
return "1";
case 2:
return "2";
case 4:
return "4";
case 100:
return "hundred";
case 10000:
return "ten thousand";
case 10001:
return "ten thousand and one";
case 2147483647:
return "int.MaxValue";
default:
return "something else";
}
}
public static string SwitchOverNullableInt(int? i)
{
switch (i) {
case null: {
return "null";
}
case 0: {
return "zero";
}
case 5: {
return "five";
}
case 10: {
return "ten";
}
default: {
return "large";
}
case null:
return "null";
case 0:
return "zero";
case 5:
return "five";
case 10:
return "ten";
default:
return "large";
}
}
public static string SwitchOverNullableIntShifted(int? i)
{
switch (i + 5) {
case null: {
return "null";
}
case 0: {
return "zero";
}
case 5: {
return "five";
}
case 10: {
return "ten";
}
default: {
return "large";
}
case null:
return "null";
case 0:
return "zero";
case 5:
return "five";
case 10:
return "ten";
default:
return "large";
}
}
public static string SwitchOverNullableIntNoNullCase(int? i)
{
switch (i) {
case 0: {
return "zero";
}
case 5: {
return "five";
}
case 10: {
return "ten";
}
default: {
return "other";
}
case 0:
return "zero";
case 5:
return "five";
case 10:
return "ten";
default:
return "other";
}
}
public static string SwitchOverNullableIntNoNullCaseShifted(int? i)
{
switch (i + 5) {
case 0: {
return "zero";
}
case 5: {
return "five";
}
case 10: {
return "ten";
}
default: {
return "other";
}
case 0:
return "zero";
case 5:
return "five";
case 10:
return "ten";
default:
return "other";
}
}
public static void SwitchOverInt(int i)
{
switch (i) {
case 0: {
Console.WriteLine("zero");
break;
}
case 5: {
Console.WriteLine("five");
break;
}
case 10: {
Console.WriteLine("ten");
break;
}
case 15: {
Console.WriteLine("fifteen");
break;
}
case 20: {
Console.WriteLine("twenty");
break;
}
case 25: {
Console.WriteLine("twenty-five");
break;
}
case 30: {
Console.WriteLine("thirty");
break;
}
case 0:
Console.WriteLine("zero");
break;
case 5:
Console.WriteLine("five");
break;
case 10:
Console.WriteLine("ten");
break;
case 15:
Console.WriteLine("fifteen");
break;
case 20:
Console.WriteLine("twenty");
break;
case 25:
Console.WriteLine("twenty-five");
break;
case 30:
Console.WriteLine("thirty");
break;
}
}
@ -198,18 +161,14 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -198,18 +161,14 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
{
Console.WriteLine("ShortSwitchOverString: " + text);
switch (text) {
case "First case": {
return "Text1";
}
case "Second case": {
return "Text2";
}
case "Third case": {
return "Text3";
}
default: {
return "Default";
}
case "First case":
return "Text1";
case "Second case":
return "Text2";
case "Third case":
return "Text3";
default:
return "Default";
}
}
@ -217,18 +176,14 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -217,18 +176,14 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
{
Console.WriteLine("ShortSwitchOverStringWithNullCase: " + text);
switch (text) {
case "First case": {
return "Text1";
}
case "Second case": {
return "Text2";
}
case null: {
return "null";
}
default: {
return "Default";
}
case "First case":
return "Text1";
case "Second case":
return "Text2";
case null:
return "null";
default:
return "Default";
}
}
@ -236,31 +191,23 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -236,31 +191,23 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
{
Console.WriteLine("SwitchOverString1: " + text);
switch (text) {
case "First case": {
return "Text1";
}
case "First case":
return "Text1";
case "Second case":
case "2nd case": {
return "Text2";
}
case "Third case": {
return "Text3";
}
case "Fourth case": {
return "Text4";
}
case "Fifth case": {
return "Text5";
}
case "Sixth case": {
return "Text6";
}
case null: {
return null;
}
default: {
return "Default";
}
case "2nd case":
return "Text2";
case "Third case":
return "Text3";
case "Fourth case":
return "Text4";
case "Fifth case":
return "Text5";
case "Sixth case":
return "Text6";
case null:
return null;
default:
return "Default";
}
}
@ -268,42 +215,30 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -268,42 +215,30 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
{
Console.WriteLine("SwitchOverString2:");
switch (Environment.UserName) {
case "First case": {
return "Text1";
}
case "Second case": {
return "Text2";
}
case "Third case": {
return "Text3";
}
case "Fourth case": {
return "Text4";
}
case "Fifth case": {
return "Text5";
}
case "Sixth case": {
return "Text6";
}
case "Seventh case": {
return "Text7";
}
case "Eighth case": {
return "Text8";
}
case "Ninth case": {
return "Text9";
}
case "Tenth case": {
return "Text10";
}
case "Eleventh case": {
return "Text11";
}
default: {
return "Default";
}
case "First case":
return "Text1";
case "Second case":
return "Text2";
case "Third case":
return "Text3";
case "Fourth case":
return "Text4";
case "Fifth case":
return "Text5";
case "Sixth case":
return "Text6";
case "Seventh case":
return "Text7";
case "Eighth case":
return "Text8";
case "Ninth case":
return "Text9";
case "Tenth case":
return "Text10";
case "Eleventh case":
return "Text11";
default:
return "Default";
}
}
@ -311,15 +246,12 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -311,15 +246,12 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
{
Console.WriteLine("SwitchOverBool: " + b.ToString());
switch (b) {
case true: {
return bool.TrueString;
}
case false: {
return bool.FalseString;
}
default: {
return null;
}
case true:
return bool.TrueString;
case false:
return bool.FalseString;
default:
return null;
}
}
@ -328,27 +260,22 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -328,27 +260,22 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
Console.WriteLine("SwitchInLoop: " + i);
while (true) {
switch (i) {
case 1: {
Console.WriteLine("one");
break;
}
case 2: {
Console.WriteLine("two");
break;
}
//case 3: {
case 1:
Console.WriteLine("one");
break;
case 2:
Console.WriteLine("two");
break;
//case 3:
// Console.WriteLine("three");
// continue;
// }
case 4: {
Console.WriteLine("four");
return;
}
default: {
Console.WriteLine("default");
Console.WriteLine("more code");
return;
}
case 4:
Console.WriteLine("four");
return;
default:
Console.WriteLine("default");
Console.WriteLine("more code");
return;
}
i++;
}
@ -358,26 +285,21 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -358,26 +285,21 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
{
Console.WriteLine("SwitchWithGoto: " + i);
switch (i) {
case 1: {
Console.WriteLine("one");
goto default;
}
case 2: {
Console.WriteLine("two");
goto case 3;
}
case 3: {
Console.WriteLine("three");
break;
}
case 4: {
Console.WriteLine("four");
return;
}
default: {
Console.WriteLine("default");
break;
}
case 1:
Console.WriteLine("one");
goto default;
case 2:
Console.WriteLine("two");
goto case 3;
case 3:
Console.WriteLine("three");
break;
case 4:
Console.WriteLine("four");
return;
default:
Console.WriteLine("default");
break;
}
Console.WriteLine("End of method");
}
@ -395,35 +317,29 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -395,35 +317,29 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
for (int i = 0; i < properties.Length; i++) {
SetProperty setProperty = properties[i];
switch (setProperty.Property.Name) {
case "Name1": {
setProperty.Set = 1;
list.Add(setProperty);
break;
}
case "Name2": {
setProperty.Set = 2;
list.Add(setProperty);
break;
}
case "Name3": {
setProperty.Set = 3;
list.Add(setProperty);
break;
}
case "Name4": {
setProperty.Set = 4;
list.Add(setProperty);
break;
}
case "Name1":
setProperty.Set = 1;
list.Add(setProperty);
break;
case "Name2":
setProperty.Set = 2;
list.Add(setProperty);
break;
case "Name3":
setProperty.Set = 3;
list.Add(setProperty);
break;
case "Name4":
setProperty.Set = 4;
list.Add(setProperty);
break;
case "Name5":
case "Name6": {
list.Add(setProperty);
break;
}
default: {
list2.Add(setProperty);
break;
}
case "Name6":
list.Add(setProperty);
break;
default:
list2.Add(setProperty);
break;
}
}
}
@ -431,22 +347,18 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -431,22 +347,18 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
public static void SwitchWithComplexCondition(string[] args)
{
switch ((args.Length == 0) ? "dummy" : args[0]) {
case "a": {
Console.WriteLine("a");
break;
}
case "b": {
Console.WriteLine("b");
break;
}
case "c": {
Console.WriteLine("c");
break;
}
case "d": {
Console.WriteLine("d");
break;
}
case "a":
Console.WriteLine("a");
break;
case "b":
Console.WriteLine("b");
break;
case "c":
Console.WriteLine("c");
break;
case "d":
Console.WriteLine("d");
break;
}
Console.WriteLine("end");
}
@ -454,22 +366,18 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -454,22 +366,18 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
public static void SwitchWithArray(string[] args)
{
switch (args[0]) {
case "a": {
case "a":
Console.WriteLine("a");
break;
}
case "b": {
case "b":
Console.WriteLine("b");
break;
}
case "c": {
case "c":
Console.WriteLine("c");
break;
}
case "d": {
case "d":
Console.WriteLine("d");
break;
}
}
Console.WriteLine("end");
}

2
ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs

@ -144,7 +144,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -144,7 +144,7 @@ namespace ICSharpCode.Decompiler.CSharp
new IntroduceExtensionMethods(), // must run after IntroduceUsingDeclarations
new IntroduceQueryExpressions(), // must run after IntroduceExtensionMethods
new CombineQueryExpressions(),
//new FlattenSwitchBlocks(),
new FlattenSwitchBlocks(),
new FixNameCollisions(),
new AddXmlDocumentationTransform(),
};

6
ICSharpCode.Decompiler/CSharp/Transforms/FlattenSwitchBlocks.cs

@ -2,15 +2,15 @@ @@ -2,15 +2,15 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.Decompiler.CSharp.Syntax;
namespace ICSharpCode.Decompiler.CSharp.Transforms
{
class FlattenSwitchBlocks : IAstTransform
{
public void Run(AstNode compilationUnit)
public void Run(AstNode rootNode, TransformContext context)
{
foreach (var switchSection in compilationUnit.Descendants.OfType<SwitchSection>())
foreach (var switchSection in rootNode.Descendants.OfType<SwitchSection>())
{
if (switchSection.Statements.Count != 1)
continue;

1
ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj

@ -224,6 +224,7 @@ @@ -224,6 +224,7 @@
<Compile Include="CSharp\Resolver\RenameCallbackArguments.cs" />
<Compile Include="CSharp\Resolver\TypeInference.cs" />
<Compile Include="CSharp\Transforms\CombineQueryExpressions.cs" />
<Compile Include="CSharp\Transforms\FlattenSwitchBlocks.cs" />
<Compile Include="CSharp\Transforms\IntroduceExtensionMethods.cs" />
<Compile Include="CSharp\Transforms\IntroduceQueryExpressions.cs" />
<Compile Include="CSharp\Transforms\PrettifyAssignments.cs" />

Loading…
Cancel
Save