/* 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.
*/

#ifndef DIALECT_IDIALECT_H
#define DIALECT_IDIALECT_H

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "metallurgy/Assembly.h"
#include "metallurgy/Attribute.h"
#include "metallurgy/Element.h"
#include "metallurgy/Method.h"
#include "metallurgy/Module.h"
#include "metallurgy/Property.h"
#include "metallurgy/Signature.h"
#include "metallurgy/TypeDef.h"

#include "ilengineer/ilengineer.h"
#include "ilengineer/Statement.h"

#include "dialect/Exceptions.h"

namespace Dialect {

DIAPEXIS_IFACE_(IDialect, Diapexis::Unknown) {
  public:
	virtual void Assign(std::wostream &out);

	virtual void Render(const Metallurgy::Value *value, std::wstring &builder) = 0;

	virtual void Render(const Metallurgy::Element *element, std::wstring &builder) = 0;
	virtual void Render(const Metallurgy::Element *element, std::wstring &builder, Metallurgy::ModDeque &mods) = 0;

	virtual void Formulate(const Metallurgy::Element *element) = 0;
	virtual void Formulate(const Metallurgy::TypeDef &type) = 0;
	virtual void Formulate(Metallurgy::Property *property) = 0;
	virtual void Formulate(Metallurgy::Method *method) = 0;
	virtual void Formulate(Metallurgy::Field &field) = 0;
	virtual void Formulate(const std::wstring &str) = 0;
	virtual void Formulate(wchar_t chr) = 0;
	virtual void Formulate(ILEngineer::Operation *op) = 0;
	virtual void Formulate(ILEngineer::Statement *st) = 0;

	/*void Formulate(ExeFile &peFile) {
		if (!peFile.isPE()) {
			peFile.Explain(std::wcerr);
			return *this;
		}

		if (!peFile.hasCOR()) {
			std::wcerr << peFile.getName() << L" is a 100% native PE executable (spiffy!)." << std::endl;
			return *this;
		}

		m_Import = new Assembly(&peFile);
		Metallurgy::TokenList tkTypeDefs = m_Import->getTypes();
		for (Metallurgy::TokenList::iterator tkI = tkTypeDefs.begin(); tkI != tkTypeDefs.end(); tkI++)
			Forumate(m_Import->openType(*tkI));

		return *this;
	}*/
};

}

#endif//DIALECT_IDIALECT_H