Browse Source

Fix PatternStatementTransform for loop detection

pull/734/merge
Siegfried Pammer 8 years ago
parent
commit
1036fde2b6
  1. 40
      ICSharpCode.Decompiler/CSharp/Transforms/PatternStatementTransform.cs

40
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) public ForStatement TransformFor(ExpressionStatement node)
{ {
Match m1 = variableAssignPattern.Match(node); Match m1 = variableAssignPattern.Match(node);
if (!m1.Success) return null; if (!m1.Success) return null;
var variableName = m1.Get<IdentifierExpression>("variable").Single().Identifier;
AstNode next = node.NextSibling; AstNode next = node.NextSibling;
Match m2 = forLoopWithoutInitializer.Match(next); if (next is ForStatement forStatement) {
ForStatement forStatement; if ((forStatement.Iterators.FirstOrDefault() is ExpressionStatement stmt
if (m2.Success) { && stmt.Expression is AssignmentExpression assign
node.Remove(); && variableName == assign.Left.ToString())
forStatement = (ForStatement)next; || (forStatement.Condition is BinaryOperatorExpression cond
forStatement.InsertChildAfter(null, node, ForStatement.InitializerRole); && variableName == cond.Left.ToString()))
return forStatement; {
node.Remove();
forStatement.InsertChildAfter(null, node, ForStatement.InitializerRole);
return forStatement;
}
} }
Match m3 = forPattern.Match(next); Match m3 = forPattern.Match(next);
if (!m3.Success) return null; if (!m3.Success) return null;
// ensure the variable in the for pattern is the same as in the declaration // ensure the variable in the for pattern is the same as in the declaration
if (m1.Get<IdentifierExpression>("variable").Single().Identifier != m3.Get<IdentifierExpression>("ident").Single().Identifier) if (variableName != m3.Get<IdentifierExpression>("ident").Single().Identifier)
return null; return null;
WhileStatement loop = (WhileStatement)next; WhileStatement loop = (WhileStatement)next;
node.Remove(); node.Remove();

Loading…
Cancel
Save