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", "<")])
Example #5
0
    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)
Example #6
0
    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)