/* Dialect - Code Output Formatter
 * Copyright (C) 2001-2002  Jay Freeman (saurik)
*/

/*
 *        Redistribution and use in source and binary
 * forms, with or without modification, are permitted
 * provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the
 *    above copyright notice, this list of conditions
 *    and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the
 *    above copyright notice, this list of conditions
 *    and the following disclaimer in the documentation
 *    and/or other materials provided with the
 *    distribution.
 * 3. The name of the author may not be used to endorse
 *    or promote products derived from this software
 *    without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include "stdafx.h"
#include "CSharpDialect.h"

#include "ilengineer/Ops/MSIL.h"
#include "ilengineer/Ops/ILE.h"

void Dialect::CSharpDialect::PrintOperator(ILEngineer::Ops::MSIL::Call *call) {
	Metallurgy::Member *member = call->getMember();
    std::wstring name = member->getName().getFull();
    ILEngineer::OperationVector &ops = call->getOperations();

    int after(0);
    *wout << "(";
    if (ops.size() == 2) {
        Formulate(ops[0]);
        after = 1;
    }

    /*if (name == L"op_Implicit") {
    } else if (name == L"op_Explicit") {*/

    if (name == L"op_Addition") {
        *wout << L" + ";
    } else if (name == L"op_Subtraction") {
        *wout << L" - ";
    } else if (name == L"op_Multiply") {
        *wout << L" * ";
    } else if (name == L"op_Division") {
        *wout << L" / ";
    } else if (name == L"op_Modulus") {
        *wout << L" % ";
    } else if (name == L"op_ExclusiveOr") {
        *wout << L" ^ ";
    } else if (name == L"op_BitwiseAnd") {
        *wout << L" & ";
    } else if (name == L"op_BitwiseOr") {
        *wout << L" | ";
    } else if (name == L"op_LogicalAnd") {
        *wout << L" && ";
    } else if (name == L"op_LogicalOr") {
        *wout << L" || ";
    } else if (name == L"op_Assign") {
        *wout << L" = ";
    } else if (name == L"op_LeftShift") {
        *wout << L" << ";
    } else if (name == L"op_RightShift") {
        *wout << L" >> ";
    /*} else if (name == L"op_SignedRightShift") {
    } else if (name == L"op_UnsignedRightShift") {*/
    } else if (name == L"op_Equality") {
        *wout << L" == ";
    } else if (name == L"op_GreaterThan") {
        *wout << L" > ";
    } else if (name == L"op_LessThan") {
        *wout << L" < ";
    } else if (name == L"op_Inequality") {
        *wout << L" != ";
    } else if (name == L"op_GreaterThanOrEqual") {
        *wout << L" >= ";
    } else if (name == L"op_LessThanOrEqual") {
        *wout << L" <= ";
    } else if (name == L"op_MultiplicationAssignment") {
        *wout << L" *= ";
    } else if (name == L"op_SubtractionAssignment") {
        *wout << L" -= ";
    } else if (name == L"op_ExclusiveOrAssignment") {
        *wout << L" ^= ";
    } else if (name == L"op_LeftShiftAssignment") {
        *wout << L" <<= ";
    } else if (name == L"op_ModulusAssignment") {
        *wout << L" %= ";
    } else if (name == L"op_AdditionAssignment") {
        *wout << L" += ";
    } else if (name == L"op_BitwiseAndAssignment") {
        *wout << L" &= ";
    } else if (name == L"op_BitwiseOrAssignment") {
        *wout << L" |= ";
    } else if (name == L"op_Comma") {
        *wout << L", ";
    } else if (name == L"op_DivisionAssignment") {
        *wout << L" /= ";
    } else if (name == L"op_Decrement") {
        *wout << L"--";
    } else if (name == L"op_Increment") {
        *wout << L"++";
    } else if (name == L"op_UnaryNegation") {
        *wout << L"-";
    } else if (name == L"op_UnaryPlus") {
        *wout << L"+";
    } else if (name == L"op_OnesComplement") {
        *wout << L"~";
    } else {
        *wout << "< {" << name << "} >" << std::endl;
    }

    Formulate(ops[after]);
    *wout << ")";
}