diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index 7cd2075399929e24bc7913cfcf4d8c2928c2445c..dbc526c9e9de777d053330dc52a3141adf6cd2fd 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -35,8 +35,6 @@ using namespace CPlusPlus;
 void SimpleSpecifierAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit SimpleSpecifierAST
-        // visit SpecifierAST
     }
     visitor->endVisit(this);
 }
@@ -44,10 +42,8 @@ void SimpleSpecifierAST::accept0(ASTVisitor *visitor)
 void AttributeSpecifierAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit AttributeSpecifierAST
         for (AttributeAST *it = attributes; it; it = it->next)
             accept(it, visitor);
-        // visit SpecifierAST
     }
     visitor->endVisit(this);
 }
@@ -55,7 +51,6 @@ void AttributeSpecifierAST::accept0(ASTVisitor *visitor)
 void AttributeAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit AttributeAST
         for (ExpressionListAST *it = expression_list; it; it = it->next)
             accept(it, visitor);
     }
@@ -65,9 +60,7 @@ void AttributeAST::accept0(ASTVisitor *visitor)
 void TypeofSpecifierAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit TypeofSpecifierAST
         accept(expression, visitor);
-        // visit SpecifierAST
     }
     visitor->endVisit(this);
 }
@@ -75,7 +68,6 @@ void TypeofSpecifierAST::accept0(ASTVisitor *visitor)
 void DeclarationListAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit DeclarationListAST
         accept(declaration, visitor);
     }
     visitor->endVisit(this);
@@ -84,7 +76,6 @@ void DeclarationListAST::accept0(ASTVisitor *visitor)
 void DeclaratorAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit DeclaratorAST
         for (SpecifierAST *it = attributes; it; it = it->next)
             accept(it, visitor);
         for (PtrOperatorAST *it = ptr_operators; it; it = it->next)
@@ -102,7 +93,6 @@ void DeclaratorAST::accept0(ASTVisitor *visitor)
 void ExpressionListAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ExpressionListAST
         accept(expression, visitor);
     }
     visitor->endVisit(this);
@@ -111,12 +101,10 @@ void ExpressionListAST::accept0(ASTVisitor *visitor)
 void SimpleDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit SimpleDeclarationAST
         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
     }
     visitor->endVisit(this);
 }
@@ -124,8 +112,6 @@ void SimpleDeclarationAST::accept0(ASTVisitor *visitor)
 void EmptyDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit EmptyDeclarationAST
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -133,8 +119,6 @@ void EmptyDeclarationAST::accept0(ASTVisitor *visitor)
 void AccessDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit AccessDeclarationAST
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -142,8 +126,6 @@ void AccessDeclarationAST::accept0(ASTVisitor *visitor)
 void AsmDefinitionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit AsmDefinitionAST
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -151,7 +133,6 @@ void AsmDefinitionAST::accept0(ASTVisitor *visitor)
 void BaseSpecifierAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit BaseSpecifierAST
         accept(name, visitor);
     }
     visitor->endVisit(this);
@@ -160,10 +141,8 @@ void BaseSpecifierAST::accept0(ASTVisitor *visitor)
 void CompoundLiteralAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit CompoundLiteralAST
         accept(type_id, visitor);
         accept(initializer, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -171,9 +150,7 @@ void CompoundLiteralAST::accept0(ASTVisitor *visitor)
 void QtMethodAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit QtMethodAST
         accept(declarator, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -181,10 +158,8 @@ void QtMethodAST::accept0(ASTVisitor *visitor)
 void BinaryExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit BinaryExpressionAST
         accept(left_expression, visitor);
         accept(right_expression, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -192,10 +167,8 @@ void BinaryExpressionAST::accept0(ASTVisitor *visitor)
 void CastExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit CastExpressionAST
         accept(type_id, visitor);
         accept(expression, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -203,7 +176,6 @@ void CastExpressionAST::accept0(ASTVisitor *visitor)
 void ClassSpecifierAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ClassSpecifierAST
         for (SpecifierAST *it = attributes; it; it = it->next)
             accept(it, visitor);
         accept(name, visitor);
@@ -211,7 +183,6 @@ void ClassSpecifierAST::accept0(ASTVisitor *visitor)
             accept(it, visitor);
         for (DeclarationListAST *it = member_specifiers; it; it = it->next)
             accept(it, visitor);
-        // visit SpecifierAST
     }
     visitor->endVisit(this);
 }
@@ -219,10 +190,8 @@ void ClassSpecifierAST::accept0(ASTVisitor *visitor)
 void CaseStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit CaseStatementAST
         accept(expression, visitor);
         accept(statement, visitor);
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -230,7 +199,6 @@ void CaseStatementAST::accept0(ASTVisitor *visitor)
 void StatementListAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit StatementListAST
         accept(statement, visitor);
     }
     visitor->endVisit(this);
@@ -239,10 +207,8 @@ void StatementListAST::accept0(ASTVisitor *visitor)
 void CompoundStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit CompoundStatementAST
         for (StatementListAST *it = statements; it; it = it->next)
             accept(it, visitor);
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -250,11 +216,9 @@ void CompoundStatementAST::accept0(ASTVisitor *visitor)
 void ConditionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ConditionAST
         for (SpecifierAST *it = type_specifier; it; it = it->next)
             accept(it, visitor);
         accept(declarator, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -262,11 +226,9 @@ void ConditionAST::accept0(ASTVisitor *visitor)
 void ConditionalExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ConditionalExpressionAST
         accept(condition, visitor);
         accept(left_expression, visitor);
         accept(right_expression, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -274,10 +236,8 @@ void ConditionalExpressionAST::accept0(ASTVisitor *visitor)
 void CppCastExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit CppCastExpressionAST
         accept(type_id, visitor);
         accept(expression, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -285,7 +245,6 @@ void CppCastExpressionAST::accept0(ASTVisitor *visitor)
 void CtorInitializerAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit CtorInitializerAST
         for (MemInitializerAST *it = member_initializers; it; it = it->next)
             accept(it, visitor);
     }
@@ -295,9 +254,7 @@ void CtorInitializerAST::accept0(ASTVisitor *visitor)
 void DeclarationStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit DeclarationStatementAST
         accept(declaration, visitor);
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -305,9 +262,7 @@ void DeclarationStatementAST::accept0(ASTVisitor *visitor)
 void DeclaratorIdAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit DeclaratorIdAST
         accept(name, visitor);
-        // visit CoreDeclaratorAST
     }
     visitor->endVisit(this);
 }
@@ -315,9 +270,7 @@ void DeclaratorIdAST::accept0(ASTVisitor *visitor)
 void NestedDeclaratorAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit NestedDeclaratorAST
         accept(declarator, visitor);
-        // visit CoreDeclaratorAST
     }
     visitor->endVisit(this);
 }
