xref: /llvm-project/clang-tools-extra/clang-query/QueryParser.h (revision 027899dab6ac31a34e17b0f43eeb3d00e310a361)
1 //===--- QueryParser.h - clang-query ----------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_QUERY_QUERY_PARSER_H
10 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_QUERY_QUERY_PARSER_H
11 
12 #include "Query.h"
13 #include "QuerySession.h"
14 #include "llvm/LineEditor/LineEditor.h"
15 #include <cstddef>
16 
17 namespace clang {
18 namespace query {
19 
20 class QuerySession;
21 
22 class QueryParser {
23 public:
24   /// Parse \a Line as a query.
25   ///
26   /// \return A QueryRef representing the query, which may be an InvalidQuery.
27   static QueryRef parse(StringRef Line, const QuerySession &QS);
28 
29   /// Compute a list of completions for \a Line assuming a cursor at
30   /// \param Pos characters past the start of \a Line, ordered from most
31   /// likely to least likely.
32   ///
33   /// \return A vector of completions for \a Line.
34   static std::vector<llvm::LineEditor::Completion>
35   complete(StringRef Line, size_t Pos, const QuerySession &QS);
36 
37 private:
QueryParser(StringRef Line,const QuerySession & QS)38   QueryParser(StringRef Line, const QuerySession &QS)
39       : Line(Line), CompletionPos(nullptr), QS(QS) {}
40 
41   StringRef lexWord();
42 
43   template <typename T> struct LexOrCompleteWord;
44 
45   QueryRef parseSetBool(bool QuerySession::*Var);
46   QueryRef parseSetTraversalKind(TraversalKind QuerySession::*Var);
47   template <typename QueryType> QueryRef parseSetOutputKind();
48   QueryRef completeMatcherExpression();
49 
50   QueryRef endQuery(QueryRef Q);
51 
52   /// Parse [\p Begin,\p End).
53   ///
54   /// \return A reference to the parsed query object, which may be an
55   /// \c InvalidQuery if a parse error occurs.
56   QueryRef doParse();
57 
58   StringRef Line;
59 
60   const char *CompletionPos;
61   std::vector<llvm::LineEditor::Completion> Completions;
62 
63   const QuerySession &QS;
64 };
65 
66 } // namespace query
67 } // namespace clang
68 
69 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_QUERY_QUERY_PARSER_H
70