public Object visit(AssignmentStatement node) {
            VariableRef lvalue = node.getLValue();
            Type ltype = lvalue.getType();
            Variable v = lvalue.getVariable();
            LocalVariable local = getLocalVariable(v);

            final Expression rvalue = node.getRValue();
            Type rtype = rvalue.getType();

            // Special optimization to convert a = a + n to a += n
            if (local != null &&
                ltype.getNaturalClass() == int.class &&
                rtype.getNaturalClass() == int.class &&
                rvalue instanceof ArithmeticExpression) {

                ArithmeticExpression arith = (ArithmeticExpression)rvalue;
                int ID = arith.getOperator().getID();
                if (ID == Token.PLUS || ID == Token.MINUS) {
                    Expression left = arith.getLeftExpression();
                    Expression right = arith.getRightExpression();
                    Integer amount = null;
                    if (left instanceof VariableRef &&
                        right.isValueKnown()) {
                        if ( ((VariableRef)left).getVariable() == v ) {
                            amount = (Integer)right.getValue();
                        }
                    }
                    else if (right instanceof VariableRef &&
                             left.isValueKnown() &&
                             ID != Token.MINUS) {
                        if ( ((VariableRef)right).getVariable() == v ) {
                            amount = (Integer)left.getValue();
                        }
                    }

                    if (amount != null) {
                        int i = amount.intValue();
                        if (ID == Token.PLUS) {
                            mBuilder.integerIncrement(local, i);
                        }
                        else {
                            mBuilder.integerIncrement(local, -i);
                        }
                        return null;
                    }
                }
            }

            storeToVariable(v, new Runnable() {
                public void run() {
                    generate(rvalue);
                }
            });

            return null;
        }