@@ -325,13 +278,11 @@ void NestedDeclaratorAST::accept0(ASTVisitor *visitor)
 void FunctionDeclaratorAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit FunctionDeclaratorAST
         accept(parameters, 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
     }
     visitor->endVisit(this);
 }
@@ -339,9 +290,7 @@ void FunctionDeclaratorAST::accept0(ASTVisitor *visitor)
 void ArrayDeclaratorAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ArrayDeclaratorAST
         accept(expression, visitor);
-        // visit PostfixDeclaratorAST
     }
     visitor->endVisit(this);
 }
@@ -349,7 +298,6 @@ void ArrayDeclaratorAST::accept0(ASTVisitor *visitor)
 void DeclaratorListAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit DeclaratorListAST
         accept(declarator, visitor);
     }
     visitor->endVisit(this);
@@ -358,9 +306,7 @@ void DeclaratorListAST::accept0(ASTVisitor *visitor)
 void DeleteExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit DeleteExpressionAST
         accept(expression, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -368,10 +314,8 @@ void DeleteExpressionAST::accept0(ASTVisitor *visitor)
 void DoStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit DoStatementAST
         accept(statement, visitor);
         accept(expression, visitor);
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -379,9 +323,7 @@ void DoStatementAST::accept0(ASTVisitor *visitor)
 void NamedTypeSpecifierAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit NamedTypeSpecifierAST
         accept(name, visitor);
-        // visit SpecifierAST
     }
     visitor->endVisit(this);
 }
@@ -389,9 +331,7 @@ void NamedTypeSpecifierAST::accept0(ASTVisitor *visitor)
 void ElaboratedTypeSpecifierAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ElaboratedTypeSpecifierAST
         accept(name, visitor);
-        // visit SpecifierAST
     }
     visitor->endVisit(this);
 }
@@ -399,11 +339,9 @@ void ElaboratedTypeSpecifierAST::accept0(ASTVisitor *visitor)
 void EnumSpecifierAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit EnumSpecifierAST
         accept(name, visitor);
         for (EnumeratorAST *it = enumerators; it; it = it->next)
             accept(it, visitor);
-        // visit SpecifierAST
     }
     visitor->endVisit(this);
 }
@@ -411,7 +349,6 @@ void EnumSpecifierAST::accept0(ASTVisitor *visitor)
 void EnumeratorAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit EnumeratorAST
         accept(expression, visitor);
     }
     visitor->endVisit(this);
@@ -420,11 +357,9 @@ void EnumeratorAST::accept0(ASTVisitor *visitor)
 void ExceptionDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ExceptionDeclarationAST
         for (SpecifierAST *it = type_specifier; it; it = it->next)
             accept(it, visitor);
         accept(declarator, visitor);
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -432,7 +367,6 @@ void ExceptionDeclarationAST::accept0(ASTVisitor *visitor)
 void ExceptionSpecificationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ExceptionSpecificationAST
         for (ExpressionListAST *it = type_ids; it; it = it->next)
             accept(it, visitor);
     }
@@ -442,10 +376,8 @@ void ExceptionSpecificationAST::accept0(ASTVisitor *visitor)
 void ExpressionOrDeclarationStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ExpressionOrDeclarationStatementAST
         accept(expression, visitor);
         accept(declaration, visitor);
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -453,9 +385,7 @@ void ExpressionOrDeclarationStatementAST::accept0(ASTVisitor *visitor)
 void ExpressionStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ExpressionStatementAST
         accept(expression, visitor);
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -463,13 +393,11 @@ void ExpressionStatementAST::accept0(ASTVisitor *visitor)
 void FunctionDefinitionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit FunctionDefinitionAST
         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
     }
     visitor->endVisit(this);
 }
