a b;@s0ddlmZddZddZddZdd Zd S) )c_astcCst|tjsJt|jtjs"|Stg|jj}d}|jjp@gD]\}t|tjtjfr||j |t ||j|jd}qB|dur|j |qB|j |qB||_|S)a The 'case' statements in a 'switch' come out of parsing with one child node, so subsequent statements are just tucked to the parent Compound. Additionally, consecutive (fall-through) case statements come out messy. This is a peculiarity of the C grammar. The following: switch (myvar) { case 10: k = 10; p = k + 1; return 10; case 20: case 30: return 20; default: break; } Creates this tree (pseudo-dump): Switch ID: myvar Compound: Case 10: k = 10 p = k + 1 return 10 Case 20: Case 30: return 20 Default: break The goal of this transform is to fix this mess, turning it into the following: Switch ID: myvar Compound: Case 10: k = 10 p = k + 1 return 10 Case 20: Case 30: return 20 Default: break A fixed AST node is returned. The argument may be modified. N) isinstancerZSwitchstmtZCompoundZcoordZ block_itemsCaseDefaultappend_extract_nested_casestmts)Z switch_nodeZ new_compoundZ last_casechildr ?/tmp/pip-target-98j97qn4/lib/python/pycparser/ast_transforms.pyfix_switch_cases s3   rcCs:t|jdtjtjfr6||jt|d|dS)z Recursively extract consecutive Case statements that are made nested by the parser and add them to the stmts_list. rN)rr rrrrpopr )Z case_nodeZ stmts_listr r r r csr cCs~t|\}}|sqq|}t|tjsHz |j}WqtyD|YS0qd|jvrhd|jvrh|jd|jdurz|j |_|S)aK Atomic specifiers like _Atomic(type) are unusually structured, conferring a qualifier upon the contained type. This function fixes a decl with atomic specifiers to have a sane AST structure, by removing spurious Typename->TypeDecl pairs and attaching the _Atomic qualifier in the right place. _AtomicN) _fix_atomic_specifiers_oncerrTypeDecltypeAttributeErrorqualsrZdeclnamename)declfoundtypr r r fix_atomic_specifiersls       rcCs|}d}|j}|dur^t|tjr.d|jvr.q^z|}|}|j}WqtyZ|dfYS0qt|tjsnJ|j|_d|jjvr|jjd|dfS)z Performs one 'fix' round of atomic specifiers. Returns (modified_decl, found) where found is True iff a fix was made. NrFT)rrrZTypenamerrrr)rparentZ grandparentnoder r r rs"   rN)rrr rrr r r r  s V