//===--- QueryParser.h - clang-query ----------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_QUERY_QUERY_PARSER_H
#define LLVM_CLANG_TOOLS_EXTRA_CLANG_QUERY_QUERY_PARSER_H

#include "Query.h"
#include "QuerySession.h"
#include "llvm/LineEditor/LineEditor.h"
#include <cstddef>

namespace clang {
namespace query {

class QuerySession;

class QueryParser {
public:
  /// Parse \a Line as a query.
  ///
  /// \return A QueryRef representing the query, which may be an InvalidQuery.
  static QueryRef parse(StringRef Line, const QuerySession &QS);

  /// Compute a list of completions for \a Line assuming a cursor at
  /// \param Pos characters past the start of \a Line, ordered from most
  /// likely to least likely.
  ///
  /// \return A vector of completions for \a Line.
  static std::vector<llvm::LineEditor::Completion>
  complete(StringRef Line, size_t Pos, const QuerySession &QS);

private:
  QueryParser(StringRef Line, const QuerySession &QS)
      : Begin(Line.begin()), End(Line.end()), CompletionPos(nullptr), QS(QS) {}

  StringRef lexWord();

  template <typename T> struct LexOrCompleteWord;

  QueryRef parseSetBool(bool QuerySession::*Var);
  QueryRef parseSetOutputKind();
  QueryRef completeMatcherExpression();

  QueryRef endQuery(QueryRef Q);

  /// \brief Parse [\p Begin,\p End).
  ///
  /// \return A reference to the parsed query object, which may be an
  /// \c InvalidQuery if a parse error occurs.
  QueryRef doParse();

  const char *Begin;
  const char *End;

  const char *CompletionPos;
  std::vector<llvm::LineEditor::Completion> Completions;

  const QuerySession &QS;
};

} // namespace query
} // namespace clang

#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_QUERY_QUERY_PARSER_H