@@ -477,14 +405,12 @@ void FunctionDefinitionAST::accept0(ASTVisitor *visitor)
 void ForeachStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ForeachStatementAST
         for (SpecifierAST *it = type_specifiers; it; it = it->next)
             accept(it, visitor);
         accept(declarator, visitor);
         accept(initializer, visitor);
         accept(expression, visitor);
         accept(statement, visitor);
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -492,12 +418,10 @@ void ForeachStatementAST::accept0(ASTVisitor *visitor)
 void ForStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ForStatementAST
         accept(initializer, visitor);
         accept(condition, visitor);
         accept(expression, visitor);
         accept(statement, visitor);
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -505,11 +429,9 @@ void ForStatementAST::accept0(ASTVisitor *visitor)
 void IfStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit IfStatementAST
         accept(condition, visitor);
         accept(statement, visitor);
         accept(else_statement, visitor);
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -517,10 +439,8 @@ void IfStatementAST::accept0(ASTVisitor *visitor)
 void ArrayInitializerAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ArrayInitializerAST
         for (ExpressionListAST *it = expression_list; it; it = it->next)
             accept(it, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -528,9 +448,7 @@ void ArrayInitializerAST::accept0(ASTVisitor *visitor)
 void LabeledStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit LabeledStatementAST
         accept(statement, visitor);
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -538,10 +456,8 @@ void LabeledStatementAST::accept0(ASTVisitor *visitor)
 void LinkageBodyAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit LinkageBodyAST
         for (DeclarationListAST *it = declarations; it; it = it->next)
             accept(it, visitor);
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -549,9 +465,7 @@ void LinkageBodyAST::accept0(ASTVisitor *visitor)
 void LinkageSpecificationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit LinkageSpecificationAST
         accept(declaration, visitor);
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -559,7 +473,6 @@ void LinkageSpecificationAST::accept0(ASTVisitor *visitor)
 void MemInitializerAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit MemInitializerAST
         accept(name, visitor);
         accept(expression, visitor);
     }
@@ -569,7 +482,6 @@ void MemInitializerAST::accept0(ASTVisitor *visitor)
 void NestedNameSpecifierAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit NestedNameSpecifierAST
         accept(class_or_namespace_name, visitor);
     }
     visitor->endVisit(this);
@@ -578,12 +490,9 @@ void NestedNameSpecifierAST::accept0(ASTVisitor *visitor)
 void QualifiedNameAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit QualifiedNameAST
         for (NestedNameSpecifierAST *it = nested_name_specifier; it; it = it->next)
             accept(it, visitor);
         accept(unqualified_name, visitor);
-        // visit NameAST
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -591,10 +500,7 @@ void QualifiedNameAST::accept0(ASTVisitor *visitor)
 void OperatorFunctionIdAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit OperatorFunctionIdAST
         accept(op, visitor);
-        // visit NameAST
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -602,13 +508,10 @@ void OperatorFunctionIdAST::accept0(ASTVisitor *visitor)
 void ConversionFunctionIdAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ConversionFunctionIdAST
         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
     }
     visitor->endVisit(this);
 }
@@ -616,9 +519,6 @@ void ConversionFunctionIdAST::accept0(ASTVisitor *visitor)
 void SimpleNameAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit SimpleNameAST
-        // visit NameAST
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -626,9 +526,6 @@ void SimpleNameAST::accept0(ASTVisitor *visitor)
 void DestructorNameAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit DestructorNameAST
-        // visit NameAST
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -636,11 +533,8 @@ void DestructorNameAST::accept0(ASTVisitor *visitor)
 void TemplateIdAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit TemplateIdAST
         for (TemplateArgumentListAST *it = template_arguments; it; it = it->next)
             accept(it, visitor);
-        // visit NameAST
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -648,11 +542,9 @@ void TemplateIdAST::accept0(ASTVisitor *visitor)
 void NamespaceAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit NamespaceAST
         for (SpecifierAST *it = attributes; it; it = it->next)
             accept(it, visitor);
         accept(linkage_body, visitor);
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -660,9 +552,7 @@ void NamespaceAST::accept0(ASTVisitor *visitor)
 void NamespaceAliasDefinitionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit NamespaceAliasDefinitionAST
         accept(name, visitor);
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -670,7 +560,6 @@ void NamespaceAliasDefinitionAST::accept0(ASTVisitor *visitor)
 void NewPlacementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit NewPlacementAST
         for (ExpressionListAST *it = expression_list; it; it = it->next)
             accept(it, visitor);
     }
@@ -680,7 +569,6 @@ void NewPlacementAST::accept0(ASTVisitor *visitor)
 void NewArrayDeclaratorAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit NewArrayDeclaratorAST
         accept(expression, visitor);
     }
     visitor->endVisit(this);
@@ -689,12 +577,10 @@ void NewArrayDeclaratorAST::accept0(ASTVisitor *visitor)
 void NewExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit NewExpressionAST
         accept(new_placement, visitor);
         accept(type_id, visitor);
         accept(new_type_id, visitor);
         accept(new_initializer, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -702,7 +588,6 @@ void NewExpressionAST::accept0(ASTVisitor *visitor)
 void NewInitializerAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit NewInitializerAST
         accept(expression, visitor);
     }
     visitor->endVisit(this);
@@ -711,7 +596,6 @@ void NewInitializerAST::accept0(ASTVisitor *visitor)
 void NewTypeIdAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit NewTypeIdAST
         for (SpecifierAST *it = type_specifier; it; it = it->next)
             accept(it, visitor);
         for (PtrOperatorAST *it = ptr_operators; it; it = it->next)
