Skip to content

Commit

Permalink
Replace 'i += 1' with 'i++'. Closes #33.
Browse files Browse the repository at this point in the history
  • Loading branch information
dgrunwald committed Feb 22, 2011
1 parent eeaabc3 commit e8f9feb
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
8 changes: 8 additions & 0 deletions ICSharpCode.Decompiler/Ast/NRefactoryExtensions.cs
Expand Up @@ -15,6 +15,14 @@ static class NRefactoryExtensions
return node;
}

public static T CopyAnnotationsFrom<T>(this T node, AstNode other) where T : AstNode
{
foreach (var annotation in other.Annotations<object>()) {
node.AddAnnotation(annotation);
}
return node;
}

public static T Detach<T>(this T node) where T : AstNode
{
node.Remove();
Expand Down
@@ -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;
Expand Down Expand Up @@ -142,7 +143,7 @@ public override object VisitInvocationExpression(InvocationExpression invocation
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) {
Expand Down Expand Up @@ -180,10 +181,27 @@ public override object VisitAssignmentExpression(AssignmentExpression assignment
}
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<MethodReference>() == 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;
}

Expand Down

0 comments on commit e8f9feb

Please sign in to comment.