//
// 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 "Diagnostics.h"

#include <cassert>

namespace pp
{

Diagnostics::~Diagnostics()
{
}

void Diagnostics::report(ID id,
                         const SourceLocation& loc,
                         const std::string& text)
{
    // TODO(alokp): Keep a count of errors and warnings.
    print(id, loc, text);
}

Diagnostics::Severity Diagnostics::severity(ID id)
{
    if ((id > ERROR_BEGIN) && (id < ERROR_END))
        return PP_ERROR;

    if ((id > WARNING_BEGIN) && (id < WARNING_END))
        return PP_WARNING;

    assert(false);
    return PP_ERROR;
}

std::string Diagnostics::message(ID id)
{
    switch (id)
    {
      // Errors begin.
      case INTERNAL_ERROR:
          return "internal error";
      case OUT_OF_MEMORY:
          return "out of memory";
      case INVALID_CHARACTER:
          return "invalid character";
      case INVALID_NUMBER:
          return "invalid number";
      case INTEGER_OVERFLOW:
          return "integer overflow";
      case FLOAT_OVERFLOW:
          return "float overflow";
      case TOKEN_TOO_LONG:
          return "token too long";
      case INVALID_EXPRESSION:
          return "invalid expression";
      case DIVISION_BY_ZERO:
          return "division by zero";
      case EOF_IN_COMMENT:
          return "unexpected end of file found in comment";
      case UNEXPECTED_TOKEN:
          return "unexpected token";
      case DIRECTIVE_INVALID_NAME:
          return "invalid directive name";
      case MACRO_NAME_RESERVED:
          return "macro name is reserved";
      case MACRO_REDEFINED:
          return "macro redefined";
      case MACRO_PREDEFINED_REDEFINED:
          return "predefined macro redefined";
      case MACRO_PREDEFINED_UNDEFINED:
          return "predefined macro undefined";
      case MACRO_UNTERMINATED_INVOCATION:
          return "unterminated macro invocation";
      case MACRO_TOO_FEW_ARGS:
          return "Not enough arguments for macro";
      case MACRO_TOO_MANY_ARGS:
          return "Too many arguments for macro";
      case MACRO_DUPLICATE_PARAMETER_NAMES:
          return "duplicate macro parameter name";
      case CONDITIONAL_ENDIF_WITHOUT_IF:
          return "unexpected #endif found without a matching #if";
      case CONDITIONAL_ELSE_WITHOUT_IF:
          return "unexpected #else found without a matching #if";
      case CONDITIONAL_ELSE_AFTER_ELSE:
          return "unexpected #else found after another #else";
      case CONDITIONAL_ELIF_WITHOUT_IF:
          return "unexpected #elif found without a matching #if";
      case CONDITIONAL_ELIF_AFTER_ELSE:
          return "unexpected #elif found after #else";
      case CONDITIONAL_UNTERMINATED:
          return "unexpected end of file found in conditional block";
      case INVALID_EXTENSION_NAME:
          return "invalid extension name";
      case INVALID_EXTENSION_BEHAVIOR:
          return "invalid extension behavior";
      case INVALID_EXTENSION_DIRECTIVE:
          return "invalid extension directive";
      case INVALID_VERSION_NUMBER:
          return "invalid version number";
      case INVALID_VERSION_DIRECTIVE:
          return "invalid version directive";
      case VERSION_NOT_FIRST_STATEMENT:
        return "#version directive must occur before anything else, "
               "except for comments and white space";
      case INVALID_LINE_NUMBER:
          return "invalid line number";
      case INVALID_FILE_NUMBER:
          return "invalid file number";
      case INVALID_LINE_DIRECTIVE:
          return "invalid line directive";
      case UNDEFINED_IDENTIFIER:
          return "undefined identifier";
      // Errors end.
      // Warnings begin.
      case EOF_IN_DIRECTIVE:
          return "unexpected end of file found in directive";
      case CONDITIONAL_UNEXPECTED_TOKEN:
          return "unexpected token after conditional expression";
      case UNRECOGNIZED_PRAGMA:
          return "unrecognized pragma";
      // Warnings end.
      default:
          assert(false);
          return "";
    }
}

}  // namespace pp
