CppParser
Loading...
Searching...
No Matches
cppvisitormatcher.h
Go to the documentation of this file.
1//
2// Created by saleh on 6/25/23.
3//
4
5#pragma once
6
12#include <algorithm>
13#include <vector>
14
15#include "cppast.h"
16#include "cppvisitorbase.h"
17#include "cppvisitorprinter.h"
18
20{
21 using MatchedFuncType = std::function<bool(CppObj* p)>;
22 const std::vector<CppObjType> typesToMatch;
24
25public:
30 explicit CppVisitorMatcher(const std::vector<CppObjType>& typesToMatch)
32 {
33 matchedFunc = [&](CppObj* p) -> bool {
34 return matched(p);
35 };
36 }
37
38 explicit CppVisitorMatcher(const std::vector<CppObjType>& typesToMatch, MatchedFuncType &&matchedFunc)
40 {
41 this->matchedFunc = matchedFunc;
42 }
43
50 virtual bool matched(CppObj* p)
51 {
52 std::cout << CppVisitorPrinter::astToString(p) << std::endl;
53 return true;
54 }
55
56 ~CppVisitorMatcher() override = default;
57
58private:
66 inline bool check(CppObj* p)
67 {
68 if (std::find(typesToMatch.begin(), typesToMatch.end(), p->objType_) != typesToMatch.end())
69 {
70 return matchedFunc(p); // continue traversing the tree only if the user wants to.
71 }
72 return true; // continue traversing the tree to find a possible match.
73 }
74
75protected:
76 bool visit(CppVarType* p) override
77 {
78 return check(p);
79 }
80 bool visit(CppCompound* p) override
81 {
82 return check(p);
83 }
84 bool visit(CppUnRecogPrePro* p) override
85 {
86 return check(p);
87 }
88 bool visit(CppUndef* p) override
89 {
90 return check(p);
91 }
92 bool visit(CppUsingDecl* p) override
93 {
94 return check(p);
95 }
96 bool visit(CppUsingNamespaceDecl* p) override
97 {
98 return check(p);
99 }
100 bool visit(CppVar* p) override
101 {
102 return check(p);
103 }
104 bool visit(CppVarList* p) override
105 {
106 return check(p);
107 }
109 {
110 return check(p);
111 }
113 {
114 return check(p);
115 }
117 {
118 return check(p);
119 }
120 bool visit(CppAsmBlock* p) override
121 {
122 return check(p);
123 }
124 bool visit(CppBlob* p) override
125 {
126 return check(p);
127 }
128 bool visit(CppDefine* p) override
129 {
130 return check(p);
131 }
132 bool visit(CppDocComment* p) override
133 {
134 return check(p);
135 }
136 bool visit(CppEnum* p) override
137 {
138 return check(p);
139 }
140 bool visit(CppExpr* p) override
141 {
142 return check(p);
143 }
144 bool visit(CppForBlock* p) override
145 {
146 return check(p);
147 }
148 bool visit(CppLambda* p) override
149 {
150 return check(p);
151 }
152 bool visit(CppDestructor* p) override
153 {
154 return check(p);
155 }
156 bool visit(CppConstructor* p) override
157 {
158 return check(p);
159 }
160 bool visit(CppFunction* p) override
161 {
162 return check(p);
163 }
164 bool visit(CppFunctionPointer* p) override
165 {
166 return check(p);
167 }
168 bool visit(CppTypeConverter* p) override
169 {
170 return check(p);
171 }
172 bool visit(CppFwdClsDecl* p) override
173 {
174 return check(p);
175 }
176 bool visit(CppHashError* p) override
177 {
178 return check(p);
179 }
180 bool visit(CppHashIf* p) override
181 {
182 return check(p);
183 }
184 bool visit(CppHashWarning* p) override
185 {
186 return check(p);
187 }
188 bool visit(CppImport* p) override
189 {
190 return check(p);
191 }
192 bool visit(CppInclude* p) override
193 {
194 return check(p);
195 }
196 bool visit(CppLabel* p) override
197 {
198 return check(p);
199 }
200 bool visit(CppMacroCall* p) override
201 {
202 return check(p);
203 }
204 bool visit(CppNamespaceAlias* p) override
205 {
206 return check(p);
207 }
208 bool visit(CppPragma* p) override
209 {
210 return check(p);
211 }
212 bool visit(CppRangeForBlock* p) override
213 {
214 return check(p);
215 }
216 bool visit(CppSwitchBlock* p) override
217 {
218 return check(p);
219 }
220 bool visit(CppTryBlock* p) override
221 {
222 return check(p);
223 }
224 bool visit(CppTypedefList* p) override
225 {
226 return check(p);
227 }
228 bool visit(CppTypedefName* p) override
229 {
230 return check(p);
231 }
232};
bool visit(CppUsingDecl *p) override
CppVisitorMatcher(const std::vector< CppObjType > &typesToMatch)
The only ctor of the class.
bool visit(CppUndef *p) override
bool visit(CppConstructor *p) override
bool visit(CppEnum *p) override
bool visit(CppFwdClsDecl *p) override
bool visit(CppLambda *p) override
bool visit(CppTryBlock *p) override
bool visit(CppNamespaceAlias *p) override
CppVisitorMatcher(const std::vector< CppObjType > &typesToMatch, MatchedFuncType &&matchedFunc)
bool visit(CppDocComment *p) override
bool visit(CppCommonBlock< CppObjType::kWhileBlock > *p) override
bool visit(CppTypedefList *p) override
bool visit(CppLabel *p) override
bool visit(CppTypedefName *p) override
bool visit(CppDefine *p) override
bool visit(CppVar *p) override
bool visit(CppFunction *p) override
bool visit(CppImport *p) override
bool visit(CppTypeConverter *p) override
bool visit(CppHashIf *p) override
bool visit(CppUnRecogPrePro *p) override
bool visit(CppCommonBlock< CppObjType::kIfBlock > *p) override
bool visit(CppCompound *p) override
const std::vector< CppObjType > typesToMatch
bool visit(CppUsingNamespaceDecl *p) override
bool visit(CppMacroCall *p) override
bool visit(CppFunctionPointer *p) override
bool visit(CppExpr *p) override
bool visit(CppInclude *p) override
bool check(CppObj *p)
Checks the given pointer to the current AST node against the node types that are to be matched.
~CppVisitorMatcher() override=default
bool visit(CppHashError *p) override
bool visit(CppForBlock *p) override
bool visit(CppDestructor *p) override
bool visit(CppPragma *p) override
bool visit(CppAsmBlock *p) override
bool visit(CppCommonBlock< CppObjType::kDoWhileBlock > *p) override
virtual bool matched(CppObj *p)
The virtual method to be called when a tree node is matched.
bool visit(CppVarType *p) override
The visitor pattern's visit methods for the given types.
bool visit(CppBlob *p) override
MatchedFuncType matchedFunc
std::function< bool(CppObj *p)> MatchedFuncType
bool visit(CppRangeForBlock *p) override
bool visit(CppSwitchBlock *p) override
bool visit(CppHashWarning *p) override
bool visit(CppVarList *p) override
static std::string astToString(CppObj *p)
Converts the given pointer to an AST node to its equivalent string of code using CppWriter class.
A stream of text that represents some content in a C++ program.
Definition: cppast.h:167
Some blocks have common structure like if, while, and do-while.
Definition: cppast.h:1923
All classes, structs, unions, and namespaces can be classified as a Compound object.
Definition: cppast.h:927
An expression in a C/C++ program.
Definition: cppast.h:1750
Function pointer type definition using typedef, e.g.
Definition: cppast.h:1390
Represents all variants of #if preprocessors.
Definition: cppast.h:276
An abstract class that is used as base class of all other classes.
Definition: cppast.h:134
CppObjType objType_
Definition: cppast.h:135
Any other C/C++ preprocessor for which there is no class defined.
Definition: cppast.h:371
List of variables declared in a line without repeating its type, e.g.
Definition: cppast.h:699
Class to represent C++ variable definition.
Definition: cppast.h:565