@@ -725,7 +609,6 @@ void NewTypeIdAST::accept0(ASTVisitor *visitor)
 void OperatorAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit OperatorAST
     }
     visitor->endVisit(this);
 }
@@ -733,12 +616,10 @@ void OperatorAST::accept0(ASTVisitor *visitor)
 void ParameterDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ParameterDeclarationAST
         for (SpecifierAST *it = type_specifier; it; it = it->next)
             accept(it, visitor);
         accept(declarator, visitor);
         accept(expression, visitor);
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -746,7 +627,6 @@ void ParameterDeclarationAST::accept0(ASTVisitor *visitor)
 void ParameterDeclarationClauseAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ParameterDeclarationClauseAST
         for (DeclarationListAST *it = parameter_declarations; it; it = it->next)
             accept(it, visitor);
     }
@@ -756,10 +636,8 @@ void ParameterDeclarationClauseAST::accept0(ASTVisitor *visitor)
 void CallAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit CallAST
         for (ExpressionListAST *it = expression_list; it; it = it->next)
             accept(it, visitor);
-        // visit PostfixAST
     }
     visitor->endVisit(this);
 }
@@ -767,9 +645,7 @@ void CallAST::accept0(ASTVisitor *visitor)
 void ArrayAccessAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ArrayAccessAST
         accept(expression, visitor);
-        // visit PostfixAST
     }
     visitor->endVisit(this);
 }
@@ -777,8 +653,6 @@ void ArrayAccessAST::accept0(ASTVisitor *visitor)
 void PostIncrDecrAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit PostIncrDecrAST
-        // visit PostfixAST
     }
     visitor->endVisit(this);
 }
@@ -786,9 +660,7 @@ void PostIncrDecrAST::accept0(ASTVisitor *visitor)
 void MemberAccessAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit MemberAccessAST
         accept(member_name, visitor);
-        // visit PostfixAST
     }
     visitor->endVisit(this);
 }
@@ -796,9 +668,7 @@ void MemberAccessAST::accept0(ASTVisitor *visitor)
 void TypeidExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit TypeidExpressionAST
         accept(expression, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -806,11 +676,9 @@ void TypeidExpressionAST::accept0(ASTVisitor *visitor)
 void TypenameCallExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit TypenameCallExpressionAST
         accept(name, visitor);
         for (ExpressionListAST *it = expression_list; it; it = it->next)
             accept(it, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -818,12 +686,10 @@ void TypenameCallExpressionAST::accept0(ASTVisitor *visitor)
 void TypeConstructorCallAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit TypeConstructorCallAST
         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);
 }
@@ -831,11 +697,9 @@ void TypeConstructorCallAST::accept0(ASTVisitor *visitor)
 void PostfixExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit PostfixExpressionAST
         accept(base_expression, visitor);
         for (PostfixAST *it = postfix_expressions; it; it = it->next)
             accept(it, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -843,12 +707,10 @@ void PostfixExpressionAST::accept0(ASTVisitor *visitor)
 void PointerToMemberAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit PointerToMemberAST
         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
     }
     visitor->endVisit(this);
 }
@@ -856,10 +718,8 @@ void PointerToMemberAST::accept0(ASTVisitor *visitor)
 void PointerAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit PointerAST
         for (SpecifierAST *it = cv_qualifier_seq; it; it = it->next)
             accept(it, visitor);
-        // visit PtrOperatorAST
     }
     visitor->endVisit(this);
 }
@@ -867,8 +727,6 @@ void PointerAST::accept0(ASTVisitor *visitor)
 void ReferenceAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ReferenceAST
-        // visit PtrOperatorAST
     }
     visitor->endVisit(this);
 }
