//
// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

#include "compiler/preprocessor/DiagnosticsBase.h"

#include "common/debug.h"

namespace angle
{

namespace pp
{

Diagnostics::~Diagnostics() {}

void Diagnostics::report(ID id, const SourceLocation &loc, const std::string &text)
{
    print(id, loc, text);
}

bool Diagnostics::isError(ID id)
{
    if ((id > PP_ERROR_BEGIN) && (id < PP_ERROR_END))
        return true;

    if ((id > PP_WARNING_BEGIN) && (id < PP_WARNING_END))
        return false;

    UNREACHABLE();
    return true;
}

const char *Diagnostics::message(ID id)
{
    switch (id)
    {
        // Errors begin.
        case PP_INTERNAL_ERROR:
            return "internal error";
        case PP_OUT_OF_MEMORY:
            return "out of memory";
        case PP_INVALID_CHARACTER:
            return "invalid character";
        case PP_INVALID_NUMBER:
            return "invalid number";
        case PP_INTEGER_OVERFLOW:
            return "integer overflow";
        case PP_FLOAT_OVERFLOW:
            return "float overflow";
        case PP_TOKEN_TOO_LONG:
            return "token too long";
        case PP_INVALID_EXPRESSION:
            return "invalid expression";
        case PP_DIVISION_BY_ZERO:
            return "division by zero";
        case PP_EOF_IN_COMMENT:
            return "unexpected end of file found in comment";
        case PP_UNEXPECTED_TOKEN:
            return "unexpected token";
        case PP_DIRECTIVE_INVALID_NAME:
            return "invalid directive name";
        case PP_MACRO_NAME_RESERVED:
            return "macro name is reserved";
        case PP_MACRO_REDEFINED:
            return "macro redefined";
        case PP_MACRO_PREDEFINED_REDEFINED:
            return "predefined macro redefined";
        case PP_MACRO_PREDEFINED_UNDEFINED:
            return "predefined macro undefined";
        case PP_MACRO_UNTERMINATED_INVOCATION:
            return "unterminated macro invocation";
        case PP_MACRO_UNDEFINED_WHILE_INVOKED:
            return "macro undefined while being invoked";
        case PP_MACRO_TOO_FEW_ARGS:
            return "Not enough arguments for macro";
        case PP_MACRO_TOO_MANY_ARGS:
            return "Too many arguments for macro";
        case PP_MACRO_DUPLICATE_PARAMETER_NAMES:
            return "duplicate macro parameter name";
        case PP_MACRO_INVOCATION_CHAIN_TOO_DEEP:
            return "macro invocation chain too deep";
        case PP_CONDITIONAL_ENDIF_WITHOUT_IF:
            return "unexpected #endif found without a matching #if";
        case PP_CONDITIONAL_ELSE_WITHOUT_IF:
            return "unexpected #else found without a matching #if";
        case PP_CONDITIONAL_ELSE_AFTER_ELSE:
            return "unexpected #else found after another #else";
        case PP_CONDITIONAL_ELIF_WITHOUT_IF:
            return "unexpected #elif found without a matching #if";
        case PP_CONDITIONAL_ELIF_AFTER_ELSE:
            return "unexpected #elif found after #else";
        case PP_CONDITIONAL_UNTERMINATED:
            return "unexpected end of file found in conditional block";
        case PP_INVALID_EXTENSION_NAME:
            return "invalid extension name";
        case PP_INVALID_EXTENSION_BEHAVIOR:
            return "invalid extension behavior";
        case PP_INVALID_EXTENSION_DIRECTIVE:
            return "invalid extension directive";
        case PP_INVALID_VERSION_NUMBER:
            return "invalid version number";
        case PP_INVALID_VERSION_DIRECTIVE:
            return "invalid version directive";
        case PP_VERSION_NOT_FIRST_STATEMENT:
            return "#version directive must occur before anything else, "
                   "except for comments and white space";
        case PP_VERSION_NOT_FIRST_LINE_ESSL3:
            return "#version directive must occur on the first line of the shader";
        case PP_INVALID_LINE_NUMBER:
            return "invalid line number";
        case PP_INVALID_FILE_NUMBER:
            return "invalid file number";
        case PP_INVALID_LINE_DIRECTIVE:
            return "invalid line directive";
        case PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL1:
            return "extension directive must occur before any non-preprocessor tokens in ESSL1";
        case PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL3:
            return "extension directive must occur before any non-preprocessor tokens in ESSL3";
        case PP_UNDEFINED_SHIFT:
            return "shift exponent is negative or undefined";
        case PP_TOKENIZER_ERROR:
            return "internal tokenizer error";
        // Errors end.
        // Warnings begin.
        case PP_EOF_IN_DIRECTIVE:
            return "unexpected end of file found in directive";
        case PP_CONDITIONAL_UNEXPECTED_TOKEN:
            return "unexpected token after conditional expression";
        case PP_UNRECOGNIZED_PRAGMA:
            return "unrecognized pragma";
        case PP_NON_PP_TOKEN_BEFORE_EXTENSION_WEBGL:
            return "extension directive should occur before any non-preprocessor tokens";
        case PP_WARNING_MACRO_NAME_RESERVED:
            return "macro name with a double underscore is reserved - unintented behavior is "
                   "possible";
        // Warnings end.
        default:
            UNREACHABLE();
            return "";
    }
}

}  // namespace pp

}  // namespace angle
