1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
16 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 ** In addition, as a special exception, Nokia gives you certain additional
26 ** rights. These rights are described in the Nokia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 ** If you have questions regarding the use of this file, please contact
30 ** Nokia at qt-info@nokia.com.
32 **************************************************************************/
33 // Copyright (c) 2008 Roberto Raggi <roberto.raggi@gmail.com>
35 // Permission is hereby granted, free of charge, to any person obtaining a copy
36 // of this software and associated documentation files (the "Software"), to deal
37 // in the Software without restriction, including without limitation the rights
38 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
39 // copies of the Software, and to permit persons to whom the Software is
40 // furnished to do so, subject to the following conditions:
42 // The above copyright notice and this permission notice shall be included in
43 // all copies or substantial portions of the Software.
45 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
46 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
47 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
48 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
49 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
50 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
53 #ifndef CPLUSPLUS_ASTVISITOR_H
54 #define CPLUSPLUS_ASTVISITOR_H
56 #include "CPlusPlusForwardDeclarations.h"
62 class CPLUSPLUS_EXPORT ASTVisitor
64 ASTVisitor(const ASTVisitor &other);
65 void operator =(const ASTVisitor &other);
68 ASTVisitor(TranslationUnit *unit);
69 virtual ~ASTVisitor();
71 TranslationUnit *translationUnit() const;
72 void setTranslationUnit(TranslationUnit *translationUnit);
74 Control *control() const;
75 unsigned tokenCount() const;
76 const Token &tokenAt(unsigned index) const;
77 int tokenKind(unsigned index) const;
78 const char *spell(unsigned index) const;
79 const Identifier *identifier(unsigned index) const;
80 const Literal *literal(unsigned index) const;
81 const NumericLiteral *numericLiteral(unsigned index) const;
82 const StringLiteral *stringLiteral(unsigned index) const;
84 void getPosition(unsigned offset,
87 const StringLiteral **fileName = 0) const;
89 void getTokenPosition(unsigned index,
92 const StringLiteral **fileName = 0) const;
94 void getTokenStartPosition(unsigned index, unsigned *line, unsigned *column) const;
95 void getTokenEndPosition(unsigned index, unsigned *line, unsigned *column) const;
97 void accept(AST *ast);
99 template <typename _Tp>
100 void accept(List<_Tp> *it)
102 for (; it; it = it->next)
106 virtual bool preVisit(AST *) { return true; }
107 virtual void postVisit(AST *) {}
109 virtual bool visit(AccessDeclarationAST *) { return true; }
110 virtual bool visit(QtObjectTagAST *) { return true; }
111 virtual bool visit(QtPrivateSlotAST *) { return true; }
112 virtual bool visit(QtPropertyDeclarationAST *) { return true; }
113 virtual bool visit(QtEnumDeclarationAST *) { return true; }
114 virtual bool visit(QtFlagsDeclarationAST *) { return true; }
115 virtual bool visit(ArrayAccessAST *) { return true; }
116 virtual bool visit(ArrayDeclaratorAST *) { return true; }
117 virtual bool visit(ArrayInitializerAST *) { return true; }
118 virtual bool visit(AsmDefinitionAST *) { return true; }
119 virtual bool visit(AttributeSpecifierAST *) { return true; }
120 virtual bool visit(AttributeAST *) { return true; }
121 virtual bool visit(BaseSpecifierAST *) { return true; }
122 virtual bool visit(BinaryExpressionAST *) { return true; }
123 virtual bool visit(BoolLiteralAST *) { return true; }
124 virtual bool visit(BreakStatementAST *) { return true; }
125 virtual bool visit(CallAST *) { return true; }
126 virtual bool visit(CaseStatementAST *) { return true; }
127 virtual bool visit(CastExpressionAST *) { return true; }
128 virtual bool visit(CatchClauseAST *) { return true; }
129 virtual bool visit(ClassSpecifierAST *) { return true; }
130 virtual bool visit(CompoundExpressionAST *) { return true; }
131 virtual bool visit(CompoundLiteralAST *) { return true; }
132 virtual bool visit(CompoundStatementAST *) { return true; }
133 virtual bool visit(ConditionAST *) { return true; }
134 virtual bool visit(ConditionalExpressionAST *) { return true; }
135 virtual bool visit(ContinueStatementAST *) { return true; }
136 virtual bool visit(ConversionFunctionIdAST *) { return true; }
137 virtual bool visit(CppCastExpressionAST *) { return true; }
138 virtual bool visit(CtorInitializerAST *) { return true; }
139 virtual bool visit(DeclaratorAST *) { return true; }
140 virtual bool visit(DeclarationStatementAST *) { return true; }
141 virtual bool visit(DeclaratorIdAST *) { return true; }
142 virtual bool visit(DeleteExpressionAST *) { return true; }
143 virtual bool visit(DestructorNameAST *) { return true; }
144 virtual bool visit(DoStatementAST *) { return true; }
145 virtual bool visit(ElaboratedTypeSpecifierAST *) { return true; }
146 virtual bool visit(EmptyDeclarationAST *) { return true; }
147 virtual bool visit(EnumSpecifierAST *) { return true; }
148 virtual bool visit(EnumeratorAST *) { return true; }
149 virtual bool visit(ExceptionDeclarationAST *) { return true; }
150 virtual bool visit(ExceptionSpecificationAST *) { return true; }
151 virtual bool visit(ExpressionOrDeclarationStatementAST *) { return true; }
152 virtual bool visit(ExpressionStatementAST *) { return true; }
153 virtual bool visit(ForeachStatementAST *) { return true; }
154 virtual bool visit(ForStatementAST *) { return true; }
155 virtual bool visit(FunctionDeclaratorAST *) { return true; }
156 virtual bool visit(FunctionDefinitionAST *) { return true; }
157 virtual bool visit(GotoStatementAST *) { return true; }
158 virtual bool visit(IdExpressionAST *) { return true; }
159 virtual bool visit(IfStatementAST *) { return true; }
160 virtual bool visit(LabeledStatementAST *) { return true; }
161 virtual bool visit(LinkageBodyAST *) { return true; }
162 virtual bool visit(LinkageSpecificationAST *) { return true; }
163 virtual bool visit(MemInitializerAST *) { return true; }
164 virtual bool visit(MemberAccessAST *) { return true; }
165 virtual bool visit(NamedTypeSpecifierAST *) { return true; }
166 virtual bool visit(NamespaceAST *) { return true; }
167 virtual bool visit(NamespaceAliasDefinitionAST *) { return true; }
168 virtual bool visit(NestedDeclaratorAST *) { return true; }
169 virtual bool visit(NestedExpressionAST *) { return true; }
170 virtual bool visit(NestedNameSpecifierAST *) { return true; }
171 virtual bool visit(NewPlacementAST *) { return true; }
172 virtual bool visit(NewArrayDeclaratorAST *) { return true; }
173 virtual bool visit(NewExpressionAST *) { return true; }
174 virtual bool visit(NewInitializerAST *) { return true; }
175 virtual bool visit(NewTypeIdAST *) { return true; }
176 virtual bool visit(NumericLiteralAST *) { return true; }
177 virtual bool visit(OperatorAST *) { return true; }
178 virtual bool visit(OperatorFunctionIdAST *) { return true; }
179 virtual bool visit(ParameterDeclarationAST *) { return true; }
180 virtual bool visit(ParameterDeclarationClauseAST *) { return true; }
181 virtual bool visit(PointerAST *) { return true; }
182 virtual bool visit(PointerToMemberAST *) { return true; }
183 virtual bool visit(PostIncrDecrAST *) { return true; }
184 virtual bool visit(QualifiedNameAST *) { return true; }
185 virtual bool visit(ReferenceAST *) { return true; }
186 virtual bool visit(ReturnStatementAST *) { return true; }
187 virtual bool visit(SimpleDeclarationAST *) { return true; }
188 virtual bool visit(SimpleNameAST *) { return true; }
189 virtual bool visit(SimpleSpecifierAST *) { return true; }
190 virtual bool visit(SizeofExpressionAST *) { return true; }
191 virtual bool visit(StringLiteralAST *) { return true; }
192 virtual bool visit(SwitchStatementAST *) { return true; }
193 virtual bool visit(TemplateDeclarationAST *) { return true; }
194 virtual bool visit(TemplateIdAST *) { return true; }
195 virtual bool visit(TemplateTypeParameterAST *) { return true; }
196 virtual bool visit(ThisExpressionAST *) { return true; }
197 virtual bool visit(ThrowExpressionAST *) { return true; }
198 virtual bool visit(TranslationUnitAST *) { return true; }
199 virtual bool visit(TryBlockStatementAST *) { return true; }
200 virtual bool visit(TypeConstructorCallAST *) { return true; }
201 virtual bool visit(TypeIdAST *) { return true; }
202 virtual bool visit(TypeidExpressionAST *) { return true; }
203 virtual bool visit(TypeofSpecifierAST *) { return true; }
204 virtual bool visit(TypenameCallExpressionAST *) { return true; }
205 virtual bool visit(TypenameTypeParameterAST *) { return true; }
206 virtual bool visit(UnaryExpressionAST *) { return true; }
207 virtual bool visit(UsingAST *) { return true; }
208 virtual bool visit(UsingDirectiveAST *) { return true; }
209 virtual bool visit(WhileStatementAST *) { return true; }
210 virtual bool visit(QtMethodAST *) { return true; }
211 virtual bool visit(QtMemberDeclarationAST *) { return true; }
212 virtual bool visit(QtPropertyDeclarationItemAST *) { return true; }
213 virtual bool visit(QtInterfacesDeclarationAST *) { return true; }
214 virtual bool visit(QtInterfaceNameAST *) { return true; }
217 virtual bool visit(LambdaExpressionAST *) { return true; }
218 virtual bool visit(LambdaIntroducerAST *) { return true; }
219 virtual bool visit(LambdaCaptureAST *) { return true; }
220 virtual bool visit(LambdaDeclaratorAST *) { return true; }
221 virtual bool visit(CaptureAST *) { return true; }
222 virtual bool visit(TrailingReturnTypeAST *) { return true; }
223 virtual bool visit(BracedInitializerAST *) { return true; }
226 virtual bool visit(ObjCClassDeclarationAST *) { return true; }
227 virtual bool visit(ObjCClassForwardDeclarationAST *) { return true; }
228 virtual bool visit(ObjCProtocolDeclarationAST *) { return true; }
229 virtual bool visit(ObjCProtocolForwardDeclarationAST *) { return true; }
230 virtual bool visit(ObjCProtocolRefsAST *) { return true; }
231 virtual bool visit(ObjCSelectorAST *) { return true; }
232 virtual bool visit(ObjCMessageExpressionAST *) { return true; }
233 virtual bool visit(ObjCMessageArgumentAST *) { return true; }
234 virtual bool visit(ObjCProtocolExpressionAST *) { return true; }
235 virtual bool visit(ObjCTypeNameAST *) { return true; }
236 virtual bool visit(ObjCEncodeExpressionAST *) { return true; }
237 virtual bool visit(ObjCSelectorArgumentAST *) { return true; }
238 virtual bool visit(ObjCSelectorExpressionAST *) { return true; }
239 virtual bool visit(ObjCInstanceVariablesDeclarationAST *) { return true; }
240 virtual bool visit(ObjCVisibilityDeclarationAST *) { return true; }
241 virtual bool visit(ObjCPropertyAttributeAST *) { return true; }
242 virtual bool visit(ObjCPropertyDeclarationAST *) { return true; }
243 virtual bool visit(ObjCMethodPrototypeAST *) { return true; }
244 virtual bool visit(ObjCMethodDeclarationAST *) { return true; }
245 virtual bool visit(ObjCMessageArgumentDeclarationAST *) { return true; }
246 virtual bool visit(ObjCSynthesizedPropertyAST *) { return true; }
247 virtual bool visit(ObjCSynthesizedPropertiesDeclarationAST *) { return true; }
248 virtual bool visit(ObjCDynamicPropertiesDeclarationAST *) { return true; }
249 virtual bool visit(ObjCFastEnumerationAST *) { return true; }
250 virtual bool visit(ObjCSynchronizedStatementAST *) { return true; }
252 virtual void endVisit(AccessDeclarationAST *) { }
253 virtual void endVisit(QtObjectTagAST *) {}
254 virtual void endVisit(QtPrivateSlotAST *) {}
255 virtual void endVisit(QtPropertyDeclarationAST *) { }
256 virtual void endVisit(QtEnumDeclarationAST *) { }
257 virtual void endVisit(QtFlagsDeclarationAST *) { }
258 virtual void endVisit(ArrayAccessAST *) { }
259 virtual void endVisit(ArrayDeclaratorAST *) { }
260 virtual void endVisit(ArrayInitializerAST *) { }
261 virtual void endVisit(AsmDefinitionAST *) { }
262 virtual void endVisit(AttributeSpecifierAST *) { }
263 virtual void endVisit(AttributeAST *) { }
264 virtual void endVisit(BaseSpecifierAST *) { }
265 virtual void endVisit(BinaryExpressionAST *) { }
266 virtual void endVisit(BoolLiteralAST *) { }
267 virtual void endVisit(BreakStatementAST *) { }
268 virtual void endVisit(CallAST *) { }
269 virtual void endVisit(CaseStatementAST *) { }
270 virtual void endVisit(CastExpressionAST *) { }
271 virtual void endVisit(CatchClauseAST *) { }
272 virtual void endVisit(ClassSpecifierAST *) { }
273 virtual void endVisit(CompoundExpressionAST *) { }
274 virtual void endVisit(CompoundLiteralAST *) { }
275 virtual void endVisit(CompoundStatementAST *) { }
276 virtual void endVisit(ConditionAST *) { }
277 virtual void endVisit(ConditionalExpressionAST *) { }
278 virtual void endVisit(ContinueStatementAST *) { }
279 virtual void endVisit(ConversionFunctionIdAST *) { }
280 virtual void endVisit(CppCastExpressionAST *) { }
281 virtual void endVisit(CtorInitializerAST *) { }
282 virtual void endVisit(DeclaratorAST *) { }
283 virtual void endVisit(DeclarationStatementAST *) { }
284 virtual void endVisit(DeclaratorIdAST *) { }
285 virtual void endVisit(DeleteExpressionAST *) { }
286 virtual void endVisit(DestructorNameAST *) { }
287 virtual void endVisit(DoStatementAST *) { }
288 virtual void endVisit(ElaboratedTypeSpecifierAST *) { }
289 virtual void endVisit(EmptyDeclarationAST *) { }
290 virtual void endVisit(EnumSpecifierAST *) { }
291 virtual void endVisit(EnumeratorAST *) { }
292 virtual void endVisit(ExceptionDeclarationAST *) { }
293 virtual void endVisit(ExceptionSpecificationAST *) { }
294 virtual void endVisit(ExpressionOrDeclarationStatementAST *) { }
295 virtual void endVisit(ExpressionStatementAST *) { }
296 virtual void endVisit(ForeachStatementAST *) { }
297 virtual void endVisit(ForStatementAST *) { }
298 virtual void endVisit(FunctionDeclaratorAST *) { }
299 virtual void endVisit(FunctionDefinitionAST *) { }
300 virtual void endVisit(GotoStatementAST *) { }
301 virtual void endVisit(IdExpressionAST *) { }
302 virtual void endVisit(IfStatementAST *) { }
303 virtual void endVisit(LabeledStatementAST *) { }
304 virtual void endVisit(LinkageBodyAST *) { }
305 virtual void endVisit(LinkageSpecificationAST *) { }
306 virtual void endVisit(MemInitializerAST *) { }
307 virtual void endVisit(MemberAccessAST *) { }
308 virtual void endVisit(NamedTypeSpecifierAST *) { }
309 virtual void endVisit(NamespaceAST *) { }
310 virtual void endVisit(NamespaceAliasDefinitionAST *) { }
311 virtual void endVisit(NestedDeclaratorAST *) { }
312 virtual void endVisit(NestedExpressionAST *) { }
313 virtual void endVisit(NestedNameSpecifierAST *) { }
314 virtual void endVisit(NewPlacementAST *) { }
315 virtual void endVisit(NewArrayDeclaratorAST *) { }
316 virtual void endVisit(NewExpressionAST *) { }
317 virtual void endVisit(NewInitializerAST *) { }
318 virtual void endVisit(NewTypeIdAST *) { }
319 virtual void endVisit(NumericLiteralAST *) { }
320 virtual void endVisit(OperatorAST *) { }
321 virtual void endVisit(OperatorFunctionIdAST *) { }
322 virtual void endVisit(ParameterDeclarationAST *) { }
323 virtual void endVisit(ParameterDeclarationClauseAST *) { }
324 virtual void endVisit(PointerAST *) { }
325 virtual void endVisit(PointerToMemberAST *) { }
326 virtual void endVisit(PostIncrDecrAST *) { }
327 virtual void endVisit(QualifiedNameAST *) { }
328 virtual void endVisit(ReferenceAST *) { }
329 virtual void endVisit(ReturnStatementAST *) { }
330 virtual void endVisit(SimpleDeclarationAST *) { }
331 virtual void endVisit(SimpleNameAST *) { }
332 virtual void endVisit(SimpleSpecifierAST *) { }
333 virtual void endVisit(SizeofExpressionAST *) { }
334 virtual void endVisit(StringLiteralAST *) { }
335 virtual void endVisit(SwitchStatementAST *) { }
336 virtual void endVisit(TemplateDeclarationAST *) { }
337 virtual void endVisit(TemplateIdAST *) { }
338 virtual void endVisit(TemplateTypeParameterAST *) { }
339 virtual void endVisit(ThisExpressionAST *) { }
340 virtual void endVisit(ThrowExpressionAST *) { }
341 virtual void endVisit(TranslationUnitAST *) { }
342 virtual void endVisit(TryBlockStatementAST *) { }
343 virtual void endVisit(TypeConstructorCallAST *) { }
344 virtual void endVisit(TypeIdAST *) { }
345 virtual void endVisit(TypeidExpressionAST *) { }
346 virtual void endVisit(TypeofSpecifierAST *) { }
347 virtual void endVisit(TypenameCallExpressionAST *) { }
348 virtual void endVisit(TypenameTypeParameterAST *) { }
349 virtual void endVisit(UnaryExpressionAST *) { }
350 virtual void endVisit(UsingAST *) { }
351 virtual void endVisit(UsingDirectiveAST *) { }
352 virtual void endVisit(WhileStatementAST *) { }
353 virtual void endVisit(QtMethodAST *) { }
354 virtual void endVisit(QtMemberDeclarationAST *) { }
355 virtual void endVisit(QtPropertyDeclarationItemAST *) { }
356 virtual void endVisit(QtInterfacesDeclarationAST *) { }
357 virtual void endVisit(QtInterfaceNameAST *) { }
360 virtual void endVisit(LambdaExpressionAST *) { }
361 virtual void endVisit(LambdaIntroducerAST *) { }
362 virtual void endVisit(LambdaCaptureAST *) { }
363 virtual void endVisit(LambdaDeclaratorAST *) { }
364 virtual void endVisit(CaptureAST *) { }
365 virtual void endVisit(TrailingReturnTypeAST *) { }
366 virtual void endVisit(BracedInitializerAST *) { }
369 virtual void endVisit(ObjCClassDeclarationAST *) { }
370 virtual void endVisit(ObjCClassForwardDeclarationAST *) { }
371 virtual void endVisit(ObjCProtocolDeclarationAST *) { }
372 virtual void endVisit(ObjCProtocolForwardDeclarationAST *) { }
373 virtual void endVisit(ObjCProtocolRefsAST *) { }
374 virtual void endVisit(ObjCSelectorAST *) { }
375 virtual void endVisit(ObjCMessageExpressionAST *) { }
376 virtual void endVisit(ObjCMessageArgumentAST *) { }
377 virtual void endVisit(ObjCProtocolExpressionAST *) { }
378 virtual void endVisit(ObjCTypeNameAST *) { }
379 virtual void endVisit(ObjCEncodeExpressionAST *) { }
380 virtual void endVisit(ObjCSelectorArgumentAST *) { }
381 virtual void endVisit(ObjCSelectorExpressionAST *) { }
382 virtual void endVisit(ObjCInstanceVariablesDeclarationAST *) { }
383 virtual void endVisit(ObjCVisibilityDeclarationAST *) { }
384 virtual void endVisit(ObjCPropertyAttributeAST *) { }
385 virtual void endVisit(ObjCPropertyDeclarationAST *) { }
386 virtual void endVisit(ObjCMethodPrototypeAST *) { }
387 virtual void endVisit(ObjCMethodDeclarationAST *) { }
388 virtual void endVisit(ObjCMessageArgumentDeclarationAST *) { }
389 virtual void endVisit(ObjCSynthesizedPropertyAST *) { }
390 virtual void endVisit(ObjCSynthesizedPropertiesDeclarationAST *) { }
391 virtual void endVisit(ObjCDynamicPropertiesDeclarationAST *) { }
392 virtual void endVisit(ObjCFastEnumerationAST *) { }
393 virtual void endVisit(ObjCSynchronizedStatementAST *) { }
396 TranslationUnit *_translationUnit;
399 } // end of namespace CPlusPlus
402 #endif // CPLUSPLUS_ASTVISITOR_H