summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2009-06-17 16:08:01 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2009-06-17 16:08:33 +0200
commitc222f2aa27a5d3cbc4583d2ae8ee60d623aaacc4 (patch)
treecadc4126fe8e2c5b89a996024dc9ce716652a626 /src/shared/cplusplus
parenta29864ef012d98ad6773ba4690704b731c79c7da (diff)
downloadqt-creator-c222f2aa27a5d3cbc4583d2ae8ee60d623aaacc4.tar.gz
Some cleanup in the AST nodes.
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/AST.cpp52
-rw-r--r--src/shared/cplusplus/AST.h60
-rw-r--r--src/shared/cplusplus/ASTClone.cpp54
-rw-r--r--src/shared/cplusplus/ASTVisit.cpp219
-rw-r--r--src/shared/cplusplus/ASTVisitor.h4
-rw-r--r--src/shared/cplusplus/ASTfwd.h2
-rw-r--r--src/shared/cplusplus/CheckDeclaration.cpp23
-rw-r--r--src/shared/cplusplus/CheckDeclarator.cpp6
-rw-r--r--src/shared/cplusplus/CheckSpecifier.cpp5
-rw-r--r--src/shared/cplusplus/CheckStatement.cpp4
-rw-r--r--src/shared/cplusplus/Parser.cpp71
-rw-r--r--src/shared/cplusplus/Parser.h4
-rw-r--r--src/shared/cplusplus/PrettyPrinter.cpp28
13 files changed, 296 insertions, 236 deletions
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 6e66060e40..39c3795116 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -356,10 +356,8 @@ unsigned CatchClauseAST::lastToken() const
return statement->lastToken();
else if (rparen_token)
return rparen_token + 1;
- for (DeclarationAST *it = exception_declaration; it; it = it->next) {
- if (! it->next)
- return it->lastToken();
- }
+ if (exception_declaration)
+ return exception_declaration->lastToken();
if (lparen_token)
return lparen_token + 1;
@@ -377,7 +375,7 @@ unsigned ClassSpecifierAST::lastToken() const
if (rbrace_token)
return rbrace_token + 1;
- for (DeclarationAST *it = member_specifiers; it; it = it->next) {
+ for (DeclarationListAST *it = member_specifiers; it; it = it->next) {
if (! it->next)
return it->lastToken();
}
@@ -405,6 +403,21 @@ unsigned ClassSpecifierAST::lastToken() const
}
+unsigned StatementListAST::firstToken() const
+{
+ return statement->firstToken();
+}
+
+unsigned StatementListAST::lastToken() const
+{
+ for (const StatementListAST *it = this; it; it = it->next) {
+ if (! it->next)
+ return it->statement->lastToken();
+ }
+
+ return 0;
+}
+
unsigned CompoundStatementAST::firstToken() const
{
return lbrace_token;
@@ -415,9 +428,9 @@ unsigned CompoundStatementAST::lastToken() const
if (rbrace_token)
return rbrace_token + 1;
- for (StatementAST *it = statements; it ; it = it->next) {
+ for (StatementListAST *it = statements; it; it = it->next) {
if (! it->next)
- return it->lastToken();
+ return it->statement->lastToken();
}
return lbrace_token + 1;
@@ -540,6 +553,20 @@ unsigned CtorInitializerAST::lastToken() const
return colon_token + 1;
}
+unsigned DeclarationListAST::firstToken() const
+{
+ return declaration->firstToken();
+}
+
+unsigned DeclarationListAST::lastToken() const
+{
+ for (const DeclarationListAST *it = this; it; it = it->next) {
+ if (! it->next)
+ return it->declaration->lastToken();
+ }
+
+ return 0;
+}
unsigned DeclaratorAST::firstToken() const
{
@@ -986,7 +1013,7 @@ unsigned LinkageBodyAST::lastToken() const
if (rbrace_token)
return rbrace_token + 1;
- for (DeclarationAST *it = declarations; it; it = it->next) {
+ for (DeclarationListAST *it = declarations; it; it = it->next) {
if (! it->next)
return it->lastToken();
}
@@ -1006,6 +1033,7 @@ unsigned LinkageSpecificationAST::lastToken() const
return declaration->lastToken();
else if (extern_type_token)
return extern_type_token + 1;
+
return extern_token + 1;
}
@@ -1553,7 +1581,7 @@ unsigned TemplateDeclarationAST::lastToken() const
else if (greater_token)
return greater_token + 1;
- for (DeclarationAST *it = template_parameters; it; it = it->next) {
+ for (DeclarationListAST *it = template_parameters; it; it = it->next) {
if (! it->next)
return it->lastToken();
}
@@ -1609,9 +1637,9 @@ unsigned TemplateTypeParameterAST::lastToken() const
else if (greater_token)
return greater_token + 1;
- for (DeclarationAST *it = template_parameters; it; it = it->next) {
+ for (DeclarationListAST *it = template_parameters; it; it = it->next) {
if (! it->next)
- return it->lastToken();
+ return it->declaration->lastToken();
}
if (less_token)
@@ -1652,7 +1680,7 @@ unsigned TranslationUnitAST::firstToken() const
unsigned TranslationUnitAST::lastToken() const
{
- for (DeclarationAST *it = declarations; it; it = it->next) {
+ for (DeclarationListAST *it = declarations; it; it = it->next) {
if (! it->next)
return it->lastToken();
}
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 7dfcf4cc5f..5869b1a14d 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -304,9 +304,6 @@ protected:
class CPLUSPLUS_EXPORT StatementAST: public AST
{
public:
- StatementAST *next;
-
-public:
virtual StatementAST *asStatement()
{ return this; }
@@ -325,15 +322,31 @@ public:
class CPLUSPLUS_EXPORT DeclarationAST: public AST
{
public:
- DeclarationAST *next;
-
-public:
virtual DeclarationAST *asDeclaration()
{ return this; }
virtual DeclarationAST *clone(MemoryPool *pool) const = 0;
};
+class CPLUSPLUS_EXPORT DeclarationListAST: public AST
+{
+public:
+ DeclarationAST *declaration;
+ DeclarationListAST *next;
+
+public:
+ virtual DeclarationListAST *asDeclarationList()
+ { return this; }
+
+ virtual unsigned firstToken() const;
+ virtual unsigned lastToken() const;
+
+ virtual DeclarationListAST *clone(MemoryPool *pool) const;
+
+protected:
+ virtual void accept0(ASTVisitor *visitor);
+};
+
class CPLUSPLUS_EXPORT CoreDeclaratorAST: public AST
{
public:
@@ -378,7 +391,7 @@ protected:
virtual void accept0(ASTVisitor *visitor);
};
-class CPLUSPLUS_EXPORT ExpressionListAST: public ExpressionAST
+class CPLUSPLUS_EXPORT ExpressionListAST: public AST
{
public:
unsigned comma_token;
@@ -601,7 +614,7 @@ public:
unsigned colon_token;
BaseSpecifierAST *base_clause;
unsigned lbrace_token;
- DeclarationAST *member_specifiers;
+ DeclarationListAST *member_specifiers;
unsigned rbrace_token;
public: // annotations
@@ -641,11 +654,30 @@ protected:
virtual void accept0(ASTVisitor *visitor);
};
+class CPLUSPLUS_EXPORT StatementListAST: public AST
+{
+public:
+ StatementAST *statement;
+ StatementListAST *next;
+
+public:
+ virtual StatementListAST *asStatementList()
+ { return this; }
+
+ virtual unsigned firstToken() const;
+ virtual unsigned lastToken() const;
+
+ virtual StatementListAST *clone(MemoryPool *pool) const;
+
+protected:
+ virtual void accept0(ASTVisitor *visitor);
+};
+
class CPLUSPLUS_EXPORT CompoundStatementAST: public StatementAST
{
public:
unsigned lbrace_token;
- StatementAST *statements;
+ StatementListAST *statements;
unsigned rbrace_token;
public: // annotations
@@ -1201,7 +1233,7 @@ class CPLUSPLUS_EXPORT LinkageBodyAST: public DeclarationAST
{
public:
unsigned lbrace_token;
- DeclarationAST *declarations;
+ DeclarationListAST *declarations;
unsigned rbrace_token;
public:
@@ -1607,7 +1639,7 @@ protected:
class CPLUSPLUS_EXPORT ParameterDeclarationClauseAST: public AST
{
public:
- DeclarationAST *parameter_declarations;
+ DeclarationListAST *parameter_declarations;
unsigned dot_dot_dot_token;
public:
@@ -2107,7 +2139,7 @@ public:
unsigned export_token;
unsigned template_token;
unsigned less_token;
- DeclarationAST *template_parameters;
+ DeclarationListAST *template_parameters;
unsigned greater_token;
DeclarationAST *declaration;
@@ -2146,7 +2178,7 @@ protected:
class CPLUSPLUS_EXPORT TranslationUnitAST: public AST
{
public:
- DeclarationAST *declarations;
+ DeclarationListAST *declarations;
public:
virtual TranslationUnitAST *asTranslationUnit()
@@ -2255,7 +2287,7 @@ class CPLUSPLUS_EXPORT TemplateTypeParameterAST: public DeclarationAST
public:
unsigned template_token;
unsigned less_token;
- DeclarationAST *template_parameters;
+ DeclarationListAST *template_parameters;
unsigned greater_token;
unsigned class_token;
NameAST *name;
diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp
index 77e4a6488a..a48f7b4c8b 100644
--- a/src/shared/cplusplus/ASTClone.cpp
+++ b/src/shared/cplusplus/ASTClone.cpp
@@ -28,6 +28,7 @@
**************************************************************************/
#include "AST.h"
+#include "ASTVisitor.h"
CPLUSPLUS_BEGIN_NAMESPACE
@@ -83,6 +84,15 @@ TypeofSpecifierAST *TypeofSpecifierAST::clone(MemoryPool *pool) const
return ast;
}
+DeclarationListAST *DeclarationListAST::clone(MemoryPool *pool) const
+{
+ DeclarationListAST *ast = new (pool) DeclarationListAST;
+ // copy DeclarationListAST
+ if (declaration) ast->declaration = declaration->clone(pool);
+ if (next) ast->next = next->clone(pool);
+ return ast;
+}
+
DeclaratorAST *DeclaratorAST::clone(MemoryPool *pool) const
{
DeclaratorAST *ast = new (pool) DeclaratorAST;
@@ -99,7 +109,6 @@ DeclaratorAST *DeclaratorAST::clone(MemoryPool *pool) const
ExpressionListAST *ExpressionListAST::clone(MemoryPool *pool) const
{
ExpressionListAST *ast = new (pool) ExpressionListAST;
- // copy ExpressionAST
// copy ExpressionListAST
ast->comma_token = comma_token;
if (expression) ast->expression = expression->clone(pool);
@@ -111,7 +120,6 @@ SimpleDeclarationAST *SimpleDeclarationAST::clone(MemoryPool *pool) const
{
SimpleDeclarationAST *ast = new (pool) SimpleDeclarationAST;
// copy DeclarationAST
- if (next) ast->next = next->clone(pool);
// copy SimpleDeclarationAST
ast->qt_invokable_token = qt_invokable_token;
if (decl_specifier_seq) ast->decl_specifier_seq = decl_specifier_seq->clone(pool);
@@ -124,7 +132,6 @@ EmptyDeclarationAST *EmptyDeclarationAST::clone(MemoryPool *pool) const
{
EmptyDeclarationAST *ast = new (pool) EmptyDeclarationAST;
// copy DeclarationAST
- if (next) ast->next = next->clone(pool);
// copy EmptyDeclarationAST
ast->semicolon_token = semicolon_token;
return ast;
@@ -134,7 +141,6 @@ AccessDeclarationAST *AccessDeclarationAST::clone(MemoryPool *pool) const
{
AccessDeclarationAST *ast = new (pool) AccessDeclarationAST;
// copy DeclarationAST
- if (next) ast->next = next->clone(pool);
// copy AccessDeclarationAST
ast->access_specifier_token = access_specifier_token;
ast->slots_token = slots_token;
@@ -146,7 +152,6 @@ AsmDefinitionAST *AsmDefinitionAST::clone(MemoryPool *pool) const
{
AsmDefinitionAST *ast = new (pool) AsmDefinitionAST;
// copy DeclarationAST
- if (next) ast->next = next->clone(pool);
// copy AsmDefinitionAST
ast->asm_token = asm_token;
ast->volatile_token = volatile_token;
@@ -236,7 +241,6 @@ CaseStatementAST *CaseStatementAST::clone(MemoryPool *pool) const
{
CaseStatementAST *ast = new (pool) CaseStatementAST;
// copy StatementAST
- if (next) ast->next = next->clone(pool);
// copy CaseStatementAST
ast->case_token = case_token;
if (expression) ast->expression = expression->clone(pool);
@@ -245,11 +249,19 @@ CaseStatementAST *CaseStatementAST::clone(MemoryPool *pool) const
return ast;
}
+StatementListAST *StatementListAST::clone(MemoryPool *pool) const
+{
+ StatementListAST *ast = new (pool) StatementListAST;
+ // copy StatementListAST
+ if (statement) ast->statement = statement->clone(pool);
+ if (next) ast->next = next->clone(pool);
+ return ast;
+}
+
CompoundStatementAST *CompoundStatementAST::clone(MemoryPool *pool) const
{
CompoundStatementAST *ast = new (pool) CompoundStatementAST;
// copy StatementAST
- if (next) ast->next = next->clone(pool);
// copy CompoundStatementAST
ast->lbrace_token = lbrace_token;
if (statements) ast->statements = statements->clone(pool);
@@ -308,7 +320,6 @@ DeclarationStatementAST *DeclarationStatementAST::clone(MemoryPool *pool) const
{
DeclarationStatementAST *ast = new (pool) DeclarationStatementAST;
// copy StatementAST
- if (next) ast->next = next->clone(pool);
// copy DeclarationStatementAST
if (declaration) ast->declaration = declaration->clone(pool);
return ast;
@@ -388,7 +399,6 @@ DoStatementAST *DoStatementAST::clone(MemoryPool *pool) const
{
DoStatementAST *ast = new (pool) DoStatementAST;
// copy StatementAST
- if (next) ast->next = next->clone(pool);
// copy DoStatementAST
ast->do_token = do_token;
if (statement) ast->statement = statement->clone(pool);
@@ -451,7 +461,6 @@ ExceptionDeclarationAST *ExceptionDeclarationAST::clone(MemoryPool *pool) const
{
ExceptionDeclarationAST *ast = new (pool) ExceptionDeclarationAST;
// copy DeclarationAST
- if (next) ast->next = next->clone(pool);
// copy ExceptionDeclarationAST
if (type_specifier) ast->type_specifier = type_specifier->clone(pool);
if (declarator) ast->declarator = declarator->clone(pool);
@@ -475,7 +484,6 @@ ExpressionOrDeclarationStatementAST *ExpressionOrDeclarationStatementAST::clone(
{
ExpressionOrDeclarationStatementAST *ast = new (pool) ExpressionOrDeclarationStatementAST;
// copy StatementAST
- if (next) ast->next = next->clone(pool);
// copy ExpressionOrDeclarationStatementAST
if (expression) ast->expression = expression->clone(pool);
if (declaration) ast->declaration = declaration->clone(pool);
@@ -486,7 +494,6 @@ ExpressionStatementAST *ExpressionStatementAST::clone(MemoryPool *pool) const
{
ExpressionStatementAST *ast = new (pool) ExpressionStatementAST;
// copy StatementAST
- if (next) ast->next = next->clone(pool);
// copy ExpressionStatementAST
if (expression) ast->expression = expression->clone(pool);
ast->semicolon_token = semicolon_token;
@@ -497,7 +504,6 @@ FunctionDefinitionAST *FunctionDefinitionAST::clone(MemoryPool *pool) const
{
FunctionDefinitionAST *ast = new (pool) FunctionDefinitionAST;
// copy DeclarationAST
- if (next) ast->next = next->clone(pool);
// copy FunctionDefinitionAST
ast->qt_invokable_token = qt_invokable_token;
if (decl_specifier_seq) ast->decl_specifier_seq = decl_specifier_seq->clone(pool);
@@ -511,7 +517,6 @@ ForStatementAST *ForStatementAST::clone(MemoryPool *pool) const
{
ForStatementAST *ast = new (pool) ForStatementAST;
// copy StatementAST
- if (next) ast->next = next->clone(pool);
// copy ForStatementAST
ast->for_token = for_token;
ast->lparen_token = lparen_token;
@@ -528,7 +533,6 @@ IfStatementAST *IfStatementAST::clone(MemoryPool *pool) const
{
IfStatementAST *ast = new (pool) IfStatementAST;
// copy StatementAST
- if (next) ast->next = next->clone(pool);
// copy IfStatementAST
ast->if_token = if_token;
ast->lparen_token = lparen_token;
@@ -555,7 +559,6 @@ LabeledStatementAST *LabeledStatementAST::clone(MemoryPool *pool) const
{
LabeledStatementAST *ast = new (pool) LabeledStatementAST;
// copy StatementAST
- if (next) ast->next = next->clone(pool);
// copy LabeledStatementAST
ast->label_token = label_token;
ast->colon_token = colon_token;
@@ -567,7 +570,6 @@ LinkageBodyAST *LinkageBodyAST::clone(MemoryPool *pool) const
{
LinkageBodyAST *ast = new (pool) LinkageBodyAST;
// copy DeclarationAST
- if (next) ast->next = next->clone(pool);
// copy LinkageBodyAST
ast->lbrace_token = lbrace_token;
if (declarations) ast->declarations = declarations->clone(pool);
@@ -579,7 +581,6 @@ LinkageSpecificationAST *LinkageSpecificationAST::clone(MemoryPool *pool) const
{
LinkageSpecificationAST *ast = new (pool) LinkageSpecificationAST;
// copy DeclarationAST
- if (next) ast->next = next->clone(pool);
// copy LinkageSpecificationAST
ast->extern_token = extern_token;
ast->extern_type_token = extern_type_token;
@@ -683,7 +684,6 @@ NamespaceAST *NamespaceAST::clone(MemoryPool *pool) const
{
NamespaceAST *ast = new (pool) NamespaceAST;
// copy DeclarationAST
- if (next) ast->next = next->clone(pool);
// copy NamespaceAST
ast->namespace_token = namespace_token;
ast->identifier_token = identifier_token;
@@ -696,7 +696,6 @@ NamespaceAliasDefinitionAST *NamespaceAliasDefinitionAST::clone(MemoryPool *pool
{
NamespaceAliasDefinitionAST *ast = new (pool) NamespaceAliasDefinitionAST;
// copy DeclarationAST
- if (next) ast->next = next->clone(pool);
// copy NamespaceAliasDefinitionAST
ast->namespace_token = namespace_token;
ast->namespace_name_token = namespace_name_token;
@@ -777,7 +776,6 @@ ParameterDeclarationAST *ParameterDeclarationAST::clone(MemoryPool *pool) const
{
ParameterDeclarationAST *ast = new (pool) ParameterDeclarationAST;
// copy DeclarationAST
- if (next) ast->next = next->clone(pool);
// copy ParameterDeclarationAST
if (type_specifier) ast->type_specifier = type_specifier->clone(pool);
if (declarator) ast->declarator = declarator->clone(pool);
@@ -926,7 +924,6 @@ BreakStatementAST *BreakStatementAST::clone(MemoryPool *pool) const
{
BreakStatementAST *ast = new (pool) BreakStatementAST;
// copy StatementAST
- if (next) ast->next = next->clone(pool);
// copy BreakStatementAST
ast->break_token = break_token;
ast->semicolon_token = semicolon_token;
@@ -937,7 +934,6 @@ ContinueStatementAST *ContinueStatementAST::clone(MemoryPool *pool) const
{
ContinueStatementAST *ast = new (pool) ContinueStatementAST;
// copy StatementAST
- if (next) ast->next = next->clone(pool);
// copy ContinueStatementAST
ast->continue_token = continue_token;
ast->semicolon_token = semicolon_token;
@@ -948,7 +944,6 @@ GotoStatementAST *GotoStatementAST::clone(MemoryPool *pool) const
{
GotoStatementAST *ast = new (pool) GotoStatementAST;
// copy StatementAST
- if (next) ast->next = next->clone(pool);
// copy GotoStatementAST
ast->goto_token = goto_token;
ast->identifier_token = identifier_token;
@@ -960,7 +955,6 @@ ReturnStatementAST *ReturnStatementAST::clone(MemoryPool *pool) const
{
ReturnStatementAST *ast = new (pool) ReturnStatementAST;
// copy StatementAST
- if (next) ast->next = next->clone(pool);
// copy ReturnStatementAST
ast->return_token = return_token;
if (expression) ast->expression = expression->clone(pool);
@@ -1030,7 +1024,6 @@ SwitchStatementAST *SwitchStatementAST::clone(MemoryPool *pool) const
{
SwitchStatementAST *ast = new (pool) SwitchStatementAST;
// copy StatementAST
- if (next) ast->next = next->clone(pool);
// copy SwitchStatementAST
ast->switch_token = switch_token;
ast->lparen_token = lparen_token;
@@ -1054,7 +1047,6 @@ TemplateDeclarationAST *TemplateDeclarationAST::clone(MemoryPool *pool) const
{
TemplateDeclarationAST *ast = new (pool) TemplateDeclarationAST;
// copy DeclarationAST
- if (next) ast->next = next->clone(pool);
// copy TemplateDeclarationAST
ast->export_token = export_token;
ast->template_token = template_token;
@@ -1087,7 +1079,6 @@ TryBlockStatementAST *TryBlockStatementAST::clone(MemoryPool *pool) const
{
TryBlockStatementAST *ast = new (pool) TryBlockStatementAST;
// copy StatementAST
- if (next) ast->next = next->clone(pool);
// copy TryBlockStatementAST
ast->try_token = try_token;
if (statement) ast->statement = statement->clone(pool);
@@ -1099,7 +1090,6 @@ CatchClauseAST *CatchClauseAST::clone(MemoryPool *pool) const
{
CatchClauseAST *ast = new (pool) CatchClauseAST;
// copy StatementAST
- if (next) ast->next = next->clone(pool);
// copy CatchClauseAST
ast->catch_token = catch_token;
ast->lparen_token = lparen_token;
@@ -1124,7 +1114,6 @@ TypenameTypeParameterAST *TypenameTypeParameterAST::clone(MemoryPool *pool) cons
{
TypenameTypeParameterAST *ast = new (pool) TypenameTypeParameterAST;
// copy DeclarationAST
- if (next) ast->next = next->clone(pool);
// copy TypenameTypeParameterAST
ast->classkey_token = classkey_token;
if (name) ast->name = name->clone(pool);
@@ -1137,7 +1126,6 @@ TemplateTypeParameterAST *TemplateTypeParameterAST::clone(MemoryPool *pool) cons
{
TemplateTypeParameterAST *ast = new (pool) TemplateTypeParameterAST;
// copy DeclarationAST
- if (next) ast->next = next->clone(pool);
// copy TemplateTypeParameterAST
ast->template_token = template_token;
ast->less_token = less_token;
@@ -1164,7 +1152,6 @@ UsingAST *UsingAST::clone(MemoryPool *pool) const
{
UsingAST *ast = new (pool) UsingAST;
// copy DeclarationAST
- if (next) ast->next = next->clone(pool);
// copy UsingAST
ast->using_token = using_token;
ast->typename_token = typename_token;
@@ -1177,7 +1164,6 @@ UsingDirectiveAST *UsingDirectiveAST::clone(MemoryPool *pool) const
{
UsingDirectiveAST *ast = new (pool) UsingDirectiveAST;
// copy DeclarationAST
- if (next) ast->next = next->clone(pool);
// copy UsingDirectiveAST
ast->using_token = using_token;
ast->namespace_token = namespace_token;
@@ -1190,7 +1176,6 @@ WhileStatementAST *WhileStatementAST::clone(MemoryPool *pool) const
{
WhileStatementAST *ast = new (pool) WhileStatementAST;
// copy StatementAST
- if (next) ast->next = next->clone(pool);
// copy WhileStatementAST
ast->while_token = while_token;
ast->lparen_token = lparen_token;
@@ -1213,7 +1198,6 @@ ObjCClassDeclarationAST *ObjCClassDeclarationAST::clone(MemoryPool *pool) const
{
ObjCClassDeclarationAST *ast = new (pool) ObjCClassDeclarationAST;
// copy DeclarationAST
- if (next) ast->next = next->clone(pool);
// copy ObjCClassDeclarationAST
if (attributes) ast->attributes = attributes->clone(pool);
ast->class_token = class_token;
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index 808931e298..c904e6d3f3 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -37,7 +37,6 @@ void SimpleSpecifierAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit SimpleSpecifierAST
// visit SpecifierAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -46,9 +45,9 @@ void AttributeSpecifierAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit AttributeSpecifierAST
- accept(attributes, visitor);
+ for (AttributeAST *it = attributes; it; it = it->next)
+ accept(it, visitor);
// visit SpecifierAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -57,8 +56,8 @@ void AttributeAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit AttributeAST
- accept(expression_list, visitor);
- accept(next, visitor);
+ for (ExpressionListAST *it = expression_list; it; it = it->next)
+ accept(it, visitor);
}
visitor->endVisit(this);
}
@@ -69,7 +68,15 @@ void TypeofSpecifierAST::accept0(ASTVisitor *visitor)
// visit TypeofSpecifierAST
accept(expression, visitor);
// visit SpecifierAST
- accept(next, visitor);
+ }
+ visitor->endVisit(this);
+}
+
+void DeclarationListAST::accept0(ASTVisitor *visitor)
+{
+ if (visitor->visit(this)) {
+ // visit DeclarationListAST
+ accept(declaration, visitor);
}
visitor->endVisit(this);
}
@@ -78,10 +85,13 @@ void DeclaratorAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit DeclaratorAST
- accept(ptr_operators, visitor);
+ for (PtrOperatorAST *it = ptr_operators; it; it = it->next)
+ accept(it, visitor);
accept(core_declarator, visitor);
- accept(postfix_declarators, visitor);
- accept(attributes, visitor);
+ for (PostfixDeclaratorAST *it = postfix_declarators; it; it = it->next)
+ accept(it, visitor);
+ for (SpecifierAST *it = attributes; it; it = it->next)
+ accept(it, visitor);
accept(initializer, visitor);
}
visitor->endVisit(this);
@@ -92,8 +102,6 @@ void ExpressionListAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit ExpressionListAST
accept(expression, visitor);
- accept(next, visitor);
- // visit ExpressionAST
}
visitor->endVisit(this);
}
@@ -102,10 +110,11 @@ void SimpleDeclarationAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit SimpleDeclarationAST
- accept(decl_specifier_seq, visitor);
- accept(declarators, visitor);
+ for (SpecifierAST *it = decl_specifier_seq; it; it = it->next)
+ accept(it, visitor);
+ for (DeclaratorListAST *it = declarators; it; it = it->next)
+ accept(it, visitor);
// visit DeclarationAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -115,7 +124,6 @@ void EmptyDeclarationAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit EmptyDeclarationAST
// visit DeclarationAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -125,7 +133,6 @@ void AccessDeclarationAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit AccessDeclarationAST
// visit DeclarationAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -135,7 +142,6 @@ void AsmDefinitionAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit AsmDefinitionAST
// visit DeclarationAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -145,7 +151,6 @@ void BaseSpecifierAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit BaseSpecifierAST
accept(name, visitor);
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -197,12 +202,14 @@ void ClassSpecifierAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit ClassSpecifierAST
- accept(attributes, visitor);
+ for (SpecifierAST *it = attributes; it; it = it->next)
+ accept(it, visitor);
accept(name, visitor);
- accept(base_clause, visitor);
- accept(member_specifiers, visitor);
+ for (BaseSpecifierAST *it = base_clause; it; it = it->next)
+ accept(it, visitor);
+ for (DeclarationListAST *it = member_specifiers; it; it = it->next)
+ accept(it, visitor);
// visit SpecifierAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -214,7 +221,15 @@ void CaseStatementAST::accept0(ASTVisitor *visitor)
accept(expression, visitor);
accept(statement, visitor);
// visit StatementAST
- accept(next, visitor);
+ }
+ visitor->endVisit(this);
+}
+
+void StatementListAST::accept0(ASTVisitor *visitor)
+{
+ if (visitor->visit(this)) {
+ // visit StatementListAST
+ accept(statement, visitor);
}
visitor->endVisit(this);
}
@@ -223,9 +238,9 @@ void CompoundStatementAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit CompoundStatementAST
- accept(statements, visitor);
+ for (StatementListAST *it = statements; it; it = it->next)
+ accept(it, visitor);
// visit StatementAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -234,7 +249,8 @@ void ConditionAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit ConditionAST
- accept(type_specifier, visitor);
+ for (SpecifierAST *it = type_specifier; it; it = it->next)
+ accept(it, visitor);
accept(declarator, visitor);
// visit ExpressionAST
}
@@ -268,7 +284,8 @@ void CtorInitializerAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit CtorInitializerAST
- accept(member_initializers, visitor);
+ for (MemInitializerAST *it = member_initializers; it; it = it->next)
+ accept(it, visitor);
}
visitor->endVisit(this);
}
@@ -279,7 +296,6 @@ void DeclarationStatementAST::accept0(ASTVisitor *visitor)
// visit DeclarationStatementAST
accept(declaration, visitor);
// visit StatementAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -309,11 +325,11 @@ void FunctionDeclaratorAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit FunctionDeclaratorAST
accept(parameters, visitor);
- accept(cv_qualifier_seq, visitor);
+ for (SpecifierAST *it = cv_qualifier_seq; it; it = it->next)
+ accept(it, visitor);
accept(exception_specification, visitor);
accept(as_cpp_initializer, visitor);
// visit PostfixDeclaratorAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -324,7 +340,6 @@ void ArrayDeclaratorAST::accept0(ASTVisitor *visitor)
// visit ArrayDeclaratorAST
accept(expression, visitor);
// visit PostfixDeclaratorAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -334,7 +349,6 @@ void DeclaratorListAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit DeclaratorListAST
accept(declarator, visitor);
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -356,7 +370,6 @@ void DoStatementAST::accept0(ASTVisitor *visitor)
accept(statement, visitor);
accept(expression, visitor);
// visit StatementAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -367,7 +380,6 @@ void NamedTypeSpecifierAST::accept0(ASTVisitor *visitor)
// visit NamedTypeSpecifierAST
accept(name, visitor);
// visit SpecifierAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -378,7 +390,6 @@ void ElaboratedTypeSpecifierAST::accept0(ASTVisitor *visitor)
// visit ElaboratedTypeSpecifierAST
accept(name, visitor);
// visit SpecifierAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -388,9 +399,9 @@ void EnumSpecifierAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit EnumSpecifierAST
accept(name, visitor);
- accept(enumerators, visitor);
+ for (EnumeratorAST *it = enumerators; it; it = it->next)
+ accept(it, visitor);
// visit SpecifierAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -400,7 +411,6 @@ void EnumeratorAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit EnumeratorAST
accept(expression, visitor);
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -409,10 +419,10 @@ void ExceptionDeclarationAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit ExceptionDeclarationAST
- accept(type_specifier, visitor);
+ for (SpecifierAST *it = type_specifier; it; it = it->next)
+ accept(it, visitor);
accept(declarator, visitor);
// visit DeclarationAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -421,7 +431,8 @@ void ExceptionSpecificationAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit ExceptionSpecificationAST
- accept(type_ids, visitor);
+ for (ExpressionListAST *it = type_ids; it; it = it->next)
+ accept(it, visitor);
}
visitor->endVisit(this);
}
@@ -433,7 +444,6 @@ void ExpressionOrDeclarationStatementAST::accept0(ASTVisitor *visitor)
accept(expression, visitor);
accept(declaration, visitor);
// visit StatementAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -444,7 +454,6 @@ void ExpressionStatementAST::accept0(ASTVisitor *visitor)
// visit ExpressionStatementAST
accept(expression, visitor);
// visit StatementAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -453,12 +462,12 @@ void FunctionDefinitionAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit FunctionDefinitionAST
- accept(decl_specifier_seq, visitor);
+ for (SpecifierAST *it = decl_specifier_seq; it; it = it->next)
+ accept(it, visitor);
accept(declarator, visitor);
accept(ctor_initializer, visitor);
accept(function_body, visitor);
// visit DeclarationAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -472,7 +481,6 @@ void ForStatementAST::accept0(ASTVisitor *visitor)
accept(expression, visitor);
accept(statement, visitor);
// visit StatementAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -485,7 +493,6 @@ void IfStatementAST::accept0(ASTVisitor *visitor)
accept(statement, visitor);
accept(else_statement, visitor);
// visit StatementAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -494,7 +501,8 @@ void ArrayInitializerAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit ArrayInitializerAST
- accept(expression_list, visitor);
+ for (ExpressionListAST *it = expression_list; it; it = it->next)
+ accept(it, visitor);
// visit ExpressionAST
}
visitor->endVisit(this);
@@ -506,7 +514,6 @@ void LabeledStatementAST::accept0(ASTVisitor *visitor)
// visit LabeledStatementAST
accept(statement, visitor);
// visit StatementAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -515,9 +522,9 @@ void LinkageBodyAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit LinkageBodyAST
- accept(declarations, visitor);
+ for (DeclarationListAST *it = declarations; it; it = it->next)
+ accept(it, visitor);
// visit DeclarationAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -528,7 +535,6 @@ void LinkageSpecificationAST::accept0(ASTVisitor *visitor)
// visit LinkageSpecificationAST
accept(declaration, visitor);
// visit DeclarationAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -539,7 +545,6 @@ void MemInitializerAST::accept0(ASTVisitor *visitor)
// visit MemInitializerAST
accept(name, visitor);
accept(expression, visitor);
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -549,7 +554,6 @@ void NestedNameSpecifierAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit NestedNameSpecifierAST
accept(class_or_namespace_name, visitor);
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -558,7 +562,8 @@ void QualifiedNameAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit QualifiedNameAST
- accept(nested_name_specifier, visitor);
+ for (NestedNameSpecifierAST *it = nested_name_specifier; it; it = it->next)
+ accept(it, visitor);
accept(unqualified_name, visitor);
// visit NameAST
// visit ExpressionAST
@@ -581,8 +586,10 @@ void ConversionFunctionIdAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit ConversionFunctionIdAST
- accept(type_specifier, visitor);
- accept(ptr_operators, visitor);
+ for (SpecifierAST *it = type_specifier; it; it = it->next)
+ accept(it, visitor);
+ for (PtrOperatorAST *it = ptr_operators; it; it = it->next)
+ accept(it, visitor);
// visit NameAST
// visit ExpressionAST
}
@@ -613,7 +620,8 @@ void TemplateIdAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit TemplateIdAST
- accept(template_arguments, visitor);
+ for (TemplateArgumentListAST *it = template_arguments; it; it = it->next)
+ accept(it, visitor);
// visit NameAST
// visit ExpressionAST
}
@@ -624,10 +632,10 @@ void NamespaceAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit NamespaceAST
- accept(attributes, visitor);
+ for (SpecifierAST *it = attributes; it; it = it->next)
+ accept(it, visitor);
accept(linkage_body, visitor);
// visit DeclarationAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -638,7 +646,6 @@ void NamespaceAliasDefinitionAST::accept0(ASTVisitor *visitor)
// visit NamespaceAliasDefinitionAST
accept(name, visitor);
// visit DeclarationAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -647,7 +654,8 @@ void NewPlacementAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit NewPlacementAST
- accept(expression_list, visitor);
+ for (ExpressionListAST *it = expression_list; it; it = it->next)
+ accept(it, visitor);
}
visitor->endVisit(this);
}
@@ -657,7 +665,6 @@ void NewArrayDeclaratorAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit NewArrayDeclaratorAST
accept(expression, visitor);
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -688,9 +695,12 @@ void NewTypeIdAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit NewTypeIdAST
- accept(type_specifier, visitor);
- accept(ptr_operators, visitor);
- accept(new_array_declarators, visitor);
+ for (SpecifierAST *it = type_specifier; it; it = it->next)
+ accept(it, visitor);
+ for (PtrOperatorAST *it = ptr_operators; it; it = it->next)
+ accept(it, visitor);
+ for (NewArrayDeclaratorAST *it = new_array_declarators; it; it = it->next)
+ accept(it, visitor);
}
visitor->endVisit(this);
}
@@ -707,11 +717,11 @@ void ParameterDeclarationAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit ParameterDeclarationAST
- accept(type_specifier, visitor);
+ for (SpecifierAST *it = type_specifier; it; it = it->next)
+ accept(it, visitor);
accept(declarator, visitor);
accept(expression, visitor);
// visit DeclarationAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -720,7 +730,8 @@ void ParameterDeclarationClauseAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit ParameterDeclarationClauseAST
- accept(parameter_declarations, visitor);
+ for (DeclarationListAST *it = parameter_declarations; it; it = it->next)
+ accept(it, visitor);
}
visitor->endVisit(this);
}
@@ -729,9 +740,9 @@ void CallAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit CallAST
- accept(expression_list, visitor);
+ for (ExpressionListAST *it = expression_list; it; it = it->next)
+ accept(it, visitor);
// visit PostfixAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -742,7 +753,6 @@ void ArrayAccessAST::accept0(ASTVisitor *visitor)
// visit ArrayAccessAST
accept(expression, visitor);
// visit PostfixAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -752,7 +762,6 @@ void PostIncrDecrAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit PostIncrDecrAST
// visit PostfixAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -763,7 +772,6 @@ void MemberAccessAST::accept0(ASTVisitor *visitor)
// visit MemberAccessAST
accept(member_name, visitor);
// visit PostfixAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -783,7 +791,8 @@ void TypenameCallExpressionAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit TypenameCallExpressionAST
accept(name, visitor);
- accept(expression_list, visitor);
+ for (ExpressionListAST *it = expression_list; it; it = it->next)
+ accept(it, visitor);
// visit ExpressionAST
}
visitor->endVisit(this);
@@ -793,8 +802,10 @@ void TypeConstructorCallAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit TypeConstructorCallAST
- accept(type_specifier, visitor);
- accept(expression_list, visitor);
+ for (SpecifierAST *it = type_specifier; it; it = it->next)
+ accept(it, visitor);
+ for (ExpressionListAST *it = expression_list; it; it = it->next)
+ accept(it, visitor);
// visit ExpressionAST
}
visitor->endVisit(this);
@@ -805,7 +816,8 @@ void PostfixExpressionAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit PostfixExpressionAST
accept(base_expression, visitor);
- accept(postfix_expressions, visitor);
+ for (PostfixAST *it = postfix_expressions; it; it = it->next)
+ accept(it, visitor);
// visit ExpressionAST
}
visitor->endVisit(this);
@@ -815,10 +827,11 @@ void PointerToMemberAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit PointerToMemberAST
- accept(nested_name_specifier, visitor);
- accept(cv_qualifier_seq, visitor);
+ for (NestedNameSpecifierAST *it = nested_name_specifier; it; it = it->next)
+ accept(it, visitor);
+ for (SpecifierAST *it = cv_qualifier_seq; it; it = it->next)
+ accept(it, visitor);
// visit PtrOperatorAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -827,9 +840,9 @@ void PointerAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit PointerAST
- accept(cv_qualifier_seq, visitor);
+ for (SpecifierAST *it = cv_qualifier_seq; it; it = it->next)
+ accept(it, visitor);
// visit PtrOperatorAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -839,7 +852,6 @@ void ReferenceAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit ReferenceAST
// visit PtrOperatorAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -849,7 +861,6 @@ void BreakStatementAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit BreakStatementAST
// visit StatementAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -859,7 +870,6 @@ void ContinueStatementAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit ContinueStatementAST
// visit StatementAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -869,7 +879,6 @@ void GotoStatementAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit GotoStatementAST
// visit StatementAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -880,7 +889,6 @@ void ReturnStatementAST::accept0(ASTVisitor *visitor)
// visit ReturnStatementAST
accept(expression, visitor);
// visit StatementAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -936,7 +944,6 @@ void StringLiteralAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit StringLiteralAST
- accept(next, visitor);
// visit ExpressionAST
}
visitor->endVisit(this);
@@ -949,7 +956,6 @@ void SwitchStatementAST::accept0(ASTVisitor *visitor)
accept(condition, visitor);
accept(statement, visitor);
// visit StatementAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -959,7 +965,6 @@ void TemplateArgumentListAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit TemplateArgumentListAST
accept(template_argument, visitor);
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -968,10 +973,10 @@ void TemplateDeclarationAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit TemplateDeclarationAST
- accept(template_parameters, visitor);
+ for (DeclarationListAST *it = template_parameters; it; it = it->next)
+ accept(it, visitor);
accept(declaration, visitor);
// visit DeclarationAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -990,7 +995,8 @@ void TranslationUnitAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit TranslationUnitAST
- accept(declarations, visitor);
+ for (DeclarationListAST *it = declarations; it; it = it->next)
+ accept(it, visitor);
}
visitor->endVisit(this);
}
@@ -1000,9 +1006,9 @@ void TryBlockStatementAST::accept0(ASTVisitor *visitor)
if (visitor->visit(this)) {
// visit TryBlockStatementAST
accept(statement, visitor);
- accept(catch_clause_seq, visitor);
+ for (CatchClauseAST *it = catch_clause_seq; it; it = it->next)
+ accept(it, visitor);
// visit StatementAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -1013,9 +1019,7 @@ void CatchClauseAST::accept0(ASTVisitor *visitor)
// visit CatchClauseAST
accept(exception_declaration, visitor);
accept(statement, visitor);
- accept(next, visitor);
// visit StatementAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -1024,7 +1028,8 @@ void TypeIdAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit TypeIdAST
- accept(type_specifier, visitor);
+ for (SpecifierAST *it = type_specifier; it; it = it->next)
+ accept(it, visitor);
accept(declarator, visitor);
// visit ExpressionAST
}
@@ -1038,7 +1043,6 @@ void TypenameTypeParameterAST::accept0(ASTVisitor *visitor)
accept(name, visitor);
accept(type_id, visitor);
// visit DeclarationAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -1047,11 +1051,11 @@ void TemplateTypeParameterAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit TemplateTypeParameterAST
- accept(template_parameters, visitor);
+ for (DeclarationListAST *it = template_parameters; it; it = it->next)
+ accept(it, visitor);
accept(name, visitor);
accept(type_id, visitor);
// visit DeclarationAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -1072,7 +1076,6 @@ void UsingAST::accept0(ASTVisitor *visitor)
// visit UsingAST
accept(name, visitor);
// visit DeclarationAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -1083,7 +1086,6 @@ void UsingDirectiveAST::accept0(ASTVisitor *visitor)
// visit UsingDirectiveAST
accept(name, visitor);
// visit DeclarationAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -1095,7 +1097,6 @@ void WhileStatementAST::accept0(ASTVisitor *visitor)
accept(condition, visitor);
accept(statement, visitor);
// visit StatementAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -1104,7 +1105,6 @@ void IdentifierListAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit IdentifierListAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
@@ -1113,10 +1113,11 @@ void ObjCClassDeclarationAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit ObjCClassDeclarationAST
- accept(attributes, visitor);
- accept(identifier_list, visitor);
+ for (SpecifierAST *it = attributes; it; it = it->next)
+ accept(it, visitor);
+ for (IdentifierListAST *it = identifier_list; it; it = it->next)
+ accept(it, visitor);
// visit DeclarationAST
- accept(next, visitor);
}
visitor->endVisit(this);
}
diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h
index 71c8c2fb89..45c8d89efc 100644
--- a/src/shared/cplusplus/ASTVisitor.h
+++ b/src/shared/cplusplus/ASTVisitor.h
@@ -171,6 +171,7 @@ public:
virtual bool visit(SimpleNameAST *) { return true; }
virtual bool visit(SimpleSpecifierAST *) { return true; }
virtual bool visit(SizeofExpressionAST *) { return true; }
+ virtual bool visit(StatementListAST *) { return true; }
virtual bool visit(StringLiteralAST *) { return true; }
virtual bool visit(SwitchStatementAST *) { return true; }
virtual bool visit(TemplateArgumentListAST *) { return true; }
@@ -197,6 +198,8 @@ public:
virtual bool visit(IdentifierListAST *) { return true; }
virtual bool visit(ObjCClassDeclarationAST *) { return true; }
+ virtual bool visit(DeclarationListAST *) { return true; }
+ virtual void endVisit(DeclarationListAST *) { }
virtual void endVisit(AccessDeclarationAST *) { }
@@ -276,6 +279,7 @@ public:
virtual void endVisit(SimpleNameAST *) { }
virtual void endVisit(SimpleSpecifierAST *) { }
virtual void endVisit(SizeofExpressionAST *) { }
+ virtual void endVisit(StatementListAST *) { }
virtual void endVisit(StringLiteralAST *) { }
virtual void endVisit(SwitchStatementAST *) { }
virtual void endVisit(TemplateArgumentListAST *) { }
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index 71287c98ac..0f4d9581bf 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -83,6 +83,7 @@ class CoreDeclaratorAST;
class CppCastExpressionAST;
class CtorInitializerAST;
class DeclarationAST;
+class DeclarationListAST;
class DeclarationStatementAST;
class DeclaratorAST;
class DeclaratorIdAST;
@@ -143,6 +144,7 @@ class SimpleSpecifierAST;
class SizeofExpressionAST;
class SpecifierAST;
class StatementAST;
+class StatementListAST;
class StringLiteralAST;
class SwitchStatementAST;
class TemplateArgumentListAST;
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index 42004bcc8e..79392bf4e7 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -311,27 +311,20 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast)
semantic()->switchMethodKey(previousMethodKey);
semantic()->switchVisibility(previousVisibility);
- if (ast->next && ast->next->asEmptyDeclaration()) {
- translationUnit()->warning(ast->next->firstToken(),
- "unnecessary semicolon after function block");
- }
-
return false;
}
bool CheckDeclaration::visit(LinkageBodyAST *ast)
{
- for (DeclarationAST *decl = ast->declarations; decl; decl = decl->next) {
- semantic()->check(decl, _scope);
+ for (DeclarationListAST *decl = ast->declarations; decl; decl = decl->next) {
+ semantic()->check(decl->declaration, _scope);
}
return false;
}
bool CheckDeclaration::visit(LinkageSpecificationAST *ast)
{
- for (DeclarationAST *decl = ast->declaration; decl; decl = decl->next) {
- semantic()->check(decl, _scope);
- }
+ semantic()->check(ast->declaration, _scope);
return false;
}
@@ -352,11 +345,6 @@ bool CheckDeclaration::visit(NamespaceAST *ast)
_scope->enterSymbol(ns);
semantic()->check(ast->linkage_body, ns->members()); // ### we'll do the merge later.
- if (ast->next && ast->next->asEmptyDeclaration()) {
- translationUnit()->warning(ast->next->firstToken(),
- "unnecessary semicolon after namespace");
- }
-
return false;
}
@@ -389,9 +377,8 @@ bool CheckDeclaration::visit(ParameterDeclarationAST *ast)
bool CheckDeclaration::visit(TemplateDeclarationAST *ast)
{
Scope *previousScope = switchScope(new Scope(_scope->owner()));
- for (DeclarationAST *param = ast->template_parameters; param;
- param = param->next) {
- semantic()->check(param, _scope);
+ for (DeclarationListAST *param = ast->template_parameters; param; param = param->next) {
+ semantic()->check(param->declaration, _scope);
}
Scope *templateParameters = switchScope(previousScope);
diff --git a/src/shared/cplusplus/CheckDeclarator.cpp b/src/shared/cplusplus/CheckDeclarator.cpp
index 225754521c..aaf324cc21 100644
--- a/src/shared/cplusplus/CheckDeclarator.cpp
+++ b/src/shared/cplusplus/CheckDeclarator.cpp
@@ -162,9 +162,9 @@ bool CheckDeclarator::visit(FunctionDeclaratorAST *ast)
fun->setReturnType(_fullySpecifiedType);
if (ast->parameters) {
- DeclarationAST *parameter_declarations = ast->parameters->parameter_declarations;
- for (DeclarationAST *decl = parameter_declarations; decl; decl = decl->next) {
- semantic()->check(decl, fun->arguments());
+ DeclarationListAST *parameter_declarations = ast->parameters->parameter_declarations;
+ for (DeclarationListAST *decl = parameter_declarations; decl; decl = decl->next) {
+ semantic()->check(decl->declaration, fun->arguments());
}
if (ast->parameters->dot_dot_dot_token)
diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp
index 3f3fffb580..c112561f16 100644
--- a/src/shared/cplusplus/CheckSpecifier.cpp
+++ b/src/shared/cplusplus/CheckSpecifier.cpp
@@ -335,9 +335,8 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast)
int previousVisibility = semantic()->switchVisibility(visibility);
int previousMethodKey = semantic()->switchMethodKey(Function::NormalMethod);
- for (DeclarationAST *member = ast->member_specifiers;
- member; member = member->next) {
- semantic()->check(member, klass->members());
+ for (DeclarationListAST *member = ast->member_specifiers; member; member = member->next) {
+ semantic()->check(member->declaration, klass->members());
}
(void) semantic()->switchMethodKey(previousMethodKey);
diff --git a/src/shared/cplusplus/CheckStatement.cpp b/src/shared/cplusplus/CheckStatement.cpp
index 06651fae75..433dc5c873 100644
--- a/src/shared/cplusplus/CheckStatement.cpp
+++ b/src/shared/cplusplus/CheckStatement.cpp
@@ -104,8 +104,8 @@ bool CheckStatement::visit(CompoundStatementAST *ast)
ast->symbol = block;
_scope->enterSymbol(block);
Scope *previousScope = switchScope(block->members());
- for (StatementAST *it = ast->statements; it; it = it->next) {
- semantic()->check(it, _scope);
+ for (StatementListAST *it = ast->statements; it; it = it->next) {
+ semantic()->check(it->statement, _scope);
}
(void) switchScope(previousScope);
return false;
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 4f38bbe726..a2c0d2edda 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -353,14 +353,17 @@ bool Parser::parseName(NameAST *&node, bool acceptTemplateId)
bool Parser::parseTranslationUnit(TranslationUnitAST *&node)
{
TranslationUnitAST *ast = new (_pool) TranslationUnitAST;
- DeclarationAST **decl = &ast->declarations;
+ DeclarationListAST **decl = &ast->declarations;
while (LA()) {
unsigned start_declaration = cursor();
- if (parseDeclaration(*decl)) {
- if (*decl)
- decl = &(*decl)->next;
+ DeclarationAST *declaration = 0;
+
+ if (parseDeclaration(declaration)) {
+ *decl = new (_pool) DeclarationListAST;
+ (*decl)->declaration = declaration;
+ decl = &(*decl)->next;
} else {
rewind(start_declaration + 1);
skipUntilDeclaration();
@@ -469,16 +472,18 @@ bool Parser::parseLinkageBody(DeclarationAST *&node)
if (LA() == T_LBRACE) {
LinkageBodyAST *ast = new (_pool) LinkageBodyAST;
ast->lbrace_token = consumeToken();
- DeclarationAST **declaration_ptr = &ast->declarations;
+ DeclarationListAST **declaration_ptr = &ast->declarations;
while (int tk = LA()) {
if (tk == T_RBRACE)
break;
unsigned start_declaration = cursor();
- if (parseDeclaration(*declaration_ptr)) {
- if (*declaration_ptr) // ### remove me
- declaration_ptr = &(*declaration_ptr)->next;
+ DeclarationAST *declaration = 0;
+ if (parseDeclaration(declaration)) {
+ *declaration_ptr = new (_pool) DeclarationListAST;
+ (*declaration_ptr)->declaration = declaration;
+ declaration_ptr = &(*declaration_ptr)->next;
} else {
rewind(start_declaration + 1);
skipUntilDeclaration();
@@ -1179,16 +1184,24 @@ bool Parser::parseEnumSpecifier(SpecifierAST *&node)
return false;
}
-bool Parser::parseTemplateParameterList(DeclarationAST *&node)
+bool Parser::parseTemplateParameterList(DeclarationListAST *&node)
{
- DeclarationAST **template_parameter_ptr = &node;
- if (parseTemplateParameter(*template_parameter_ptr)) {
+ DeclarationListAST **template_parameter_ptr = &node;
+ DeclarationAST *declaration = 0;
+ if (parseTemplateParameter(declaration)) {
+ *template_parameter_ptr = new (_pool) DeclarationListAST;
+ (*template_parameter_ptr)->declaration = declaration;
template_parameter_ptr = &(*template_parameter_ptr)->next;
+
while (LA() == T_COMMA) {
consumeToken(); // XXX Store this token somewhere
- if (parseTemplateParameter(*template_parameter_ptr))
+ declaration = 0;
+ if (parseTemplateParameter(declaration)) {
+ *template_parameter_ptr = new (_pool) DeclarationListAST;
+ (*template_parameter_ptr)->declaration = declaration;
template_parameter_ptr = &(*template_parameter_ptr)->next;
+ }
}
return true;
}
@@ -1272,7 +1285,7 @@ bool Parser::parseTypeId(ExpressionAST *&node)
bool Parser::parseParameterDeclarationClause(ParameterDeclarationClauseAST *&node)
{
- DeclarationAST *parameter_declarations = 0;
+ DeclarationListAST *parameter_declarations = 0;
if (LA() != T_DOT_DOT_DOT)
parseParameterDeclarationList(parameter_declarations);
unsigned dot_dot_dot_token = 0;
@@ -1288,10 +1301,13 @@ bool Parser::parseParameterDeclarationClause(ParameterDeclarationClauseAST *&nod
return true;
}
-bool Parser::parseParameterDeclarationList(DeclarationAST *&node)
+bool Parser::parseParameterDeclarationList(DeclarationListAST *&node)
{
- DeclarationAST **parameter_declaration_ptr = &node;
- if (parseParameterDeclaration(*parameter_declaration_ptr)) {
+ DeclarationListAST **parameter_declaration_ptr = &node;
+ DeclarationAST *declaration = 0;
+ if (parseParameterDeclaration(declaration)) {
+ *parameter_declaration_ptr = new (_pool) DeclarationListAST;
+ (*parameter_declaration_ptr)->declaration = declaration;
parameter_declaration_ptr = &(*parameter_declaration_ptr)->next;
while (LA() == T_COMMA) {
consumeToken();
@@ -1299,8 +1315,12 @@ bool Parser::parseParameterDeclarationList(DeclarationAST *&node)
if (LA() == T_DOT_DOT_DOT)
break;
- if (parseParameterDeclaration(*parameter_declaration_ptr))
+ declaration = 0;
+ if (parseParameterDeclaration(declaration)) {
+ *parameter_declaration_ptr = new (_pool) DeclarationListAST;
+ (*parameter_declaration_ptr)->declaration = declaration;
parameter_declaration_ptr = &(*parameter_declaration_ptr)->next;
+ }
}
return true;
}
@@ -1381,7 +1401,7 @@ bool Parser::parseClassSpecifier(SpecifierAST *&node)
if (LA() == T_LBRACE)
ast->lbrace_token = consumeToken();
- DeclarationAST **declaration_ptr = &ast->member_specifiers;
+ DeclarationListAST **declaration_ptr = &ast->member_specifiers;
while (int tk = LA()) {
if (tk == T_RBRACE) {
ast->rbrace_token = consumeToken();
@@ -1389,9 +1409,11 @@ bool Parser::parseClassSpecifier(SpecifierAST *&node)
}
unsigned start_declaration = cursor();
- if (parseMemberSpecification(*declaration_ptr)) {
- if (*declaration_ptr)
- declaration_ptr = &(*declaration_ptr)->next;
+ DeclarationAST *declaration = 0;
+ if (parseMemberSpecification(declaration)) {
+ *declaration_ptr = new (_pool) DeclarationListAST;
+ (*declaration_ptr)->declaration = declaration;
+ declaration_ptr = &(*declaration_ptr)->next;
} else {
rewind(start_declaration + 1);
skipUntilDeclaration();
@@ -2097,16 +2119,19 @@ bool Parser::parseCompoundStatement(StatementAST *&node)
if (LA() == T_LBRACE) {
CompoundStatementAST *ast = new (_pool) CompoundStatementAST;
ast->lbrace_token = consumeToken();
- StatementAST **statement_ptr = &ast->statements;
+ StatementListAST **statement_ptr = &ast->statements;
while (int tk = LA()) {
if (tk == T_RBRACE)
break;
unsigned start_statement = cursor();
- if (! parseStatement(*statement_ptr)) {
+ StatementAST *statement = 0;
+ if (! parseStatement(statement)) {
rewind(start_statement + 1);
skipUntilStatement();
} else {
+ *statement_ptr = new (_pool) StatementListAST;
+ (*statement_ptr)->statement = statement;
statement_ptr = &(*statement_ptr)->next;
}
}
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index b069320c48..330bb84b3d 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -156,7 +156,7 @@ public:
bool parseOperatorFunctionId(NameAST *&node);
bool parseParameterDeclaration(DeclarationAST *&node);
bool parseParameterDeclarationClause(ParameterDeclarationClauseAST *&node);
- bool parseParameterDeclarationList(DeclarationAST *&node);
+ bool parseParameterDeclarationList(DeclarationListAST *&node);
bool parsePmExpression(ExpressionAST *&node);
bool parseTypeidExpression(ExpressionAST *&node);
bool parseTypenameCallExpression(ExpressionAST *&node);
@@ -178,7 +178,7 @@ public:
bool parseTemplateArgumentList(TemplateArgumentListAST *&node);
bool parseTemplateDeclaration(DeclarationAST *&node);
bool parseTemplateParameter(DeclarationAST *&node);
- bool parseTemplateParameterList(DeclarationAST *&node);
+ bool parseTemplateParameterList(DeclarationListAST *&node);
bool parseThrowExpression(ExpressionAST *&node);
bool parseTryBlockStatement(StatementAST *&node);
bool parseCatchClause(CatchClauseAST *&node);
diff --git a/src/shared/cplusplus/PrettyPrinter.cpp b/src/shared/cplusplus/PrettyPrinter.cpp
index e197952362..fd274c47d4 100644
--- a/src/shared/cplusplus/PrettyPrinter.cpp
+++ b/src/shared/cplusplus/PrettyPrinter.cpp
@@ -286,10 +286,8 @@ bool PrettyPrinter::visit(ClassSpecifierAST *ast)
outToken(ast->lbrace_token);
if (ast->member_specifiers) {
indent();
- if (ast->member_specifiers) {
- for (DeclarationAST *it = ast->member_specifiers; it; it = it->next) {
- accept(it);
- }
+ for (DeclarationListAST *it = ast->member_specifiers; it; it = it->next) {
+ accept(it->declaration);
}
deindent();
}
@@ -302,7 +300,7 @@ bool PrettyPrinter::visit(CompoundStatementAST *ast)
outToken(ast->lbrace_token);
if (ast->statements) {
indent();
- for (StatementAST *it = ast->statements; it; it = it->next) {
+ for (StatementListAST *it = ast->statements; it; it = it->next) {
accept(it);
}
deindent();
@@ -624,8 +622,8 @@ bool PrettyPrinter::visit(LinkageBodyAST *ast)
outToken(ast->lbrace_token);
if (ast->declarations) {
indent();
- for (DeclarationAST *it = ast->declarations; it; it = it->next) {
- accept(it);
+ for (DeclarationListAST *it = ast->declarations; it; it = it->next) {
+ accept(it->declaration);
}
deindent();
}
@@ -806,9 +804,9 @@ bool PrettyPrinter::visit(ParameterDeclarationAST *ast)
bool PrettyPrinter::visit(ParameterDeclarationClauseAST *ast)
{
- for (DeclarationAST *it = ast->parameter_declarations; it; it = it->next) {
+ for (DeclarationListAST *it = ast->parameter_declarations; it; it = it->next) {
// XXX handle the comma tokens correctly
- accept(it);
+ accept(it->declaration);
}
return false;
}
@@ -943,9 +941,9 @@ bool PrettyPrinter::visit(TemplateDeclarationAST *ast)
outToken(ast->template_token);
outToken(ast->less_token);
if (ast->template_parameters) {
- for (DeclarationAST *it = ast->template_parameters; it; it = it->next) {
+ for (DeclarationListAST *it = ast->template_parameters; it; it = it->next) {
// XXX handle the comma tokens correctly
- accept(it);
+ accept(it->declaration);
}
}
outToken(ast->greater_token);
@@ -972,9 +970,9 @@ bool PrettyPrinter::visit(TemplateTypeParameterAST *ast)
outToken(ast->template_token);
outToken(ast->less_token);
if (ast->template_parameters) {
- for (DeclarationAST *it = ast->template_parameters; it; it = it->next) {
+ for (DeclarationListAST *it = ast->template_parameters; it; it = it->next) {
// XXX handle the comma tokens correctly
- accept(it);
+ accept(it->declaration);
}
}
outToken(ast->greater_token);
@@ -1002,8 +1000,8 @@ bool PrettyPrinter::visit(ThrowExpressionAST *ast)
bool PrettyPrinter::visit(TranslationUnitAST *ast)
{
- for (DeclarationAST *it = ast->declarations; it; it = it->next) {
- accept(it);
+ for (DeclarationListAST *it = ast->declarations; it; it = it->next) {
+ accept(it->declaration);
}
return false;
}