tools/icheck/parser/src/shared/cplusplus/ASTMatcher.cpp
changeset 0 876b1a06bc25
equal deleted inserted replaced
-1:000000000000 0:876b1a06bc25
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the Qt Mobility Components.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #include "AST.h"
       
    43 #include "ASTMatcher.h"
       
    44 #include "TranslationUnit.h"
       
    45 
       
    46 using namespace CPlusPlus;
       
    47 
       
    48 ASTMatcher::ASTMatcher()
       
    49 { }
       
    50 
       
    51 ASTMatcher::~ASTMatcher()
       
    52 { }
       
    53 
       
    54 bool ASTMatcher::match(SimpleSpecifierAST *node, SimpleSpecifierAST *pattern)
       
    55 {
       
    56     (void) node;
       
    57     (void) pattern;
       
    58 
       
    59     pattern->specifier_token = node->specifier_token;
       
    60 
       
    61     return true;
       
    62 }
       
    63 
       
    64 bool ASTMatcher::match(AttributeSpecifierAST *node, AttributeSpecifierAST *pattern)
       
    65 {
       
    66     (void) node;
       
    67     (void) pattern;
       
    68 
       
    69     pattern->attribute_token = node->attribute_token;
       
    70 
       
    71     pattern->first_lparen_token = node->first_lparen_token;
       
    72 
       
    73     pattern->second_lparen_token = node->second_lparen_token;
       
    74 
       
    75     if (! pattern->attribute_list)
       
    76         pattern->attribute_list = node->attribute_list;
       
    77     else if (! AST::match(node->attribute_list, pattern->attribute_list, this))
       
    78         return false;
       
    79 
       
    80     pattern->first_rparen_token = node->first_rparen_token;
       
    81 
       
    82     pattern->second_rparen_token = node->second_rparen_token;
       
    83 
       
    84     return true;
       
    85 }
       
    86 
       
    87 bool ASTMatcher::match(AttributeAST *node, AttributeAST *pattern)
       
    88 {
       
    89     (void) node;
       
    90     (void) pattern;
       
    91 
       
    92     pattern->identifier_token = node->identifier_token;
       
    93 
       
    94     pattern->lparen_token = node->lparen_token;
       
    95 
       
    96     pattern->tag_token = node->tag_token;
       
    97 
       
    98     if (! pattern->expression_list)
       
    99         pattern->expression_list = node->expression_list;
       
   100     else if (! AST::match(node->expression_list, pattern->expression_list, this))
       
   101         return false;
       
   102 
       
   103     pattern->rparen_token = node->rparen_token;
       
   104 
       
   105     return true;
       
   106 }
       
   107 
       
   108 bool ASTMatcher::match(TypeofSpecifierAST *node, TypeofSpecifierAST *pattern)
       
   109 {
       
   110     (void) node;
       
   111     (void) pattern;
       
   112 
       
   113     pattern->typeof_token = node->typeof_token;
       
   114 
       
   115     pattern->lparen_token = node->lparen_token;
       
   116 
       
   117     if (! pattern->expression)
       
   118         pattern->expression = node->expression;
       
   119     else if (! AST::match(node->expression, pattern->expression, this))
       
   120         return false;
       
   121 
       
   122     pattern->rparen_token = node->rparen_token;
       
   123 
       
   124     return true;
       
   125 }
       
   126 
       
   127 bool ASTMatcher::match(DeclaratorAST *node, DeclaratorAST *pattern)
       
   128 {
       
   129     (void) node;
       
   130     (void) pattern;
       
   131 
       
   132     if (! pattern->attribute_list)
       
   133         pattern->attribute_list = node->attribute_list;
       
   134     else if (! AST::match(node->attribute_list, pattern->attribute_list, this))
       
   135         return false;
       
   136 
       
   137     if (! pattern->ptr_operator_list)
       
   138         pattern->ptr_operator_list = node->ptr_operator_list;
       
   139     else if (! AST::match(node->ptr_operator_list, pattern->ptr_operator_list, this))
       
   140         return false;
       
   141 
       
   142     if (! pattern->core_declarator)
       
   143         pattern->core_declarator = node->core_declarator;
       
   144     else if (! AST::match(node->core_declarator, pattern->core_declarator, this))
       
   145         return false;
       
   146 
       
   147     if (! pattern->postfix_declarator_list)
       
   148         pattern->postfix_declarator_list = node->postfix_declarator_list;
       
   149     else if (! AST::match(node->postfix_declarator_list, pattern->postfix_declarator_list, this))
       
   150         return false;
       
   151 
       
   152     if (! pattern->post_attribute_list)
       
   153         pattern->post_attribute_list = node->post_attribute_list;
       
   154     else if (! AST::match(node->post_attribute_list, pattern->post_attribute_list, this))
       
   155         return false;
       
   156 
       
   157     pattern->equals_token = node->equals_token;
       
   158 
       
   159     if (! pattern->initializer)
       
   160         pattern->initializer = node->initializer;
       
   161     else if (! AST::match(node->initializer, pattern->initializer, this))
       
   162         return false;
       
   163 
       
   164     return true;
       
   165 }
       
   166 
       
   167 bool ASTMatcher::match(SimpleDeclarationAST *node, SimpleDeclarationAST *pattern)
       
   168 {
       
   169     (void) node;
       
   170     (void) pattern;
       
   171 
       
   172     pattern->qt_invokable_token = node->qt_invokable_token;
       
   173 
       
   174     if (! pattern->decl_specifier_list)
       
   175         pattern->decl_specifier_list = node->decl_specifier_list;
       
   176     else if (! AST::match(node->decl_specifier_list, pattern->decl_specifier_list, this))
       
   177         return false;
       
   178 
       
   179     if (! pattern->declarator_list)
       
   180         pattern->declarator_list = node->declarator_list;
       
   181     else if (! AST::match(node->declarator_list, pattern->declarator_list, this))
       
   182         return false;
       
   183 
       
   184     pattern->semicolon_token = node->semicolon_token;
       
   185 
       
   186     return true;
       
   187 }
       
   188 
       
   189 bool ASTMatcher::match(EmptyDeclarationAST *node, EmptyDeclarationAST *pattern)
       
   190 {
       
   191     (void) node;
       
   192     (void) pattern;
       
   193 
       
   194     pattern->semicolon_token = node->semicolon_token;
       
   195 
       
   196     return true;
       
   197 }
       
   198 
       
   199 bool ASTMatcher::match(AccessDeclarationAST *node, AccessDeclarationAST *pattern)
       
   200 {
       
   201     (void) node;
       
   202     (void) pattern;
       
   203 
       
   204     pattern->access_specifier_token = node->access_specifier_token;
       
   205 
       
   206     pattern->slots_token = node->slots_token;
       
   207 
       
   208     pattern->colon_token = node->colon_token;
       
   209 
       
   210 #ifdef ICHECK_BUILD
       
   211     pattern->invoke_token = node->invoke_token;
       
   212 #endif
       
   213 
       
   214     return true;
       
   215 }
       
   216 
       
   217 #ifdef ICHECK_BUILD
       
   218 bool ASTMatcher::match(QPropertyDeclarationAST *node, QPropertyDeclarationAST *pattern)
       
   219 {
       
   220     (void) node;
       
   221     (void) pattern;
       
   222 
       
   223     pattern->property_specifier_token = node->property_specifier_token;
       
   224 
       
   225     pattern->type_name_token = node->type_name_token;
       
   226 
       
   227     pattern->read_function_token = node->read_function_token;
       
   228 
       
   229     pattern->write_function_token = node->write_function_token;
       
   230 
       
   231     pattern->notify_function_token = node->notify_function_token;
       
   232 
       
   233     return true;
       
   234 }
       
   235 
       
   236 bool ASTMatcher::match(QEnumDeclarationAST *node, QEnumDeclarationAST *pattern)
       
   237 {
       
   238     (void) node;
       
   239     (void) pattern;
       
   240 
       
   241     pattern->enum_specifier_token = node->enum_specifier_token;
       
   242 
       
   243     if (! pattern->enumerator_list)
       
   244         pattern->enumerator_list = node->enumerator_list;
       
   245     else if (! AST::match(node->enumerator_list, pattern->enumerator_list, this))
       
   246         return false;
       
   247 
       
   248     return true;
       
   249 }
       
   250 
       
   251 bool ASTMatcher::match(QFlagsDeclarationAST *node, QFlagsDeclarationAST *pattern)
       
   252 {
       
   253     (void) node;
       
   254     (void) pattern;
       
   255 
       
   256     pattern->flags_specifier_token = node->flags_specifier_token;
       
   257 
       
   258     if (! pattern->enumerator_list)
       
   259         pattern->enumerator_list = node->enumerator_list;
       
   260     else if (! AST::match(node->enumerator_list, pattern->enumerator_list, this))
       
   261         return false;
       
   262 
       
   263     return true;
       
   264 }
       
   265 
       
   266 bool ASTMatcher::match(QDeclareFlagsDeclarationAST *node, QDeclareFlagsDeclarationAST *pattern)
       
   267 {
       
   268     (void) node;
       
   269     (void) pattern;
       
   270 
       
   271     pattern->declareflags_specifier_token = node->declareflags_specifier_token;
       
   272     pattern->flag_token = node->flag_token;
       
   273     pattern->enum_token = node->enum_token;
       
   274 
       
   275     return true;
       
   276 }
       
   277 #endif
       
   278 
       
   279 bool ASTMatcher::match(AsmDefinitionAST *node, AsmDefinitionAST *pattern)
       
   280 {
       
   281     (void) node;
       
   282     (void) pattern;
       
   283 
       
   284     pattern->asm_token = node->asm_token;
       
   285 
       
   286     pattern->volatile_token = node->volatile_token;
       
   287 
       
   288     pattern->lparen_token = node->lparen_token;
       
   289 
       
   290     pattern->rparen_token = node->rparen_token;
       
   291 
       
   292     pattern->semicolon_token = node->semicolon_token;
       
   293 
       
   294     return true;
       
   295 }
       
   296 
       
   297 bool ASTMatcher::match(BaseSpecifierAST *node, BaseSpecifierAST *pattern)
       
   298 {
       
   299     (void) node;
       
   300     (void) pattern;
       
   301 
       
   302     pattern->virtual_token = node->virtual_token;
       
   303 
       
   304     pattern->access_specifier_token = node->access_specifier_token;
       
   305 
       
   306     if (! pattern->name)
       
   307         pattern->name = node->name;
       
   308     else if (! AST::match(node->name, pattern->name, this))
       
   309         return false;
       
   310 
       
   311     return true;
       
   312 }
       
   313 
       
   314 bool ASTMatcher::match(CompoundLiteralAST *node, CompoundLiteralAST *pattern)
       
   315 {
       
   316     (void) node;
       
   317     (void) pattern;
       
   318 
       
   319     pattern->lparen_token = node->lparen_token;
       
   320 
       
   321     if (! pattern->type_id)
       
   322         pattern->type_id = node->type_id;
       
   323     else if (! AST::match(node->type_id, pattern->type_id, this))
       
   324         return false;
       
   325 
       
   326     pattern->rparen_token = node->rparen_token;
       
   327 
       
   328     if (! pattern->initializer)
       
   329         pattern->initializer = node->initializer;
       
   330     else if (! AST::match(node->initializer, pattern->initializer, this))
       
   331         return false;
       
   332 
       
   333     return true;
       
   334 }
       
   335 
       
   336 bool ASTMatcher::match(QtMethodAST *node, QtMethodAST *pattern)
       
   337 {
       
   338     (void) node;
       
   339     (void) pattern;
       
   340 
       
   341     pattern->method_token = node->method_token;
       
   342 
       
   343     pattern->lparen_token = node->lparen_token;
       
   344 
       
   345     if (! pattern->declarator)
       
   346         pattern->declarator = node->declarator;
       
   347     else if (! AST::match(node->declarator, pattern->declarator, this))
       
   348         return false;
       
   349 
       
   350     pattern->rparen_token = node->rparen_token;
       
   351 
       
   352     return true;
       
   353 }
       
   354 
       
   355 bool ASTMatcher::match(QtMemberDeclarationAST *node, QtMemberDeclarationAST *pattern)
       
   356 {
       
   357     (void) node;
       
   358     (void) pattern;
       
   359 
       
   360     pattern->q_token = node->q_token;
       
   361 
       
   362     pattern->lparen_token = node->lparen_token;
       
   363 
       
   364     if (! pattern->type_id)
       
   365         pattern->type_id = node->type_id;
       
   366     else if (! AST::match(node->type_id, pattern->type_id, this))
       
   367         return false;
       
   368 
       
   369     pattern->rparen_token = node->rparen_token;
       
   370 
       
   371     return true;
       
   372 }
       
   373 
       
   374 bool ASTMatcher::match(BinaryExpressionAST *node, BinaryExpressionAST *pattern)
       
   375 {
       
   376     (void) node;
       
   377     (void) pattern;
       
   378 
       
   379     if (! pattern->left_expression)
       
   380         pattern->left_expression = node->left_expression;
       
   381     else if (! AST::match(node->left_expression, pattern->left_expression, this))
       
   382         return false;
       
   383 
       
   384     pattern->binary_op_token = node->binary_op_token;
       
   385 
       
   386     if (! pattern->right_expression)
       
   387         pattern->right_expression = node->right_expression;
       
   388     else if (! AST::match(node->right_expression, pattern->right_expression, this))
       
   389         return false;
       
   390 
       
   391     return true;
       
   392 }
       
   393 
       
   394 bool ASTMatcher::match(CastExpressionAST *node, CastExpressionAST *pattern)
       
   395 {
       
   396     (void) node;
       
   397     (void) pattern;
       
   398 
       
   399     pattern->lparen_token = node->lparen_token;
       
   400 
       
   401     if (! pattern->type_id)
       
   402         pattern->type_id = node->type_id;
       
   403     else if (! AST::match(node->type_id, pattern->type_id, this))
       
   404         return false;
       
   405 
       
   406     pattern->rparen_token = node->rparen_token;
       
   407 
       
   408     if (! pattern->expression)
       
   409         pattern->expression = node->expression;
       
   410     else if (! AST::match(node->expression, pattern->expression, this))
       
   411         return false;
       
   412 
       
   413     return true;
       
   414 }
       
   415 
       
   416 bool ASTMatcher::match(ClassSpecifierAST *node, ClassSpecifierAST *pattern)
       
   417 {
       
   418     (void) node;
       
   419     (void) pattern;
       
   420 
       
   421     pattern->classkey_token = node->classkey_token;
       
   422 
       
   423     if (! pattern->attribute_list)
       
   424         pattern->attribute_list = node->attribute_list;
       
   425     else if (! AST::match(node->attribute_list, pattern->attribute_list, this))
       
   426         return false;
       
   427 
       
   428     if (! pattern->name)
       
   429         pattern->name = node->name;
       
   430     else if (! AST::match(node->name, pattern->name, this))
       
   431         return false;
       
   432 
       
   433     pattern->colon_token = node->colon_token;
       
   434 
       
   435     if (! pattern->base_clause_list)
       
   436         pattern->base_clause_list = node->base_clause_list;
       
   437     else if (! AST::match(node->base_clause_list, pattern->base_clause_list, this))
       
   438         return false;
       
   439 
       
   440     pattern->lbrace_token = node->lbrace_token;
       
   441 
       
   442     if (! pattern->member_specifier_list)
       
   443         pattern->member_specifier_list = node->member_specifier_list;
       
   444     else if (! AST::match(node->member_specifier_list, pattern->member_specifier_list, this))
       
   445         return false;
       
   446 
       
   447     pattern->rbrace_token = node->rbrace_token;
       
   448 
       
   449     return true;
       
   450 }
       
   451 
       
   452 bool ASTMatcher::match(CaseStatementAST *node, CaseStatementAST *pattern)
       
   453 {
       
   454     (void) node;
       
   455     (void) pattern;
       
   456 
       
   457     pattern->case_token = node->case_token;
       
   458 
       
   459     if (! pattern->expression)
       
   460         pattern->expression = node->expression;
       
   461     else if (! AST::match(node->expression, pattern->expression, this))
       
   462         return false;
       
   463 
       
   464     pattern->colon_token = node->colon_token;
       
   465 
       
   466     if (! pattern->statement)
       
   467         pattern->statement = node->statement;
       
   468     else if (! AST::match(node->statement, pattern->statement, this))
       
   469         return false;
       
   470 
       
   471     return true;
       
   472 }
       
   473 
       
   474 bool ASTMatcher::match(CompoundStatementAST *node, CompoundStatementAST *pattern)
       
   475 {
       
   476     (void) node;
       
   477     (void) pattern;
       
   478 
       
   479     pattern->lbrace_token = node->lbrace_token;
       
   480 
       
   481     if (! pattern->statement_list)
       
   482         pattern->statement_list = node->statement_list;
       
   483     else if (! AST::match(node->statement_list, pattern->statement_list, this))
       
   484         return false;
       
   485 
       
   486     pattern->rbrace_token = node->rbrace_token;
       
   487 
       
   488     return true;
       
   489 }
       
   490 
       
   491 bool ASTMatcher::match(ConditionAST *node, ConditionAST *pattern)
       
   492 {
       
   493     (void) node;
       
   494     (void) pattern;
       
   495 
       
   496     if (! pattern->type_specifier_list)
       
   497         pattern->type_specifier_list = node->type_specifier_list;
       
   498     else if (! AST::match(node->type_specifier_list, pattern->type_specifier_list, this))
       
   499         return false;
       
   500 
       
   501     if (! pattern->declarator)
       
   502         pattern->declarator = node->declarator;
       
   503     else if (! AST::match(node->declarator, pattern->declarator, this))
       
   504         return false;
       
   505 
       
   506     return true;
       
   507 }
       
   508 
       
   509 bool ASTMatcher::match(ConditionalExpressionAST *node, ConditionalExpressionAST *pattern)
       
   510 {
       
   511     (void) node;
       
   512     (void) pattern;
       
   513 
       
   514     if (! pattern->condition)
       
   515         pattern->condition = node->condition;
       
   516     else if (! AST::match(node->condition, pattern->condition, this))
       
   517         return false;
       
   518 
       
   519     pattern->question_token = node->question_token;
       
   520 
       
   521     if (! pattern->left_expression)
       
   522         pattern->left_expression = node->left_expression;
       
   523     else if (! AST::match(node->left_expression, pattern->left_expression, this))
       
   524         return false;
       
   525 
       
   526     pattern->colon_token = node->colon_token;
       
   527 
       
   528     if (! pattern->right_expression)
       
   529         pattern->right_expression = node->right_expression;
       
   530     else if (! AST::match(node->right_expression, pattern->right_expression, this))
       
   531         return false;
       
   532 
       
   533     return true;
       
   534 }
       
   535 
       
   536 bool ASTMatcher::match(CppCastExpressionAST *node, CppCastExpressionAST *pattern)
       
   537 {
       
   538     (void) node;
       
   539     (void) pattern;
       
   540 
       
   541     pattern->cast_token = node->cast_token;
       
   542 
       
   543     pattern->less_token = node->less_token;
       
   544 
       
   545     if (! pattern->type_id)
       
   546         pattern->type_id = node->type_id;
       
   547     else if (! AST::match(node->type_id, pattern->type_id, this))
       
   548         return false;
       
   549 
       
   550     pattern->greater_token = node->greater_token;
       
   551 
       
   552     pattern->lparen_token = node->lparen_token;
       
   553 
       
   554     if (! pattern->expression)
       
   555         pattern->expression = node->expression;
       
   556     else if (! AST::match(node->expression, pattern->expression, this))
       
   557         return false;
       
   558 
       
   559     pattern->rparen_token = node->rparen_token;
       
   560 
       
   561     return true;
       
   562 }
       
   563 
       
   564 bool ASTMatcher::match(CtorInitializerAST *node, CtorInitializerAST *pattern)
       
   565 {
       
   566     (void) node;
       
   567     (void) pattern;
       
   568 
       
   569     pattern->colon_token = node->colon_token;
       
   570 
       
   571     if (! pattern->member_initializer_list)
       
   572         pattern->member_initializer_list = node->member_initializer_list;
       
   573     else if (! AST::match(node->member_initializer_list, pattern->member_initializer_list, this))
       
   574         return false;
       
   575 
       
   576     return true;
       
   577 }
       
   578 
       
   579 bool ASTMatcher::match(DeclarationStatementAST *node, DeclarationStatementAST *pattern)
       
   580 {
       
   581     (void) node;
       
   582     (void) pattern;
       
   583 
       
   584     if (! pattern->declaration)
       
   585         pattern->declaration = node->declaration;
       
   586     else if (! AST::match(node->declaration, pattern->declaration, this))
       
   587         return false;
       
   588 
       
   589     return true;
       
   590 }
       
   591 
       
   592 bool ASTMatcher::match(DeclaratorIdAST *node, DeclaratorIdAST *pattern)
       
   593 {
       
   594     (void) node;
       
   595     (void) pattern;
       
   596 
       
   597     if (! pattern->name)
       
   598         pattern->name = node->name;
       
   599     else if (! AST::match(node->name, pattern->name, this))
       
   600         return false;
       
   601 
       
   602     return true;
       
   603 }
       
   604 
       
   605 bool ASTMatcher::match(NestedDeclaratorAST *node, NestedDeclaratorAST *pattern)
       
   606 {
       
   607     (void) node;
       
   608     (void) pattern;
       
   609 
       
   610     pattern->lparen_token = node->lparen_token;
       
   611 
       
   612     if (! pattern->declarator)
       
   613         pattern->declarator = node->declarator;
       
   614     else if (! AST::match(node->declarator, pattern->declarator, this))
       
   615         return false;
       
   616 
       
   617     pattern->rparen_token = node->rparen_token;
       
   618 
       
   619     return true;
       
   620 }
       
   621 
       
   622 bool ASTMatcher::match(FunctionDeclaratorAST *node, FunctionDeclaratorAST *pattern)
       
   623 {
       
   624     (void) node;
       
   625     (void) pattern;
       
   626 
       
   627     pattern->lparen_token = node->lparen_token;
       
   628 
       
   629     if (! pattern->parameters)
       
   630         pattern->parameters = node->parameters;
       
   631     else if (! AST::match(node->parameters, pattern->parameters, this))
       
   632         return false;
       
   633 
       
   634     pattern->rparen_token = node->rparen_token;
       
   635 
       
   636     if (! pattern->cv_qualifier_list)
       
   637         pattern->cv_qualifier_list = node->cv_qualifier_list;
       
   638     else if (! AST::match(node->cv_qualifier_list, pattern->cv_qualifier_list, this))
       
   639         return false;
       
   640 
       
   641     if (! pattern->exception_specification)
       
   642         pattern->exception_specification = node->exception_specification;
       
   643     else if (! AST::match(node->exception_specification, pattern->exception_specification, this))
       
   644         return false;
       
   645 
       
   646     if (! pattern->as_cpp_initializer)
       
   647         pattern->as_cpp_initializer = node->as_cpp_initializer;
       
   648     else if (! AST::match(node->as_cpp_initializer, pattern->as_cpp_initializer, this))
       
   649         return false;
       
   650 
       
   651     return true;
       
   652 }
       
   653 
       
   654 bool ASTMatcher::match(ArrayDeclaratorAST *node, ArrayDeclaratorAST *pattern)
       
   655 {
       
   656     (void) node;
       
   657     (void) pattern;
       
   658 
       
   659     pattern->lbracket_token = node->lbracket_token;
       
   660 
       
   661     if (! pattern->expression)
       
   662         pattern->expression = node->expression;
       
   663     else if (! AST::match(node->expression, pattern->expression, this))
       
   664         return false;
       
   665 
       
   666     pattern->rbracket_token = node->rbracket_token;
       
   667 
       
   668     return true;
       
   669 }
       
   670 
       
   671 bool ASTMatcher::match(DeleteExpressionAST *node, DeleteExpressionAST *pattern)
       
   672 {
       
   673     (void) node;
       
   674     (void) pattern;
       
   675 
       
   676     pattern->scope_token = node->scope_token;
       
   677 
       
   678     pattern->delete_token = node->delete_token;
       
   679 
       
   680     pattern->lbracket_token = node->lbracket_token;
       
   681 
       
   682     pattern->rbracket_token = node->rbracket_token;
       
   683 
       
   684     if (! pattern->expression)
       
   685         pattern->expression = node->expression;
       
   686     else if (! AST::match(node->expression, pattern->expression, this))
       
   687         return false;
       
   688 
       
   689     return true;
       
   690 }
       
   691 
       
   692 bool ASTMatcher::match(DoStatementAST *node, DoStatementAST *pattern)
       
   693 {
       
   694     (void) node;
       
   695     (void) pattern;
       
   696 
       
   697     pattern->do_token = node->do_token;
       
   698 
       
   699     if (! pattern->statement)
       
   700         pattern->statement = node->statement;
       
   701     else if (! AST::match(node->statement, pattern->statement, this))
       
   702         return false;
       
   703 
       
   704     pattern->while_token = node->while_token;
       
   705 
       
   706     pattern->lparen_token = node->lparen_token;
       
   707 
       
   708     if (! pattern->expression)
       
   709         pattern->expression = node->expression;
       
   710     else if (! AST::match(node->expression, pattern->expression, this))
       
   711         return false;
       
   712 
       
   713     pattern->rparen_token = node->rparen_token;
       
   714 
       
   715     pattern->semicolon_token = node->semicolon_token;
       
   716 
       
   717     return true;
       
   718 }
       
   719 
       
   720 bool ASTMatcher::match(NamedTypeSpecifierAST *node, NamedTypeSpecifierAST *pattern)
       
   721 {
       
   722     (void) node;
       
   723     (void) pattern;
       
   724 
       
   725     if (! pattern->name)
       
   726         pattern->name = node->name;
       
   727     else if (! AST::match(node->name, pattern->name, this))
       
   728         return false;
       
   729 
       
   730     return true;
       
   731 }
       
   732 
       
   733 bool ASTMatcher::match(ElaboratedTypeSpecifierAST *node, ElaboratedTypeSpecifierAST *pattern)
       
   734 {
       
   735     (void) node;
       
   736     (void) pattern;
       
   737 
       
   738     pattern->classkey_token = node->classkey_token;
       
   739 
       
   740     if (! pattern->name)
       
   741         pattern->name = node->name;
       
   742     else if (! AST::match(node->name, pattern->name, this))
       
   743         return false;
       
   744 
       
   745     return true;
       
   746 }
       
   747 
       
   748 bool ASTMatcher::match(EnumSpecifierAST *node, EnumSpecifierAST *pattern)
       
   749 {
       
   750     (void) node;
       
   751     (void) pattern;
       
   752 
       
   753     pattern->enum_token = node->enum_token;
       
   754 
       
   755     if (! pattern->name)
       
   756         pattern->name = node->name;
       
   757     else if (! AST::match(node->name, pattern->name, this))
       
   758         return false;
       
   759 
       
   760     pattern->lbrace_token = node->lbrace_token;
       
   761 
       
   762     if (! pattern->enumerator_list)
       
   763         pattern->enumerator_list = node->enumerator_list;
       
   764     else if (! AST::match(node->enumerator_list, pattern->enumerator_list, this))
       
   765         return false;
       
   766 
       
   767     pattern->rbrace_token = node->rbrace_token;
       
   768 
       
   769     return true;
       
   770 }
       
   771 
       
   772 bool ASTMatcher::match(EnumeratorAST *node, EnumeratorAST *pattern)
       
   773 {
       
   774     (void) node;
       
   775     (void) pattern;
       
   776 
       
   777     pattern->identifier_token = node->identifier_token;
       
   778 
       
   779     pattern->equal_token = node->equal_token;
       
   780 
       
   781     if (! pattern->expression)
       
   782         pattern->expression = node->expression;
       
   783     else if (! AST::match(node->expression, pattern->expression, this))
       
   784         return false;
       
   785 
       
   786     return true;
       
   787 }
       
   788 
       
   789 bool ASTMatcher::match(ExceptionDeclarationAST *node, ExceptionDeclarationAST *pattern)
       
   790 {
       
   791     (void) node;
       
   792     (void) pattern;
       
   793 
       
   794     if (! pattern->type_specifier_list)
       
   795         pattern->type_specifier_list = node->type_specifier_list;
       
   796     else if (! AST::match(node->type_specifier_list, pattern->type_specifier_list, this))
       
   797         return false;
       
   798 
       
   799     if (! pattern->declarator)
       
   800         pattern->declarator = node->declarator;
       
   801     else if (! AST::match(node->declarator, pattern->declarator, this))
       
   802         return false;
       
   803 
       
   804     pattern->dot_dot_dot_token = node->dot_dot_dot_token;
       
   805 
       
   806     return true;
       
   807 }
       
   808 
       
   809 bool ASTMatcher::match(ExceptionSpecificationAST *node, ExceptionSpecificationAST *pattern)
       
   810 {
       
   811     (void) node;
       
   812     (void) pattern;
       
   813 
       
   814     pattern->throw_token = node->throw_token;
       
   815 
       
   816     pattern->lparen_token = node->lparen_token;
       
   817 
       
   818     pattern->dot_dot_dot_token = node->dot_dot_dot_token;
       
   819 
       
   820     if (! pattern->type_id_list)
       
   821         pattern->type_id_list = node->type_id_list;
       
   822     else if (! AST::match(node->type_id_list, pattern->type_id_list, this))
       
   823         return false;
       
   824 
       
   825     pattern->rparen_token = node->rparen_token;
       
   826 
       
   827     return true;
       
   828 }
       
   829 
       
   830 bool ASTMatcher::match(ExpressionOrDeclarationStatementAST *node, ExpressionOrDeclarationStatementAST *pattern)
       
   831 {
       
   832     (void) node;
       
   833     (void) pattern;
       
   834 
       
   835     if (! pattern->expression)
       
   836         pattern->expression = node->expression;
       
   837     else if (! AST::match(node->expression, pattern->expression, this))
       
   838         return false;
       
   839 
       
   840     if (! pattern->declaration)
       
   841         pattern->declaration = node->declaration;
       
   842     else if (! AST::match(node->declaration, pattern->declaration, this))
       
   843         return false;
       
   844 
       
   845     return true;
       
   846 }
       
   847 
       
   848 bool ASTMatcher::match(ExpressionStatementAST *node, ExpressionStatementAST *pattern)
       
   849 {
       
   850     (void) node;
       
   851     (void) pattern;
       
   852 
       
   853     if (! pattern->expression)
       
   854         pattern->expression = node->expression;
       
   855     else if (! AST::match(node->expression, pattern->expression, this))
       
   856         return false;
       
   857 
       
   858     pattern->semicolon_token = node->semicolon_token;
       
   859 
       
   860     return true;
       
   861 }
       
   862 
       
   863 bool ASTMatcher::match(FunctionDefinitionAST *node, FunctionDefinitionAST *pattern)
       
   864 {
       
   865     (void) node;
       
   866     (void) pattern;
       
   867 
       
   868     pattern->qt_invokable_token = node->qt_invokable_token;
       
   869 
       
   870     if (! pattern->decl_specifier_list)
       
   871         pattern->decl_specifier_list = node->decl_specifier_list;
       
   872     else if (! AST::match(node->decl_specifier_list, pattern->decl_specifier_list, this))
       
   873         return false;
       
   874 
       
   875     if (! pattern->declarator)
       
   876         pattern->declarator = node->declarator;
       
   877     else if (! AST::match(node->declarator, pattern->declarator, this))
       
   878         return false;
       
   879 
       
   880     if (! pattern->ctor_initializer)
       
   881         pattern->ctor_initializer = node->ctor_initializer;
       
   882     else if (! AST::match(node->ctor_initializer, pattern->ctor_initializer, this))
       
   883         return false;
       
   884 
       
   885     if (! pattern->function_body)
       
   886         pattern->function_body = node->function_body;
       
   887     else if (! AST::match(node->function_body, pattern->function_body, this))
       
   888         return false;
       
   889 
       
   890     return true;
       
   891 }
       
   892 
       
   893 bool ASTMatcher::match(ForeachStatementAST *node, ForeachStatementAST *pattern)
       
   894 {
       
   895     (void) node;
       
   896     (void) pattern;
       
   897 
       
   898     pattern->foreach_token = node->foreach_token;
       
   899 
       
   900     pattern->lparen_token = node->lparen_token;
       
   901 
       
   902     if (! pattern->type_specifier_list)
       
   903         pattern->type_specifier_list = node->type_specifier_list;
       
   904     else if (! AST::match(node->type_specifier_list, pattern->type_specifier_list, this))
       
   905         return false;
       
   906 
       
   907     if (! pattern->declarator)
       
   908         pattern->declarator = node->declarator;
       
   909     else if (! AST::match(node->declarator, pattern->declarator, this))
       
   910         return false;
       
   911 
       
   912     if (! pattern->initializer)
       
   913         pattern->initializer = node->initializer;
       
   914     else if (! AST::match(node->initializer, pattern->initializer, this))
       
   915         return false;
       
   916 
       
   917     pattern->comma_token = node->comma_token;
       
   918 
       
   919     if (! pattern->expression)
       
   920         pattern->expression = node->expression;
       
   921     else if (! AST::match(node->expression, pattern->expression, this))
       
   922         return false;
       
   923 
       
   924     pattern->rparen_token = node->rparen_token;
       
   925 
       
   926     if (! pattern->statement)
       
   927         pattern->statement = node->statement;
       
   928     else if (! AST::match(node->statement, pattern->statement, this))
       
   929         return false;
       
   930 
       
   931     return true;
       
   932 }
       
   933 
       
   934 bool ASTMatcher::match(ForStatementAST *node, ForStatementAST *pattern)
       
   935 {
       
   936     (void) node;
       
   937     (void) pattern;
       
   938 
       
   939     pattern->for_token = node->for_token;
       
   940 
       
   941     pattern->lparen_token = node->lparen_token;
       
   942 
       
   943     if (! pattern->initializer)
       
   944         pattern->initializer = node->initializer;
       
   945     else if (! AST::match(node->initializer, pattern->initializer, this))
       
   946         return false;
       
   947 
       
   948     if (! pattern->condition)
       
   949         pattern->condition = node->condition;
       
   950     else if (! AST::match(node->condition, pattern->condition, this))
       
   951         return false;
       
   952 
       
   953     pattern->semicolon_token = node->semicolon_token;
       
   954 
       
   955     if (! pattern->expression)
       
   956         pattern->expression = node->expression;
       
   957     else if (! AST::match(node->expression, pattern->expression, this))
       
   958         return false;
       
   959 
       
   960     pattern->rparen_token = node->rparen_token;
       
   961 
       
   962     if (! pattern->statement)
       
   963         pattern->statement = node->statement;
       
   964     else if (! AST::match(node->statement, pattern->statement, this))
       
   965         return false;
       
   966 
       
   967     return true;
       
   968 }
       
   969 
       
   970 bool ASTMatcher::match(IfStatementAST *node, IfStatementAST *pattern)
       
   971 {
       
   972     (void) node;
       
   973     (void) pattern;
       
   974 
       
   975     pattern->if_token = node->if_token;
       
   976 
       
   977     pattern->lparen_token = node->lparen_token;
       
   978 
       
   979     if (! pattern->condition)
       
   980         pattern->condition = node->condition;
       
   981     else if (! AST::match(node->condition, pattern->condition, this))
       
   982         return false;
       
   983 
       
   984     pattern->rparen_token = node->rparen_token;
       
   985 
       
   986     if (! pattern->statement)
       
   987         pattern->statement = node->statement;
       
   988     else if (! AST::match(node->statement, pattern->statement, this))
       
   989         return false;
       
   990 
       
   991     pattern->else_token = node->else_token;
       
   992 
       
   993     if (! pattern->else_statement)
       
   994         pattern->else_statement = node->else_statement;
       
   995     else if (! AST::match(node->else_statement, pattern->else_statement, this))
       
   996         return false;
       
   997 
       
   998     return true;
       
   999 }
       
  1000 
       
  1001 bool ASTMatcher::match(ArrayInitializerAST *node, ArrayInitializerAST *pattern)
       
  1002 {
       
  1003     (void) node;
       
  1004     (void) pattern;
       
  1005 
       
  1006     pattern->lbrace_token = node->lbrace_token;
       
  1007 
       
  1008     if (! pattern->expression_list)
       
  1009         pattern->expression_list = node->expression_list;
       
  1010     else if (! AST::match(node->expression_list, pattern->expression_list, this))
       
  1011         return false;
       
  1012 
       
  1013     pattern->rbrace_token = node->rbrace_token;
       
  1014 
       
  1015     return true;
       
  1016 }
       
  1017 
       
  1018 bool ASTMatcher::match(LabeledStatementAST *node, LabeledStatementAST *pattern)
       
  1019 {
       
  1020     (void) node;
       
  1021     (void) pattern;
       
  1022 
       
  1023     pattern->label_token = node->label_token;
       
  1024 
       
  1025     pattern->colon_token = node->colon_token;
       
  1026 
       
  1027     if (! pattern->statement)
       
  1028         pattern->statement = node->statement;
       
  1029     else if (! AST::match(node->statement, pattern->statement, this))
       
  1030         return false;
       
  1031 
       
  1032     return true;
       
  1033 }
       
  1034 
       
  1035 bool ASTMatcher::match(LinkageBodyAST *node, LinkageBodyAST *pattern)
       
  1036 {
       
  1037     (void) node;
       
  1038     (void) pattern;
       
  1039 
       
  1040     pattern->lbrace_token = node->lbrace_token;
       
  1041 
       
  1042     if (! pattern->declaration_list)
       
  1043         pattern->declaration_list = node->declaration_list;
       
  1044     else if (! AST::match(node->declaration_list, pattern->declaration_list, this))
       
  1045         return false;
       
  1046 
       
  1047     pattern->rbrace_token = node->rbrace_token;
       
  1048 
       
  1049     return true;
       
  1050 }
       
  1051 
       
  1052 bool ASTMatcher::match(LinkageSpecificationAST *node, LinkageSpecificationAST *pattern)
       
  1053 {
       
  1054     (void) node;
       
  1055     (void) pattern;
       
  1056 
       
  1057     pattern->extern_token = node->extern_token;
       
  1058 
       
  1059     pattern->extern_type_token = node->extern_type_token;
       
  1060 
       
  1061     if (! pattern->declaration)
       
  1062         pattern->declaration = node->declaration;
       
  1063     else if (! AST::match(node->declaration, pattern->declaration, this))
       
  1064         return false;
       
  1065 
       
  1066     return true;
       
  1067 }
       
  1068 
       
  1069 bool ASTMatcher::match(MemInitializerAST *node, MemInitializerAST *pattern)
       
  1070 {
       
  1071     (void) node;
       
  1072     (void) pattern;
       
  1073 
       
  1074     if (! pattern->name)
       
  1075         pattern->name = node->name;
       
  1076     else if (! AST::match(node->name, pattern->name, this))
       
  1077         return false;
       
  1078 
       
  1079     pattern->lparen_token = node->lparen_token;
       
  1080 
       
  1081     if (! pattern->expression_list)
       
  1082         pattern->expression_list = node->expression_list;
       
  1083     else if (! AST::match(node->expression_list, pattern->expression_list, this))
       
  1084         return false;
       
  1085 
       
  1086     pattern->rparen_token = node->rparen_token;
       
  1087 
       
  1088     return true;
       
  1089 }
       
  1090 
       
  1091 bool ASTMatcher::match(NestedNameSpecifierAST *node, NestedNameSpecifierAST *pattern)
       
  1092 {
       
  1093     (void) node;
       
  1094     (void) pattern;
       
  1095 
       
  1096     if (! pattern->class_or_namespace_name)
       
  1097         pattern->class_or_namespace_name = node->class_or_namespace_name;
       
  1098     else if (! AST::match(node->class_or_namespace_name, pattern->class_or_namespace_name, this))
       
  1099         return false;
       
  1100 
       
  1101     pattern->scope_token = node->scope_token;
       
  1102 
       
  1103     return true;
       
  1104 }
       
  1105 
       
  1106 bool ASTMatcher::match(QualifiedNameAST *node, QualifiedNameAST *pattern)
       
  1107 {
       
  1108     (void) node;
       
  1109     (void) pattern;
       
  1110 
       
  1111     pattern->global_scope_token = node->global_scope_token;
       
  1112 
       
  1113     if (! pattern->nested_name_specifier_list)
       
  1114         pattern->nested_name_specifier_list = node->nested_name_specifier_list;
       
  1115     else if (! AST::match(node->nested_name_specifier_list, pattern->nested_name_specifier_list, this))
       
  1116         return false;
       
  1117 
       
  1118     if (! pattern->unqualified_name)
       
  1119         pattern->unqualified_name = node->unqualified_name;
       
  1120     else if (! AST::match(node->unqualified_name, pattern->unqualified_name, this))
       
  1121         return false;
       
  1122 
       
  1123     return true;
       
  1124 }
       
  1125 
       
  1126 bool ASTMatcher::match(OperatorFunctionIdAST *node, OperatorFunctionIdAST *pattern)
       
  1127 {
       
  1128     (void) node;
       
  1129     (void) pattern;
       
  1130 
       
  1131     pattern->operator_token = node->operator_token;
       
  1132 
       
  1133     if (! pattern->op)
       
  1134         pattern->op = node->op;
       
  1135     else if (! AST::match(node->op, pattern->op, this))
       
  1136         return false;
       
  1137 
       
  1138     return true;
       
  1139 }
       
  1140 
       
  1141 bool ASTMatcher::match(ConversionFunctionIdAST *node, ConversionFunctionIdAST *pattern)
       
  1142 {
       
  1143     (void) node;
       
  1144     (void) pattern;
       
  1145 
       
  1146     pattern->operator_token = node->operator_token;
       
  1147 
       
  1148     if (! pattern->type_specifier_list)
       
  1149         pattern->type_specifier_list = node->type_specifier_list;
       
  1150     else if (! AST::match(node->type_specifier_list, pattern->type_specifier_list, this))
       
  1151         return false;
       
  1152 
       
  1153     if (! pattern->ptr_operator_list)
       
  1154         pattern->ptr_operator_list = node->ptr_operator_list;
       
  1155     else if (! AST::match(node->ptr_operator_list, pattern->ptr_operator_list, this))
       
  1156         return false;
       
  1157 
       
  1158     return true;
       
  1159 }
       
  1160 
       
  1161 bool ASTMatcher::match(SimpleNameAST *node, SimpleNameAST *pattern)
       
  1162 {
       
  1163     (void) node;
       
  1164     (void) pattern;
       
  1165 
       
  1166     pattern->identifier_token = node->identifier_token;
       
  1167 
       
  1168     return true;
       
  1169 }
       
  1170 
       
  1171 bool ASTMatcher::match(DestructorNameAST *node, DestructorNameAST *pattern)
       
  1172 {
       
  1173     (void) node;
       
  1174     (void) pattern;
       
  1175 
       
  1176     pattern->tilde_token = node->tilde_token;
       
  1177 
       
  1178     pattern->identifier_token = node->identifier_token;
       
  1179 
       
  1180     return true;
       
  1181 }
       
  1182 
       
  1183 bool ASTMatcher::match(TemplateIdAST *node, TemplateIdAST *pattern)
       
  1184 {
       
  1185     (void) node;
       
  1186     (void) pattern;
       
  1187 
       
  1188     pattern->identifier_token = node->identifier_token;
       
  1189 
       
  1190     pattern->less_token = node->less_token;
       
  1191 
       
  1192     if (! pattern->template_argument_list)
       
  1193         pattern->template_argument_list = node->template_argument_list;
       
  1194     else if (! AST::match(node->template_argument_list, pattern->template_argument_list, this))
       
  1195         return false;
       
  1196 
       
  1197     pattern->greater_token = node->greater_token;
       
  1198 
       
  1199     return true;
       
  1200 }
       
  1201 
       
  1202 bool ASTMatcher::match(NamespaceAST *node, NamespaceAST *pattern)
       
  1203 {
       
  1204     (void) node;
       
  1205     (void) pattern;
       
  1206 
       
  1207     pattern->namespace_token = node->namespace_token;
       
  1208 
       
  1209     pattern->identifier_token = node->identifier_token;
       
  1210 
       
  1211     if (! pattern->attribute_list)
       
  1212         pattern->attribute_list = node->attribute_list;
       
  1213     else if (! AST::match(node->attribute_list, pattern->attribute_list, this))
       
  1214         return false;
       
  1215 
       
  1216     if (! pattern->linkage_body)
       
  1217         pattern->linkage_body = node->linkage_body;
       
  1218     else if (! AST::match(node->linkage_body, pattern->linkage_body, this))
       
  1219         return false;
       
  1220 
       
  1221     return true;
       
  1222 }
       
  1223 
       
  1224 bool ASTMatcher::match(NamespaceAliasDefinitionAST *node, NamespaceAliasDefinitionAST *pattern)
       
  1225 {
       
  1226     (void) node;
       
  1227     (void) pattern;
       
  1228 
       
  1229     pattern->namespace_token = node->namespace_token;
       
  1230 
       
  1231     pattern->namespace_name_token = node->namespace_name_token;
       
  1232 
       
  1233     pattern->equal_token = node->equal_token;
       
  1234 
       
  1235     if (! pattern->name)
       
  1236         pattern->name = node->name;
       
  1237     else if (! AST::match(node->name, pattern->name, this))
       
  1238         return false;
       
  1239 
       
  1240     pattern->semicolon_token = node->semicolon_token;
       
  1241 
       
  1242     return true;
       
  1243 }
       
  1244 
       
  1245 bool ASTMatcher::match(NewPlacementAST *node, NewPlacementAST *pattern)
       
  1246 {
       
  1247     (void) node;
       
  1248     (void) pattern;
       
  1249 
       
  1250     pattern->lparen_token = node->lparen_token;
       
  1251 
       
  1252     if (! pattern->expression_list)
       
  1253         pattern->expression_list = node->expression_list;
       
  1254     else if (! AST::match(node->expression_list, pattern->expression_list, this))
       
  1255         return false;
       
  1256 
       
  1257     pattern->rparen_token = node->rparen_token;
       
  1258 
       
  1259     return true;
       
  1260 }
       
  1261 
       
  1262 bool ASTMatcher::match(NewArrayDeclaratorAST *node, NewArrayDeclaratorAST *pattern)
       
  1263 {
       
  1264     (void) node;
       
  1265     (void) pattern;
       
  1266 
       
  1267     pattern->lbracket_token = node->lbracket_token;
       
  1268 
       
  1269     if (! pattern->expression)
       
  1270         pattern->expression = node->expression;
       
  1271     else if (! AST::match(node->expression, pattern->expression, this))
       
  1272         return false;
       
  1273 
       
  1274     pattern->rbracket_token = node->rbracket_token;
       
  1275 
       
  1276     return true;
       
  1277 }
       
  1278 
       
  1279 bool ASTMatcher::match(NewExpressionAST *node, NewExpressionAST *pattern)
       
  1280 {
       
  1281     (void) node;
       
  1282     (void) pattern;
       
  1283 
       
  1284     pattern->scope_token = node->scope_token;
       
  1285 
       
  1286     pattern->new_token = node->new_token;
       
  1287 
       
  1288     if (! pattern->new_placement)
       
  1289         pattern->new_placement = node->new_placement;
       
  1290     else if (! AST::match(node->new_placement, pattern->new_placement, this))
       
  1291         return false;
       
  1292 
       
  1293     pattern->lparen_token = node->lparen_token;
       
  1294 
       
  1295     if (! pattern->type_id)
       
  1296         pattern->type_id = node->type_id;
       
  1297     else if (! AST::match(node->type_id, pattern->type_id, this))
       
  1298         return false;
       
  1299 
       
  1300     pattern->rparen_token = node->rparen_token;
       
  1301 
       
  1302     if (! pattern->new_type_id)
       
  1303         pattern->new_type_id = node->new_type_id;
       
  1304     else if (! AST::match(node->new_type_id, pattern->new_type_id, this))
       
  1305         return false;
       
  1306 
       
  1307     if (! pattern->new_initializer)
       
  1308         pattern->new_initializer = node->new_initializer;
       
  1309     else if (! AST::match(node->new_initializer, pattern->new_initializer, this))
       
  1310         return false;
       
  1311 
       
  1312     return true;
       
  1313 }
       
  1314 
       
  1315 bool ASTMatcher::match(NewInitializerAST *node, NewInitializerAST *pattern)
       
  1316 {
       
  1317     (void) node;
       
  1318     (void) pattern;
       
  1319 
       
  1320     pattern->lparen_token = node->lparen_token;
       
  1321 
       
  1322     if (! pattern->expression)
       
  1323         pattern->expression = node->expression;
       
  1324     else if (! AST::match(node->expression, pattern->expression, this))
       
  1325         return false;
       
  1326 
       
  1327     pattern->rparen_token = node->rparen_token;
       
  1328 
       
  1329     return true;
       
  1330 }
       
  1331 
       
  1332 bool ASTMatcher::match(NewTypeIdAST *node, NewTypeIdAST *pattern)
       
  1333 {
       
  1334     (void) node;
       
  1335     (void) pattern;
       
  1336 
       
  1337     if (! pattern->type_specifier_list)
       
  1338         pattern->type_specifier_list = node->type_specifier_list;
       
  1339     else if (! AST::match(node->type_specifier_list, pattern->type_specifier_list, this))
       
  1340         return false;
       
  1341 
       
  1342     if (! pattern->ptr_operator_list)
       
  1343         pattern->ptr_operator_list = node->ptr_operator_list;
       
  1344     else if (! AST::match(node->ptr_operator_list, pattern->ptr_operator_list, this))
       
  1345         return false;
       
  1346 
       
  1347     if (! pattern->new_array_declarator_list)
       
  1348         pattern->new_array_declarator_list = node->new_array_declarator_list;
       
  1349     else if (! AST::match(node->new_array_declarator_list, pattern->new_array_declarator_list, this))
       
  1350         return false;
       
  1351 
       
  1352     return true;
       
  1353 }
       
  1354 
       
  1355 bool ASTMatcher::match(OperatorAST *node, OperatorAST *pattern)
       
  1356 {
       
  1357     (void) node;
       
  1358     (void) pattern;
       
  1359 
       
  1360     pattern->op_token = node->op_token;
       
  1361 
       
  1362     pattern->open_token = node->open_token;
       
  1363 
       
  1364     pattern->close_token = node->close_token;
       
  1365 
       
  1366     return true;
       
  1367 }
       
  1368 
       
  1369 bool ASTMatcher::match(ParameterDeclarationAST *node, ParameterDeclarationAST *pattern)
       
  1370 {
       
  1371     (void) node;
       
  1372     (void) pattern;
       
  1373 
       
  1374     if (! pattern->type_specifier_list)
       
  1375         pattern->type_specifier_list = node->type_specifier_list;
       
  1376     else if (! AST::match(node->type_specifier_list, pattern->type_specifier_list, this))
       
  1377         return false;
       
  1378 
       
  1379     if (! pattern->declarator)
       
  1380         pattern->declarator = node->declarator;
       
  1381     else if (! AST::match(node->declarator, pattern->declarator, this))
       
  1382         return false;
       
  1383 
       
  1384     pattern->equal_token = node->equal_token;
       
  1385 
       
  1386     if (! pattern->expression)
       
  1387         pattern->expression = node->expression;
       
  1388     else if (! AST::match(node->expression, pattern->expression, this))
       
  1389         return false;
       
  1390 
       
  1391     return true;
       
  1392 }
       
  1393 
       
  1394 bool ASTMatcher::match(ParameterDeclarationClauseAST *node, ParameterDeclarationClauseAST *pattern)
       
  1395 {
       
  1396     (void) node;
       
  1397     (void) pattern;
       
  1398 
       
  1399     if (! pattern->parameter_declaration_list)
       
  1400         pattern->parameter_declaration_list = node->parameter_declaration_list;
       
  1401     else if (! AST::match(node->parameter_declaration_list, pattern->parameter_declaration_list, this))
       
  1402         return false;
       
  1403 
       
  1404     pattern->dot_dot_dot_token = node->dot_dot_dot_token;
       
  1405 
       
  1406     return true;
       
  1407 }
       
  1408 
       
  1409 bool ASTMatcher::match(CallAST *node, CallAST *pattern)
       
  1410 {
       
  1411     (void) node;
       
  1412     (void) pattern;
       
  1413 
       
  1414     pattern->lparen_token = node->lparen_token;
       
  1415 
       
  1416     if (! pattern->expression_list)
       
  1417         pattern->expression_list = node->expression_list;
       
  1418     else if (! AST::match(node->expression_list, pattern->expression_list, this))
       
  1419         return false;
       
  1420 
       
  1421     pattern->rparen_token = node->rparen_token;
       
  1422 
       
  1423     return true;
       
  1424 }
       
  1425 
       
  1426 bool ASTMatcher::match(ArrayAccessAST *node, ArrayAccessAST *pattern)
       
  1427 {
       
  1428     (void) node;
       
  1429     (void) pattern;
       
  1430 
       
  1431     pattern->lbracket_token = node->lbracket_token;
       
  1432 
       
  1433     if (! pattern->expression)
       
  1434         pattern->expression = node->expression;
       
  1435     else if (! AST::match(node->expression, pattern->expression, this))
       
  1436         return false;
       
  1437 
       
  1438     pattern->rbracket_token = node->rbracket_token;
       
  1439 
       
  1440     return true;
       
  1441 }
       
  1442 
       
  1443 bool ASTMatcher::match(PostIncrDecrAST *node, PostIncrDecrAST *pattern)
       
  1444 {
       
  1445     (void) node;
       
  1446     (void) pattern;
       
  1447 
       
  1448     pattern->incr_decr_token = node->incr_decr_token;
       
  1449 
       
  1450     return true;
       
  1451 }
       
  1452 
       
  1453 bool ASTMatcher::match(MemberAccessAST *node, MemberAccessAST *pattern)
       
  1454 {
       
  1455     (void) node;
       
  1456     (void) pattern;
       
  1457 
       
  1458     pattern->access_token = node->access_token;
       
  1459 
       
  1460     pattern->template_token = node->template_token;
       
  1461 
       
  1462     if (! pattern->member_name)
       
  1463         pattern->member_name = node->member_name;
       
  1464     else if (! AST::match(node->member_name, pattern->member_name, this))
       
  1465         return false;
       
  1466 
       
  1467     return true;
       
  1468 }
       
  1469 
       
  1470 bool ASTMatcher::match(TypeidExpressionAST *node, TypeidExpressionAST *pattern)
       
  1471 {
       
  1472     (void) node;
       
  1473     (void) pattern;
       
  1474 
       
  1475     pattern->typeid_token = node->typeid_token;
       
  1476 
       
  1477     pattern->lparen_token = node->lparen_token;
       
  1478 
       
  1479     if (! pattern->expression)
       
  1480         pattern->expression = node->expression;
       
  1481     else if (! AST::match(node->expression, pattern->expression, this))
       
  1482         return false;
       
  1483 
       
  1484     pattern->rparen_token = node->rparen_token;
       
  1485 
       
  1486     return true;
       
  1487 }
       
  1488 
       
  1489 bool ASTMatcher::match(TypenameCallExpressionAST *node, TypenameCallExpressionAST *pattern)
       
  1490 {
       
  1491     (void) node;
       
  1492     (void) pattern;
       
  1493 
       
  1494     pattern->typename_token = node->typename_token;
       
  1495 
       
  1496     if (! pattern->name)
       
  1497         pattern->name = node->name;
       
  1498     else if (! AST::match(node->name, pattern->name, this))
       
  1499         return false;
       
  1500 
       
  1501     pattern->lparen_token = node->lparen_token;
       
  1502 
       
  1503     if (! pattern->expression_list)
       
  1504         pattern->expression_list = node->expression_list;
       
  1505     else if (! AST::match(node->expression_list, pattern->expression_list, this))
       
  1506         return false;
       
  1507 
       
  1508     pattern->rparen_token = node->rparen_token;
       
  1509 
       
  1510     return true;
       
  1511 }
       
  1512 
       
  1513 bool ASTMatcher::match(TypeConstructorCallAST *node, TypeConstructorCallAST *pattern)
       
  1514 {
       
  1515     (void) node;
       
  1516     (void) pattern;
       
  1517 
       
  1518     if (! pattern->type_specifier_list)
       
  1519         pattern->type_specifier_list = node->type_specifier_list;
       
  1520     else if (! AST::match(node->type_specifier_list, pattern->type_specifier_list, this))
       
  1521         return false;
       
  1522 
       
  1523     pattern->lparen_token = node->lparen_token;
       
  1524 
       
  1525     if (! pattern->expression_list)
       
  1526         pattern->expression_list = node->expression_list;
       
  1527     else if (! AST::match(node->expression_list, pattern->expression_list, this))
       
  1528         return false;
       
  1529 
       
  1530     pattern->rparen_token = node->rparen_token;
       
  1531 
       
  1532     return true;
       
  1533 }
       
  1534 
       
  1535 bool ASTMatcher::match(PostfixExpressionAST *node, PostfixExpressionAST *pattern)
       
  1536 {
       
  1537     (void) node;
       
  1538     (void) pattern;
       
  1539 
       
  1540     if (! pattern->base_expression)
       
  1541         pattern->base_expression = node->base_expression;
       
  1542     else if (! AST::match(node->base_expression, pattern->base_expression, this))
       
  1543         return false;
       
  1544 
       
  1545     if (! pattern->postfix_expression_list)
       
  1546         pattern->postfix_expression_list = node->postfix_expression_list;
       
  1547     else if (! AST::match(node->postfix_expression_list, pattern->postfix_expression_list, this))
       
  1548         return false;
       
  1549 
       
  1550     return true;
       
  1551 }
       
  1552 
       
  1553 bool ASTMatcher::match(PointerToMemberAST *node, PointerToMemberAST *pattern)
       
  1554 {
       
  1555     (void) node;
       
  1556     (void) pattern;
       
  1557 
       
  1558     pattern->global_scope_token = node->global_scope_token;
       
  1559 
       
  1560     if (! pattern->nested_name_specifier_list)
       
  1561         pattern->nested_name_specifier_list = node->nested_name_specifier_list;
       
  1562     else if (! AST::match(node->nested_name_specifier_list, pattern->nested_name_specifier_list, this))
       
  1563         return false;
       
  1564 
       
  1565     pattern->star_token = node->star_token;
       
  1566 
       
  1567     if (! pattern->cv_qualifier_list)
       
  1568         pattern->cv_qualifier_list = node->cv_qualifier_list;
       
  1569     else if (! AST::match(node->cv_qualifier_list, pattern->cv_qualifier_list, this))
       
  1570         return false;
       
  1571 
       
  1572     return true;
       
  1573 }
       
  1574 
       
  1575 bool ASTMatcher::match(PointerAST *node, PointerAST *pattern)
       
  1576 {
       
  1577     (void) node;
       
  1578     (void) pattern;
       
  1579 
       
  1580     pattern->star_token = node->star_token;
       
  1581 
       
  1582     if (! pattern->cv_qualifier_list)
       
  1583         pattern->cv_qualifier_list = node->cv_qualifier_list;
       
  1584     else if (! AST::match(node->cv_qualifier_list, pattern->cv_qualifier_list, this))
       
  1585         return false;
       
  1586 
       
  1587     return true;
       
  1588 }
       
  1589 
       
  1590 bool ASTMatcher::match(ReferenceAST *node, ReferenceAST *pattern)
       
  1591 {
       
  1592     (void) node;
       
  1593     (void) pattern;
       
  1594 
       
  1595     pattern->amp_token = node->amp_token;
       
  1596 
       
  1597     return true;
       
  1598 }
       
  1599 
       
  1600 bool ASTMatcher::match(BreakStatementAST *node, BreakStatementAST *pattern)
       
  1601 {
       
  1602     (void) node;
       
  1603     (void) pattern;
       
  1604 
       
  1605     pattern->break_token = node->break_token;
       
  1606 
       
  1607     pattern->semicolon_token = node->semicolon_token;
       
  1608 
       
  1609     return true;
       
  1610 }
       
  1611 
       
  1612 bool ASTMatcher::match(ContinueStatementAST *node, ContinueStatementAST *pattern)
       
  1613 {
       
  1614     (void) node;
       
  1615     (void) pattern;
       
  1616 
       
  1617     pattern->continue_token = node->continue_token;
       
  1618 
       
  1619     pattern->semicolon_token = node->semicolon_token;
       
  1620 
       
  1621     return true;
       
  1622 }
       
  1623 
       
  1624 bool ASTMatcher::match(GotoStatementAST *node, GotoStatementAST *pattern)
       
  1625 {
       
  1626     (void) node;
       
  1627     (void) pattern;
       
  1628 
       
  1629     pattern->goto_token = node->goto_token;
       
  1630 
       
  1631     pattern->identifier_token = node->identifier_token;
       
  1632 
       
  1633     pattern->semicolon_token = node->semicolon_token;
       
  1634 
       
  1635     return true;
       
  1636 }
       
  1637 
       
  1638 bool ASTMatcher::match(ReturnStatementAST *node, ReturnStatementAST *pattern)
       
  1639 {
       
  1640     (void) node;
       
  1641     (void) pattern;
       
  1642 
       
  1643     pattern->return_token = node->return_token;
       
  1644 
       
  1645     if (! pattern->expression)
       
  1646         pattern->expression = node->expression;
       
  1647     else if (! AST::match(node->expression, pattern->expression, this))
       
  1648         return false;
       
  1649 
       
  1650     pattern->semicolon_token = node->semicolon_token;
       
  1651 
       
  1652     return true;
       
  1653 }
       
  1654 
       
  1655 bool ASTMatcher::match(SizeofExpressionAST *node, SizeofExpressionAST *pattern)
       
  1656 {
       
  1657     (void) node;
       
  1658     (void) pattern;
       
  1659 
       
  1660     pattern->sizeof_token = node->sizeof_token;
       
  1661 
       
  1662     pattern->lparen_token = node->lparen_token;
       
  1663 
       
  1664     if (! pattern->expression)
       
  1665         pattern->expression = node->expression;
       
  1666     else if (! AST::match(node->expression, pattern->expression, this))
       
  1667         return false;
       
  1668 
       
  1669     pattern->rparen_token = node->rparen_token;
       
  1670 
       
  1671     return true;
       
  1672 }
       
  1673 
       
  1674 bool ASTMatcher::match(NumericLiteralAST *node, NumericLiteralAST *pattern)
       
  1675 {
       
  1676     (void) node;
       
  1677     (void) pattern;
       
  1678 
       
  1679     pattern->literal_token = node->literal_token;
       
  1680 
       
  1681     return true;
       
  1682 }
       
  1683 
       
  1684 bool ASTMatcher::match(BoolLiteralAST *node, BoolLiteralAST *pattern)
       
  1685 {
       
  1686     (void) node;
       
  1687     (void) pattern;
       
  1688 
       
  1689     pattern->literal_token = node->literal_token;
       
  1690 
       
  1691     return true;
       
  1692 }
       
  1693 
       
  1694 bool ASTMatcher::match(ThisExpressionAST *node, ThisExpressionAST *pattern)
       
  1695 {
       
  1696     (void) node;
       
  1697     (void) pattern;
       
  1698 
       
  1699     pattern->this_token = node->this_token;
       
  1700 
       
  1701     return true;
       
  1702 }
       
  1703 
       
  1704 bool ASTMatcher::match(NestedExpressionAST *node, NestedExpressionAST *pattern)
       
  1705 {
       
  1706     (void) node;
       
  1707     (void) pattern;
       
  1708 
       
  1709     pattern->lparen_token = node->lparen_token;
       
  1710 
       
  1711     if (! pattern->expression)
       
  1712         pattern->expression = node->expression;
       
  1713     else if (! AST::match(node->expression, pattern->expression, this))
       
  1714         return false;
       
  1715 
       
  1716     pattern->rparen_token = node->rparen_token;
       
  1717 
       
  1718     return true;
       
  1719 }
       
  1720 
       
  1721 bool ASTMatcher::match(StringLiteralAST *node, StringLiteralAST *pattern)
       
  1722 {
       
  1723     (void) node;
       
  1724     (void) pattern;
       
  1725 
       
  1726     pattern->literal_token = node->literal_token;
       
  1727 
       
  1728     if (! pattern->next)
       
  1729         pattern->next = node->next;
       
  1730     else if (! AST::match(node->next, pattern->next, this))
       
  1731         return false;
       
  1732 
       
  1733     return true;
       
  1734 }
       
  1735 
       
  1736 bool ASTMatcher::match(SwitchStatementAST *node, SwitchStatementAST *pattern)
       
  1737 {
       
  1738     (void) node;
       
  1739     (void) pattern;
       
  1740 
       
  1741     pattern->switch_token = node->switch_token;
       
  1742 
       
  1743     pattern->lparen_token = node->lparen_token;
       
  1744 
       
  1745     if (! pattern->condition)
       
  1746         pattern->condition = node->condition;
       
  1747     else if (! AST::match(node->condition, pattern->condition, this))
       
  1748         return false;
       
  1749 
       
  1750     pattern->rparen_token = node->rparen_token;
       
  1751 
       
  1752     if (! pattern->statement)
       
  1753         pattern->statement = node->statement;
       
  1754     else if (! AST::match(node->statement, pattern->statement, this))
       
  1755         return false;
       
  1756 
       
  1757     return true;
       
  1758 }
       
  1759 
       
  1760 bool ASTMatcher::match(TemplateDeclarationAST *node, TemplateDeclarationAST *pattern)
       
  1761 {
       
  1762     (void) node;
       
  1763     (void) pattern;
       
  1764 
       
  1765     pattern->export_token = node->export_token;
       
  1766 
       
  1767     pattern->template_token = node->template_token;
       
  1768 
       
  1769     pattern->less_token = node->less_token;
       
  1770 
       
  1771     if (! pattern->template_parameter_list)
       
  1772         pattern->template_parameter_list = node->template_parameter_list;
       
  1773     else if (! AST::match(node->template_parameter_list, pattern->template_parameter_list, this))
       
  1774         return false;
       
  1775 
       
  1776     pattern->greater_token = node->greater_token;
       
  1777 
       
  1778     if (! pattern->declaration)
       
  1779         pattern->declaration = node->declaration;
       
  1780     else if (! AST::match(node->declaration, pattern->declaration, this))
       
  1781         return false;
       
  1782 
       
  1783     return true;
       
  1784 }
       
  1785 
       
  1786 bool ASTMatcher::match(ThrowExpressionAST *node, ThrowExpressionAST *pattern)
       
  1787 {
       
  1788     (void) node;
       
  1789     (void) pattern;
       
  1790 
       
  1791     pattern->throw_token = node->throw_token;
       
  1792 
       
  1793     if (! pattern->expression)
       
  1794         pattern->expression = node->expression;
       
  1795     else if (! AST::match(node->expression, pattern->expression, this))
       
  1796         return false;
       
  1797 
       
  1798     return true;
       
  1799 }
       
  1800 
       
  1801 bool ASTMatcher::match(TranslationUnitAST *node, TranslationUnitAST *pattern)
       
  1802 {
       
  1803     (void) node;
       
  1804     (void) pattern;
       
  1805 
       
  1806     if (! pattern->declaration_list)
       
  1807         pattern->declaration_list = node->declaration_list;
       
  1808     else if (! AST::match(node->declaration_list, pattern->declaration_list, this))
       
  1809         return false;
       
  1810 
       
  1811     return true;
       
  1812 }
       
  1813 
       
  1814 bool ASTMatcher::match(TryBlockStatementAST *node, TryBlockStatementAST *pattern)
       
  1815 {
       
  1816     (void) node;
       
  1817     (void) pattern;
       
  1818 
       
  1819     pattern->try_token = node->try_token;
       
  1820 
       
  1821     if (! pattern->statement)
       
  1822         pattern->statement = node->statement;
       
  1823     else if (! AST::match(node->statement, pattern->statement, this))
       
  1824         return false;
       
  1825 
       
  1826     if (! pattern->catch_clause_list)
       
  1827         pattern->catch_clause_list = node->catch_clause_list;
       
  1828     else if (! AST::match(node->catch_clause_list, pattern->catch_clause_list, this))
       
  1829         return false;
       
  1830 
       
  1831     return true;
       
  1832 }
       
  1833 
       
  1834 bool ASTMatcher::match(CatchClauseAST *node, CatchClauseAST *pattern)
       
  1835 {
       
  1836     (void) node;
       
  1837     (void) pattern;
       
  1838 
       
  1839     pattern->catch_token = node->catch_token;
       
  1840 
       
  1841     pattern->lparen_token = node->lparen_token;
       
  1842 
       
  1843     if (! pattern->exception_declaration)
       
  1844         pattern->exception_declaration = node->exception_declaration;
       
  1845     else if (! AST::match(node->exception_declaration, pattern->exception_declaration, this))
       
  1846         return false;
       
  1847 
       
  1848     pattern->rparen_token = node->rparen_token;
       
  1849 
       
  1850     if (! pattern->statement)
       
  1851         pattern->statement = node->statement;
       
  1852     else if (! AST::match(node->statement, pattern->statement, this))
       
  1853         return false;
       
  1854 
       
  1855     return true;
       
  1856 }
       
  1857 
       
  1858 bool ASTMatcher::match(TypeIdAST *node, TypeIdAST *pattern)
       
  1859 {
       
  1860     (void) node;
       
  1861     (void) pattern;
       
  1862 
       
  1863     if (! pattern->type_specifier_list)
       
  1864         pattern->type_specifier_list = node->type_specifier_list;
       
  1865     else if (! AST::match(node->type_specifier_list, pattern->type_specifier_list, this))
       
  1866         return false;
       
  1867 
       
  1868     if (! pattern->declarator)
       
  1869         pattern->declarator = node->declarator;
       
  1870     else if (! AST::match(node->declarator, pattern->declarator, this))
       
  1871         return false;
       
  1872 
       
  1873     return true;
       
  1874 }
       
  1875 
       
  1876 bool ASTMatcher::match(TypenameTypeParameterAST *node, TypenameTypeParameterAST *pattern)
       
  1877 {
       
  1878     (void) node;
       
  1879     (void) pattern;
       
  1880 
       
  1881     pattern->classkey_token = node->classkey_token;
       
  1882 
       
  1883     if (! pattern->name)
       
  1884         pattern->name = node->name;
       
  1885     else if (! AST::match(node->name, pattern->name, this))
       
  1886         return false;
       
  1887 
       
  1888     pattern->equal_token = node->equal_token;
       
  1889 
       
  1890     if (! pattern->type_id)
       
  1891         pattern->type_id = node->type_id;
       
  1892     else if (! AST::match(node->type_id, pattern->type_id, this))
       
  1893         return false;
       
  1894 
       
  1895     return true;
       
  1896 }
       
  1897 
       
  1898 bool ASTMatcher::match(TemplateTypeParameterAST *node, TemplateTypeParameterAST *pattern)
       
  1899 {
       
  1900     (void) node;
       
  1901     (void) pattern;
       
  1902 
       
  1903     pattern->template_token = node->template_token;
       
  1904 
       
  1905     pattern->less_token = node->less_token;
       
  1906 
       
  1907     if (! pattern->template_parameter_list)
       
  1908         pattern->template_parameter_list = node->template_parameter_list;
       
  1909     else if (! AST::match(node->template_parameter_list, pattern->template_parameter_list, this))
       
  1910         return false;
       
  1911 
       
  1912     pattern->greater_token = node->greater_token;
       
  1913 
       
  1914     pattern->class_token = node->class_token;
       
  1915 
       
  1916     if (! pattern->name)
       
  1917         pattern->name = node->name;
       
  1918     else if (! AST::match(node->name, pattern->name, this))
       
  1919         return false;
       
  1920 
       
  1921     pattern->equal_token = node->equal_token;
       
  1922 
       
  1923     if (! pattern->type_id)
       
  1924         pattern->type_id = node->type_id;
       
  1925     else if (! AST::match(node->type_id, pattern->type_id, this))
       
  1926         return false;
       
  1927 
       
  1928     return true;
       
  1929 }
       
  1930 
       
  1931 bool ASTMatcher::match(UnaryExpressionAST *node, UnaryExpressionAST *pattern)
       
  1932 {
       
  1933     (void) node;
       
  1934     (void) pattern;
       
  1935 
       
  1936     pattern->unary_op_token = node->unary_op_token;
       
  1937 
       
  1938     if (! pattern->expression)
       
  1939         pattern->expression = node->expression;
       
  1940     else if (! AST::match(node->expression, pattern->expression, this))
       
  1941         return false;
       
  1942 
       
  1943     return true;
       
  1944 }
       
  1945 
       
  1946 bool ASTMatcher::match(UsingAST *node, UsingAST *pattern)
       
  1947 {
       
  1948     (void) node;
       
  1949     (void) pattern;
       
  1950 
       
  1951     pattern->using_token = node->using_token;
       
  1952 
       
  1953     pattern->typename_token = node->typename_token;
       
  1954 
       
  1955     if (! pattern->name)
       
  1956         pattern->name = node->name;
       
  1957     else if (! AST::match(node->name, pattern->name, this))
       
  1958         return false;
       
  1959 
       
  1960     pattern->semicolon_token = node->semicolon_token;
       
  1961 
       
  1962     return true;
       
  1963 }
       
  1964 
       
  1965 bool ASTMatcher::match(UsingDirectiveAST *node, UsingDirectiveAST *pattern)
       
  1966 {
       
  1967     (void) node;
       
  1968     (void) pattern;
       
  1969 
       
  1970     pattern->using_token = node->using_token;
       
  1971 
       
  1972     pattern->namespace_token = node->namespace_token;
       
  1973 
       
  1974     if (! pattern->name)
       
  1975         pattern->name = node->name;
       
  1976     else if (! AST::match(node->name, pattern->name, this))
       
  1977         return false;
       
  1978 
       
  1979     pattern->semicolon_token = node->semicolon_token;
       
  1980 
       
  1981     return true;
       
  1982 }
       
  1983 
       
  1984 bool ASTMatcher::match(WhileStatementAST *node, WhileStatementAST *pattern)
       
  1985 {
       
  1986     (void) node;
       
  1987     (void) pattern;
       
  1988 
       
  1989     pattern->while_token = node->while_token;
       
  1990 
       
  1991     pattern->lparen_token = node->lparen_token;
       
  1992 
       
  1993     if (! pattern->condition)
       
  1994         pattern->condition = node->condition;
       
  1995     else if (! AST::match(node->condition, pattern->condition, this))
       
  1996         return false;
       
  1997 
       
  1998     pattern->rparen_token = node->rparen_token;
       
  1999 
       
  2000     if (! pattern->statement)
       
  2001         pattern->statement = node->statement;
       
  2002     else if (! AST::match(node->statement, pattern->statement, this))
       
  2003         return false;
       
  2004 
       
  2005     return true;
       
  2006 }
       
  2007 
       
  2008 bool ASTMatcher::match(ObjCClassForwardDeclarationAST *node, ObjCClassForwardDeclarationAST *pattern)
       
  2009 {
       
  2010     (void) node;
       
  2011     (void) pattern;
       
  2012 
       
  2013     if (! pattern->attribute_list)
       
  2014         pattern->attribute_list = node->attribute_list;
       
  2015     else if (! AST::match(node->attribute_list, pattern->attribute_list, this))
       
  2016         return false;
       
  2017 
       
  2018     pattern->class_token = node->class_token;
       
  2019 
       
  2020     if (! pattern->identifier_list)
       
  2021         pattern->identifier_list = node->identifier_list;
       
  2022     else if (! AST::match(node->identifier_list, pattern->identifier_list, this))
       
  2023         return false;
       
  2024 
       
  2025     pattern->semicolon_token = node->semicolon_token;
       
  2026 
       
  2027     return true;
       
  2028 }
       
  2029 
       
  2030 bool ASTMatcher::match(ObjCClassDeclarationAST *node, ObjCClassDeclarationAST *pattern)
       
  2031 {
       
  2032     (void) node;
       
  2033     (void) pattern;
       
  2034 
       
  2035     if (! pattern->attribute_list)
       
  2036         pattern->attribute_list = node->attribute_list;
       
  2037     else if (! AST::match(node->attribute_list, pattern->attribute_list, this))
       
  2038         return false;
       
  2039 
       
  2040     pattern->interface_token = node->interface_token;
       
  2041 
       
  2042     pattern->implementation_token = node->implementation_token;
       
  2043 
       
  2044     if (! pattern->class_name)
       
  2045         pattern->class_name = node->class_name;
       
  2046     else if (! AST::match(node->class_name, pattern->class_name, this))
       
  2047         return false;
       
  2048 
       
  2049     pattern->lparen_token = node->lparen_token;
       
  2050 
       
  2051     if (! pattern->category_name)
       
  2052         pattern->category_name = node->category_name;
       
  2053     else if (! AST::match(node->category_name, pattern->category_name, this))
       
  2054         return false;
       
  2055 
       
  2056     pattern->rparen_token = node->rparen_token;
       
  2057 
       
  2058     pattern->colon_token = node->colon_token;
       
  2059 
       
  2060     if (! pattern->superclass)
       
  2061         pattern->superclass = node->superclass;
       
  2062     else if (! AST::match(node->superclass, pattern->superclass, this))
       
  2063         return false;
       
  2064 
       
  2065     if (! pattern->protocol_refs)
       
  2066         pattern->protocol_refs = node->protocol_refs;
       
  2067     else if (! AST::match(node->protocol_refs, pattern->protocol_refs, this))
       
  2068         return false;
       
  2069 
       
  2070     if (! pattern->inst_vars_decl)
       
  2071         pattern->inst_vars_decl = node->inst_vars_decl;
       
  2072     else if (! AST::match(node->inst_vars_decl, pattern->inst_vars_decl, this))
       
  2073         return false;
       
  2074 
       
  2075     if (! pattern->member_declaration_list)
       
  2076         pattern->member_declaration_list = node->member_declaration_list;
       
  2077     else if (! AST::match(node->member_declaration_list, pattern->member_declaration_list, this))
       
  2078         return false;
       
  2079 
       
  2080     pattern->end_token = node->end_token;
       
  2081 
       
  2082     return true;
       
  2083 }
       
  2084 
       
  2085 bool ASTMatcher::match(ObjCProtocolForwardDeclarationAST *node, ObjCProtocolForwardDeclarationAST *pattern)
       
  2086 {
       
  2087     (void) node;
       
  2088     (void) pattern;
       
  2089 
       
  2090     if (! pattern->attribute_list)
       
  2091         pattern->attribute_list = node->attribute_list;
       
  2092     else if (! AST::match(node->attribute_list, pattern->attribute_list, this))
       
  2093         return false;
       
  2094 
       
  2095     pattern->protocol_token = node->protocol_token;
       
  2096 
       
  2097     if (! pattern->identifier_list)
       
  2098         pattern->identifier_list = node->identifier_list;
       
  2099     else if (! AST::match(node->identifier_list, pattern->identifier_list, this))
       
  2100         return false;
       
  2101 
       
  2102     pattern->semicolon_token = node->semicolon_token;
       
  2103 
       
  2104     return true;
       
  2105 }
       
  2106 
       
  2107 bool ASTMatcher::match(ObjCProtocolDeclarationAST *node, ObjCProtocolDeclarationAST *pattern)
       
  2108 {
       
  2109     (void) node;
       
  2110     (void) pattern;
       
  2111 
       
  2112     if (! pattern->attribute_list)
       
  2113         pattern->attribute_list = node->attribute_list;
       
  2114     else if (! AST::match(node->attribute_list, pattern->attribute_list, this))
       
  2115         return false;
       
  2116 
       
  2117     pattern->protocol_token = node->protocol_token;
       
  2118 
       
  2119     if (! pattern->name)
       
  2120         pattern->name = node->name;
       
  2121     else if (! AST::match(node->name, pattern->name, this))
       
  2122         return false;
       
  2123 
       
  2124     if (! pattern->protocol_refs)
       
  2125         pattern->protocol_refs = node->protocol_refs;
       
  2126     else if (! AST::match(node->protocol_refs, pattern->protocol_refs, this))
       
  2127         return false;
       
  2128 
       
  2129     if (! pattern->member_declaration_list)
       
  2130         pattern->member_declaration_list = node->member_declaration_list;
       
  2131     else if (! AST::match(node->member_declaration_list, pattern->member_declaration_list, this))
       
  2132         return false;
       
  2133 
       
  2134     pattern->end_token = node->end_token;
       
  2135 
       
  2136     return true;
       
  2137 }
       
  2138 
       
  2139 bool ASTMatcher::match(ObjCProtocolRefsAST *node, ObjCProtocolRefsAST *pattern)
       
  2140 {
       
  2141     (void) node;
       
  2142     (void) pattern;
       
  2143 
       
  2144     pattern->less_token = node->less_token;
       
  2145 
       
  2146     if (! pattern->identifier_list)
       
  2147         pattern->identifier_list = node->identifier_list;
       
  2148     else if (! AST::match(node->identifier_list, pattern->identifier_list, this))
       
  2149         return false;
       
  2150 
       
  2151     pattern->greater_token = node->greater_token;
       
  2152 
       
  2153     return true;
       
  2154 }
       
  2155 
       
  2156 bool ASTMatcher::match(ObjCMessageArgumentAST *node, ObjCMessageArgumentAST *pattern)
       
  2157 {
       
  2158     (void) node;
       
  2159     (void) pattern;
       
  2160 
       
  2161     if (! pattern->parameter_value_expression)
       
  2162         pattern->parameter_value_expression = node->parameter_value_expression;
       
  2163     else if (! AST::match(node->parameter_value_expression, pattern->parameter_value_expression, this))
       
  2164         return false;
       
  2165 
       
  2166     return true;
       
  2167 }
       
  2168 
       
  2169 bool ASTMatcher::match(ObjCMessageExpressionAST *node, ObjCMessageExpressionAST *pattern)
       
  2170 {
       
  2171     (void) node;
       
  2172     (void) pattern;
       
  2173 
       
  2174     pattern->lbracket_token = node->lbracket_token;
       
  2175 
       
  2176     if (! pattern->receiver_expression)
       
  2177         pattern->receiver_expression = node->receiver_expression;
       
  2178     else if (! AST::match(node->receiver_expression, pattern->receiver_expression, this))
       
  2179         return false;
       
  2180 
       
  2181     if (! pattern->selector)
       
  2182         pattern->selector = node->selector;
       
  2183     else if (! AST::match(node->selector, pattern->selector, this))
       
  2184         return false;
       
  2185 
       
  2186     if (! pattern->argument_list)
       
  2187         pattern->argument_list = node->argument_list;
       
  2188     else if (! AST::match(node->argument_list, pattern->argument_list, this))
       
  2189         return false;
       
  2190 
       
  2191     pattern->rbracket_token = node->rbracket_token;
       
  2192 
       
  2193     return true;
       
  2194 }
       
  2195 
       
  2196 bool ASTMatcher::match(ObjCProtocolExpressionAST *node, ObjCProtocolExpressionAST *pattern)
       
  2197 {
       
  2198     (void) node;
       
  2199     (void) pattern;
       
  2200 
       
  2201     pattern->protocol_token = node->protocol_token;
       
  2202 
       
  2203     pattern->lparen_token = node->lparen_token;
       
  2204 
       
  2205     pattern->identifier_token = node->identifier_token;
       
  2206 
       
  2207     pattern->rparen_token = node->rparen_token;
       
  2208 
       
  2209     return true;
       
  2210 }
       
  2211 
       
  2212 bool ASTMatcher::match(ObjCTypeNameAST *node, ObjCTypeNameAST *pattern)
       
  2213 {
       
  2214     (void) node;
       
  2215     (void) pattern;
       
  2216 
       
  2217     pattern->lparen_token = node->lparen_token;
       
  2218 
       
  2219     if (! pattern->type_id)
       
  2220         pattern->type_id = node->type_id;
       
  2221     else if (! AST::match(node->type_id, pattern->type_id, this))
       
  2222         return false;
       
  2223 
       
  2224     pattern->rparen_token = node->rparen_token;
       
  2225 
       
  2226     return true;
       
  2227 }
       
  2228 
       
  2229 bool ASTMatcher::match(ObjCEncodeExpressionAST *node, ObjCEncodeExpressionAST *pattern)
       
  2230 {
       
  2231     (void) node;
       
  2232     (void) pattern;
       
  2233 
       
  2234     pattern->encode_token = node->encode_token;
       
  2235 
       
  2236     if (! pattern->type_name)
       
  2237         pattern->type_name = node->type_name;
       
  2238     else if (! AST::match(node->type_name, pattern->type_name, this))
       
  2239         return false;
       
  2240 
       
  2241     return true;
       
  2242 }
       
  2243 
       
  2244 bool ASTMatcher::match(ObjCSelectorWithoutArgumentsAST *node, ObjCSelectorWithoutArgumentsAST *pattern)
       
  2245 {
       
  2246     (void) node;
       
  2247     (void) pattern;
       
  2248 
       
  2249     pattern->name_token = node->name_token;
       
  2250 
       
  2251     return true;
       
  2252 }
       
  2253 
       
  2254 bool ASTMatcher::match(ObjCSelectorArgumentAST *node, ObjCSelectorArgumentAST *pattern)
       
  2255 {
       
  2256     (void) node;
       
  2257     (void) pattern;
       
  2258 
       
  2259     pattern->name_token = node->name_token;
       
  2260 
       
  2261     pattern->colon_token = node->colon_token;
       
  2262 
       
  2263     return true;
       
  2264 }
       
  2265 
       
  2266 bool ASTMatcher::match(ObjCSelectorWithArgumentsAST *node, ObjCSelectorWithArgumentsAST *pattern)
       
  2267 {
       
  2268     (void) node;
       
  2269     (void) pattern;
       
  2270 
       
  2271     if (! pattern->selector_argument_list)
       
  2272         pattern->selector_argument_list = node->selector_argument_list;
       
  2273     else if (! AST::match(node->selector_argument_list, pattern->selector_argument_list, this))
       
  2274         return false;
       
  2275 
       
  2276     return true;
       
  2277 }
       
  2278 
       
  2279 bool ASTMatcher::match(ObjCSelectorExpressionAST *node, ObjCSelectorExpressionAST *pattern)
       
  2280 {
       
  2281     (void) node;
       
  2282     (void) pattern;
       
  2283 
       
  2284     pattern->selector_token = node->selector_token;
       
  2285 
       
  2286     pattern->lparen_token = node->lparen_token;
       
  2287 
       
  2288     if (! pattern->selector)
       
  2289         pattern->selector = node->selector;
       
  2290     else if (! AST::match(node->selector, pattern->selector, this))
       
  2291         return false;
       
  2292 
       
  2293     pattern->rparen_token = node->rparen_token;
       
  2294 
       
  2295     return true;
       
  2296 }
       
  2297 
       
  2298 bool ASTMatcher::match(ObjCInstanceVariablesDeclarationAST *node, ObjCInstanceVariablesDeclarationAST *pattern)
       
  2299 {
       
  2300     (void) node;
       
  2301     (void) pattern;
       
  2302 
       
  2303     pattern->lbrace_token = node->lbrace_token;
       
  2304 
       
  2305     if (! pattern->instance_variable_list)
       
  2306         pattern->instance_variable_list = node->instance_variable_list;
       
  2307     else if (! AST::match(node->instance_variable_list, pattern->instance_variable_list, this))
       
  2308         return false;
       
  2309 
       
  2310     pattern->rbrace_token = node->rbrace_token;
       
  2311 
       
  2312     return true;
       
  2313 }
       
  2314 
       
  2315 bool ASTMatcher::match(ObjCVisibilityDeclarationAST *node, ObjCVisibilityDeclarationAST *pattern)
       
  2316 {
       
  2317     (void) node;
       
  2318     (void) pattern;
       
  2319 
       
  2320     pattern->visibility_token = node->visibility_token;
       
  2321 
       
  2322     return true;
       
  2323 }
       
  2324 
       
  2325 bool ASTMatcher::match(ObjCPropertyAttributeAST *node, ObjCPropertyAttributeAST *pattern)
       
  2326 {
       
  2327     (void) node;
       
  2328     (void) pattern;
       
  2329 
       
  2330     pattern->attribute_identifier_token = node->attribute_identifier_token;
       
  2331 
       
  2332     pattern->equals_token = node->equals_token;
       
  2333 
       
  2334     if (! pattern->method_selector)
       
  2335         pattern->method_selector = node->method_selector;
       
  2336     else if (! AST::match(node->method_selector, pattern->method_selector, this))
       
  2337         return false;
       
  2338 
       
  2339     return true;
       
  2340 }
       
  2341 
       
  2342 bool ASTMatcher::match(ObjCPropertyDeclarationAST *node, ObjCPropertyDeclarationAST *pattern)
       
  2343 {
       
  2344     (void) node;
       
  2345     (void) pattern;
       
  2346 
       
  2347     if (! pattern->attribute_list)
       
  2348         pattern->attribute_list = node->attribute_list;
       
  2349     else if (! AST::match(node->attribute_list, pattern->attribute_list, this))
       
  2350         return false;
       
  2351 
       
  2352     pattern->property_token = node->property_token;
       
  2353 
       
  2354     pattern->lparen_token = node->lparen_token;
       
  2355 
       
  2356     if (! pattern->property_attribute_list)
       
  2357         pattern->property_attribute_list = node->property_attribute_list;
       
  2358     else if (! AST::match(node->property_attribute_list, pattern->property_attribute_list, this))
       
  2359         return false;
       
  2360 
       
  2361     pattern->rparen_token = node->rparen_token;
       
  2362 
       
  2363     if (! pattern->simple_declaration)
       
  2364         pattern->simple_declaration = node->simple_declaration;
       
  2365     else if (! AST::match(node->simple_declaration, pattern->simple_declaration, this))
       
  2366         return false;
       
  2367 
       
  2368     return true;
       
  2369 }
       
  2370 
       
  2371 bool ASTMatcher::match(ObjCMessageArgumentDeclarationAST *node, ObjCMessageArgumentDeclarationAST *pattern)
       
  2372 {
       
  2373     (void) node;
       
  2374     (void) pattern;
       
  2375 
       
  2376     if (! pattern->type_name)
       
  2377         pattern->type_name = node->type_name;
       
  2378     else if (! AST::match(node->type_name, pattern->type_name, this))
       
  2379         return false;
       
  2380 
       
  2381     if (! pattern->attribute_list)
       
  2382         pattern->attribute_list = node->attribute_list;
       
  2383     else if (! AST::match(node->attribute_list, pattern->attribute_list, this))
       
  2384         return false;
       
  2385 
       
  2386     pattern->param_name_token = node->param_name_token;
       
  2387 
       
  2388     return true;
       
  2389 }
       
  2390 
       
  2391 bool ASTMatcher::match(ObjCMethodPrototypeAST *node, ObjCMethodPrototypeAST *pattern)
       
  2392 {
       
  2393     (void) node;
       
  2394     (void) pattern;
       
  2395 
       
  2396     pattern->method_type_token = node->method_type_token;
       
  2397 
       
  2398     if (! pattern->type_name)
       
  2399         pattern->type_name = node->type_name;
       
  2400     else if (! AST::match(node->type_name, pattern->type_name, this))
       
  2401         return false;
       
  2402 
       
  2403     if (! pattern->selector)
       
  2404         pattern->selector = node->selector;
       
  2405     else if (! AST::match(node->selector, pattern->selector, this))
       
  2406         return false;
       
  2407 
       
  2408     if (! pattern->argument_list)
       
  2409         pattern->argument_list = node->argument_list;
       
  2410     else if (! AST::match(node->argument_list, pattern->argument_list, this))
       
  2411         return false;
       
  2412 
       
  2413     pattern->dot_dot_dot_token = node->dot_dot_dot_token;
       
  2414 
       
  2415     if (! pattern->attribute_list)
       
  2416         pattern->attribute_list = node->attribute_list;
       
  2417     else if (! AST::match(node->attribute_list, pattern->attribute_list, this))
       
  2418         return false;
       
  2419 
       
  2420     return true;
       
  2421 }
       
  2422 
       
  2423 bool ASTMatcher::match(ObjCMethodDeclarationAST *node, ObjCMethodDeclarationAST *pattern)
       
  2424 {
       
  2425     (void) node;
       
  2426     (void) pattern;
       
  2427 
       
  2428     if (! pattern->method_prototype)
       
  2429         pattern->method_prototype = node->method_prototype;
       
  2430     else if (! AST::match(node->method_prototype, pattern->method_prototype, this))
       
  2431         return false;
       
  2432 
       
  2433     if (! pattern->function_body)
       
  2434         pattern->function_body = node->function_body;
       
  2435     else if (! AST::match(node->function_body, pattern->function_body, this))
       
  2436         return false;
       
  2437 
       
  2438     pattern->semicolon_token = node->semicolon_token;
       
  2439 
       
  2440     return true;
       
  2441 }
       
  2442 
       
  2443 bool ASTMatcher::match(ObjCSynthesizedPropertyAST *node, ObjCSynthesizedPropertyAST *pattern)
       
  2444 {
       
  2445     (void) node;
       
  2446     (void) pattern;
       
  2447 
       
  2448     pattern->equals_token = node->equals_token;
       
  2449 
       
  2450     return true;
       
  2451 }
       
  2452 
       
  2453 bool ASTMatcher::match(ObjCSynthesizedPropertiesDeclarationAST *node, ObjCSynthesizedPropertiesDeclarationAST *pattern)
       
  2454 {
       
  2455     (void) node;
       
  2456     (void) pattern;
       
  2457 
       
  2458     pattern->synthesized_token = node->synthesized_token;
       
  2459 
       
  2460     if (! pattern->property_identifier_list)
       
  2461         pattern->property_identifier_list = node->property_identifier_list;
       
  2462     else if (! AST::match(node->property_identifier_list, pattern->property_identifier_list, this))
       
  2463         return false;
       
  2464 
       
  2465     pattern->semicolon_token = node->semicolon_token;
       
  2466 
       
  2467     return true;
       
  2468 }
       
  2469 
       
  2470 bool ASTMatcher::match(ObjCDynamicPropertiesDeclarationAST *node, ObjCDynamicPropertiesDeclarationAST *pattern)
       
  2471 {
       
  2472     (void) node;
       
  2473     (void) pattern;
       
  2474 
       
  2475     pattern->dynamic_token = node->dynamic_token;
       
  2476 
       
  2477     if (! pattern->property_identifier_list)
       
  2478         pattern->property_identifier_list = node->property_identifier_list;
       
  2479     else if (! AST::match(node->property_identifier_list, pattern->property_identifier_list, this))
       
  2480         return false;
       
  2481 
       
  2482     pattern->semicolon_token = node->semicolon_token;
       
  2483 
       
  2484     return true;
       
  2485 }
       
  2486 
       
  2487 bool ASTMatcher::match(ObjCFastEnumerationAST *node, ObjCFastEnumerationAST *pattern)
       
  2488 {
       
  2489     (void) node;
       
  2490     (void) pattern;
       
  2491 
       
  2492     pattern->for_token = node->for_token;
       
  2493 
       
  2494     pattern->lparen_token = node->lparen_token;
       
  2495 
       
  2496     if (! pattern->type_specifier_list)
       
  2497         pattern->type_specifier_list = node->type_specifier_list;
       
  2498     else if (! AST::match(node->type_specifier_list, pattern->type_specifier_list, this))
       
  2499         return false;
       
  2500 
       
  2501     if (! pattern->declarator)
       
  2502         pattern->declarator = node->declarator;
       
  2503     else if (! AST::match(node->declarator, pattern->declarator, this))
       
  2504         return false;
       
  2505 
       
  2506     if (! pattern->initializer)
       
  2507         pattern->initializer = node->initializer;
       
  2508     else if (! AST::match(node->initializer, pattern->initializer, this))
       
  2509         return false;
       
  2510 
       
  2511     pattern->in_token = node->in_token;
       
  2512 
       
  2513     if (! pattern->fast_enumeratable_expression)
       
  2514         pattern->fast_enumeratable_expression = node->fast_enumeratable_expression;
       
  2515     else if (! AST::match(node->fast_enumeratable_expression, pattern->fast_enumeratable_expression, this))
       
  2516         return false;
       
  2517 
       
  2518     pattern->rparen_token = node->rparen_token;
       
  2519 
       
  2520     if (! pattern->statement)
       
  2521         pattern->statement = node->statement;
       
  2522     else if (! AST::match(node->statement, pattern->statement, this))
       
  2523         return false;
       
  2524 
       
  2525     return true;
       
  2526 }
       
  2527 
       
  2528 bool ASTMatcher::match(ObjCSynchronizedStatementAST *node, ObjCSynchronizedStatementAST *pattern)
       
  2529 {
       
  2530     (void) node;
       
  2531     (void) pattern;
       
  2532 
       
  2533     pattern->synchronized_token = node->synchronized_token;
       
  2534 
       
  2535     pattern->lparen_token = node->lparen_token;
       
  2536 
       
  2537     if (! pattern->synchronized_object)
       
  2538         pattern->synchronized_object = node->synchronized_object;
       
  2539     else if (! AST::match(node->synchronized_object, pattern->synchronized_object, this))
       
  2540         return false;
       
  2541 
       
  2542     pattern->rparen_token = node->rparen_token;
       
  2543 
       
  2544     if (! pattern->statement)
       
  2545         pattern->statement = node->statement;
       
  2546     else if (! AST::match(node->statement, pattern->statement, this))
       
  2547         return false;
       
  2548 
       
  2549     return true;
       
  2550 }
       
  2551