Browse Source

fix #483: if-else-if-... and nesting

pull/550/head
Siegfried Pammer 11 years ago
parent
commit
72a8229e90
  1. 34
      ICSharpCode.Decompiler/Ast/Transforms/PatternStatementTransform.cs
  2. 18
      ICSharpCode.Decompiler/Tests/ControlFlow.cs

34
ICSharpCode.Decompiler/Ast/Transforms/PatternStatementTransform.cs

@ -99,6 +99,9 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -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 @@ -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<IfElseStatement>("nestedIfStatement").Single();
node.FalseStatement = elseIf.Detach();
}
return null;
}
#endregion
}
}

18
ICSharpCode.Decompiler/Tests/ControlFlow.cs

@ -78,4 +78,22 @@ public static class ControlFlow @@ -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");
}
}
}

Loading…
Cancel
Save