Exemplo n.º 1
0
    def test_index_scope_ok(self):
        self.ast_description = """
        file: TestTemplate
        #def test_function
          #set $foo = {}
          #if True
            #set $foo[1] = 1
          #end if
        #end def
        """

        ast_root, function_node = self._build_function_template()
        assign_node1 = ast.AssignNode(
            ast.IdentifierNode('foo'), ast.DictLiteralNode())
        function_node.append(assign_node1)
        if_node = ast.IfNode(ast.LiteralNode(True))
        assign_node2 = ast.AssignNode(
            ast.SliceNode(
                ast.IdentifierNode('foo'), ast.LiteralNode(1)),
            ast.LiteralNode(1))
        if_node.append(assign_node2)
        function_node.append(if_node)

        optimization_analyzer = self._get_analyzer(ast_root)

        try:
            optimization_analyzer.visit_ast(ast_root)
        except analyzer.SemanticAnalyzerError:
            self.fail('visit_ast raised SemanticAnalyzerError unexpectedly.')
Exemplo n.º 2
0
    def assign_after_filter_fails(self):
        self.ast_description = """
        file: TestTemplate
        #def test_function
          #set $foo = 'foo'
          $foo
          #set $foo = 'bar'
          $foo
        #end def
        """

        ast_root, function_node = self._build_function_template()
        first_assign = ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode('foo'))
        function_node.append(first_assign)
        first_use = ast.FilterNode(ast.IdentifierNode('foo'))
        function_node.append(first_use)
        second_assign = ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode('bar'))
        function_node.append(second_assign)
        second_use = ast.FilterNode(ast.IdentifierNode('foo'))
        function_node.append(second_use)

        optimization_analyzer = optimizer.OptimizationAnalyzer(
            ast_root, self.compiler.analyzer_options, self.compiler)

        optimization_analyzer.visit_ast = test_util.RecordedFunction(
            optimization_analyzer.visit_ast)

        self.assertRaises(compiler.Warning, optimization_analyzer.visit_ast,
                          ast_root)
Exemplo n.º 3
0
    def test_nested_else(self):
        self.ast_description = """
        file: TestTemplate
        #def test_function
          #if True
            #set $foo = 1
          #else
            #if
              #set $foo = 2
            #else
              #set $foo = 3
            #end if
          #end if
          $foo
        #end def
        """

        ast_root, function_node, if_node = self._build_if_template()
        if_node.append(ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode(1)))
        if_node_2 = ast.IfNode(ast.LiteralNode(True))
        if_node_2.append(ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode(2)))
        if_node_2.else_.append(ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode(3)))
        if_node.else_.append(if_node_2)
        function_node.append(ast.PlaceholderNode('foo'))

        optimization_analyzer = self._get_analyzer(ast_root)

        try:
            optimization_analyzer.visit_ast(ast_root)
        except analyzer.SemanticAnalyzerError:
            self.fail('visit_ast raised SemanticAnalyzerError unexpectedly.')
Exemplo n.º 4
0
 def build_conditional_body(node):
     node.append(ast.AssignNode(
         ast.IdentifierNode('_rph_foo'), ast.PlaceholderNode('foo')))
     node.append(ast.AssignNode(
         ast.IdentifierNode('_fph123'), ast.FilterNode(
             ast.IdentifierNode('_rph_foo'))))
     node.append(ast.BufferWrite(ast.IdentifierNode('_fph123')))
Exemplo n.º 5
0
    def double_assign_ok(self):
        self.ast_description = """
        file: TestTemplate
        #def test_function
          #set $foo = 'foo'
          #set $foo = 'bar'
          $foo
        #end def
        """

        ast_root, function_node = self._build_function_template()
        first_assign = ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode('foo'))
        function_node.append(first_assign)
        second_assign = ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode('bar'))
        function_node.append(second_assign)
        first_use = ast.FilterNode(ast.IdentifierNode('foo'))
        function_node.append(first_use)

        optimization_analyzer = optimizer.OptimizationAnalyzer(
            ast_root, self.compiler.analyzer_options, self.compiler)

        optimization_analyzer.visit_ast = test_util.RecordedFunction(
            optimization_analyzer.visit_ast)

        try:
            optimization_analyzer.visit_ast(ast_root)
        except compiler.Warning:
            self.fail('visit_ast raised WarningError unexpectedly.')
