(self, node, frame=None)
| 693 | # -- Statement Visitors |
| 694 | |
| 695 | def visit_Template(self, node, frame=None): |
| 696 | assert frame is None, 'no root frame allowed' |
| 697 | eval_ctx = EvalContext(self.environment, self.name) |
| 698 | |
| 699 | from jinja2.runtime import __all__ as exported |
| 700 | self.writeline('from __future__ import %s' % ', '.join(code_features)) |
| 701 | self.writeline('from jinja2.runtime import ' + ', '.join(exported)) |
| 702 | |
| 703 | if self.environment.is_async: |
| 704 | self.writeline('from jinja2.asyncsupport import auto_await, ' |
| 705 | 'auto_aiter, make_async_loop_context') |
| 706 | |
| 707 | # if we want a deferred initialization we cannot move the |
| 708 | # environment into a local name |
| 709 | envenv = not self.defer_init and ', environment=environment' or '' |
| 710 | |
| 711 | # do we have an extends tag at all? If not, we can save some |
| 712 | # overhead by just not processing any inheritance code. |
| 713 | have_extends = node.find(nodes.Extends) is not None |
| 714 | |
| 715 | # find all blocks |
| 716 | for block in node.find_all(nodes.Block): |
| 717 | if block.name in self.blocks: |
| 718 | self.fail('block %r defined twice' % block.name, block.lineno) |
| 719 | self.blocks[block.name] = block |
| 720 | |
| 721 | # find all imports and import them |
| 722 | for import_ in node.find_all(nodes.ImportedName): |
| 723 | if import_.importname not in self.import_aliases: |
| 724 | imp = import_.importname |
| 725 | self.import_aliases[imp] = alias = self.temporary_identifier() |
| 726 | if '.' in imp: |
| 727 | module, obj = imp.rsplit('.', 1) |
| 728 | self.writeline('from %s import %s as %s' % |
| 729 | (module, obj, alias)) |
| 730 | else: |
| 731 | self.writeline('import %s as %s' % (imp, alias)) |
| 732 | |
| 733 | # add the load name |
| 734 | self.writeline('name = %r' % self.name) |
| 735 | |
| 736 | # generate the root render function. |
| 737 | self.writeline('%s(context, missing=missing%s):' % |
| 738 | (self.func('root'), envenv), extra=1) |
| 739 | self.indent() |
| 740 | self.write_commons() |
| 741 | |
| 742 | # process the root |
| 743 | frame = Frame(eval_ctx) |
| 744 | if 'self' in find_undeclared(node.body, ('self',)): |
| 745 | ref = frame.symbols.declare_parameter('self') |
| 746 | self.writeline('%s = TemplateReference(context)' % ref) |
| 747 | frame.symbols.analyze_node(node) |
| 748 | frame.toplevel = frame.rootlevel = True |
| 749 | frame.require_output_check = have_extends and not self.has_known_extends |
| 750 | if have_extends: |
| 751 | self.writeline('parent_template = None') |
| 752 | self.enter_frame(frame) |
nothing calls this directly
no test coverage detected