示例#1
0
        def parse_generator(nodes):
            """Transform the generator into a for loop.

            """

            node = nodes[0]
            tempnode = ast.For()
            tempnode.target = node.target
            tempnode.iter = node.iter

            if len(nodes) == 1:
                append_node = ast.parse("%s.append(foo)" % iden).body[0]
                append_node.value.args[0] = elt
                body = [append_node]
            else:
                body = [parse_generator(nodes[1:])]

            if len(node.ifs) == 1:
                ifnode = _ast.If(test=node.ifs[0], body=body, orelse=[])
                tempnode.body = [ifnode]

            elif len(node.ifs) > 1:
                ifnode = _ast.If(test=_ast.BoolOp(op=_ast.And(),
                                                  values=node.ifs),
                                 body=body,
                                 orelse=[])
                tempnode.body = [ifnode]

            else:
                tempnode.body = body

            tempnode.orelse = None
            return tempnode
示例#2
0
        def parse_generator(nodes, ids):
            node = nodes[0]
            tempnode = _ast.For()
            tempnode.target = node.target
            tempnode.iter = _ast.Name(id=ids[0], ctx=_ast.Load())

            if len(nodes) == 1:
                yield_node = _ast.Expr(value=_ast.Yield(value=elt))
                body = [yield_node]
            else:
                body = [parse_generator(nodes[1:], ids[1:])]

            if len(node.ifs) == 1:
                ifnode = _ast.If(test=node.ifs[0], body=body, orelse=[])
                tempnode.body = [ifnode]

            elif len(node.ifs) > 1:
                ifnode = _ast.If(test=_ast.BoolOp(op=_ast.And(),
                                                  values=node.ifs),
                                 body=body,
                                 orelse=[])
                tempnode.body = [ifnode]

            else:
                tempnode.body = body

            tempnode.orelse = None
            return tempnode
示例#3
0
    def test_compile_ast(self):
        fname = __file__
        if fname.lower().endswith('pyc'):
            fname = fname[:-1]
        with open(fname, 'r') as f:
            fcontents = f.read()
        sample_code = [
            ['<assign>', 'x = 5'],
            ['<ifblock>', """if True:\n    pass\n"""],
            ['<forblock>', """for n in [1, 2, 3]:\n    print(n)\n"""],
            ['<deffunc>', """def foo():\n    pass\nfoo()\n"""],
            [fname, fcontents],
        ]

        for fname, code in sample_code:
            co1 = compile(code, '%s1' % fname, 'exec')
            ast = compile(code, '%s2' % fname, 'exec', _ast.PyCF_ONLY_AST)
            self.assertTrue(type(ast) == _ast.Module)
            co2 = compile(ast, '%s3' % fname, 'exec')
            self.assertEqual(co1, co2)
            # the code object's filename comes from the second compilation step
            self.assertEqual(co2.co_filename, '%s3' % fname)

        # raise exception when node type doesn't match with compile mode
        co1 = compile('print(1)', '<string>', 'exec', _ast.PyCF_ONLY_AST)
        self.assertRaises(TypeError, compile, co1, '<ast>', 'eval')

        # raise exception when node type is no start node
        self.assertRaises(TypeError, compile, _ast.If(), '<ast>', 'exec')

        # raise exception when node has invalid children
        ast = _ast.Module()
        ast.body = [_ast.BoolOp()]
        self.assertRaises(TypeError, compile, ast, '<ast>', 'exec')
