diff --git a/ICSharpCode.Decompiler/CSharp/Transforms/PatternStatementTransform.cs b/ICSharpCode.Decompiler/CSharp/Transforms/PatternStatementTransform.cs index d789799a3..084ed00f1 100644 --- a/ICSharpCode.Decompiler/CSharp/Transforms/PatternStatementTransform.cs +++ b/ICSharpCode.Decompiler/CSharp/Transforms/PatternStatementTransform.cs @@ -164,24 +164,17 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms { Match m1 = variableAssignPattern.Match(node); if (!m1.Success) return null; - var variableName = m1.Get("variable").Single().Identifier; + var variable = m1.Get("variable").Single().GetILVariable(); AstNode next = node.NextSibling; - 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; - } + if (next is ForStatement forStatement && ForStatementUsesVariable(forStatement, variable)) { + node.Remove(); + next.InsertChildAfter(null, node, ForStatement.InitializerRole); + return (ForStatement)next; } 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 (variableName != m3.Get("ident").Single().Identifier) + if (variable != m3.Get("ident").Single().GetILVariable()) return null; WhileStatement loop = (WhileStatement)next; node.Remove(); @@ -197,6 +190,15 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms loop.ReplaceWith(forStatement); return forStatement; } + + bool ForStatementUsesVariable(ForStatement statement, IL.ILVariable variable) + { + if (!statement.Condition.DescendantsAndSelf.OfType().Any(ie => ie.GetILVariable() == variable)) + return false; + if (!statement.Iterators.Any(i => i.DescendantsAndSelf.OfType().Any(ie => ie.GetILVariable() == variable))) + return false; + return true; + } #endregion #region foreach