//
// 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 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";
      // 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
