blob: 15b2ea36fed6817d70abd7c5df328c2f7c8f4b3c [file] [log] [blame]
/**************************************************************
*
* 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_