def test_parse_with_top_level_ifdef_and_else_blocks(self): source = """ int a; #ifdef CONFIG_SOMETHING struct s { int x; } y; struct s t, u; #else int z; #endif int b; """ actual = self.parser.parse(source) expected = pre_ast.CompositeBlock([ pre_ast.TextBlock('int a;'), pre_ast.If(conditional_blocks=[ pre_ast.ConditionalBlock( conditional_expression='defined(CONFIG_SOMETHING)', content=[ pre_ast.TextBlock( '\n'.join(( 'struct s {', ' int x;', '} y;', 'struct s t, u;', )), ), ]), pre_ast.ConditionalBlock(conditional_expression="1", content=[pre_ast.TextBlock('int z;')]) ]), pre_ast.TextBlock('int b;') ]) self.assertASTEqual(actual, expected)
def test_parse_with_nested_if_blocks(self): source = """ #if CONFIG_SOMETHING #if CONFIG_SOMETHING_ELSE #define FOO #endif #else #define BAR #endif """ actual = self.parser.parse(source) expected = pre_ast.CompositeBlock([ pre_ast.If(conditional_blocks=[ pre_ast.ConditionalBlock( conditional_expression='CONFIG_SOMETHING', content=[ pre_ast.If(conditional_blocks=[ pre_ast.ConditionalBlock( conditional_expression="CONFIG_SOMETHING_ELSE", content=[ pre_ast.DefineObjectLike(name="FOO", replacement="") ], ) ]) ]), pre_ast.ConditionalBlock( conditional_expression='1', content=[ pre_ast.DefineObjectLike(name="BAR", replacement="") ], ), ]), ]) self.assertASTEqual(actual, expected)
def test_parse_with_empty_if_elif_and_else_blocks(self): source = """ #if CONFIG_SOMETHING #elif defined(CONFIG_SOMETHING_ELSE) #else #endif """ actual = self.parser.parse(source) expected = pre_ast.CompositeBlock([ pre_ast.If(conditional_blocks=[ pre_ast.ConditionalBlock( conditional_expression='CONFIG_SOMETHING', content=[], ), pre_ast.ConditionalBlock( conditional_expression='defined(CONFIG_SOMETHING_ELSE)', content=[], ), pre_ast.ConditionalBlock( conditional_expression='1', content=[], ), ]), ]) self.assertASTEqual(actual, expected)
def test_collect_includes_with_conditional_block(self): node = pre_ast.ConditionalBlock( conditional_expression='some_expression', content=[pre_ast.Include("33", "<")], ) actual = self.include_collector.collect_includes(node) self.assertEqual(actual, [pre_ast.Include("33", "<")])
def _add_conditional_block(self, expression): conditional_block = pre_ast.ConditionalBlock( conditional_expression=expression, content=[]) if_block = pre_ast.If([conditional_block]) self.current_node.content.append(if_block) self.push_node(if_block) self.push_node(conditional_block)
def _add_elif_block(self, expression): # An else clause is just a ConditionalBlock with a true expression. self.pop_node() # Pop the ConditionalBlock # Make a new conditional node. conditional_block = pre_ast.ConditionalBlock( conditional_expression=expression, content=[]) # Add the new conditional_block to the if block. self.current_node.conditional_blocks.append(conditional_block) # Now add nodes to that ConditionalBlock. self.push_node(conditional_block)
def test_parse_with_empty_ifndef_block(self): source = """ #ifndef CONFIG_SOMETHING #endif """ actual = self.parser.parse(source) expected = pre_ast.CompositeBlock([ pre_ast.If([ pre_ast.ConditionalBlock( conditional_expression="!defined(CONFIG_SOMETHING)", content=[]), ]) ]) self.assertASTEqual(actual, expected)
def test_parse_with_empty_ifndef_header_guard(self): source = """ #ifndef _SOMETHING_H #define _SOMETHING_H #endif """ actual = self.parser.parse(source) expected = pre_ast.CompositeBlock([ pre_ast.If([ pre_ast.ConditionalBlock( conditional_expression="!defined(_SOMETHING_H)", content=[ pre_ast.DefineObjectLike( name='_SOMETHING_H', replacement="", ), ], ), ]), ]) self.assertASTEqual(actual, expected)