ó g¨wUc@s&ddlmZd„Zd„ZdS(i(tc_astcCsÕt|jtjƒs|Stjg|jjƒ}d}xŽ|jjD]€}t|tjtjfƒr•|jj |ƒt ||jƒ|jd}qD|dkr´|jj |ƒqD|j j |ƒqDW||_|S(sÜ 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 it 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. iÿÿÿÿN( t isinstancetstmtRtCompoundtcoordtNonet block_itemstCasetDefaulttappendt_extract_nested_casetstmts(t switch_nodet new_compoundt last_casetchild((s</usr/lib/python2.7/site-packages/pycparser/ast_transforms.pytfix_switch_cases s4  cCsPt|jdtjtjfƒrL|j|jjƒƒt|d|ƒndS(s€ Recursively extract consecutive Case statements that are made nested by the parser and add them to the stmts_list. iiÿÿÿÿN(RR RRRR tpopR (t case_nodet stmts_list((s</usr/lib/python2.7/site-packages/pycparser/ast_transforms.pyR bs"N(tRRR (((s</usr/lib/python2.7/site-packages/pycparser/ast_transforms.pyt s U