Exemplo n.º 6
0
    def test_partial_nested_else_if(self):
        self.ast_description = """
        file: TestTemplate
        #def test_function
          #if True
            #set $foo = 1
          #else
            #if True
              #set $foo = 2
            #end if
          #end if
          $foo
        #end def
        """

        ast_root, function_node, if_node = self._build_if_template()
        if_node.append(ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode(1)))
        if_node_2 = ast.IfNode(ast.LiteralNode(True))
        if_node_2.append(ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode(2)))
        if_node.else_.append(if_node_2)
        function_node.append(ast.PlaceholderNode('foo'))

        optimization_analyzer = self._get_analyzer(ast_root)
        self.assertRaises(analyzer.SemanticAnalyzerError,
                          optimization_analyzer.visit_ast, ast_root)
Exemplo n.º 7
0
    def test_duplicate_node_collect(self):
        self.ast_description = """
        file: TestTemplate

        #def test_function
          foo
          bar
          #if True
            #set $foo = 1
          #end if
          baz
          boo
          #if True
            #set $foo = 1
          #end if
        #end def

        NOTE: This test will break if collect_writes is written
        using ast.ASTNode.insert_before.
        """

        ast_root, function_node = self._build_function_template()
        function_node.append(ast.BufferWrite(ast.LiteralNode('foo')))
        function_node.append(ast.BufferWrite(ast.LiteralNode('bar')))
        if_node = ast.IfNode()
        if_node.append(ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode(1)))
        function_node.append(if_node)
        function_node.append(ast.BufferWrite(ast.LiteralNode('baz')))
        function_node.append(ast.BufferWrite(ast.LiteralNode('boo')))
        if_node = ast.IfNode()
        if_node.append(ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode(1)))
        optimization_analyzer = self._get_analyzer(ast_root)

        ast_root, function_node = self._build_function_template()
        tuple_node = ast.TupleLiteralNode()
        tuple_node.append(ast.LiteralNode('foo'))
        tuple_node.append(ast.LiteralNode('bar'))
        function_node.append(ast.BufferExtend(tuple_node))
        if_node = ast.IfNode()
        if_node.append(ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode(1)))
        function_node.append(if_node)
        tuple_node = ast.TupleLiteralNode()
        tuple_node.append(ast.LiteralNode('baz'))
        tuple_node.append(ast.LiteralNode('boo'))
        function_node.append(ast.BufferExtend(tuple_node))
        if_node = ast.IfNode()
        if_node.append(ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode(1)))

        expected_hash = hash(ast_root)

        got_hash = hash(optimization_analyzer.optimize_ast())
        self.assertEqual(expected_hash, got_hash)
Exemplo n.º 8
0
    def test_collect_writes_join_if(self):
        self.ast_description = """
        file: TestTemplate

        #def test_function
          foo
          bar
          #if True
            #set $foo = 1
          #end if
          baz
          boo
        #end def
        """

        ast_root, function_node = self._build_function_template()
        function_node.append(ast.BufferWrite(ast.LiteralNode('foo')))
        function_node.append(ast.BufferWrite(ast.LiteralNode('bar')))
        if_node = ast.IfNode()
        if_node.append(ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode(1)))
        function_node.append(if_node)
        function_node.append(ast.BufferWrite(ast.LiteralNode('baz')))
        function_node.append(ast.BufferWrite(ast.LiteralNode('boo')))
        optimization_analyzer = self._get_analyzer(ast_root)

        ast_root, function_node = self._build_function_template()
        tuple_node = ast.TupleLiteralNode()
        tuple_node.append(ast.LiteralNode('foo'))
        tuple_node.append(ast.LiteralNode('bar'))
        function_node.append(ast.BufferExtend(tuple_node))
        if_node = ast.IfNode()
        if_node.append(ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode(1)))
        function_node.append(if_node)
        tuple_node = ast.TupleLiteralNode()
        tuple_node.append(ast.LiteralNode('baz'))
        tuple_node.append(ast.LiteralNode('boo'))
        function_node.append(ast.BufferExtend(tuple_node))

        expected_hash = hash(ast_root)

        got_hash = hash(optimization_analyzer.optimize_ast())
        self.assertEqual(expected_hash, got_hash)
