a ÿ¸_^@ ã @ s d dl mZ dd„ Zdd„ ZdS )é )Úc_astc C sª t | tjƒsJ ‚t | jtjƒs"| S t g | jj¡}d}| jjp@g D ]\}t |tjtjfƒr||j |¡ t ||jƒ |jd }qB|du r’|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éÿÿÿÿ)Ú isinstancer ZSwitchZstmtZCompoundZcoordZblock_itemsÚCaseÚDefaultÚappendÚ_extract_nested_caseÚstmts)Zswitch_nodeZnew_compoundZ last_caseÚchild© r ú