forked from OSchip/llvm-project
108 lines
3.8 KiB
C++
108 lines
3.8 KiB
C++
//===--- JsonCompileCommandLineDatabase - Simple JSON database --*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements reading a compile command line database, as written
|
|
// out for example by CMake. It only supports the subset of the JSON standard
|
|
// that is needed to parse the CMake output.
|
|
// See http://www.json.org/ for the full standard.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_CLANG_TOOLING_JSON_COMPILE_COMMAND_LINE_DATABASE_H
|
|
#define LLVM_CLANG_TOOLING_JSON_COMPILE_COMMAND_LINE_DATABASE_H
|
|
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace clang {
|
|
namespace tooling {
|
|
|
|
/// \brief Converts a JSON escaped command line to a vector of arguments.
|
|
///
|
|
/// \param JsonEscapedCommandLine The escaped command line as a string. This
|
|
/// is assumed to be escaped as a JSON string (e.g. " and \ are escaped).
|
|
/// In addition, any arguments containing spaces are assumed to be \-escaped
|
|
///
|
|
/// For example, the input (|| denoting non C-escaped strings):
|
|
/// |./call a \"b \\\" c \\\\ \" d|
|
|
/// would yield:
|
|
/// [ |./call|, |a|, |b " c \ |, |d| ].
|
|
std::vector<std::string> UnescapeJsonCommandLine(
|
|
llvm::StringRef JsonEscapedCommandLine);
|
|
|
|
/// \brief Interface for users of the JsonCompileCommandLineParser.
|
|
class CompileCommandHandler {
|
|
public:
|
|
virtual ~CompileCommandHandler() {}
|
|
|
|
/// \brief Called after all translation units are parsed.
|
|
virtual void EndTranslationUnits() {}
|
|
|
|
/// \brief Called at the end of a single translation unit.
|
|
virtual void EndTranslationUnit() {}
|
|
|
|
/// \brief Called for every (Key, Value) pair in a translation unit
|
|
/// description.
|
|
virtual void HandleKeyValue(llvm::StringRef Key, llvm::StringRef Value) {}
|
|
};
|
|
|
|
/// \brief A JSON parser that supports the subset of JSON needed to parse
|
|
/// JSON compile command line databases as written out by CMake.
|
|
///
|
|
/// The supported subset describes a list of compile command lines for
|
|
/// each processed translation unit. The translation units are stored in a
|
|
/// JSON array, where each translation unit is described by a JSON object
|
|
/// containing (Key, Value) pairs for the working directory the compile command
|
|
/// line was executed from, the main C/C++ input file of the translation unit
|
|
/// and the actual compile command line, for example:
|
|
/// [
|
|
/// {
|
|
/// "file":"/file.cpp",
|
|
/// "directory":"/",
|
|
/// "command":"/cc /file.cpp"
|
|
/// }
|
|
/// ]
|
|
class JsonCompileCommandLineParser {
|
|
public:
|
|
/// \brief Create a parser on 'Input', calling 'CommandHandler' to handle the
|
|
/// parsed constructs. 'CommandHandler' may be NULL in order to just check
|
|
/// the validity of 'Input'.
|
|
JsonCompileCommandLineParser(const llvm::StringRef Input,
|
|
CompileCommandHandler *CommandHandler);
|
|
|
|
/// \brief Parses the specified input. Returns true if no parsing errors were
|
|
/// foudn.
|
|
bool Parse();
|
|
|
|
/// \brief Returns an error message if Parse() returned false previously.
|
|
std::string GetErrorMessage() const;
|
|
|
|
private:
|
|
bool ParseTranslationUnits();
|
|
bool ParseTranslationUnit(bool First);
|
|
bool ParseObjectKeyValuePairs();
|
|
bool ParseString(llvm::StringRef &String);
|
|
bool Consume(char C);
|
|
bool ConsumeOrError(char C, llvm::StringRef Message);
|
|
void NextNonWhitespace();
|
|
bool IsWhitespace();
|
|
void SetExpectError(char C, llvm::StringRef Message);
|
|
|
|
const llvm::StringRef Input;
|
|
llvm::StringRef::iterator Position;
|
|
std::string ErrorMessage;
|
|
CompileCommandHandler * const CommandHandler;
|
|
};
|
|
|
|
} // end namespace tooling
|
|
} // end namespace clang
|
|
|
|
#endif // LLVM_CLANG_TOOLING_JSON_COMPILE_COMMAND_LINE_DATABASE_H
|