@@ -876,8 +734,6 @@ void ReferenceAST::accept0(ASTVisitor *visitor)
 void BreakStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit BreakStatementAST
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -885,8 +741,6 @@ void BreakStatementAST::accept0(ASTVisitor *visitor)
 void ContinueStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ContinueStatementAST
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -894,8 +748,6 @@ void ContinueStatementAST::accept0(ASTVisitor *visitor)
 void GotoStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit GotoStatementAST
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -903,9 +755,7 @@ void GotoStatementAST::accept0(ASTVisitor *visitor)
 void ReturnStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ReturnStatementAST
         accept(expression, visitor);
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -913,9 +763,7 @@ void ReturnStatementAST::accept0(ASTVisitor *visitor)
 void SizeofExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit SizeofExpressionAST
         accept(expression, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -923,8 +771,6 @@ void SizeofExpressionAST::accept0(ASTVisitor *visitor)
 void NumericLiteralAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit NumericLiteralAST
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -932,8 +778,6 @@ void NumericLiteralAST::accept0(ASTVisitor *visitor)
 void BoolLiteralAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit BoolLiteralAST
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -941,8 +785,6 @@ void BoolLiteralAST::accept0(ASTVisitor *visitor)
 void ThisExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ThisExpressionAST
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -950,9 +792,7 @@ void ThisExpressionAST::accept0(ASTVisitor *visitor)
 void NestedExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit NestedExpressionAST
         accept(expression, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -960,8 +800,6 @@ void NestedExpressionAST::accept0(ASTVisitor *visitor)
 void StringLiteralAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit StringLiteralAST
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -969,10 +807,8 @@ void StringLiteralAST::accept0(ASTVisitor *visitor)
 void SwitchStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit SwitchStatementAST
         accept(condition, visitor);
         accept(statement, visitor);
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -980,7 +816,6 @@ void SwitchStatementAST::accept0(ASTVisitor *visitor)
 void TemplateArgumentListAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit TemplateArgumentListAST
         accept(template_argument, visitor);
     }
     visitor->endVisit(this);
@@ -989,11 +824,9 @@ void TemplateArgumentListAST::accept0(ASTVisitor *visitor)
 void TemplateDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit TemplateDeclarationAST
         for (DeclarationListAST *it = template_parameters; it; it = it->next)
             accept(it, visitor);
         accept(declaration, visitor);
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -1001,9 +834,7 @@ void TemplateDeclarationAST::accept0(ASTVisitor *visitor)
 void ThrowExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ThrowExpressionAST
         accept(expression, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -1011,7 +842,6 @@ void ThrowExpressionAST::accept0(ASTVisitor *visitor)
 void TranslationUnitAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit TranslationUnitAST
         for (DeclarationListAST *it = declarations; it; it = it->next)
             accept(it, visitor);
     }
@@ -1021,11 +851,9 @@ void TranslationUnitAST::accept0(ASTVisitor *visitor)
 void TryBlockStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit TryBlockStatementAST
         accept(statement, visitor);
         for (CatchClauseAST *it = catch_clause_seq; it; it = it->next)
             accept(it, visitor);
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -1033,10 +861,8 @@ void TryBlockStatementAST::accept0(ASTVisitor *visitor)
 void CatchClauseAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit CatchClauseAST
         accept(exception_declaration, visitor);
         accept(statement, visitor);
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -1044,11 +870,9 @@ void CatchClauseAST::accept0(ASTVisitor *visitor)
 void TypeIdAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit TypeIdAST
         for (SpecifierAST *it = type_specifier; it; it = it->next)
             accept(it, visitor);
         accept(declarator, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -1056,10 +880,8 @@ void TypeIdAST::accept0(ASTVisitor *visitor)
 void TypenameTypeParameterAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit TypenameTypeParameterAST
         accept(name, visitor);
         accept(type_id, visitor);
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -1067,12 +889,10 @@ void TypenameTypeParameterAST::accept0(ASTVisitor *visitor)
 void TemplateTypeParameterAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit TemplateTypeParameterAST
         for (DeclarationListAST *it = template_parameters; it; it = it->next)
             accept(it, visitor);
         accept(name, visitor);
         accept(type_id, visitor);
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -1080,9 +900,7 @@ void TemplateTypeParameterAST::accept0(ASTVisitor *visitor)
 void UnaryExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit UnaryExpressionAST
         accept(expression, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -1090,9 +908,7 @@ void UnaryExpressionAST::accept0(ASTVisitor *visitor)
 void UsingAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit UsingAST
         accept(name, visitor);
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -1100,9 +916,7 @@ void UsingAST::accept0(ASTVisitor *visitor)
 void UsingDirectiveAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit UsingDirectiveAST
         accept(name, visitor);
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -1110,10 +924,8 @@ void UsingDirectiveAST::accept0(ASTVisitor *visitor)
 void WhileStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit WhileStatementAST
         accept(condition, visitor);
         accept(statement, visitor);
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -1121,7 +933,6 @@ void WhileStatementAST::accept0(ASTVisitor *visitor)
 void IdentifierListAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit IdentifierListAST
         accept(name, visitor);
     }
     visitor->endVisit(this);
@@ -1130,12 +941,10 @@ void IdentifierListAST::accept0(ASTVisitor *visitor)
 void ObjCClassForwardDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCClassForwardDeclarationAST
         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
     }
     visitor->endVisit(this);
 }
@@ -1143,7 +952,6 @@ void ObjCClassForwardDeclarationAST::accept0(ASTVisitor *visitor)
 void ObjCClassDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCClassInterfaceDefinitionAST
         for (SpecifierAST *it = attributes; it; it = it->next)
             accept(it, visitor);
         accept(class_name, visitor);
@@ -1153,7 +961,6 @@ void ObjCClassDeclarationAST::accept0(ASTVisitor *visitor)
         accept(inst_vars_decl, visitor);
         for (DeclarationListAST *it = member_declarations; it; it = it->next)
             accept(it, visitor);
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -1161,12 +968,10 @@ void ObjCClassDeclarationAST::accept0(ASTVisitor *visitor)
 void ObjCProtocolForwardDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCProtocolDeclarationAST
         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
     }
     visitor->endVisit(this);
 }
@@ -1174,14 +979,12 @@ void ObjCProtocolForwardDeclarationAST::accept0(ASTVisitor *visitor)
 void ObjCProtocolDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCProtocolDeclarationAST
         for (SpecifierAST *it = attributes; it; it = it->next)
             accept(it, visitor);
         accept(name, visitor);
         accept(protocol_refs, visitor);
         for (DeclarationListAST *it = member_declarations; it; it = it->next)
             accept(it, visitor);
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -1189,7 +992,6 @@ void ObjCProtocolDeclarationAST::accept0(ASTVisitor *visitor)
 void ObjCProtocolRefsAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCProtocolRefsAST
         for (IdentifierListAST *it = identifier_list; it; it = it->next)
             accept(it, visitor);
     }
