//
// 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.
//

#ifndef COMPILER_PREPROCESSOR_DIAGNOSTICS_H_
#define COMPILER_PREPROCESSOR_DIAGNOSTICS_H_

#include <string>

namespace pp
{

struct SourceLocation;

// Base class for reporting diagnostic messages.
// Derived classes are responsible for formatting and printing the messages.
class Diagnostics
{
  public:
    enum Severity
    {
        PP_ERROR,
        PP_WARNING
    };
    enum ID
    {
        ERROR_BEGIN,
        INTERNAL_ERROR,
        OUT_OF_MEMORY,
        INVALID_CHARACTER,
        INVALID_NUMBER,
        INTEGER_OVERFLOW,
        FLOAT_OVERFLOW,
        TOKEN_TOO_LONG,
        INVALID_EXPRESSION,
        DIVISION_BY_ZERO,
        EOF_IN_COMMENT,
        UNEXPECTED_TOKEN,
        DIRECTIVE_INVALID_NAME,
        MACRO_NAME_RESERVED,
        MACRO_REDEFINED,
        MACRO_PREDEFINED_REDEFINED,
        MACRO_PREDEFINED_UNDEFINED,
        MACRO_UNTERMINATED_INVOCATION,
        MACRO_TOO_FEW_ARGS,
        MACRO_TOO_MANY_ARGS,
        CONDITIONAL_ENDIF_WITHOUT_IF,
        CONDITIONAL_ELSE_WITHOUT_IF,
        CONDITIONAL_ELSE_AFTER_ELSE,
        CONDITIONAL_ELIF_WITHOUT_IF,
        CONDITIONAL_ELIF_AFTER_ELSE,
        CONDITIONAL_UNTERMINATED,
        INVALID_EXTENSION_NAME,
        INVALID_EXTENSION_BEHAVIOR,
        INVALID_EXTENSION_DIRECTIVE,
        INVALID_VERSION_NUMBER,
        INVALID_VERSION_DIRECTIVE,
        VERSION_NOT_FIRST_STATEMENT,
        INVALID_LINE_NUMBER,
        INVALID_FILE_NUMBER,
        INVALID_LINE_DIRECTIVE,
        ERROR_END,

        WARNING_BEGIN,
        EOF_IN_DIRECTIVE,
        CONDITIONAL_UNEXPECTED_TOKEN,
        UNRECOGNIZED_PRAGMA,
        WARNING_END
    };

    virtual ~Diagnostics();

    void report(ID id, const SourceLocation& loc, const std::string& text);

  protected:
    Severity severity(ID id);
    std::string message(ID id);

    virtual void print(ID id,
                       const SourceLocation& loc,
                       const std::string& text) = 0;
};

}  // namespace pp
#endif  // COMPILER_PREPROCESSOR_DIAGNOSTICS_H_
