blob: a43f84da336d63883cb649e6b9edc9dce1e638be [file] [log] [blame]
Peter Collingbourne8b1265b2013-11-08 00:08:23 +00001//===--- QueryParser.h - clang-query ----------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_QUERY_QUERY_PARSER_H
11#define LLVM_CLANG_TOOLS_EXTRA_CLANG_QUERY_QUERY_PARSER_H
12
13#include "Query.h"
Samuel Benzaquen1f6066c2014-04-23 14:04:52 +000014#include "QuerySession.h"
Peter Collingbourned9a0f252014-02-01 01:42:46 +000015#include "llvm/LineEditor/LineEditor.h"
Eugene Zelenko05f7e6a2016-03-17 17:02:25 +000016#include <cstddef>
Peter Collingbourned9a0f252014-02-01 01:42:46 +000017
Peter Collingbourne8b1265b2013-11-08 00:08:23 +000018namespace clang {
19namespace query {
20
Peter Collingbourned9a0f252014-02-01 01:42:46 +000021class QuerySession;
22
23class QueryParser {
24public:
Dmitri Gribenko23077e32014-03-02 16:48:59 +000025 /// Parse \a Line as a query.
Peter Collingbourned9a0f252014-02-01 01:42:46 +000026 ///
27 /// \return A QueryRef representing the query, which may be an InvalidQuery.
Samuel Benzaquen1f6066c2014-04-23 14:04:52 +000028 static QueryRef parse(StringRef Line, const QuerySession &QS);
Peter Collingbourned9a0f252014-02-01 01:42:46 +000029
Dmitri Gribenko23077e32014-03-02 16:48:59 +000030 /// Compute a list of completions for \a Line assuming a cursor at
31 /// \param Pos characters past the start of \a Line, ordered from most
Peter Collingbourned9a0f252014-02-01 01:42:46 +000032 /// likely to least likely.
33 ///
Dmitri Gribenko23077e32014-03-02 16:48:59 +000034 /// \return A vector of completions for \a Line.
Samuel Benzaquen1f6066c2014-04-23 14:04:52 +000035 static std::vector<llvm::LineEditor::Completion>
36 complete(StringRef Line, size_t Pos, const QuerySession &QS);
Peter Collingbourned9a0f252014-02-01 01:42:46 +000037
38private:
Samuel Benzaquen1f6066c2014-04-23 14:04:52 +000039 QueryParser(StringRef Line, const QuerySession &QS)
Craig Topper6014c492014-06-10 04:50:50 +000040 : Begin(Line.begin()), End(Line.end()),
Craig Topperf61be9c2014-06-09 02:03:06 +000041 CompletionPos(nullptr), QS(QS) {}
Peter Collingbourned9a0f252014-02-01 01:42:46 +000042
43 StringRef lexWord();
44
45 template <typename T> struct LexOrCompleteWord;
46 template <typename T> LexOrCompleteWord<T> lexOrCompleteWord(StringRef &Str);
47
48 QueryRef parseSetBool(bool QuerySession::*Var);
49 QueryRef parseSetOutputKind();
Samuel Benzaquen1f6066c2014-04-23 14:04:52 +000050 QueryRef completeMatcherExpression();
Peter Collingbourned9a0f252014-02-01 01:42:46 +000051
52 QueryRef endQuery(QueryRef Q);
53
54 /// \brief Parse [\p Begin,\p End).
55 ///
56 /// \return A reference to the parsed query object, which may be an
57 /// \c InvalidQuery if a parse error occurs.
58 QueryRef doParse();
59
60 const char *Begin;
61 const char *End;
62
63 const char *CompletionPos;
64 std::vector<llvm::LineEditor::Completion> Completions;
Samuel Benzaquen1f6066c2014-04-23 14:04:52 +000065
66 const QuerySession &QS;
Peter Collingbourned9a0f252014-02-01 01:42:46 +000067};
Peter Collingbourne8b1265b2013-11-08 00:08:23 +000068
69} // namespace query
70} // namespace clang
71
Eugene Zelenko05f7e6a2016-03-17 17:02:25 +000072#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_QUERY_QUERY_PARSER_H