@@ -1199,7 +1001,6 @@ void ObjCProtocolRefsAST::accept0(ASTVisitor *visitor)
 void ObjCMessageArgumentAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCMessageArgumentAST
         accept(parameter_value_expression, visitor);
     }
     visitor->endVisit(this);
@@ -1208,7 +1009,6 @@ void ObjCMessageArgumentAST::accept0(ASTVisitor *visitor)
 void ObjCMessageArgumentListAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCMessageArgumentListAST
         accept(arg, visitor);
     }
     visitor->endVisit(this);
@@ -1217,12 +1017,10 @@ void ObjCMessageArgumentListAST::accept0(ASTVisitor *visitor)
 void ObjCMessageExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCMessageExpressionAST
         accept(receiver_expression, visitor);
         accept(selector, visitor);
         for (ObjCMessageArgumentListAST *it = argument_list; it; it = it->next)
             accept(it, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -1230,8 +1028,6 @@ void ObjCMessageExpressionAST::accept0(ASTVisitor *visitor)
 void ObjCProtocolExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCProtocolExpressionAST
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -1239,7 +1035,6 @@ void ObjCProtocolExpressionAST::accept0(ASTVisitor *visitor)
 void ObjCTypeNameAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCTypeNameAST
         accept(type_id, visitor);
     }
     visitor->endVisit(this);
@@ -1248,9 +1043,7 @@ void ObjCTypeNameAST::accept0(ASTVisitor *visitor)
 void ObjCEncodeExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCEncodeExpressionAST
         accept(type_name, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -1258,8 +1051,6 @@ void ObjCEncodeExpressionAST::accept0(ASTVisitor *visitor)
 void ObjCSelectorWithoutArgumentsAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCSelectorWithoutArgumentsAST
-        // visit ObjCSelectorAST
     }
     visitor->endVisit(this);
 }
@@ -1267,7 +1058,6 @@ void ObjCSelectorWithoutArgumentsAST::accept0(ASTVisitor *visitor)
 void ObjCSelectorArgumentAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCSelectorArgumentAST
     }
     visitor->endVisit(this);
 }
@@ -1275,7 +1065,6 @@ void ObjCSelectorArgumentAST::accept0(ASTVisitor *visitor)
 void ObjCSelectorArgumentListAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCSelectorArgumentListAST
         accept(argument, visitor);
     }
     visitor->endVisit(this);
@@ -1284,10 +1073,8 @@ void ObjCSelectorArgumentListAST::accept0(ASTVisitor *visitor)
 void ObjCSelectorWithArgumentsAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCSelectorWithArgumentsAST
         for (ObjCSelectorArgumentListAST *it = selector_arguments; it; it = it->next)
             accept(it, visitor);
-        // visit ObjCSelectorAST
     }
     visitor->endVisit(this);
 }
@@ -1295,9 +1082,7 @@ void ObjCSelectorWithArgumentsAST::accept0(ASTVisitor *visitor)
 void ObjCSelectorExpressionAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCSelectorExpressionAST
         accept(selector, visitor);
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -1305,7 +1090,6 @@ void ObjCSelectorExpressionAST::accept0(ASTVisitor *visitor)
 void ObjCInstanceVariablesDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCInstanceVariablesDeclarationAST
         for (DeclarationListAST *it = instance_variables; it; it = it->next)
             accept(it, visitor);
     }
@@ -1315,8 +1099,6 @@ void ObjCInstanceVariablesDeclarationAST::accept0(ASTVisitor *visitor)
 void ObjCVisibilityDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCVisibilityDeclarationAST
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -1324,7 +1106,6 @@ void ObjCVisibilityDeclarationAST::accept0(ASTVisitor *visitor)
 void ObjCPropertyAttributeAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCPropertyAttributeAST
         accept(method_selector, visitor);
     }
     visitor->endVisit(this);
@@ -1333,7 +1114,6 @@ void ObjCPropertyAttributeAST::accept0(ASTVisitor *visitor)
 void ObjCPropertyAttributeListAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCPropertyAttributeListAST
         accept(attr, visitor);
     }
     visitor->endVisit(this);
@@ -1342,13 +1122,11 @@ void ObjCPropertyAttributeListAST::accept0(ASTVisitor *visitor)
 void ObjCPropertyDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCPropertyDeclarationAST
         for (SpecifierAST *it = attributes; it; it = it->next)
             accept(it, visitor);
         for (ObjCPropertyAttributeListAST *it = property_attributes; it; it = it->next)
             accept(it, visitor);
         accept(simple_declaration, visitor);
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -1356,12 +1134,9 @@ void ObjCPropertyDeclarationAST::accept0(ASTVisitor *visitor)
 void ObjCMessageArgumentDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCMessageArgumentDeclarationAST
         accept(type_name, visitor);
         for (SpecifierAST *it = attributes; it; it = it->next)
             accept(it, visitor);
-        // visit NameAST
-        // visit ExpressionAST
     }
     visitor->endVisit(this);
 }
@@ -1369,7 +1144,6 @@ void ObjCMessageArgumentDeclarationAST::accept0(ASTVisitor *visitor)
 void ObjCMessageArgumentDeclarationListAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCMessageArgumentDeclarationListAST
         accept(argument_declaration, visitor);
     }
     visitor->endVisit(this);