Exemplo n.º 9
0
    def test_index_before_assign_error(self):
        self.ast_description = """
        file: TestTemplate
        #def test_function
          #set $foo[1] = 1
        #end def
        """

        ast_root, function_node = self._build_function_template()
        assign_node = ast.AssignNode(
            ast.SliceNode(
                ast.IdentifierNode('foo'), ast.LiteralNode(1)),
            ast.LiteralNode(1))
        function_node.append(assign_node)

        optimization_analyzer = self._get_analyzer(ast_root)
        self.assertRaises(analyzer.SemanticAnalyzerError,
                          optimization_analyzer.visit_ast, ast_root)
Exemplo n.º 10
0
    def test_slice_non_identifier_error(self):
        self.ast_description = """
        file: TestTemplate
        #def test_function
          #set 1[1] = 1
        #end def
        """

        ast_root, def_node = self._build_function_template()
        assign_node = ast.AssignNode(
            ast.SliceNode(
                ast.LiteralNode(1), ast.LiteralNode(1)), ast.LiteralNode(1))
        def_node.append(assign_node)

        semantic_analyzer = self._get_analyzer(ast_root)

        self.assertRaises(analyzer.SemanticAnalyzerError,
                          semantic_analyzer.get_ast)
Exemplo n.º 11
0
    def test_set_error(self):
        self.ast_description = """
        file: TestTemplate
        #implements library
        #set $foo = True
        #def test_function
        #end def
        """

        ast_root, def_node = self._build_function_template_library()
        assign_node = ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode(True))
        ast_root.insert_before(def_node, assign_node)

        semantic_analyzer = self._get_analyzer(ast_root)

        self.assertRaises(analyzer.SemanticAnalyzerError,
                          semantic_analyzer.get_ast)
Exemplo n.º 12
0
    def test_empty_if_full_else_fails(self):
        self.ast_description = """
        file: TestTemplate
        #def test_function
          #if True
          #else
            #set $foo = true
          #end if
        #end def
        """

        ast_root, def_node, if_node = self._build_if_template()
        assign_node = ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode(True))
        if_node.else_.append(assign_node)

        semantic_analyzer = self._get_analyzer(ast_root)

        self.assertRaises(analyzer.SemanticAnalyzerError,
                          semantic_analyzer.get_ast)
Exemplo n.º 13
0
    def test_hoists_both_from_plus(self):
        self.ast_description = """
        file: TestTemplate

        #global $foo

        #def test_function
          #set $bar = $foo + $foo
        #end def
        """

        ast_root, function_node = self._build_function_template()
        ast_root.global_placeholders.add('foo')
        function_node.append(ast.AssignNode(
            ast.IdentifierNode('bar'), ast.BinOpNode('+', ast.PlaceholderNode(
                'foo'), ast.PlaceholderNode('foo'))))

        optimization_analyzer = self._get_analyzer_and_visit(ast_root)
        self.assertEqual(
            optimization_analyzer._placeholdernode_replacement.GetResults(),
            [True, True])
Exemplo n.º 14
0
    def test_slice_identifier_ok(self):
        self.ast_description = """
        file: TestTemplate
        #def test_function
          #set $foo[1] = 1
        #end def
        """

        ast_root, def_node = self._build_function_template()
        assign_node = ast.AssignNode(
            ast.SliceNode(
                ast.IdentifierNode('foo'), ast.LiteralNode(1)),
            ast.LiteralNode(1))
        def_node.append(assign_node)

        semantic_analyzer = self._get_analyzer(ast_root)

        try:
            semantic_analyzer.get_ast()
        except analyzer.SemanticAnalyzerError:
            self.fail('get_ast raised SemanticAnalyzerError unexpectedly.')
Exemplo n.º 15
0
    def test_non_empty_for_ok(self):
        self.ast_description = """
        file: TestTemplate
        #def test_function
          #for $i in []
             #set $foo = True
          #end for
        #end def
        """

        ast_root, def_node, for_node = self._build_for_template()
        assign_node = ast.AssignNode(
            ast.IdentifierNode('foo'), ast.LiteralNode(True))
        for_node.append(assign_node)

        semantic_analyzer = self._get_analyzer(ast_root)

        try:
            semantic_analyzer.get_ast()
        except analyzer.SemanticAnalyzerError:
            self.fail('get_ast raised SemanticAnalyzerError unexpectedly.')