clang-tools 19.0.0git
Query.h
Go to the documentation of this file.
1//===--- Query.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_H
10#define LLVM_CLANG_TOOLS_EXTRA_CLANG_QUERY_QUERY_H
11
12#include "QuerySession.h"
13#include "clang/ASTMatchers/Dynamic/VariantValue.h"
14#include "llvm/ADT/IntrusiveRefCntPtr.h"
15#include <string>
16
17namespace clang {
18namespace query {
19
21
34};
35
36class QuerySession;
37
38struct Query : llvm::RefCountedBase<Query> {
40 virtual ~Query();
41
42 /// Perform the query on \p QS and print output to \p OS.
43 ///
44 /// \return false if an error occurs, otherwise return true.
45 virtual bool run(llvm::raw_ostream &OS, QuerySession &QS) const = 0;
46
49};
50
51typedef llvm::IntrusiveRefCntPtr<Query> QueryRef;
52
53/// Any query which resulted in a parse error. The error message is in ErrStr.
55 InvalidQuery(const Twine &ErrStr) : Query(QK_Invalid), ErrStr(ErrStr.str()) {}
56 bool run(llvm::raw_ostream &OS, QuerySession &QS) const override;
57
58 std::string ErrStr;
59
60 static bool classof(const Query *Q) { return Q->Kind == QK_Invalid; }
61};
62
63/// No-op query (i.e. a blank line).
64struct NoOpQuery : Query {
66 bool run(llvm::raw_ostream &OS, QuerySession &QS) const override;
67
68 static bool classof(const Query *Q) { return Q->Kind == QK_NoOp; }
69};
70
71/// Query for "help".
72struct HelpQuery : Query {
74 bool run(llvm::raw_ostream &OS, QuerySession &QS) const override;
75
76 static bool classof(const Query *Q) { return Q->Kind == QK_Help; }
77};
78
79/// Query for "quit".
80struct QuitQuery : Query {
82 bool run(llvm::raw_ostream &OS, QuerySession &QS) const override;
83
84 static bool classof(const Query *Q) { return Q->Kind == QK_Quit; }
85};
86
87/// Query for "match MATCHER".
88struct MatchQuery : Query {
89 MatchQuery(StringRef Source,
90 const ast_matchers::dynamic::DynTypedMatcher &Matcher)
92 bool run(llvm::raw_ostream &OS, QuerySession &QS) const override;
93
94 ast_matchers::dynamic::DynTypedMatcher Matcher;
95
96 StringRef Source;
97
98 static bool classof(const Query *Q) { return Q->Kind == QK_Match; }
99};
100
101struct LetQuery : Query {
102 LetQuery(StringRef Name, const ast_matchers::dynamic::VariantValue &Value)
103 : Query(QK_Let), Name(Name), Value(Value) {}
104 bool run(llvm::raw_ostream &OS, QuerySession &QS) const override;
105
106 std::string Name;
107 ast_matchers::dynamic::VariantValue Value;
108
109 static bool classof(const Query *Q) { return Q->Kind == QK_Let; }
110};
111
112template <typename T> struct SetQueryKind {};
113
114template <> struct SetQueryKind<bool> {
115 static const QueryKind value = QK_SetBool;
116};
117
118template <> struct SetQueryKind<OutputKind> {
119 static const QueryKind value = QK_SetOutputKind;
120};
121
122template <> struct SetQueryKind<TraversalKind> {
123 static const QueryKind value = QK_SetTraversalKind;
124};
125
126/// Query for "set VAR VALUE".
127template <typename T> struct SetQuery : Query {
129 : Query(SetQueryKind<T>::value), Var(Var), Value(Value) {}
130 bool run(llvm::raw_ostream &OS, QuerySession &QS) const override {
131 QS.*Var = Value;
132 return true;
133 }
134
135 static bool classof(const Query *Q) {
136 return Q->Kind == SetQueryKind<T>::value;
137 }
138
141};
142
143// Implements the exclusive 'set output dump|diag|print' options.
147 bool run(llvm::raw_ostream &OS, QuerySession &QS) const override {
148 QS.DiagOutput = false;
149 QS.DetailedASTOutput = false;
150 QS.PrintOutput = false;
151 QS.SrcLocOutput = false;
152 QS.*Var = true;
153 return true;
154 }
155
156 static bool classof(const Query *Q) { return Q->Kind == QK_SetOutputKind; }
157
159};
160
161// Implements the non-exclusive 'set output dump|diag|print' options.
164 bool Value)
165 : Query(Kind), Var(Var), Value(Value) {}
166 bool run(llvm::raw_ostream &OS, QuerySession &QS) const override {
167 QS.*Var = Value;
168 return true;
169 }
170
172 bool Value;
173};
174
178
179 static bool classof(const Query *Q) { return Q->Kind == QK_EnableOutputKind; }
180};
181
185
186 static bool classof(const Query *Q) {
187 return Q->Kind == QK_DisableOutputKind;
188 }
189};
190
191} // namespace query
192} // namespace clang
193
194#endif
llvm::raw_string_ostream OS
Definition: TraceTests.cpp:160
Represents the state for a particular clang-query session.
Definition: QuerySession.h:24
llvm::IntrusiveRefCntPtr< Query > QueryRef
Definition: Query.h:51
@ OK_Diag
Definition: Query.h:20
@ OK_Print
Definition: Query.h:20
@ OK_SrcLoc
Definition: Query.h:20
@ OK_DetailedAST
Definition: Query.h:20
@ QK_Help
Definition: Query.h:25
@ QK_Invalid
Definition: Query.h:23
@ QK_DisableOutputKind
Definition: Query.h:32
@ QK_NoOp
Definition: Query.h:24
@ QK_EnableOutputKind
Definition: Query.h:31
@ QK_Let
Definition: Query.h:26
@ QK_Match
Definition: Query.h:27
@ QK_Quit
Definition: Query.h:33
@ QK_SetOutputKind
Definition: Query.h:29
@ QK_SetTraversalKind
Definition: Query.h:30
@ QK_SetBool
Definition: Query.h:28
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
-clang-tidy
DisableOutputQuery(bool QuerySession::*Var)
Definition: Query.h:183
static bool classof(const Query *Q)
Definition: Query.h:186
EnableOutputQuery(bool QuerySession::*Var)
Definition: Query.h:176
static bool classof(const Query *Q)
Definition: Query.h:179
Query for "help".
Definition: Query.h:72
static bool classof(const Query *Q)
Definition: Query.h:76
Any query which resulted in a parse error. The error message is in ErrStr.
Definition: Query.h:54
static bool classof(const Query *Q)
Definition: Query.h:60
std::string ErrStr
Definition: Query.h:58
InvalidQuery(const Twine &ErrStr)
Definition: Query.h:55
LetQuery(StringRef Name, const ast_matchers::dynamic::VariantValue &Value)
Definition: Query.h:102
ast_matchers::dynamic::VariantValue Value
Definition: Query.h:107
std::string Name
Definition: Query.h:106
static bool classof(const Query *Q)
Definition: Query.h:109
Query for "match MATCHER".
Definition: Query.h:88
MatchQuery(StringRef Source, const ast_matchers::dynamic::DynTypedMatcher &Matcher)
Definition: Query.h:89
StringRef Source
Definition: Query.h:96
static bool classof(const Query *Q)
Definition: Query.h:98
ast_matchers::dynamic::DynTypedMatcher Matcher
Definition: Query.h:94
No-op query (i.e. a blank line).
Definition: Query.h:64
static bool classof(const Query *Q)
Definition: Query.h:68
virtual bool run(llvm::raw_ostream &OS, QuerySession &QS) const =0
Perform the query on QS and print output to OS.
virtual ~Query()
Definition: Query.cpp:25
StringRef RemainingContent
Definition: Query.h:47
Query(QueryKind Kind)
Definition: Query.h:39
const QueryKind Kind
Definition: Query.h:48
Query for "quit".
Definition: Query.h:80
static bool classof(const Query *Q)
Definition: Query.h:84
SetExclusiveOutputQuery(bool QuerySession::*Var)
Definition: Query.h:145
static bool classof(const Query *Q)
Definition: Query.h:156
bool run(llvm::raw_ostream &OS, QuerySession &QS) const override
Perform the query on QS and print output to OS.
Definition: Query.h:147
bool QuerySession::* Var
Definition: Query.h:158
SetNonExclusiveOutputQuery(QueryKind Kind, bool QuerySession::*Var, bool Value)
Definition: Query.h:163
bool run(llvm::raw_ostream &OS, QuerySession &QS) const override
Perform the query on QS and print output to OS.
Definition: Query.h:166
Query for "set VAR VALUE".
Definition: Query.h:127
T QuerySession::* Var
Definition: Query.h:139
static bool classof(const Query *Q)
Definition: Query.h:135
bool run(llvm::raw_ostream &OS, QuerySession &QS) const override
Perform the query on QS and print output to OS.
Definition: Query.h:130
SetQuery(T QuerySession::*Var, T Value)
Definition: Query.h:128