better debugging information. compiler knows about name and filename now (the first one is the load name, the second the estimated filename on the file system if such a name exists)
--HG--
branch : trunk
diff --git a/jinja2/compiler.py b/jinja2/compiler.py
index 06017f8..d1025d4 100644
--- a/jinja2/compiler.py
+++ b/jinja2/compiler.py
@@ -37,9 +37,9 @@
have_condexpr = True
-def generate(node, environment, filename, stream=None):
+def generate(node, environment, name, filename, stream=None):
"""Generate the python source for a node tree."""
- generator = CodeGenerator(environment, filename, stream)
+ generator = CodeGenerator(environment, name, filename, stream)
generator.visit(node)
if stream is None:
return generator.stream.getvalue()
@@ -228,10 +228,11 @@
class CodeGenerator(NodeVisitor):
- def __init__(self, environment, filename, stream=None):
+ def __init__(self, environment, name, filename, stream=None):
if stream is None:
stream = StringIO()
self.environment = environment
+ self.name = name
self.filename = filename
self.stream = stream
@@ -248,10 +249,11 @@
self.has_known_extends = False
# the current line number
- self.lineno = 1
+ self.code_lineno = 1
# the debug information
self.debug_info = []
+ self._write_debug_info = None
# the number of new lines before the next write()
self._new_lines = 0
@@ -306,7 +308,11 @@
if self._new_lines:
if not self._first_write:
self.stream.write('\n' * self._new_lines)
- self.lineno += self._new_lines
+ self.code_lineno += self._new_lines
+ if self._write_debug_info is not None:
+ self.debug_info.append((self._write_debug_info,
+ self.code_lineno))
+ self._write_debug_info = None
self._first_write = False
self.stream.write(' ' * self._indentation)
self._new_lines = 0
@@ -321,7 +327,8 @@
"""Add one or more newlines before the next write."""
self._new_lines = max(self._new_lines, 1 + extra)
if node is not None and node.lineno != self._last_line:
- self.debug_info.append((node.lineno, self.lineno))
+ self._write_debug_info = node.lineno
+ self._last_line = node.lineno
def signature(self, node, frame, have_comma=True, extra_kwargs=None):
"""Writes a function call to the stream for the current node.
@@ -444,7 +451,7 @@
def visit_Template(self, node, frame=None):
assert frame is None, 'no root frame allowed'
self.writeline('from jinja2.runtime import *')
- self.writeline('name = %r' % self.filename)
+ self.writeline('name = %r' % self.name)
# do we have an extends tag at all? If not, we can save some
# overhead by just not processing any inheritance code.
@@ -463,7 +470,7 @@
', standalone=False):', extra=1)
self.indent()
self.writeline('context = TemplateContext(environment, globals, %r, '
- 'blocks, standalone)' % self.filename)
+ 'blocks, standalone)' % self.name)
if have_extends:
self.writeline('parent_root = None')
self.outdent()
@@ -835,15 +842,17 @@
self.writeline('%s.append(' % frame.buffer)
self.write(repr(u''.join(format)) + ' % (')
idx = -1
- for idx, argument in enumerate(arguments):
- if idx:
- self.write(', ')
+ self.indent()
+ for argument in arguments:
+ self.newline(argument)
if have_finalizer:
self.write('(')
self.visit(argument, frame)
if have_finalizer:
self.write(')')
- self.write(idx == 0 and ',)' or ')')
+ self.write(',')
+ self.outdent()
+ self.writeline(')')
if frame.buffer is not None:
self.write(')')