blob: 38e87ce37acbe708262099d1fa01dc4f1145980a [file] [log] [blame]
//===--- Diagnostics.h - Helper class for error diagnostics -----*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// \file
/// \brief Diagnostics class to manage error messages.
///
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_AST_MATCHERS_DYNAMIC_DIAGNOSTICS_H
#define LLVM_CLANG_AST_MATCHERS_DYNAMIC_DIAGNOSTICS_H
#include <string>
#include <vector>
#include "clang/ASTMatchers/Dynamic/VariantValue.h"
#include "clang/Basic/LLVM.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
namespace clang {
namespace ast_matchers {
namespace dynamic {
struct SourceLocation {
SourceLocation() : Line(), Column() {}
unsigned Line;
unsigned Column;
};
struct SourceRange {
SourceLocation Start;
SourceLocation End;
};
/// \brief A VariantValue instance annotated with its parser context.
struct ParserValue {
ParserValue() : Text(), Range(), Value() {}
StringRef Text;
SourceRange Range;
VariantValue Value;
};
/// \brief Helper class to manage error messages.
class Diagnostics {
public:
/// \brief All errors from the system.
enum ErrorType {
ET_None = 0,
ET_RegistryNotFound = 1,
ET_RegistryWrongArgCount = 2,
ET_RegistryWrongArgType = 3,
ET_RegistryNotBindable = 4,
ET_ParserStringError = 100,
ET_ParserMatcherArgFailure = 101,
ET_ParserMatcherFailure = 102,
ET_ParserNoOpenParen = 103,
ET_ParserNoCloseParen = 104,
ET_ParserNoComma = 105,
ET_ParserNoCode = 106,
ET_ParserNotAMatcher = 107,
ET_ParserInvalidToken = 108,
ET_ParserMalformedBindExpr = 109,
ET_ParserTrailingCode = 110
};
/// \brief Helper stream class.
struct ArgStream {
template <class T> ArgStream &operator<<(const T &Arg) {
return operator<<(Twine(Arg));
}
ArgStream &operator<<(const Twine &Arg);
std::vector<std::string> *Out;
};
/// \brief Push a frame to the beginning of the list
///
/// Returns a helper class to allow the caller to pass the arguments for the
/// error message, using the << operator.
ArgStream pushErrorFrame(const SourceRange &Range, ErrorType Error);
struct ErrorFrame {
SourceRange Range;
ErrorType Type;
std::vector<std::string> Args;
std::string ToString() const;
};
ArrayRef<ErrorFrame> frames() const { return Frames; }
/// \brief Returns a string representation of the last frame.
std::string ToString() const;
/// \brief Returns a string representation of the whole frame stack.
std::string ToStringFull() const;
private:
std::vector<ErrorFrame> Frames;
};
} // namespace dynamic
} // namespace ast_matchers
} // namespace clang
#endif // LLVM_CLANG_AST_MATCHERS_DYNAMIC_DIAGNOSTICS_H