From e8f9febcc0855004ff173e630137711ab9a0e5d5 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 22 Feb 2011 16:38:56 +0100 Subject: [PATCH] Replace 'i += 1' with 'i++'. Closes #33. --- .../Ast/NRefactoryExtensions.cs | 8 ++++++++ .../ReplaceMethodCallsWithOperators.cs | 20 ++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.Decompiler/Ast/NRefactoryExtensions.cs b/ICSharpCode.Decompiler/Ast/NRefactoryExtensions.cs index dfc2e3486..8657037ad 100644 --- a/ICSharpCode.Decompiler/Ast/NRefactoryExtensions.cs +++ b/ICSharpCode.Decompiler/Ast/NRefactoryExtensions.cs @@ -15,6 +15,14 @@ namespace Decompiler return node; } + public static T CopyAnnotationsFrom(this T node, AstNode other) where T : AstNode + { + foreach (var annotation in other.Annotations()) { + node.AddAnnotation(annotation); + } + return node; + } + public static T Detach(this T node) where T : AstNode { node.Remove(); diff --git a/ICSharpCode.Decompiler/Ast/Transforms/ReplaceMethodCallsWithOperators.cs b/ICSharpCode.Decompiler/Ast/Transforms/ReplaceMethodCallsWithOperators.cs index f33d51599..0a7cb2655 100644 --- a/ICSharpCode.Decompiler/Ast/Transforms/ReplaceMethodCallsWithOperators.cs +++ b/ICSharpCode.Decompiler/Ast/Transforms/ReplaceMethodCallsWithOperators.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using ICSharpCode.NRefactory.CSharp.PatternMatching; using Mono.Cecil; using Ast = ICSharpCode.NRefactory.CSharp; using ICSharpCode.NRefactory.CSharp; @@ -142,7 +143,7 @@ namespace Decompiler.Transforms public override object VisitAssignmentExpression(AssignmentExpression assignment, object data) { base.VisitAssignmentExpression(assignment, data); - // First, combine "x = x op y" into "x op= y" + // Combine "x = x op y" into "x op= y" BinaryOperatorExpression binary = assignment.Right as BinaryOperatorExpression; if (binary != null && assignment.Operator == AssignmentOperatorType.Assign) { if (IsWithoutSideEffects(assignment.Left) && assignment.Left.Match(binary.Left) != null) { @@ -180,10 +181,27 @@ namespace Decompiler.Transforms } if (assignment.Operator != AssignmentOperatorType.Assign) { // If we found a shorter operator, get rid of the BinaryOperatorExpression: + assignment.CopyAnnotationsFrom(binary); assignment.Right = binary.Right; } } } + if (assignment.Operator == AssignmentOperatorType.Add || assignment.Operator == AssignmentOperatorType.Subtract) { + // detect increment/decrement + if (assignment.Right.Match(new PrimitiveExpression(1)) != null) { + // only if it's not a custom operator + if (assignment.Annotation() == null) { + UnaryOperatorType type; + // When the parent is an expression statement, pre- or post-increment doesn't matter; + // so we can pick post-increment which is more commonly used (for (int i = 0; i < x; i++)) + if (assignment.Parent is ExpressionStatement) + type = (assignment.Operator == AssignmentOperatorType.Add) ? UnaryOperatorType.PostIncrement : UnaryOperatorType.PostDecrement; + else + type = (assignment.Operator == AssignmentOperatorType.Add) ? UnaryOperatorType.Increment : UnaryOperatorType.Decrement; + assignment.ReplaceWith(new UnaryOperatorExpression(type, assignment.Left.Detach()).CopyAnnotationsFrom(assignment)); + } + } + } return null; }