1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# -*- coding: utf-8 -*-
2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler"""
3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    jinja2.nodes
4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ~~~~~~~~~~~~
5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    This module implements additional nodes derived from the ast base node.
7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    It also provides some node tree helper functions like `in_lineno` and
9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    `get_nodes` used by the parser and translator in order to normalize
10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    python and jinja nodes.
11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    :copyright: (c) 2010 by the Jinja Team.
13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    :license: BSD, see LICENSE for more details.
14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler"""
15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerimport operator
16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerfrom collections import deque
18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerfrom jinja2.utils import Markup
19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerfrom jinja2._compat import next, izip, with_metaclass, text_type, \
20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler     method_type, function_type
21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#: the types we support for context functions
24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler_context_function_types = (function_type, method_type)
25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler_binop_to_func = {
28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    '*':        operator.mul,
29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    '/':        operator.truediv,
30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    '//':       operator.floordiv,
31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    '**':       operator.pow,
32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    '%':        operator.mod,
33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    '+':        operator.add,
34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    '-':        operator.sub
35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler_uaop_to_func = {
38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    'not':      operator.not_,
39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    '+':        operator.pos,
40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    '-':        operator.neg
41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler_cmpop_to_func = {
44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    'eq':       operator.eq,
45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    'ne':       operator.ne,
46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    'gt':       operator.gt,
47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    'gteq':     operator.ge,
48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    'lt':       operator.lt,
49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    'lteq':     operator.le,
50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    'in':       lambda a, b: a in b,
51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    'notin':    lambda a, b: a not in b
52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Impossible(Exception):
56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Raised if the node could not perform a requested action."""
57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass NodeType(type):
60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """A metaclass for nodes that handles the field and attribute
61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    inheritance.  fields and attributes from the parent class are
62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    automatically forwarded to the child."""
63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def __new__(cls, name, bases, d):
65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for attr in 'fields', 'attributes':
66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            storage = []
67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            storage.extend(getattr(bases[0], attr, ()))
68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            storage.extend(d.get(attr, ()))
69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            assert len(bases) == 1, 'multiple inheritance not allowed'
70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            assert len(storage) == len(set(storage)), 'layout conflict'
71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            d[attr] = tuple(storage)
72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        d.setdefault('abstract', False)
73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return type.__new__(cls, name, bases, d)
74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass EvalContext(object):
77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Holds evaluation time information.  Custom attributes can be attached
78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    to it in extensions.
79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def __init__(self, environment, template_name=None):
82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        self.environment = environment
83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if callable(environment.autoescape):
84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            self.autoescape = environment.autoescape(template_name)
85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        else:
86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            self.autoescape = environment.autoescape
87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        self.volatile = False
88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def save(self):
90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return self.__dict__.copy()
91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def revert(self, old):
93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        self.__dict__.clear()
94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        self.__dict__.update(old)
95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdef get_eval_context(node, ctx):
98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if ctx is None:
99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if node.environment is None:
100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise RuntimeError('if no eval context is passed, the '
101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                               'node must have an attached '
102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                               'environment.')
103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return EvalContext(node.environment)
104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return ctx
105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Node(with_metaclass(NodeType, object)):
108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Baseclass for all Jinja2 nodes.  There are a number of nodes available
109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    of different types.  There are four major types:
110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    -   :class:`Stmt`: statements
112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    -   :class:`Expr`: expressions
113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    -   :class:`Helper`: helper nodes
114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    -   :class:`Template`: the outermost wrapper node
115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    All nodes have fields and attributes.  Fields may be other nodes, lists,
117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    or arbitrary values.  Fields are passed to the constructor as regular
118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    positional arguments, attributes as keyword arguments.  Each node has
119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    two attributes: `lineno` (the line number of the node) and `environment`.
120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    The `environment` attribute is set at the end of the parsing process for
121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    all nodes automatically.
122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ()
124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    attributes = ('lineno', 'environment')
125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    abstract = True
126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def __init__(self, *fields, **attributes):
128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if self.abstract:
129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise TypeError('abstract nodes are not instanciable')
130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if fields:
131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if len(fields) != len(self.fields):
132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if not self.fields:
133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    raise TypeError('%r takes 0 arguments' %
134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                    self.__class__.__name__)
135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                raise TypeError('%r takes 0 or %d argument%s' % (
136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    self.__class__.__name__,
137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    len(self.fields),
138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    len(self.fields) != 1 and 's' or ''
139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                ))
140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            for name, arg in izip(self.fields, fields):
141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                setattr(self, name, arg)
142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for attr in self.attributes:
143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            setattr(self, attr, attributes.pop(attr, None))
144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if attributes:
145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise TypeError('unknown attribute %r' %
146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                            next(iter(attributes)))
147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def iter_fields(self, exclude=None, only=None):
149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        """This method iterates over all fields that are defined and yields
150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ``(key, value)`` tuples.  Per default all fields are returned, but
151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        it's possible to limit that to some fields by providing the `only`
152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        parameter or to exclude some using the `exclude` parameter.  Both
153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        should be sets or tuples of field names.
154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        """
155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for name in self.fields:
156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if (exclude is only is None) or \
157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               (exclude is not None and name not in exclude) or \
158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               (only is not None and name in only):
159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                try:
160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    yield name, getattr(self, name)
161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                except AttributeError:
162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    pass
163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def iter_child_nodes(self, exclude=None, only=None):
165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        """Iterates over all direct child nodes of the node.  This iterates
166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        over all fields and yields the values of they are nodes.  If the value
167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        of a field is a list all the nodes in that list are returned.
168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        """
169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for field, item in self.iter_fields(exclude, only):
170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if isinstance(item, list):
171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                for n in item:
172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    if isinstance(n, Node):
173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        yield n
174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            elif isinstance(item, Node):
175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                yield item
176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def find(self, node_type):
178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        """Find the first node of a given type.  If no such node exists the
179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return value is `None`.
180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        """
181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for result in self.find_all(node_type):
182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return result
183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def find_all(self, node_type):
185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        """Find all the nodes of a given type.  If the type is a tuple,
186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        the check is performed for any of the tuple items.
187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        """
188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for child in self.iter_child_nodes():
189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if isinstance(child, node_type):
190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                yield child
191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            for result in child.find_all(node_type):
192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                yield result
193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def set_ctx(self, ctx):
195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        """Reset the context of a node and all child nodes.  Per default the
196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        parser will all generate nodes that have a 'load' context as it's the
197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        most common one.  This method is used in the parser to set assignment
198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        targets and other nodes to a store context.
199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        """
200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        todo = deque([self])
201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        while todo:
202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            node = todo.popleft()
203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if 'ctx' in node.fields:
204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                node.ctx = ctx
205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            todo.extend(node.iter_child_nodes())
206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return self
207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def set_lineno(self, lineno, override=False):
209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        """Set the line numbers of the node and children."""
210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        todo = deque([self])
211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        while todo:
212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            node = todo.popleft()
213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if 'lineno' in node.attributes:
214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                if node.lineno is None or override:
215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                    node.lineno = lineno
216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            todo.extend(node.iter_child_nodes())
217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return self
218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def set_environment(self, environment):
220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        """Set the environment for all nodes."""
221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        todo = deque([self])
222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        while todo:
223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            node = todo.popleft()
224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            node.environment = environment
225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            todo.extend(node.iter_child_nodes())
226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return self
227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def __eq__(self, other):
229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return type(self) is type(other) and \
230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               tuple(self.iter_fields()) == tuple(other.iter_fields())
231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def __ne__(self, other):
233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return not self.__eq__(other)
234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    # Restore Python 2 hashing behavior on Python 3
236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    __hash__ = object.__hash__
237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def __repr__(self):
239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return '%s(%s)' % (
240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            self.__class__.__name__,
241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            ', '.join('%s=%r' % (arg, getattr(self, arg, None)) for
242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                      arg in self.fields)
243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        )
244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Stmt(Node):
247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Base node for all statements."""
248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    abstract = True
249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Helper(Node):
252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Nodes that exist in a specific context only."""
253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    abstract = True
254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Template(Node):
257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Node that represents a template.  This must be the outermost node that
258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    is passed to the compiler.
259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('body',)
261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Output(Stmt):
264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """A node that holds multiple expressions which are then printed out.
265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    This is used both for the `print` statement and the regular template data.
266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('nodes',)
268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Extends(Stmt):
271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Represents an extends statement."""
272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('template',)
273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass For(Stmt):
276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """The for loop.  `target` is the target for the iteration (usually a
277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    :class:`Name` or :class:`Tuple`), `iter` the iterable.  `body` is a list
278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    of nodes that are used as loop-body, and `else_` a list of nodes for the
279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    `else` block.  If no else node exists it has to be an empty list.
280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    For filtered nodes an expression can be stored as `test`, otherwise `None`.
282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('target', 'iter', 'body', 'else_', 'test', 'recursive')
284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass If(Stmt):
287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """If `test` is true, `body` is rendered, else `else_`."""
288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('test', 'body', 'else_')
289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Macro(Stmt):
292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """A macro definition.  `name` is the name of the macro, `args` a list of
293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    arguments and `defaults` a list of defaults if there are any.  `body` is
294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    a list of nodes for the macro body.
295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('name', 'args', 'defaults', 'body')
297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass CallBlock(Stmt):
300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Like a macro without a name but a call instead.  `call` is called with
301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    the unnamed macro as `caller` argument this node holds.
302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('call', 'args', 'defaults', 'body')
304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass FilterBlock(Stmt):
307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Node for filter sections."""
308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('body', 'filter')
309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Block(Stmt):
312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """A node that represents a block."""
313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('name', 'body', 'scoped')
314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Include(Stmt):
317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """A node that represents the include tag."""
318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('template', 'with_context', 'ignore_missing')
319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Import(Stmt):
322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """A node that represents the import tag."""
323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('template', 'target', 'with_context')
324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass FromImport(Stmt):
327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """A node that represents the from import tag.  It's important to not
328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    pass unsafe names to the name attribute.  The compiler translates the
329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    attribute lookups directly into getattr calls and does *not* use the
330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    subscript callback of the interface.  As exported variables may not
331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    start with double underscores (which the parser asserts) this is not a
332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    problem for regular Jinja code, but if this node is used in an extension
333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    extra care must be taken.
334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    The list of names may contain tuples if aliases are wanted.
336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('template', 'names', 'with_context')
338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass ExprStmt(Stmt):
341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """A statement that evaluates an expression and discards the result."""
342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('node',)
343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Assign(Stmt):
346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Assigns an expression to a target."""
347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('target', 'node')
348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Expr(Node):
351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Baseclass for all expressions."""
352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    abstract = True
353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        """Return the value of the expression as constant or raise
356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        :exc:`Impossible` if this was not possible.
357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        An :class:`EvalContext` can be provided, if none is given
359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        a default context is created which requires the nodes to have
360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        an attached environment.
361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        .. versionchanged:: 2.4
363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler           the `eval_ctx` parameter was added.
364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        """
365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        raise Impossible()
366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def can_assign(self):
368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        """Check if it's possible to assign something to this node."""
369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return False
370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass BinExpr(Expr):
373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Baseclass for all binary expressions."""
374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('left', 'right')
375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    operator = None
376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    abstract = True
377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        # intercepted operators cannot be folded at compile time
381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if self.environment.sandboxed and \
382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler           self.operator in self.environment.intercepted_binops:
383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        f = _binop_to_func[self.operator]
385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        try:
386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return f(self.left.as_const(eval_ctx), self.right.as_const(eval_ctx))
387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        except Exception:
388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass UnaryExpr(Expr):
392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Baseclass for all unary expressions."""
393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('node',)
394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    operator = None
395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    abstract = True
396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        # intercepted operators cannot be folded at compile time
400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if self.environment.sandboxed and \
401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler           self.operator in self.environment.intercepted_unops:
402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        f = _uaop_to_func[self.operator]
404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        try:
405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return f(self.node.as_const(eval_ctx))
406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        except Exception:
407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Name(Expr):
411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Looks up a name or stores a value in a name.
412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    The `ctx` of the node can be one of the following values:
413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    -   `store`: store a value in the name
415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    -   `load`: load that name
416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    -   `param`: like `store` but if the name was defined as function parameter.
417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('name', 'ctx')
419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def can_assign(self):
421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return self.name not in ('true', 'false', 'none',
422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                 'True', 'False', 'None')
423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Literal(Expr):
426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Baseclass for literals."""
427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    abstract = True
428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Const(Literal):
431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """All constant values.  The parser will return this node for simple
432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    constants such as ``42`` or ``"foo"`` but it can be used to store more
433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    complex values such as lists too.  Only constants with a safe
434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    representation (objects where ``eval(repr(x)) == x`` is true).
435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('value',)
437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return self.value
440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    @classmethod
442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def from_untrusted(cls, value, lineno=None, environment=None):
443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        """Return a const object if the value is representable as
444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        constant value in the generated code, otherwise it will raise
445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        an `Impossible` exception.
446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        """
447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        from .compiler import has_safe_repr
448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if not has_safe_repr(value):
449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return cls(value, lineno=lineno, environment=environment)
451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass TemplateData(Literal):
454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """A constant template string."""
455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('data',)
456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if eval_ctx.volatile:
460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if eval_ctx.autoescape:
462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return Markup(self.data)
463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return self.data
464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Tuple(Literal):
467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """For loop unpacking and some other things like multiple arguments
468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for subscripts.  Like for :class:`Name` `ctx` specifies if the tuple
469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    is used for loading the names or storing.
470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('items', 'ctx')
472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return tuple(x.as_const(eval_ctx) for x in self.items)
476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def can_assign(self):
478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        for item in self.items:
479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if not item.can_assign():
480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return False
481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return True
482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass List(Literal):
485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Any list literal such as ``[1, 2, 3]``"""
486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('items',)
487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return [x.as_const(eval_ctx) for x in self.items]
491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Dict(Literal):
494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Any dict literal such as ``{1: 2, 3: 4}``.  The items must be a list of
495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    :class:`Pair` nodes.
496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('items',)
498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return dict(x.as_const(eval_ctx) for x in self.items)
502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Pair(Helper):
505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """A key, value pair for dicts."""
506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('key', 'value')
507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return self.key.as_const(eval_ctx), self.value.as_const(eval_ctx)
511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Keyword(Helper):
514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """A key, value pair for keyword arguments where key is a string."""
515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('key', 'value')
516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return self.key, self.value.as_const(eval_ctx)
520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass CondExpr(Expr):
523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """A conditional expression (inline if expression).  (``{{
524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    foo if bar else baz }}``)
525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('test', 'expr1', 'expr2')
527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if self.test.as_const(eval_ctx):
531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return self.expr1.as_const(eval_ctx)
532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        # if we evaluate to an undefined object, we better do that at runtime
534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if self.expr2 is None:
535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return self.expr2.as_const(eval_ctx)
538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Filter(Expr):
541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """This node applies a filter on an expression.  `name` is the name of
542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    the filter, the rest of the fields are the same as for :class:`Call`.
543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    If the `node` of a filter is `None` the contents of the last buffer are
545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    filtered.  Buffers are created by macros and filter blocks.
546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if eval_ctx.volatile or self.node is None:
552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        # we have to be careful here because we call filter_ below.
554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        # if this variable would be called filter, 2to3 would wrap the
555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        # call in a list beause it is assuming we are talking about the
556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        # builtin filter function here which no longer returns a list in
557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        # python 3.  because of that, do not rename filter_ to filter!
558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        filter_ = self.environment.filters.get(self.name)
559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if filter_ is None or getattr(filter_, 'contextfilter', False):
560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        obj = self.node.as_const(eval_ctx)
562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        args = [x.as_const(eval_ctx) for x in self.args]
563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if getattr(filter_, 'evalcontextfilter', False):
564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            args.insert(0, eval_ctx)
565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        elif getattr(filter_, 'environmentfilter', False):
566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            args.insert(0, self.environment)
567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        kwargs = dict(x.as_const(eval_ctx) for x in self.kwargs)
568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if self.dyn_args is not None:
569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            try:
570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                args.extend(self.dyn_args.as_const(eval_ctx))
571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            except Exception:
572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                raise Impossible()
573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if self.dyn_kwargs is not None:
574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            try:
575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                kwargs.update(self.dyn_kwargs.as_const(eval_ctx))
576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            except Exception:
577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                raise Impossible()
578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        try:
579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return filter_(obj, *args, **kwargs)
580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        except Exception:
581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Test(Expr):
585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Applies a test on an expression.  `name` is the name of the test, the
586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    rest of the fields are the same as for :class:`Call`.
587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Call(Expr):
592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Calls an expression.  `args` is a list of arguments, `kwargs` a list
593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    of keyword arguments (list of :class:`Keyword` nodes), and `dyn_args`
594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    and `dyn_kwargs` has to be either `None` or a node that is used as
595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    node for dynamic positional (``*args``) or keyword (``**kwargs``)
596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    arguments.
597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('node', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if eval_ctx.volatile:
603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        obj = self.node.as_const(eval_ctx)
605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        # don't evaluate context functions
607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        args = [x.as_const(eval_ctx) for x in self.args]
608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if isinstance(obj, _context_function_types):
609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if getattr(obj, 'contextfunction', False):
610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                raise Impossible()
611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            elif getattr(obj, 'evalcontextfunction', False):
612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                args.insert(0, eval_ctx)
613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            elif getattr(obj, 'environmentfunction', False):
614793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                args.insert(0, self.environment)
615793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
616793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        kwargs = dict(x.as_const(eval_ctx) for x in self.kwargs)
617793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if self.dyn_args is not None:
618793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            try:
619793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                args.extend(self.dyn_args.as_const(eval_ctx))
620793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            except Exception:
621793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                raise Impossible()
622793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if self.dyn_kwargs is not None:
623793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            try:
624793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                kwargs.update(self.dyn_kwargs.as_const(eval_ctx))
625793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            except Exception:
626793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                raise Impossible()
627793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        try:
628793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return obj(*args, **kwargs)
629793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        except Exception:
630793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
631793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
632793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
633793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Getitem(Expr):
634793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Get an attribute or item from an expression and prefer the item."""
635793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('node', 'arg', 'ctx')
636793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
637793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
638793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
639793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if self.ctx != 'load':
640793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
641793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        try:
642793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return self.environment.getitem(self.node.as_const(eval_ctx),
643793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                            self.arg.as_const(eval_ctx))
644793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        except Exception:
645793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
646793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
647793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def can_assign(self):
648793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return False
649793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
650793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
651793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Getattr(Expr):
652793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Get an attribute or item from an expression that is a ascii-only
653793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    bytestring and prefer the attribute.
654793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
655793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('node', 'attr', 'ctx')
656793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
657793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
658793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if self.ctx != 'load':
659793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
660793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        try:
661793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            eval_ctx = get_eval_context(self, eval_ctx)
662793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return self.environment.getattr(self.node.as_const(eval_ctx),
663793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                                            self.attr)
664793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        except Exception:
665793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
666793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
667793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def can_assign(self):
668793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return False
669793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
670793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
671793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Slice(Expr):
672793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Represents a slice object.  This must only be used as argument for
673793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    :class:`Subscript`.
674793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
675793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('start', 'stop', 'step')
676793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
677793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
678793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
679793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        def const(obj):
680793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            if obj is None:
681793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                return None
682793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return obj.as_const(eval_ctx)
683793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return slice(const(self.start), const(self.stop), const(self.step))
684793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
685793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
686793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Concat(Expr):
687793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Concatenates the list of expressions provided after converting them to
688793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    unicode.
689793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
690793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('nodes',)
691793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
692793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
693793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
694793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return ''.join(text_type(x.as_const(eval_ctx)) for x in self.nodes)
695793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
696793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
697793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Compare(Expr):
698793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Compares an expression with some other expressions.  `ops` must be a
699793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    list of :class:`Operand`\s.
700793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
701793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('expr', 'ops')
702793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
703793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
704793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
705793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        result = value = self.expr.as_const(eval_ctx)
706793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        try:
707793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            for op in self.ops:
708793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                new_value = op.expr.as_const(eval_ctx)
709793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                result = _cmpop_to_func[op.op](value, new_value)
710793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                value = new_value
711793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        except Exception:
712793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
713793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return result
714793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
715793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
716793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Operand(Helper):
717793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Holds an operator and an expression."""
718793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('op', 'expr')
719793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
720793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerif __debug__:
721793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Operand.__doc__ += '\nThe following operators are available: ' + \
722793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        ', '.join(sorted('``%s``' % x for x in set(_binop_to_func) |
723793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                  set(_uaop_to_func) | set(_cmpop_to_func)))
724793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
725793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
726793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Mul(BinExpr):
727793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Multiplies the left with the right node."""
728793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    operator = '*'
729793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
730793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
731793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Div(BinExpr):
732793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Divides the left by the right node."""
733793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    operator = '/'
734793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
735793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
736793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass FloorDiv(BinExpr):
737793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Divides the left by the right node and truncates conver the
738793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    result into an integer by truncating.
739793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
740793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    operator = '//'
741793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
742793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
743793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Add(BinExpr):
744793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Add the left to the right node."""
745793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    operator = '+'
746793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
747793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
748793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Sub(BinExpr):
749793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Substract the right from the left node."""
750793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    operator = '-'
751793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
752793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
753793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Mod(BinExpr):
754793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Left modulo right."""
755793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    operator = '%'
756793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
757793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
758793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Pow(BinExpr):
759793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Left to the power of right."""
760793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    operator = '**'
761793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
762793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
763793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass And(BinExpr):
764793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Short circuited AND."""
765793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    operator = 'and'
766793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
767793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
768793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
769793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return self.left.as_const(eval_ctx) and self.right.as_const(eval_ctx)
770793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
771793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
772793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Or(BinExpr):
773793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Short circuited OR."""
774793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    operator = 'or'
775793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
776793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
777793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
778793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return self.left.as_const(eval_ctx) or self.right.as_const(eval_ctx)
779793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
780793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
781793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Not(UnaryExpr):
782793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Negate the expression."""
783793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    operator = 'not'
784793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
785793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
786793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Neg(UnaryExpr):
787793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Make the expression negative."""
788793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    operator = '-'
789793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
790793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
791793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Pos(UnaryExpr):
792793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Make the expression positive (noop for most expressions)"""
793793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    operator = '+'
794793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
795793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
796793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# Helpers for extensions
797793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
798793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
799793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass EnvironmentAttribute(Expr):
800793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Loads an attribute from the environment object.  This is useful for
801793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    extensions that want to call a callback stored on the environment.
802793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
803793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('name',)
804793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
805793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
806793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass ExtensionAttribute(Expr):
807793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Returns the attribute of an extension bound to the environment.
808793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    The identifier is the identifier of the :class:`Extension`.
809793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
810793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    This node is usually constructed by calling the
811793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    :meth:`~jinja2.ext.Extension.attr` method on an extension.
812793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
813793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('identifier', 'name')
814793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
815793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
816793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass ImportedName(Expr):
817793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """If created with an import name the import name is returned on node
818793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    access.  For example ``ImportedName('cgi.escape')`` returns the `escape`
819793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    function from the cgi module on evaluation.  Imports are optimized by the
820793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    compiler so there is no need to assign them to local variables.
821793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
822793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('importname',)
823793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
824793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
825793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass InternalName(Expr):
826793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """An internal name in the compiler.  You cannot create these nodes
827793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    yourself but the parser provides a
828793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    :meth:`~jinja2.parser.Parser.free_identifier` method that creates
829793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    a new identifier for you.  This identifier is not available from the
830793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    template and is not threated specially by the compiler.
831793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
832793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('name',)
833793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
834793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def __init__(self):
835793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        raise TypeError('Can\'t create internal names.  Use the '
836793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                        '`free_identifier` method on a parser.')
837793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
838793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
839793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass MarkSafe(Expr):
840793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Mark the wrapped expression as safe (wrap it as `Markup`)."""
841793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('expr',)
842793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
843793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
844793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
845793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return Markup(self.expr.as_const(eval_ctx))
846793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
847793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
848793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass MarkSafeIfAutoescape(Expr):
849793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Mark the wrapped expression as safe (wrap it as `Markup`) but
850793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    only if autoescaping is active.
851793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
852793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    .. versionadded:: 2.5
853793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
854793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('expr',)
855793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
856793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    def as_const(self, eval_ctx=None):
857793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        eval_ctx = get_eval_context(self, eval_ctx)
858793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if eval_ctx.volatile:
859793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            raise Impossible()
860793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        expr = self.expr.as_const(eval_ctx)
861793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        if eval_ctx.autoescape:
862793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler            return Markup(expr)
863793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return expr
864793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
865793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
866793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass ContextReference(Expr):
867793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Returns the current template context.  It can be used like a
868793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    :class:`Name` node, with a ``'load'`` ctx and will return the
869793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    current :class:`~jinja2.runtime.Context` object.
870793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
871793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Here an example that assigns the current template name to a
872793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    variable named `foo`::
873793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
874793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        Assign(Name('foo', ctx='store'),
875793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               Getattr(ContextReference(), 'name'))
876793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
877793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
878793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
879793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Continue(Stmt):
880793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Continue a loop."""
881793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
882793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
883793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Break(Stmt):
884793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Break a loop."""
885793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
886793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
887793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Scope(Stmt):
888793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """An artificial scope."""
889793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('body',)
890793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
891793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
892793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass EvalContextModifier(Stmt):
893793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Modifies the eval context.  For each option that should be modified,
894793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    a :class:`Keyword` has to be added to the :attr:`options` list.
895793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
896793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Example to change the `autoescape` setting::
897793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
898793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        EvalContextModifier(options=[Keyword('autoescape', Const(True))])
899793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
900793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('options',)
901793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
902793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
903793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass ScopedEvalContextModifier(EvalContextModifier):
904793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """Modifies the eval context and reverts it later.  Works exactly like
905793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    :class:`EvalContextModifier` but will only modify the
906793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    :class:`~jinja2.nodes.EvalContext` for nodes in the :attr:`body`.
907793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    """
908793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    fields = ('body',)
909793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
910793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
911793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# make sure nobody creates custom nodes
912793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerdef _failing_new(*args, **kwargs):
913793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    raise TypeError('can\'t create custom node types')
914793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerNodeType.__new__ = staticmethod(_failing_new); del _failing_new
915