From 72a8229e908f79ed1754eee152c071dc294867a6 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 26 Feb 2015 22:27:48 +0100 Subject: [PATCH] fix #483: if-else-if-... and nesting --- .../Transforms/PatternStatementTransform.cs | 34 +++++++++++++++++++ ICSharpCode.Decompiler/Tests/ControlFlow.cs | 18 ++++++++++ 2 files changed, 52 insertions(+) diff --git a/ICSharpCode.Decompiler/Ast/Transforms/PatternStatementTransform.cs b/ICSharpCode.Decompiler/Ast/Transforms/PatternStatementTransform.cs index 22d1afe62..8032b437e 100644 --- a/ICSharpCode.Decompiler/Ast/Transforms/PatternStatementTransform.cs +++ b/ICSharpCode.Decompiler/Ast/Transforms/PatternStatementTransform.cs @@ -99,6 +99,9 @@ namespace ICSharpCode.Decompiler.Ast.Transforms if (result != null) return result; } + AstNode simplifiedIfElse = SimplifyCascadingIfElseStatements(ifElseStatement); + if (simplifiedIfElse != null) + return simplifiedIfElse; return base.VisitIfElseStatement(ifElseStatement, data); } @@ -1047,5 +1050,36 @@ namespace ICSharpCode.Decompiler.Ast.Transforms return null; } #endregion + + #region Simplify cascading if-else-if statements + static readonly IfElseStatement cascadingIfElsePattern = new IfElseStatement + { + Condition = new AnyNode(), + TrueStatement = new AnyNode(), + FalseStatement = new BlockStatement { + Statements = { + new NamedNode( + "nestedIfStatement", + new IfElseStatement { + Condition = new AnyNode(), + TrueStatement = new AnyNode(), + FalseStatement = new OptionalNode(new AnyNode()) + } + ) + } + } + }; + + AstNode SimplifyCascadingIfElseStatements(IfElseStatement node) + { + Match m = cascadingIfElsePattern.Match(node); + if (m.Success) { + IfElseStatement elseIf = m.Get("nestedIfStatement").Single(); + node.FalseStatement = elseIf.Detach(); + } + + return null; + } + #endregion } } diff --git a/ICSharpCode.Decompiler/Tests/ControlFlow.cs b/ICSharpCode.Decompiler/Tests/ControlFlow.cs index 76038f125..86e7ef5f6 100644 --- a/ICSharpCode.Decompiler/Tests/ControlFlow.cs +++ b/ICSharpCode.Decompiler/Tests/ControlFlow.cs @@ -78,4 +78,22 @@ public static class ControlFlow _headers.Add(1, "else"); } } + + public static void CascadingIfElse(bool condition, string input, int index) + { + if (condition) + { + Console.WriteLine("condition"); + } + else + if (input == null) + { + Console.WriteLine("condition2"); + } + else + if (index > 1) + { + Console.WriteLine("condition3"); + } + } }