示例#4
0
def If(conditional, body=None, orelse=None):
    """Creates an _ast.If node.

  Args:
    conditional: The expression we evaluate for its truthiness.
    body: The list of nodes that make up the body of the if statement.
      Executed if True.
    orelse: {[_ast.If]|[_ast.stmt]|None} Either another If statement as the
      only element in a list, (in which case this becomes an elif), a list of
      stmt nodes (in which case this is an else), or None (in which case, there
      is only the if)

  Raises:
    ValueError: If the body or orelse are lists which contain elements not
      inheriting from _ast.stmt.

  Returns:
    An _ast.If node.
  """
    body = FormatAndValidateBody(body)
    if orelse is None:
        orelse = []
    if isinstance(orelse, (list, tuple)):
        for child in body:
            if not isinstance(child, _ast.stmt):
                raise ValueError(
                    'All body nodes must be stmt nodes, and {} is not. '
                    'Try wrapping your node in an Expr node.'.format(child))
    return _ast.If(test=conditional, body=body, orelse=orelse)
    def make_if(self, instr, left, and_block):
        block = [instr] + and_block[:-1]

        maxmax = max(block,
                     key=lambda ins: (0, 0) if (ins.op not in JUMP_OPS) else
                     (self.jump_map.get(ins.oparg, ins.oparg), ins.i))

        idx = block.index(maxmax)

        assert idx is not None

        hi = self.process_logic(block[:idx + 1])

        if hi.right is None and hi.parent is None:
            if instr.opname == 'POP_JUMP_IF_TRUE':
                cond = _ast.UnaryOp(op=_ast.Not(),
                                    operand=left,
                                    lineno=0,
                                    col_offset=0)
            else:
                cond = left

        else:
            cond = self.logic_ast(instr, left, hi)

        jump = and_block[-1]

        if jump.opname == 'RETURN_VALUE':
            body_block = block[idx + 1:] + [jump]
        else:
            body_block = block[idx + 1:]

        body = self.decompile_block(body_block).stmnt()

        if jump.is_jump:
            else_block = self.make_block(jump.to,
                                         inclusive=False,
                                         raise_=False)
        else:  # it is a return
            else_block = []

        if len(else_block):
            else_ = self.decompile_block(else_block).stmnt()
#
#            if len(else_lst) == 1 and isinstance(else_lst[0], _ast.If):
#                elif_ = else_lst[0]
#                tests.extend(elif_.tests)
#                else_ = elif_.else_
#            else:
#                else_ = else_lst
        else:
            else_ = []

        if_ = _ast.If(test=cond,
                      body=body,
                      orelse=else_,
                      lineno=instr.lineno,
                      col_offset=0)

        self.ast_stack.append(if_)
示例#6
0
    def test_compile_ast(self):
        fname = __file__
        if fname.lower().endswith('pyc'):
            fname = fname[:-1]
        with open(fname, 'r') as f:
            fcontents = f.read()
        sample_code = [['<assign>', 'x = 5'],
                       ['<ifblock>', 'if True:\n    pass\n'],
                       ['<forblock>', """for n in [1, 2, 3]:
    print(n)
"""], ['<deffunc>', """def foo():
    pass
foo()
"""], [fname, fcontents]]
        for fname, code in sample_code:
            co1 = compile(code, '%s1' % fname, 'exec')
            ast = compile(code, '%s2' % fname, 'exec', _ast.PyCF_ONLY_AST)
            self.assertTrue(type(ast) == _ast.Module)
            co2 = compile(ast, '%s3' % fname, 'exec')
            self.assertEqual(co1, co2)
            self.assertEqual(co2.co_filename, '%s3' % fname)
        co1 = compile('print(1)', '<string>', 'exec', _ast.PyCF_ONLY_AST)
        self.assertRaises(TypeError, compile, co1, '<ast>', 'eval')
        self.assertRaises(TypeError, compile, _ast.If(), '<ast>', 'exec')
        ast = _ast.Module()
        ast.body = [_ast.BoolOp()]
        self.assertRaises(TypeError, compile, ast, '<ast>', 'exec')
示例#7
0
def build_if():
    test = menu('test')['test']
    test = ast.parse(test).body[0].value
    add_ast_node(_ast.If(
        test=test,
        body=[],
        orelse=[],
    ))
