mirror of https://github.com/icsharpcode/ILSpy.git
5 changed files with 54 additions and 6 deletions
@ -0,0 +1,38 @@
@@ -0,0 +1,38 @@
|
||||
using System; |
||||
|
||||
using Ast = ICSharpCode.NRefactory.Ast; |
||||
using ICSharpCode.NRefactory.Ast; |
||||
using ICSharpCode.NRefactory.Visitors; |
||||
|
||||
namespace Decompiler.Transforms.Ast |
||||
{ |
||||
public class RestoreLoop: AbstractAstTransformer |
||||
{ |
||||
public override object VisitForStatement(ForStatement forStatement, object data) |
||||
{ |
||||
base.VisitForStatement(forStatement, data); |
||||
|
||||
if (forStatement.Condition.IsNull && |
||||
forStatement.EmbeddedStatement.Children.Count >= 3) |
||||
{ |
||||
IfElseStatement condition = forStatement.EmbeddedStatement.Children[0] as IfElseStatement; |
||||
BreakStatement breakStmt = forStatement.EmbeddedStatement.Children[1] as BreakStatement; |
||||
MyLabelStatement label = forStatement.EmbeddedStatement.Children[2] as MyLabelStatement; |
||||
if (condition != null && |
||||
breakStmt != null && |
||||
label != null && |
||||
condition.TrueStatement.Count == 1) |
||||
{ |
||||
MyGotoStatement gotoStmt = condition.TrueStatement[0] as MyGotoStatement; |
||||
if (gotoStmt != null && gotoStmt.NodeLabel == label.NodeLabel) { |
||||
forStatement.EmbeddedStatement.Children.RemoveAt(0); |
||||
forStatement.EmbeddedStatement.Children.RemoveAt(0); |
||||
gotoStmt.NodeLabel.ReferenceCount--; |
||||
forStatement.Condition = condition.Condition; |
||||
} |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue