(self)
| 577 | compile(ast.fix_missing_locations(tree), "<file>", "exec") |
| 578 | |
| 579 | def test_compile_ast(self): |
| 580 | fname = __file__ |
| 581 | if fname.lower().endswith('pyc'): |
| 582 | fname = fname[:-1] |
| 583 | with open(fname, encoding='utf-8') as f: |
| 584 | fcontents = f.read() |
| 585 | sample_code = [ |
| 586 | ['<assign>', 'x = 5'], |
| 587 | ['<ifblock>', """if True:\n pass\n"""], |
| 588 | ['<forblock>', """for n in [1, 2, 3]:\n print(n)\n"""], |
| 589 | ['<deffunc>', """def foo():\n pass\nfoo()\n"""], |
| 590 | [fname, fcontents], |
| 591 | ] |
| 592 | |
| 593 | for fname, code in sample_code: |
| 594 | co1 = compile(code, '%s1' % fname, 'exec') |
| 595 | ast = compile(code, '%s2' % fname, 'exec', _ast.PyCF_ONLY_AST) |
| 596 | self.assertTrue(type(ast) == _ast.Module) |
| 597 | co2 = compile(ast, '%s3' % fname, 'exec') |
| 598 | self.assertEqual(co1, co2) |
| 599 | # the code object's filename comes from the second compilation step |
| 600 | self.assertEqual(co2.co_filename, '%s3' % fname) |
| 601 | |
| 602 | # raise exception when node type doesn't match with compile mode |
| 603 | co1 = compile('print(1)', '<string>', 'exec', _ast.PyCF_ONLY_AST) |
| 604 | self.assertRaises(TypeError, compile, co1, '<ast>', 'eval') |
| 605 | |
| 606 | # raise exception when node type is no start node |
| 607 | self.assertRaises(TypeError, compile, _ast.If(test=_ast.Name(id='x', ctx=_ast.Load())), '<ast>', 'exec') |
| 608 | |
| 609 | # raise exception when node has invalid children |
| 610 | ast = _ast.Module() |
| 611 | ast.body = [_ast.BoolOp(op=_ast.Or())] |
| 612 | self.assertRaises(TypeError, compile, ast, '<ast>', 'exec') |
| 613 | |
| 614 | def test_compile_invalid_typealias(self): |
| 615 | # gh-109341 |
nothing calls this directly
no test coverage detected