示例#8
0
    def test_compile_ast(self):
        if test_support.due_to_ironpython_bug(
                "http://www.codeplex.com/IronPython/WorkItem/View.aspx?WorkItemId=21088"
        ):
            return
        fname = __file__
        if fname.lower().endswith(('pyc', 'pyo')):
            fname = fname[:-1]
        with open(fname, 'r') as f:
            fcontents = f.read()
        sample_code = [
            ['<assign>', 'x = 5'],
            ['<print1>', 'print 1'],
            ['<printv>', 'print v'],
            ['<printTrue>', 'print True'],
            ['<printList>', 'print []'],
            ['<ifblock>', """if True:\n    pass\n"""],
            ['<forblock>', """for n in [1, 2, 3]:\n    print n\n"""],
            ['<deffunc>', """def foo():\n    pass\nfoo()\n"""],
            [fname, fcontents],
        ]

        for fname, code in sample_code:
            co1 = compile(code, '%s1' % fname, 'exec')
            ast = compile(code, '%s2' % fname, 'exec', _ast.PyCF_ONLY_AST)
            self.assertTrue(type(ast) == _ast.Module)
            co2 = compile(ast, '%s3' % fname, 'exec')
            self.assertEqual(co1, co2)
            # the code object's filename comes from the second compilation step
            self.assertEqual(co2.co_filename, '%s3' % fname)

        # raise exception when node type doesn't match with compile mode
        co1 = compile('print 1', '<string>', 'exec', _ast.PyCF_ONLY_AST)
        self.assertRaises(TypeError, compile, co1, '<ast>', 'eval')

        # raise exception when node type is no start node
        self.assertRaises(TypeError, compile, _ast.If(), '<ast>', 'exec')

        # raise exception when node has invalid children
        ast = _ast.Module()
        ast.body = [_ast.BoolOp()]
        self.assertRaises(TypeError, compile, ast, '<ast>', 'exec')
示例#9
0
    def test_compile_ast(self):
        fname = __file__
        if fname.lower().endswith(('pyc', 'pyo')):
            fname = fname[:-1]
        with open(fname, 'r') as f:
            fcontents = f.read()
        sample_code = [
            ['<assign>', 'x = 5'],
            ['<print1>', 'print 1'],
            ['<printv>', 'print v'],
            ['<printTrue>', 'print True'],
            ['<printList>', 'print []'],
            ['<ifblock>', """if True:\n    pass\n"""],
            ['<forblock>', """for n in [1, 2, 3]:\n    print n\n"""],
            ['<deffunc>', """def foo():\n    pass\nfoo()\n"""],
            #FIXME: Next one not working in Jython:
            #[fname, fcontents],
        ]

        for fname, code in sample_code:
            co1 = compile(code, '%s1' % fname, 'exec')
            ast = compile(code, '%s2' % fname, 'exec', _ast.PyCF_ONLY_AST)
            self.assert_(type(ast) == _ast.Module)
            co2 = compile(ast, '%s3' % fname, 'exec')
            if not test_support.is_jython:
                self.assertEqual(co1, co2)
            # the code object's filename comes from the second compilation step
            self.assertEqual(co2.co_filename, '%s3' % fname)

        # raise exception when node type doesn't match with compile mode
        co1 = compile('print 1', '<string>', 'exec', _ast.PyCF_ONLY_AST)
        #FIXME: raises wrong error in Jython.
        #self.assertRaises(TypeError, compile, co1, '<ast>', 'eval')

        # raise exception when node type is no start node
        self.assertRaises(TypeError, compile, _ast.If(), '<ast>', 'exec')

        # raise exception when node has invalid children
        ast = _ast.Module()
        ast.body = [_ast.BoolOp()]
示例#10
0
def if_stmt(test: _ast.expr, body: List[_ast.stmt],
            orelse: List[_ast.If]) -> _ast.If:
    return _ast.If(test=test, body=body, orelse=orelse)