@@ -1378,7 +1152,6 @@ void ObjCMessageArgumentDeclarationListAST::accept0(ASTVisitor *visitor)
 void ObjCMethodPrototypeAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCMethodPrototypeAST
         accept(type_name, visitor);
         accept(selector, visitor);
         for (ObjCMessageArgumentDeclarationListAST *it = arguments; it; it = it->next)
@@ -1392,10 +1165,8 @@ void ObjCMethodPrototypeAST::accept0(ASTVisitor *visitor)
 void ObjCMethodDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCMethodDeclarationAST
         accept(method_prototype, visitor);
         accept(function_body, visitor);
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -1403,7 +1174,6 @@ void ObjCMethodDeclarationAST::accept0(ASTVisitor *visitor)
 void ObjCSynthesizedPropertyAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCSynthesizedPropertyAST
     }
     visitor->endVisit(this);
 }
@@ -1411,7 +1181,6 @@ void ObjCSynthesizedPropertyAST::accept0(ASTVisitor *visitor)
 void ObjCSynthesizedPropertyListAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCSynthesizedPropertyListAST
         accept(synthesized_property, visitor);
     }
     visitor->endVisit(this);
@@ -1420,10 +1189,8 @@ void ObjCSynthesizedPropertyListAST::accept0(ASTVisitor *visitor)
 void ObjCSynthesizedPropertiesDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCSynthesizedPropertiesDeclarationAST
         for (ObjCSynthesizedPropertyListAST *it = property_identifiers; it; it = it->next)
             accept(it, visitor);
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -1431,10 +1198,8 @@ void ObjCSynthesizedPropertiesDeclarationAST::accept0(ASTVisitor *visitor)
 void ObjCDynamicPropertiesDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCDynamicPropertiesDeclarationAST
         for (IdentifierListAST *it = property_identifiers; it; it = it->next)
             accept(it, visitor);
-        // visit DeclarationAST
     }
     visitor->endVisit(this);
 }
@@ -1442,14 +1207,12 @@ void ObjCDynamicPropertiesDeclarationAST::accept0(ASTVisitor *visitor)
 void ObjCFastEnumerationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCFastEnumerationAST
         for (SpecifierAST *it = type_specifiers; it; it = it->next)
             accept(it, visitor);
         accept(declarator, visitor);
         accept(initializer, visitor);
         accept(fast_enumeratable_expression, visitor);
         accept(body_statement, visitor);
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
@@ -1457,12 +1220,9 @@ void ObjCFastEnumerationAST::accept0(ASTVisitor *visitor)
 void ObjCSynchronizedStatementAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCSynchronizedStatementAST
         accept(synchronized_object, visitor);
         accept(statement, visitor);
-        // visit StatementAST
     }
     visitor->endVisit(this);
 }
 
-
diff --git a/src/tools/cplusplus/Main.cpp b/src/tools/cplusplus/Main.cpp
index a60d3c661e8c5135505ca33531effdc3c34485b2..6fc9dd5d8ee49ac96b6c2d3a7af730d572e9dd2e 100644
--- a/src/tools/cplusplus/Main.cpp
+++ b/src/tools/cplusplus/Main.cpp
@@ -16,12 +16,237 @@
 #include <Literals.h>
 #include <CppDocument.h>
 #include <Overview.h>
+#include <Names.h>
+#include <Scope.h>
 
 #include <iostream>
 #include <cstdlib>
 
 using namespace CPlusPlus;
 
