From 1036fde2b63b2b69e91ca94bd7c3990faa43ada1 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Tue, 22 Aug 2017 00:16:45 +0200 Subject: [PATCH] Fix PatternStatementTransform for loop detection --- .../Transforms/PatternStatementTransform.cs | 40 ++++++------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/Transforms/PatternStatementTransform.cs b/ICSharpCode.Decompiler/CSharp/Transforms/PatternStatementTransform.cs index bde7abd16..acf7dcca2 100644 --- a/ICSharpCode.Decompiler/CSharp/Transforms/PatternStatementTransform.cs +++ b/ICSharpCode.Decompiler/CSharp/Transforms/PatternStatementTransform.cs @@ -591,42 +591,28 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms } }}; - static readonly ForStatement forLoopWithoutInitializer = new ForStatement { - Condition = new BinaryOperatorExpression { - Left = new NamedNode("ident", new IdentifierExpression(Pattern.AnyString)), - Operator = BinaryOperatorType.Any, - Right = new AnyNode("endExpr") - }, - Iterators = { - new NamedNode( - "increment", - new ExpressionStatement( - new AssignmentExpression { - Left = new Backreference("ident"), - Operator = AssignmentOperatorType.Any, - Right = new AnyNode() - })) - }, - EmbeddedStatement = new AnyNode() - }; - public ForStatement TransformFor(ExpressionStatement node) { Match m1 = variableAssignPattern.Match(node); if (!m1.Success) return null; + var variableName = m1.Get("variable").Single().Identifier; AstNode next = node.NextSibling; - Match m2 = forLoopWithoutInitializer.Match(next); - ForStatement forStatement; - if (m2.Success) { - node.Remove(); - forStatement = (ForStatement)next; - forStatement.InsertChildAfter(null, node, ForStatement.InitializerRole); - return forStatement; + if (next is ForStatement forStatement) { + if ((forStatement.Iterators.FirstOrDefault() is ExpressionStatement stmt + && stmt.Expression is AssignmentExpression assign + && variableName == assign.Left.ToString()) + || (forStatement.Condition is BinaryOperatorExpression cond + && variableName == cond.Left.ToString())) + { + node.Remove(); + forStatement.InsertChildAfter(null, node, ForStatement.InitializerRole); + return forStatement; + } } Match m3 = forPattern.Match(next); if (!m3.Success) return null; // ensure the variable in the for pattern is the same as in the declaration - if (m1.Get("variable").Single().Identifier != m3.Get("ident").Single().Identifier) + if (variableName != m3.Get("ident").Single().Identifier) return null; WhileStatement loop = (WhileStatement)next; node.Remove();