/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/


#ifndef _IDLC_ERRORHANDLER_HXX_
#define _IDLC_ERRORHANDLER_HXX_

#include <idlc/astdeclaration.hxx>
#include <idlc/astexpression.hxx>
#include <idlc/astunion.hxx>
#include <idlc/astenum.hxx>

enum ErrorCode
{
	EIDL_NONE,				// No error
	EIDL_SYNTAX_ERROR,		// Syntax error in IDL input
							// More details will be gleaned from examining
							// the parse state
	EIDL_REDEF,				// Redefinition
	EIDL_REDEF_SCOPE,		// Redefinition inside defining scope
	EIDL_DEF_USE,			// Definition after use
	EIDL_MULTIPLE_BRANCH,	// More than one union branch with this label
	EIDL_COERCION_FAILURE,	// Coercion failure
	EIDL_SCOPE_CONFLICT,	// Between fwd declare and full declare
	EIDL_ONEWAY_CONFLICT,	// Between op decl and argument direction
	EIDL_DISC_TYPE,			// Illegal discriminator type in union
	EIDL_LABEL_TYPE,		// Mismatch with discriminator type in union
	EIDL_ILLEGAL_ADD,		// Illegal add action
	EIDL_ILLEGAL_USE,		// Illegal type used in expression
	EIDL_ILLEGAL_RAISES,	// Error in "raises" clause
	EIDL_CANT_INHERIT,		// Cannot inherit from non-interface
	EIDL_LOOKUP_ERROR,		// Identifier not found
	EIDL_INHERIT_FWD_ERROR,	// Cannot inherit from fwd decl interface
	EIDL_CONSTANT_EXPECTED,	// We got something else..
	EIDL_NAME_CASE_ERROR,	// Spelling differences found
	EIDL_ENUM_VAL_EXPECTED,	// Expected an enumerator
	EIDL_ENUM_VAL_NOT_FOUND,	// Didnt find an enumerator with that name
	EIDL_EVAL_ERROR,		// Error in evaluating expression
	EIDL_AMBIGUOUS,			// Ambiguous name definition
	EIDL_DECL_NOT_DEFINED,	// Forward declared but never defined
	EIDL_FWD_DECL_LOOKUP,	// Tried to lookup in fwd declared intf
	EIDL_RECURSIVE_TYPE,	// Illegal recursive use of type
	EIDL_NONVOID_ONEWAY,	// Non-void return type in oneway operation
	EIDL_NOT_A_TYPE,		// Not a type
	EIDL_TYPE_NOT_VALID,	// Type is not valid in this context
	EIDL_INTERFACEMEMBER_LOOKUP,	// interface is not defined or a fwd declaration not exists
	EIDL_SERVICEMEMBER_LOOKUP,
	EIDL_TYPE_IDENT_CONFLICT,	// type and identifier has equal names
	EIDL_ONEWAY_RAISE_CONFLICT,	// oneway function raised excpetion conflict
	EIDL_WRONGATTRIBUTEFLAG,
	EIDL_DEFINED_ATTRIBUTEFLAG,
	EIDL_WRONGATTRIBUTEKEYWORD,
	EIDL_MISSINGATTRIBUTEKEYWORD,
	EIDL_BAD_ATTRIBUTE_FLAGS,
	EIDL_OPTIONALEXPECTED,
    EIDL_MIXED_INHERITANCE,
    EIDL_DOUBLE_INHERITANCE,
    EIDL_DOUBLE_MEMBER,
    EIDL_CONSTRUCTOR_PARAMETER_NOT_IN,
    EIDL_CONSTRUCTOR_REST_PARAMETER_NOT_FIRST,
    EIDL_REST_PARAMETER_NOT_LAST,
    EIDL_REST_PARAMETER_NOT_ANY,
    EIDL_METHOD_HAS_REST_PARAMETER,
    EIDL_READONLY_ATTRIBUTE_SET_EXCEPTIONS,
    EIDL_UNSIGNED_TYPE_ARGUMENT,
    EIDL_WRONG_NUMBER_OF_TYPE_ARGUMENTS,
    EIDL_INSTANTIATED_STRUCT_TYPE_TYPEDEF,
    EIDL_IDENTICAL_TYPE_PARAMETERS,
    EIDL_STRUCT_TYPE_TEMPLATE_WITH_BASE,
    EIDL_PUBLISHED_FORWARD,
    EIDL_PUBLISHED_USES_UNPUBLISHED,
    EIDL_SIMILAR_CONSTRUCTORS
};

enum WarningCode
{
	WIDL_EXPID_CONFLICT,        // exception id conflict
	WIDL_REQID_CONFLICT,        // request id conflict
	WIDL_INHERIT_IDCONFLICT,    // request id conflict inheritance tree
	WIDL_TYPE_IDENT_CONFLICT,   // type and identifier has equal names
	WIDL_WRONG_NAMING_CONV      // type or identifier doesn't fulfill the UNO naming convention
};

class ErrorHandler
{
public:
	// Report errors with varying numbers of arguments
	void	error0(ErrorCode e);
	void	error1(ErrorCode e, AstDeclaration const * d);
	void	error2(
        ErrorCode e, AstDeclaration const * d1, AstDeclaration const * d2);
	void	error3(ErrorCode e, AstDeclaration* d1, AstDeclaration* d2, AstDeclaration* d3);

	// Warning
	void	warning0(WarningCode e, const sal_Char* warningmsg);

	// Report a syntax error in IDL input
	void	syntaxError(ParseState state, sal_Int32 lineNumber, const sal_Char* errmsg);

	// Report an unsuccesful coercion attempt
	void	coercionError(AstExpression *pExpr, ExprType et);

	// Report a failed name lookup attempt
	void	lookupError(const ::rtl::OString& n);
	// Report a failed name lookup attempt
	void	lookupError(ErrorCode e, const ::rtl::OString& n, AstDeclaration* pScope);


	// Report a type error
	void 	noTypeError(AstDeclaration const * pDecl);

	void 	inheritanceError(NodeType nodeType, const ::rtl::OString* name, AstDeclaration* pDecl);

	void 	flagError(ErrorCode e, sal_uInt32 flag);

	void	forwardLookupError(AstDeclaration* pForward, const ::rtl::OString& name);

	void	constantExpected(AstDeclaration* pDecl, const ::rtl::OString& name);

	void 	evalError(AstExpression* pExpr);

	// Report a situation where an enumerator was expected but we got
	// something else instead. This occurs when a union with an enum
	// discriminator is being parsed and one of the branch labels is
	// not an enumerator in that enum
	void	enumValExpected(AstUnion* pUnion);

	// Report a failed enumerator lookup in an enum
	void	enumValLookupFailure(AstUnion* pUnion, AstEnum* pEnum, const ::rtl::OString& name);

    bool checkPublished(AstDeclaration const * decl, bool bOptiional=false);
};

#endif // _IDLC_ERRORHANDLER_HXX_

