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
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
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')
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_)
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')
def build_if(): test = menu('test')['test'] test = ast.parse(test).body[0].value add_ast_node(_ast.If( test=test, body=[], orelse=[], ))
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')
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()]
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)