3 L] @s ddlmZddZddZdS))c_astcCst|tjstt|jtjs"|Stjg|jj}d}xh|jjD]\}t|tjtj frz|jj |t ||j|jd}q@|dkr|jj |q@|j j |q@W||_|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. Nr) isinstancerZSwitchAssertionErrorstmtZCompoundZcoordZ block_itemsCaseDefaultappend_extract_nested_casestmts)Z switch_nodeZ new_compoundZ last_casechildr ?/tmp/pip-install-wfra5znf/pycparser/pycparser/ast_transforms.pyfix_switch_cases s3   rcCs:t|jdtjtjfr6|j|jjt|d|dS)z Recursively extract consecutive Case statements that are made nested by the parser and add them to the stmts_list. rNr)rr rrrr popr )Z case_nodeZ stmts_listr r rr bsr N)rrr r r r r s U