1
/****************************************************************************
3
** Copyright (C) 2004-2005 Trolltech AS. All rights reserved.
4
** Copyright (C) 2001-2004 Roberto Raggi
6
** This file is part of the porting application of the Qt Toolkit.
8
** This file may be distributed under the terms of the Q Public License
9
** as defined by Trolltech AS of Norway and appearing in the file
10
** LICENSE.QPL included in the packaging of this file.
12
** This file may be distributed and/or modified under the terms of the
13
** GNU General Public License version 2 as published by the Free Software
14
** Foundation and appearing in the file LICENSE.GPL included in the
15
** packaging of this file.
17
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
18
** information about Qt Commercial License Agreements.
19
** See http://www.trolltech.com/qpl/ for QPL licensing information.
20
** See http://www.trolltech.com/gpl/ for GPL licensing information.
22
** Contact info@trolltech.com if any conditions of this licensing are
25
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
26
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
28
****************************************************************************/
30
#include "treewalker.h"
34
inline void parseAll(TreeWalker *w, const List<T *> *l)
44
//Workaround for ICE on MSVC, use macro instead of template.
45
#define PARSE_ALL(ListType, ListValueType) \
46
inline void parseAll(TreeWalker *w, const ListType *l) \
50
foreach(ListValueType *e, *l) \
54
PARSE_ALL(List<AST *>, AST)
55
PARSE_ALL(List<ClassOrNamespaceNameAST *>, ClassOrNamespaceNameAST)
56
PARSE_ALL(List<BaseSpecifierAST *>, BaseSpecifierAST)
57
PARSE_ALL(List<DeclarationAST *>, DeclarationAST)
58
PARSE_ALL(List<EnumeratorAST *>, EnumeratorAST)
59
PARSE_ALL(List<ParameterDeclarationAST *>, ParameterDeclarationAST)
60
PARSE_ALL(List<InitDeclaratorAST *>, InitDeclaratorAST)
61
PARSE_ALL(List<TemplateParameterAST *>, TemplateParameterAST)
62
PARSE_ALL(List<StatementAST *>, StatementAST)
65
void TreeWalker::parseTemplateArgumentList(TemplateArgumentListAST *node)
67
List<AST *> *arglist = node->argumentList();
68
parseAll(this, arglist);
71
void TreeWalker::parseClassOrNamespaceName(ClassOrNamespaceNameAST *node)
73
parseNode(node->name());
74
parseNode(node->templateArgumentList());
77
void TreeWalker::parseName(NameAST *node)
79
parseAll(this, node->classOrNamespaceNameList());
80
parseNode(node->unqualifiedName());
83
void TreeWalker::parseTypeParameter(TypeParameterAST *node)
85
parseNode(node->templateParameterList());
86
parseNode(node->name());
87
parseNode(node->typeId());
90
void TreeWalker::parseDeclaration(DeclarationAST *node)
92
switch (node->nodeType()) {
93
case NodeType_AccessDeclaration:
94
parseAccessDeclaration(static_cast<AccessDeclarationAST*>(node));
96
case NodeType_LinkageSpecification:
97
parseLinkageSpecification(static_cast<LinkageSpecificationAST*>(node));
99
case NodeType_Namespace:
100
parseNamespace(static_cast<NamespaceAST*>(node));
102
case NodeType_NamespaceAlias:
103
parseNamespaceAlias(static_cast<NamespaceAliasAST*>(node));
106
parseUsing(static_cast<UsingAST*>(node));
108
case NodeType_UsingDirective:
109
parseUsingDirective(static_cast<UsingDirectiveAST*>(node));
111
case NodeType_Typedef:
112
parseTypedef(static_cast<TypedefAST*>(node));
114
case NodeType_TemplateDeclaration:
115
parseTemplateDeclaration(static_cast<TemplateDeclarationAST*>(node));
117
case NodeType_SimpleDeclaration:
118
parseSimpleDeclaration(static_cast<SimpleDeclarationAST*>(node));
120
case NodeType_FunctionDefinition:
121
parseFunctionDefinition(static_cast<FunctionDefinitionAST*>(node));
128
void TreeWalker::parseAccessDeclaration(AccessDeclarationAST *node)
130
parseAll(this, node->accessList());
133
void TreeWalker::parseTypeSpecifier(TypeSpecifierAST *node)
135
parseNode(node->name());
136
parseNode(node->cvQualify());
137
parseNode(node->cv2Qualify());
139
switch (node->nodeType()) {
140
case NodeType_ClassSpecifier:
141
parseClassSpecifier(static_cast<ClassSpecifierAST*>(node));
143
case NodeType_EnumSpecifier:
144
parseEnumSpecifier(static_cast<EnumSpecifierAST*>(node));
146
case NodeType_ElaboratedTypeSpecifier:
147
parseElaboratedTypeSpecifier(static_cast<ElaboratedTypeSpecifierAST*>(node));
154
void TreeWalker::parseBaseSpecifier(BaseSpecifierAST *node)
156
parseNode(node->isVirtual());
157
parseNode(node->access());
158
parseNode(node->name());
161
void TreeWalker::parseBaseClause(BaseClauseAST *node)
163
parseAll(this, node->baseSpecifierList());
166
void TreeWalker::parseClassSpecifier(ClassSpecifierAST *node)
168
parseNode(node->winDeclSpec());
169
parseNode(node->classKey());
170
parseNode(node->baseClause());
171
parseAll(this, node->declarationList());
174
void TreeWalker::parseEnumerator(EnumeratorAST *node)
176
parseNode(node->id());
177
parseNode(node->expression());
180
void TreeWalker::parseEnumSpecifier(EnumSpecifierAST *node)
182
parseAll(this, node->enumeratorList());
185
void TreeWalker::parseElaboratedTypeSpecifier(ElaboratedTypeSpecifierAST *node)
187
parseNode(node->kind());
190
void TreeWalker::parseLinkageBody(LinkageBodyAST *node)
192
parseAll(this, node->declarationList());
195
void TreeWalker::parseLinkageSpecification(LinkageSpecificationAST *node)
197
parseNode(node->externType());
198
parseNode(node->linkageBody());
199
parseNode(node->declaration());
202
void TreeWalker::parseNamespace(NamespaceAST *node)
204
parseNode(node->namespaceName());
205
parseNode(node->linkageBody());
208
void TreeWalker::parseNamespaceAlias(NamespaceAliasAST *node)
210
parseNode(node->namespaceName());
211
parseNode(node->aliasName());
214
void TreeWalker::parseUsing(UsingAST *node)
216
parseNode(node->typeName());
217
parseNode(node->name());
220
void TreeWalker::parseUsingDirective(UsingDirectiveAST *node)
222
parseNode(node->name());
225
void TreeWalker::parseDeclarator(DeclaratorAST *node)
227
parseAll(this, node->ptrOpList());
228
parseNode(node->subDeclarator());
229
parseNode(node->declaratorId());
230
parseNode(node->bitfieldInitialization());
231
parseAll(this, node->arrayDimensionList());
232
parseNode(node->parameterDeclarationClause());
233
parseNode(node->constant());
234
parseNode(node->exceptionSpecification());
237
void TreeWalker::parseParameterDeclaration(ParameterDeclarationAST *node)
239
parseNode(node->typeSpec());
240
parseNode(node->declarator());
241
parseNode(node->expression());
244
void TreeWalker::parseParameterDeclarationList(ParameterDeclarationListAST *node)
246
parseAll(this, node->parameterList());
249
void TreeWalker::parseParameterDeclarationClause(ParameterDeclarationClauseAST *node)
251
parseNode(node->parameterDeclarationList());
252
parseNode(node->ellipsis());
255
void TreeWalker::parseInitDeclarator(InitDeclaratorAST *node)
257
parseNode(node->declarator());
258
parseNode(node->initializer());
261
void TreeWalker::parseInitDeclaratorList(InitDeclaratorListAST *node)
263
parseAll(this, node->initDeclaratorList());
266
void TreeWalker::parseTypedef(TypedefAST *node)
268
parseNode(node->typeSpec());
269
parseNode(node->initDeclaratorList());
272
void TreeWalker::parseTemplateParameter(TemplateParameterAST *node)
274
parseNode(node->typeParameter());
275
parseNode(node->typeValueParameter());
278
void TreeWalker::parseTemplateParameterList(TemplateParameterListAST *node)
280
parseAll(this, node->templateParameterList());
283
void TreeWalker::parseTemplateDeclaration(TemplateDeclarationAST *node)
285
parseNode(node->exported());
286
parseNode(node->templateParameterList());
287
parseNode(node->declaration());
290
void TreeWalker::parseSimpleDeclaration(SimpleDeclarationAST *node)
292
parseNode(node->functionSpecifier());
293
parseNode(node->storageSpecifier());
294
parseNode(node->typeSpec());
295
parseNode(node->initDeclaratorList());
296
parseNode(node->winDeclSpec());
299
void TreeWalker::parseStatement(StatementAST *node)
301
switch (node->nodeType()) {
302
case NodeType_ExpressionStatement:
303
parseExpressionStatement(static_cast<ExpressionStatementAST*>(node));
306
case NodeType_IfStatement:
307
parseIfStatement(static_cast<IfStatementAST*>(node));
310
case NodeType_WhileStatement:
311
parseWhileStatement(static_cast<WhileStatementAST*>(node));
314
case NodeType_DoStatement:
315
parseDoStatement(static_cast<DoStatementAST*>(node));
318
case NodeType_ForStatement:
319
parseForStatement(static_cast<ForStatementAST*>(node));
322
case NodeType_SwitchStatement:
323
parseSwitchStatement(static_cast<SwitchStatementAST*>(node));
326
case NodeType_StatementList:
327
parseStatementList(static_cast<StatementListAST*>(node));
330
case NodeType_DeclarationStatement:
331
parseDeclarationStatement(static_cast<DeclarationStatementAST*>(node));
334
case NodeType_ReturnStatement:
335
parseReturnStatement(static_cast<ReturnStatementAST*>(node));
343
void TreeWalker::parseExpressionStatement(ExpressionStatementAST *node)
345
parseNode(node->expression());
348
void TreeWalker::parseCondition(ConditionAST *node)
350
parseNode(node->typeSpec());
351
parseNode(node->declarator());
352
parseNode(node->expression());
355
void TreeWalker::parseIfStatement(IfStatementAST *node)
357
parseNode(node->condition());
358
parseNode(node->statement());
359
parseNode(node->elseStatement());
362
void TreeWalker::parseWhileStatement(WhileStatementAST *node)
364
parseNode(node->condition());
365
parseNode(node->statement());
368
void TreeWalker::parseDoStatement(DoStatementAST *node)
370
parseNode(node->condition());
371
parseNode(node->statement());
374
void TreeWalker::parseForStatement(ForStatementAST *node)
376
parseNode(node->initStatement());
377
parseNode(node->condition());
378
parseNode(node->expression());
379
parseNode(node->statement());
382
void TreeWalker::parseSwitchStatement(SwitchStatementAST *node)
384
parseNode(node->condition());
385
parseNode(node->statement());
388
void TreeWalker::parseStatementList(StatementListAST *node)
390
parseAll(this, node->statementList());
393
void TreeWalker::parseDeclarationStatement(DeclarationStatementAST *node)
395
parseNode(node->declaration());
398
void TreeWalker::parseFunctionDefinition(FunctionDefinitionAST *node)
400
parseNode(node->functionSpecifier());
401
parseNode(node->storageSpecifier());
402
parseNode(node->typeSpec());
403
parseNode(node->initDeclarator());
404
parseNode(node->functionBody());
405
parseNode(node->winDeclSpec());
408
void TreeWalker::parseTranslationUnit(TranslationUnitAST *node)
410
parseAll(this, node->declarationList());
414
void TreeWalker::parseExpression(AbstractExpressionAST *node)
416
parseAll(this, node->children());
420
void TreeWalker::parseBinaryExpression(BinaryExpressionAST *node)
422
parseNode(node->op());
423
parseNode(node->leftExpression());
424
parseNode(node->rightExpression());
427
void TreeWalker::parseReturnStatement(ReturnStatementAST *node)
429
parseNode(node->expression());