+class SearchListNodes: protected ASTVisitor
+{
+    QList<QByteArray> _listNodes;
+
+public:
+    SearchListNodes(Control *control)
+        : ASTVisitor(control)
+    { }
+
+    QList<QByteArray> operator()(AST *ast)
+    {
+        _listNodes.clear();
+        accept(ast);
+        return _listNodes;
+    }
+
+protected:
+    virtual bool visit(ClassSpecifierAST *ast)
+    {
+        const QString className = oo(ast->symbol->name());
+        
+        if (! (className.length() > 3 && className.endsWith(QLatin1String("AST"))))
+            return true;
+
+        for (unsigned i = 0; i < ast->symbol->memberCount(); ++i) {
+            Symbol *member = ast->symbol->memberAt(i);
+            Name *memberName = member->name();
+
+            if (! memberName)
+                continue;
+            else if (! memberName->identifier())
+                continue;
+            
+            if (! qstrcmp("next", memberName->identifier()->chars())) {
+                _listNodes.append(className.toUtf8());
+                break;
+            }
+        }
+
+        return true;
+    }
+
+private:
+    Overview oo;
+};
+
+class VisitCG: protected ASTVisitor
+{
+    QDir _cplusplusDir;
+    QList<QByteArray> _listNodes;
+    QTextStream *out;
+
+public:
+    VisitCG(const QDir &cplusplusDir, Control *control)
+        : ASTVisitor(control), _cplusplusDir(cplusplusDir), out(0)
+    { }
+
+    void operator()(AST *ast)
+    {
+        QFileInfo fileInfo(_cplusplusDir, QLatin1String("ASTVisit.cpp"));
+
+        QFile file(fileInfo.absoluteFilePath());
+        if (! file.open(QFile::WriteOnly))
+            return;
+
+        QTextStream output(&file);
+        out = &output;
+
+        *out <<
+            "/**************************************************************************\n"
+            "**\n"
+            "** This file is part of Qt Creator\n"
+            "**\n"
+            "** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).\n"
+            "**\n"
+            "** Contact: Nokia Corporation (qt-info@nokia.com)\n"
+            "**\n"
+            "** Commercial Usage\n"
+            "**\n"
+            "** Licensees holding valid Qt Commercial licenses may use this file in\n"
+            "** accordance with the Qt Commercial License Agreement provided with the\n"
+            "** Software or, alternatively, in accordance with the terms contained in\n"
+            "** a written agreement between you and Nokia.\n"
+            "**\n"
+            "** GNU Lesser General Public License Usage\n"
+            "**\n"
+            "** Alternatively, this file may be used under the terms of the GNU Lesser\n"
+            "** General Public License version 2.1 as published by the Free Software\n"
+            "** Foundation and appearing in the file LICENSE.LGPL included in the\n"
+            "** packaging of this file.  Please review the following information to\n"
+            "** ensure the GNU Lesser General Public License version 2.1 requirements\n"
+            "** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n"
+            "**\n"
+            "** If you are unsure which license is appropriate for your use, please\n"
+            "** contact the sales department at http://qt.nokia.com/contact.\n"
+            "**\n"
+            "**************************************************************************/\n"
+            "\n"
+            "#include \"AST.h\"\n"
+            "#include \"ASTVisitor.h\"\n"
+            "\n"
+            "using namespace CPlusPlus;\n" << endl;
+
+        SearchListNodes listNodes(control());
+        _listNodes = listNodes(ast);
+
+        accept(ast);
+    }
+
+protected:
+    using ASTVisitor::visit;
+
+    QMap<QByteArray, ClassSpecifierAST *> classMap;
+
+    QByteArray id_cast(NameAST *name)
+    {
+        if (! name)
+            return QByteArray();
+
+        Identifier *id = identifier(name->asSimpleName()->identifier_token);
+
+        return QByteArray::fromRawData(id->chars(), id->size());
+    }
+
+    void visitMembers(Class *klass)
+    {
+        const QByteArray className = klass->name()->identifier()->chars();
+
+        // *out << "        // visit " << className.constData() << endl;
+        for (unsigned i = 0; i < klass->memberCount(); ++i) {
+            Symbol *member = klass->memberAt(i);
+            if (! member->name())
+                continue;
+
+            Identifier *id = member->name()->identifier();
+
+            if (! id)
+                continue;
+
+            const QByteArray memberName = QByteArray::fromRawData(id->chars(), id->size());
+            if (member->type().isUnsigned() && memberName.endsWith("_token")) {
+                // nothing to do. The member is a token.
+
+            } else if (PointerType *ptrTy = member->type()->asPointerType()) {
+
+                if (NamedType *namedTy = ptrTy->elementType()->asNamedType()) {
+                    QByteArray typeName = namedTy->name()->identifier()->chars();
+
+                    if (_listNodes.contains(typeName) && memberName != "next") {
+                        *out
+                                << "        for (" << typeName.constData() << " *it = "
+                                << memberName.constData() << "; it; it = it->next)" << endl
+                                << "            accept(it, visitor);" << endl;
+
+                    } else if (typeName.endsWith("AST") && memberName != "next") {
+                        *out << "        accept(" << memberName.constData() << ", visitor);" << endl;
+                    }
+                }
+            }
+        }
+
+        for (unsigned i = 0; i < klass->baseClassCount(); ++i) {
+            const QByteArray baseClassName = klass->baseClassAt(i)->identifier()->chars();
+
+            if (ClassSpecifierAST *baseClassSpec = classMap.value(baseClassName, 0)) {
+                visitMembers(baseClassSpec->symbol);
+            }
+        }
+    }
+
+    bool checkMethod(Symbol *accept0Method) const
+    {
+        Declaration *decl = accept0Method->asDeclaration();
+        if (! decl)
+            return false;
+
+        Function *funTy = decl->type()->asFunctionType();
+        if (! funTy)
+            return false;
+
+        else if (funTy->isPureVirtual())
+            return false;
+
+        return true;
+    }
+
+    virtual bool visit(ClassSpecifierAST *ast)
+    {
+        Class *klass = ast->symbol;
+        const QByteArray className = id_cast(ast->name);
+
+        Identifier *visit_id = control()->findOrInsertIdentifier("accept0");
+        Symbol *accept0Method = klass->members()->lookat(visit_id);
+        for (; accept0Method; accept0Method = accept0Method->next()) {
+            if (accept0Method->identifier() != visit_id)
+                continue;
+
+            if (checkMethod(accept0Method))
+                break;
+        }
+
+        if (! accept0Method)
+            return true;
+
+        classMap.insert(className, ast);
+
+        *out
+                << "void " << className.constData() << "::accept0(ASTVisitor *visitor)" << endl
+                << "{" << endl
+                << "    if (visitor->visit(this)) {" << endl;
+
+        visitMembers(klass);
+
+        *out
+                << "    }" << endl
+                << "    visitor->endVisit(this);" << endl
+                << "}" << endl
+                << endl;
+
+        return true;
+    }
+};
+
 QTextCursor createCursor(TranslationUnit *unit, AST *ast, QTextDocument *document)
 {
     unsigned startLine, startColumn, endLine, endColumn;
@@ -226,6 +451,9 @@ QStringList generateAST_H(const Snapshot &snapshot, const QDir &cplusplusDir)
         out << document.toPlainText();
     }
 
+    VisitCG cg(cplusplusDir, doc->control());
+    cg(doc->translationUnit()->ast());
+
     return astDerivedClasses;
 }