blob: 0db061a3f22bd69df9b0e40aba2ecea3b90b1eae [file] [log] [blame]
Armin Ronacher07bc6842008-03-31 14:18:49 +02001# -*- coding: utf-8 -*-
2"""
3 jinja2.nodes
4 ~~~~~~~~~~~~
5
6 This module implements additional nodes derived from the ast base node.
7
8 It also provides some node tree helper functions like `in_lineno` and
9 `get_nodes` used by the parser and translator in order to normalize
10 python and jinja nodes.
11
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020012 :copyright: 2008 by Armin Ronacher.
Armin Ronacher07bc6842008-03-31 14:18:49 +020013 :license: BSD, see LICENSE for more details.
14"""
15import operator
Armin Ronacher7ceced52008-05-03 10:15:31 +020016from copy import copy
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020017from types import FunctionType
Armin Ronacher07bc6842008-03-31 14:18:49 +020018from itertools import chain, izip
Armin Ronacher82b3f3d2008-03-31 20:01:08 +020019from collections import deque
Armin Ronacherd84ec462008-04-29 13:43:16 +020020from jinja2.utils import Markup
Armin Ronacher07bc6842008-03-31 14:18:49 +020021
22
23_binop_to_func = {
24 '*': operator.mul,
25 '/': operator.truediv,
26 '//': operator.floordiv,
27 '**': operator.pow,
28 '%': operator.mod,
29 '+': operator.add,
30 '-': operator.sub
31}
32
33_uaop_to_func = {
34 'not': operator.not_,
35 '+': operator.pos,
36 '-': operator.neg
37}
38
Armin Ronacher625215e2008-04-13 16:31:08 +020039_cmpop_to_func = {
40 'eq': operator.eq,
41 'ne': operator.ne,
42 'gt': operator.gt,
43 'gteq': operator.ge,
44 'lt': operator.lt,
45 'lteq': operator.le,
Armin Ronacherb5124e62008-04-25 00:36:14 +020046 'in': lambda a, b: a in b,
47 'notin': lambda a, b: a not in b
Armin Ronacher625215e2008-04-13 16:31:08 +020048}
49
Armin Ronacher07bc6842008-03-31 14:18:49 +020050
Armin Ronacher023b5e92008-05-08 11:03:10 +020051# if this is `True` no new Node classes can be created.
52_node_setup_finished = False
53
54
Armin Ronacher07bc6842008-03-31 14:18:49 +020055class Impossible(Exception):
Armin Ronacher8efc5222008-04-08 14:47:40 +020056 """Raised if the node could not perform a requested action."""
Armin Ronacher07bc6842008-03-31 14:18:49 +020057
58
59class NodeType(type):
Armin Ronacher8efc5222008-04-08 14:47:40 +020060 """A metaclass for nodes that handles the field and attribute
61 inheritance. fields and attributes from the parent class are
62 automatically forwarded to the child."""
Armin Ronacher07bc6842008-03-31 14:18:49 +020063
64 def __new__(cls, name, bases, d):
Armin Ronacher023b5e92008-05-08 11:03:10 +020065 if __debug__ and _node_setup_finished:
66 raise TypeError('Can\'t create custom node types.')
Armin Ronachere791c2a2008-04-07 18:39:54 +020067 for attr in 'fields', 'attributes':
Armin Ronacher07bc6842008-03-31 14:18:49 +020068 storage = []
Armin Ronacher7324eb82008-04-21 07:55:52 +020069 storage.extend(getattr(bases[0], attr, ()))
Armin Ronacher07bc6842008-03-31 14:18:49 +020070 storage.extend(d.get(attr, ()))
Armin Ronacher7324eb82008-04-21 07:55:52 +020071 assert len(bases) == 1, 'multiple inheritance not allowed'
72 assert len(storage) == len(set(storage)), 'layout conflict'
Armin Ronacher07bc6842008-03-31 14:18:49 +020073 d[attr] = tuple(storage)
Armin Ronacher023b5e92008-05-08 11:03:10 +020074 d.setdefault('abstract', False)
Armin Ronacher7324eb82008-04-21 07:55:52 +020075 return type.__new__(cls, name, bases, d)
Armin Ronacher07bc6842008-03-31 14:18:49 +020076
77
78class Node(object):
Armin Ronacher023b5e92008-05-08 11:03:10 +020079 """Baseclass for all Jinja2 nodes. There are a number of nodes available
80 of different types. There are three major types:
81
82 - :class:`Stmt`: statements
83 - :class:`Expr`: expressions
84 - :class:`Helper`: helper nodes
85 - :class:`Template`: the outermost wrapper node
86
87 All nodes have fields and attributes. Fields may be other nodes, lists,
88 or arbitrary values. Fields are passed to the constructor as regular
89 positional arguments, attributes as keyword arguments. Each node has
90 two attributes: `lineno` (the line number of the node) and `environment`.
91 The `environment` attribute is set at the end of the parsing process for
92 all nodes automatically.
Armin Ronacher69e12db2008-05-12 09:00:03 +020093
94 Nodes can be frozen which makes them hashable. The compiler freezes the
95 nodes automatically. Modifications on frozen nodes are possible but not
96 allowed.
Armin Ronacher023b5e92008-05-08 11:03:10 +020097 """
Armin Ronacher07bc6842008-03-31 14:18:49 +020098 __metaclass__ = NodeType
Armin Ronachere791c2a2008-04-07 18:39:54 +020099 fields = ()
Armin Ronacherd55ab532008-04-09 16:13:39 +0200100 attributes = ('lineno', 'environment')
Armin Ronacher023b5e92008-05-08 11:03:10 +0200101 abstract = True
Armin Ronacher69e12db2008-05-12 09:00:03 +0200102 frozen = False
Armin Ronacher07bc6842008-03-31 14:18:49 +0200103
Armin Ronacher023b5e92008-05-08 11:03:10 +0200104 def __init__(self, *fields, **attributes):
Armin Ronacher69e12db2008-05-12 09:00:03 +0200105 if self.abstract:
106 raise TypeError('abstract nodes are not instanciable')
Armin Ronacher023b5e92008-05-08 11:03:10 +0200107 if fields:
108 if len(fields) != len(self.fields):
Armin Ronachere791c2a2008-04-07 18:39:54 +0200109 if not self.fields:
Armin Ronacher07bc6842008-03-31 14:18:49 +0200110 raise TypeError('%r takes 0 arguments' %
111 self.__class__.__name__)
112 raise TypeError('%r takes 0 or %d argument%s' % (
113 self.__class__.__name__,
Armin Ronachere791c2a2008-04-07 18:39:54 +0200114 len(self.fields),
115 len(self.fields) != 1 and 's' or ''
Armin Ronacher07bc6842008-03-31 14:18:49 +0200116 ))
Armin Ronacher023b5e92008-05-08 11:03:10 +0200117 for name, arg in izip(self.fields, fields):
Armin Ronacher07bc6842008-03-31 14:18:49 +0200118 setattr(self, name, arg)
Armin Ronachere791c2a2008-04-07 18:39:54 +0200119 for attr in self.attributes:
Armin Ronacher023b5e92008-05-08 11:03:10 +0200120 setattr(self, attr, attributes.pop(attr, None))
121 if attributes:
122 raise TypeError('unknown attribute %r' %
123 iter(attributes).next())
Armin Ronacher07bc6842008-03-31 14:18:49 +0200124
Armin Ronacher2feed1d2008-04-26 16:26:52 +0200125 def iter_fields(self, exclude=()):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200126 """This method iterates over all fields that are defined and yields
127 ``(key, value)`` tuples. Optionally a parameter of ignored fields
128 can be provided.
129 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200130 for name in self.fields:
Armin Ronacher2feed1d2008-04-26 16:26:52 +0200131 if name not in exclude:
132 try:
133 yield name, getattr(self, name)
134 except AttributeError:
135 pass
Armin Ronacher07bc6842008-03-31 14:18:49 +0200136
Armin Ronacher2feed1d2008-04-26 16:26:52 +0200137 def iter_child_nodes(self, exclude=()):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200138 """Iterates over all direct child nodes of the node. This iterates
139 over all fields and yields the values of they are nodes. If the value
140 of a field is a list all the nodes in that list are returned.
141 """
Armin Ronacher2feed1d2008-04-26 16:26:52 +0200142 for field, item in self.iter_fields(exclude):
Armin Ronacher07bc6842008-03-31 14:18:49 +0200143 if isinstance(item, list):
144 for n in item:
145 if isinstance(n, Node):
146 yield n
147 elif isinstance(item, Node):
148 yield item
149
Armin Ronachere791c2a2008-04-07 18:39:54 +0200150 def find(self, node_type):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200151 """Find the first node of a given type. If no such node exists the
152 return value is `None`.
153 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200154 for result in self.find_all(node_type):
155 return result
156
157 def find_all(self, node_type):
158 """Find all the nodes of a given type."""
159 for child in self.iter_child_nodes():
160 if isinstance(child, node_type):
161 yield child
162 for result in child.find_all(node_type):
163 yield result
164
Armin Ronacher0ecb8592008-04-09 16:29:47 +0200165 def copy(self):
166 """Return a deep copy of the node."""
167 result = object.__new__(self.__class__)
168 for field, value in self.iter_fields():
169 if isinstance(value, Node):
170 new_value = value.copy()
171 elif isinstance(value, list):
172 new_value = []
Armin Ronacherd436e982008-04-09 16:31:20 +0200173 for item in value:
Armin Ronacher0ecb8592008-04-09 16:29:47 +0200174 if isinstance(item, Node):
175 item = item.copy()
176 else:
177 item = copy(item)
178 new_value.append(item)
179 else:
Armin Ronacherd436e982008-04-09 16:31:20 +0200180 new_value = copy(value)
Armin Ronacher0ecb8592008-04-09 16:29:47 +0200181 setattr(result, field, new_value)
182 for attr in self.attributes:
183 try:
184 setattr(result, attr, getattr(self, attr))
185 except AttributeError:
186 pass
187 return result
188
Armin Ronachere791c2a2008-04-07 18:39:54 +0200189 def set_ctx(self, ctx):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200190 """Reset the context of a node and all child nodes. Per default the
191 parser will all generate nodes that have a 'load' context as it's the
192 most common one. This method is used in the parser to set assignment
193 targets and other nodes to a store context.
Armin Ronachere791c2a2008-04-07 18:39:54 +0200194 """
195 todo = deque([self])
196 while todo:
197 node = todo.popleft()
198 if 'ctx' in node.fields:
199 node.ctx = ctx
200 todo.extend(node.iter_child_nodes())
Armin Ronacher023b5e92008-05-08 11:03:10 +0200201 return self
Armin Ronachere791c2a2008-04-07 18:39:54 +0200202
Armin Ronacher2e9396b2008-04-16 14:21:57 +0200203 def set_lineno(self, lineno, override=False):
204 """Set the line numbers of the node and children."""
205 todo = deque([self])
206 while todo:
207 node = todo.popleft()
208 if 'lineno' in node.attributes:
209 if node.lineno is None or override:
210 node.lineno = lineno
211 todo.extend(node.iter_child_nodes())
Armin Ronacher023b5e92008-05-08 11:03:10 +0200212 return self
Armin Ronacher2e9396b2008-04-16 14:21:57 +0200213
Armin Ronacherd55ab532008-04-09 16:13:39 +0200214 def set_environment(self, environment):
215 """Set the environment for all nodes."""
216 todo = deque([self])
217 while todo:
218 node = todo.popleft()
219 node.environment = environment
220 todo.extend(node.iter_child_nodes())
Armin Ronacher023b5e92008-05-08 11:03:10 +0200221 return self
Armin Ronacherd55ab532008-04-09 16:13:39 +0200222
Armin Ronacher69e12db2008-05-12 09:00:03 +0200223 def freeze(self):
224 """Freeze the complete node tree which makes them hashable.
225 This happens automatically on compilation. Frozen nodes must not be
226 modified any further. Extensions may not freeze nodes that appear
227 in the final node tree (ie: nodes that are returned from the extension
228 parse method).
229 """
230 todo = deque([self])
231 while todo:
232 node = todo.popleft()
233 node.frozen = True
234 todo.extend(node.iter_child_nodes())
235
236 def __eq__(self, other):
237 return type(self) is type(other) and self.__dict__ == other.__dict__
238
239 def __ne__(self, other):
240 return not self.__eq__(other)
241
242 def __hash__(self):
243 if not self.frozen:
244 raise TypeError('unfrozen nodes are unhashable')
245 return hash(tuple(self.__dict__.items()))
246
Armin Ronacher07bc6842008-03-31 14:18:49 +0200247 def __repr__(self):
248 return '%s(%s)' % (
249 self.__class__.__name__,
250 ', '.join('%s=%r' % (arg, getattr(self, arg, None)) for
Armin Ronachere791c2a2008-04-07 18:39:54 +0200251 arg in self.fields)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200252 )
253
254
255class Stmt(Node):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200256 """Base node for all statements."""
Armin Ronacher023b5e92008-05-08 11:03:10 +0200257 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200258
259
260class Helper(Node):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200261 """Nodes that exist in a specific context only."""
Armin Ronacher023b5e92008-05-08 11:03:10 +0200262 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200263
264
265class Template(Node):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200266 """Node that represents a template. This must be the outermost node that
267 is passed to the compiler.
268 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200269 fields = ('body',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200270
271
272class Output(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200273 """A node that holds multiple expressions which are then printed out.
274 This is used both for the `print` statement and the regular template data.
Armin Ronacher07bc6842008-03-31 14:18:49 +0200275 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200276 fields = ('nodes',)
277
278 def optimized_nodes(self):
279 """Try to optimize the nodes."""
280 buffer = []
281 for node in self.nodes:
282 try:
283 const = unicode(node.as_const())
284 except:
285 buffer.append(node)
286 else:
287 if buffer and isinstance(buffer[-1], unicode):
288 buffer[-1] += const
289 else:
290 buffer.append(const)
291 return buffer
Armin Ronacher07bc6842008-03-31 14:18:49 +0200292
293
294class Extends(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200295 """Represents an extends statement."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200296 fields = ('template',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200297
298
299class For(Stmt):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200300 """The for loop. `target` is the target for the iteration (usually a
301 :class:`Name` or :class:`Tuple`), `iter` the iterable. `body` is a list
302 of nodes that are used as loop-body, and `else_` a list of nodes for the
303 `else` block. If no else node exists it has to be an empty list.
304
305 For filtered nodes an expression can be stored as `test`, otherwise `None`.
306 """
Armin Ronacherfdf95302008-05-11 22:20:51 +0200307 fields = ('target', 'iter', 'body', 'else_', 'test', 'recursive')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200308
309
310class If(Stmt):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200311 """If `test` is true, `body` is rendered, else `else_`."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200312 fields = ('test', 'body', 'else_')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200313
314
315class Macro(Stmt):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200316 """A macro definition. `name` is the name of the macro, `args` a list of
317 arguments and `defaults` a list of defaults if there are any. `body` is
318 a list of nodes for the macro body.
319 """
Armin Ronacher8efc5222008-04-08 14:47:40 +0200320 fields = ('name', 'args', 'defaults', 'body')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200321
322
323class CallBlock(Stmt):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200324 """Like a macro without a name but a call instead. `call` is called with
325 the unnamed macro as `caller` argument this node holds.
326 """
Armin Ronacherc9705c22008-04-27 21:28:03 +0200327 fields = ('call', 'args', 'defaults', 'body')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200328
329
330class Set(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200331 """Allows defining own variables."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200332 fields = ('name', 'expr')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200333
334
335class FilterBlock(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200336 """Node for filter sections."""
Armin Ronacherfa865fb2008-04-12 22:11:53 +0200337 fields = ('body', 'filter')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200338
339
340class Block(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200341 """A node that represents a block."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200342 fields = ('name', 'body')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200343
344
345class Include(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200346 """A node that represents the include tag."""
Armin Ronacherea847c52008-05-02 20:04:32 +0200347 fields = ('template', 'with_context')
Armin Ronacher0611e492008-04-25 23:44:14 +0200348
349
350class Import(Stmt):
351 """A node that represents the import tag."""
Armin Ronacherea847c52008-05-02 20:04:32 +0200352 fields = ('template', 'target', 'with_context')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200353
354
Armin Ronacher0611e492008-04-25 23:44:14 +0200355class FromImport(Stmt):
356 """A node that represents the from import tag. It's important to not
357 pass unsafe names to the name attribute. The compiler translates the
358 attribute lookups directly into getattr calls and does *not* use the
359 subscribe callback of the interface. As exported variables may not
360 start with double underscores (which the parser asserts) this is not a
361 problem for regular Jinja code, but if this node is used in an extension
362 extra care must be taken.
Armin Ronacher2feed1d2008-04-26 16:26:52 +0200363
364 The list of names may contain tuples if aliases are wanted.
Armin Ronacher0611e492008-04-25 23:44:14 +0200365 """
Armin Ronacherea847c52008-05-02 20:04:32 +0200366 fields = ('template', 'names', 'with_context')
Armin Ronacher0611e492008-04-25 23:44:14 +0200367
368
Armin Ronacher07bc6842008-03-31 14:18:49 +0200369class ExprStmt(Stmt):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200370 """A statement that evaluates an expression and discards the result."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200371 fields = ('node',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200372
373
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200374class Assign(Stmt):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200375 """Assigns an expression to a target."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200376 fields = ('target', 'node')
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200377
378
Armin Ronacher07bc6842008-03-31 14:18:49 +0200379class Expr(Node):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200380 """Baseclass for all expressions."""
Armin Ronacher023b5e92008-05-08 11:03:10 +0200381 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200382
383 def as_const(self):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200384 """Return the value of the expression as constant or raise
Armin Ronacher023b5e92008-05-08 11:03:10 +0200385 :exc:`Impossible` if this was not possible:
386
387 >>> Add(Const(23), Const(42)).as_const()
388 65
389 >>> Add(Const(23), Name('var', 'load')).as_const()
390 Traceback (most recent call last):
391 ...
392 Impossible
393
394 This requires the `environment` attribute of all nodes to be
395 set to the environment that created the nodes.
Armin Ronacher07bc6842008-03-31 14:18:49 +0200396 """
397 raise Impossible()
398
399 def can_assign(self):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200400 """Check if it's possible to assign something to this node."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200401 return False
402
403
404class BinExpr(Expr):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200405 """Baseclass for all binary expressions."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200406 fields = ('left', 'right')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200407 operator = None
Armin Ronacher69e12db2008-05-12 09:00:03 +0200408 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200409
410 def as_const(self):
411 f = _binop_to_func[self.operator]
412 try:
413 return f(self.left.as_const(), self.right.as_const())
414 except:
Armin Ronacher07bc6842008-03-31 14:18:49 +0200415 raise Impossible()
416
417
418class UnaryExpr(Expr):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200419 """Baseclass for all unary expressions."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200420 fields = ('node',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200421 operator = None
Armin Ronacher69e12db2008-05-12 09:00:03 +0200422 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200423
424 def as_const(self):
425 f = _uaop_to_func[self.operator]
426 try:
427 return f(self.node.as_const())
428 except:
429 raise Impossible()
430
431
432class Name(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200433 """Looks up a name or stores a value in a name.
434 The `ctx` of the node can be one of the following values:
435
436 - `store`: store a value in the name
437 - `load`: load that name
438 - `param`: like `store` but if the name was defined as function parameter.
439 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200440 fields = ('name', 'ctx')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200441
442 def can_assign(self):
Armin Ronachere791c2a2008-04-07 18:39:54 +0200443 return self.name not in ('true', 'false', 'none')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200444
445
446class Literal(Expr):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200447 """Baseclass for literals."""
Armin Ronacher69e12db2008-05-12 09:00:03 +0200448 abstract = True
Armin Ronacher07bc6842008-03-31 14:18:49 +0200449
450
451class Const(Literal):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200452 """All constant values. The parser will return this node for simple
453 constants such as ``42`` or ``"foo"`` but it can be used to store more
454 complex values such as lists too. Only constants with a safe
455 representation (objects where ``eval(repr(x)) == x`` is true).
456 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200457 fields = ('value',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200458
459 def as_const(self):
460 return self.value
461
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200462 @classmethod
Armin Ronacherd55ab532008-04-09 16:13:39 +0200463 def from_untrusted(cls, value, lineno=None, environment=None):
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200464 """Return a const object if the value is representable as
465 constant value in the generated code, otherwise it will raise
Armin Ronacher2e9396b2008-04-16 14:21:57 +0200466 an `Impossible` exception.
467 """
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200468 from compiler import has_safe_repr
469 if not has_safe_repr(value):
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200470 raise Impossible()
Armin Ronacherd55ab532008-04-09 16:13:39 +0200471 return cls(value, lineno=lineno, environment=environment)
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200472
Armin Ronacher07bc6842008-03-31 14:18:49 +0200473
474class Tuple(Literal):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200475 """For loop unpacking and some other things like multiple arguments
Armin Ronacher023b5e92008-05-08 11:03:10 +0200476 for subscripts. Like for :class:`Name` `ctx` specifies if the tuple
477 is used for loading the names or storing.
Armin Ronacher07bc6842008-03-31 14:18:49 +0200478 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200479 fields = ('items', 'ctx')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200480
481 def as_const(self):
482 return tuple(x.as_const() for x in self.items)
483
484 def can_assign(self):
485 for item in self.items:
486 if not item.can_assign():
487 return False
488 return True
489
490
491class List(Literal):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200492 """Any list literal such as ``[1, 2, 3]``"""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200493 fields = ('items',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200494
495 def as_const(self):
496 return [x.as_const() for x in self.items]
497
498
499class Dict(Literal):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200500 """Any dict literal such as ``{1: 2, 3: 4}``. The items must be a list of
501 :class:`Pair` nodes.
502 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200503 fields = ('items',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200504
505 def as_const(self):
506 return dict(x.as_const() for x in self.items)
507
508
509class Pair(Helper):
Armin Ronacher8efc5222008-04-08 14:47:40 +0200510 """A key, value pair for dicts."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200511 fields = ('key', 'value')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200512
513 def as_const(self):
514 return self.key.as_const(), self.value.as_const()
515
516
Armin Ronacher8efc5222008-04-08 14:47:40 +0200517class Keyword(Helper):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200518 """A key, value pair for keyword arguments where key is a string."""
Armin Ronacher8efc5222008-04-08 14:47:40 +0200519 fields = ('key', 'value')
520
521
Armin Ronacher07bc6842008-03-31 14:18:49 +0200522class CondExpr(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200523 """A conditional expression (inline if expression). (``{{
524 foo if bar else baz }}``)
525 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200526 fields = ('test', 'expr1', 'expr2')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200527
528 def as_const(self):
529 if self.test.as_const():
530 return self.expr1.as_const()
531 return self.expr2.as_const()
532
533
534class Filter(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200535 """This node applies a filter on an expression. `name` is the name of
536 the filter, the rest of the fields are the same as for :class:`Call`.
537 """
Armin Ronacherd55ab532008-04-09 16:13:39 +0200538 fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200539
Armin Ronacher00d5d212008-04-13 01:10:18 +0200540 def as_const(self, obj=None):
541 if self.node is obj is None:
Armin Ronacherfa865fb2008-04-12 22:11:53 +0200542 raise Impossible()
Armin Ronacherd55ab532008-04-09 16:13:39 +0200543 filter = self.environment.filters.get(self.name)
544 if filter is None or getattr(filter, 'contextfilter', False):
Christoph Hacke9e43bb2008-04-13 23:35:48 +0200545 raise Impossible()
Armin Ronacher00d5d212008-04-13 01:10:18 +0200546 if obj is None:
547 obj = self.node.as_const()
Armin Ronacherd55ab532008-04-09 16:13:39 +0200548 args = [x.as_const() for x in self.args]
Armin Ronacher9a027f42008-04-17 11:13:40 +0200549 if getattr(filter, 'environmentfilter', False):
550 args.insert(0, self.environment)
Armin Ronacherd55ab532008-04-09 16:13:39 +0200551 kwargs = dict(x.as_const() for x in self.kwargs)
552 if self.dyn_args is not None:
553 try:
554 args.extend(self.dyn_args.as_const())
555 except:
556 raise Impossible()
557 if self.dyn_kwargs is not None:
558 try:
559 kwargs.update(self.dyn_kwargs.as_const())
560 except:
561 raise Impossible()
562 try:
563 return filter(obj, *args, **kwargs)
564 except:
Christoph Hacke9e43bb2008-04-13 23:35:48 +0200565 raise Impossible()
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200566
567
Armin Ronacher07bc6842008-03-31 14:18:49 +0200568class Test(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200569 """Applies a test on an expression. `name` is the name of the test, the
570 rest of the fields are the same as for :class:`Call`.
571 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200572 fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200573
574
575class Call(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200576 """Calls an expression. `args` is a list of arguments, `kwargs` a list
577 of keyword arguments (list of :class:`Keyword` nodes), and `dyn_args`
578 and `dyn_kwargs` has to be either `None` or a node that is used as
579 node for dynamic positional (``*args``) or keyword (``**kwargs``)
580 arguments.
581 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200582 fields = ('node', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200583
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200584 def as_const(self):
585 obj = self.node.as_const()
Armin Ronacher4f7d2d52008-04-22 10:40:26 +0200586
587 # don't evaluate context functions
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200588 args = [x.as_const() for x in self.args]
Armin Ronacher203bfcb2008-04-24 21:54:44 +0200589 if type(obj) is FunctionType:
590 if getattr(obj, 'contextfunction', False):
591 raise Impossible()
592 elif obj.environmentfunction:
593 args.insert(0, self.environment)
594
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200595 kwargs = dict(x.as_const() for x in self.kwargs)
596 if self.dyn_args is not None:
597 try:
598 args.extend(self.dyn_args.as_const())
599 except:
600 raise Impossible()
601 if self.dyn_kwargs is not None:
602 try:
Armin Ronacherd55ab532008-04-09 16:13:39 +0200603 kwargs.update(self.dyn_kwargs.as_const())
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200604 except:
605 raise Impossible()
606 try:
607 return obj(*args, **kwargs)
608 except:
Christoph Hacke9e43bb2008-04-13 23:35:48 +0200609 raise Impossible()
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200610
Armin Ronacher07bc6842008-03-31 14:18:49 +0200611
612class Subscript(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200613 """Subscribe an expression by an argument. This node performs a dict
614 and an attribute lookup on the object whatever succeeds.
615 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200616 fields = ('node', 'arg', 'ctx')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200617
618 def as_const(self):
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200619 if self.ctx != 'load':
620 raise Impossible()
Armin Ronacher07bc6842008-03-31 14:18:49 +0200621 try:
Benjamin Wieganda3152742008-04-28 18:07:52 +0200622 return self.environment.subscribe(self.node.as_const(),
623 self.arg.as_const())
Armin Ronacher07bc6842008-03-31 14:18:49 +0200624 except:
625 raise Impossible()
626
627 def can_assign(self):
Armin Ronacher4f7d2d52008-04-22 10:40:26 +0200628 return False
Armin Ronacher07bc6842008-03-31 14:18:49 +0200629
630
631class Slice(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200632 """Represents a slice object. This must only be used as argument for
633 :class:`Subscript`.
634 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200635 fields = ('start', 'stop', 'step')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200636
Armin Ronacher4dfc9752008-04-09 15:03:29 +0200637 def as_const(self):
638 def const(obj):
639 if obj is None:
640 return obj
641 return obj.as_const()
642 return slice(const(self.start), const(self.stop), const(self.step))
643
Armin Ronacher07bc6842008-03-31 14:18:49 +0200644
645class Concat(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200646 """Concatenates the list of expressions provided after converting them to
647 unicode.
648 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200649 fields = ('nodes',)
Armin Ronacher07bc6842008-03-31 14:18:49 +0200650
651 def as_const(self):
652 return ''.join(unicode(x.as_const()) for x in self.nodes)
653
654
655class Compare(Expr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200656 """Compares an expression with some other expressions. `ops` must be a
657 list of :class:`Operand`\s.
658 """
Armin Ronachere791c2a2008-04-07 18:39:54 +0200659 fields = ('expr', 'ops')
Armin Ronacher07bc6842008-03-31 14:18:49 +0200660
Armin Ronacher625215e2008-04-13 16:31:08 +0200661 def as_const(self):
662 result = value = self.expr.as_const()
Armin Ronacherb5124e62008-04-25 00:36:14 +0200663 try:
664 for op in self.ops:
665 new_value = op.expr.as_const()
666 result = _cmpop_to_func[op.op](value, new_value)
667 value = new_value
668 except:
669 raise Impossible()
Armin Ronacher625215e2008-04-13 16:31:08 +0200670 return result
671
Armin Ronacher07bc6842008-03-31 14:18:49 +0200672
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200673class Operand(Helper):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200674 """Holds an operator and an expression."""
Armin Ronachere791c2a2008-04-07 18:39:54 +0200675 fields = ('op', 'expr')
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200676
Armin Ronacher023b5e92008-05-08 11:03:10 +0200677if __debug__:
678 Operand.__doc__ += '\nThe following operators are available: ' + \
679 ', '.join(sorted('``%s``' % x for x in set(_binop_to_func) |
680 set(_uaop_to_func) | set(_cmpop_to_func)))
681
Armin Ronacher82b3f3d2008-03-31 20:01:08 +0200682
Armin Ronacher07bc6842008-03-31 14:18:49 +0200683class Mul(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200684 """Multiplies the left with the right node."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200685 operator = '*'
686
687
688class Div(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200689 """Divides the left by the right node."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200690 operator = '/'
691
692
693class FloorDiv(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200694 """Divides the left by the right node and truncates conver the
695 result into an integer by truncating.
696 """
Armin Ronacher07bc6842008-03-31 14:18:49 +0200697 operator = '//'
698
699
700class Add(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200701 """Add the left to the right node."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200702 operator = '+'
703
704
705class Sub(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200706 """Substract the right from the left node."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200707 operator = '-'
708
709
710class Mod(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200711 """Left modulo right."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200712 operator = '%'
713
714
715class Pow(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200716 """Left to the power of right."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200717 operator = '**'
718
719
720class And(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200721 """Short circuited AND."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200722 operator = 'and'
723
724 def as_const(self):
725 return self.left.as_const() and self.right.as_const()
726
727
728class Or(BinExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200729 """Short circuited OR."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200730 operator = 'or'
731
732 def as_const(self):
733 return self.left.as_const() or self.right.as_const()
734
735
736class Not(UnaryExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200737 """Negate the expression."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200738 operator = 'not'
739
740
Armin Ronachere791c2a2008-04-07 18:39:54 +0200741class Neg(UnaryExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200742 """Make the expression negative."""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200743 operator = '-'
744
745
Armin Ronachere791c2a2008-04-07 18:39:54 +0200746class Pos(UnaryExpr):
Armin Ronacher023b5e92008-05-08 11:03:10 +0200747 """Make the expression positive (noop for most expressions)"""
Armin Ronacher07bc6842008-03-31 14:18:49 +0200748 operator = '+'
Armin Ronacher023b5e92008-05-08 11:03:10 +0200749
750
751# Helpers for extensions
752
753
754class EnvironmentAttribute(Expr):
755 """Loads an attribute from the environment object. This is useful for
756 extensions that want to call a callback stored on the environment.
757 """
758 fields = ('name',)
759
760
761class ExtensionAttribute(Expr):
762 """Returns the attribute of an extension bound to the environment.
763 The identifier is the identifier of the :class:`Extension`.
Armin Ronacherb9e78752008-05-10 23:36:28 +0200764
765 This node is usually constructed by calling the
766 :meth:`~jinja2.ext.Extension.attr` method on an extension.
Armin Ronacher023b5e92008-05-08 11:03:10 +0200767 """
768 fields = ('identifier', 'attr')
769
770
771class ImportedName(Expr):
772 """If created with an import name the import name is returned on node
773 access. For example ``ImportedName('cgi.escape')`` returns the `escape`
774 function from the cgi module on evaluation. Imports are optimized by the
775 compiler so there is no need to assign them to local variables.
776 """
777 fields = ('importname',)
778
779
780class InternalName(Expr):
781 """An internal name in the compiler. You cannot create these nodes
Armin Ronacher762079c2008-05-08 23:57:56 +0200782 yourself but the parser provides a
783 :meth:`~jinja2.parser.Parser.free_identifier` method that creates
Armin Ronacher023b5e92008-05-08 11:03:10 +0200784 a new identifier for you. This identifier is not available from the
785 template and is not threated specially by the compiler.
786 """
787 fields = ('name',)
788
789 def __init__(self):
790 raise TypeError('Can\'t create internal names. Use the '
791 '`free_identifier` method on a parser.')
792
793
794class MarkSafe(Expr):
795 """Mark the wrapped expression as safe (wrap it as `Markup`)."""
796 fields = ('expr',)
797
798 def as_const(self):
799 return Markup(self.expr.as_const())
800
801
802# and close down
803_node_setup_finished = True