summaryrefslogtreecommitdiff
path: root/mako/codegen.py
diff options
context:
space:
mode:
Diffstat (limited to 'mako/codegen.py')
-rw-r--r--mako/codegen.py52
1 files changed, 32 insertions, 20 deletions
diff --git a/mako/codegen.py b/mako/codegen.py
index 2240ba2..63e76a7 100644
--- a/mako/codegen.py
+++ b/mako/codegen.py
@@ -14,7 +14,7 @@ from mako import util, ast, parsetree, filters, exceptions
from mako import compat
-MAGIC_NUMBER = 9
+MAGIC_NUMBER = 10
# names which are hardwired into the
# template and are not accessed via the
@@ -99,7 +99,6 @@ class _GenerateRenderMethod(object):
"""
def __init__(self, printer, compiler, node):
self.printer = printer
- self.last_source_line = -1
self.compiler = compiler
self.node = node
self.identifier_stack = [None]
@@ -146,6 +145,26 @@ class _GenerateRenderMethod(object):
for node in defs:
_GenerateRenderMethod(printer, compiler, node)
+ if not self.in_def:
+ self.write_metadata_struct()
+
+ def write_metadata_struct(self):
+ self.printer.source_map[self.printer.lineno] = self.printer.last_source_line
+ struct = {
+ "filename": self.compiler.filename,
+ "uri": self.compiler.uri,
+ "source_encoding": self.compiler.source_encoding,
+ "line_map": self.printer.source_map,
+ "boilerplate_lines": self.printer.boilerplate_map
+ }
+ self.printer.writelines(
+ '"""',
+ '__M_BEGIN_METADATA',
+ compat.json.dumps(struct),
+ '__M_END_METADATA\n'
+ '"""'
+ )
+
@property
def identifiers(self):
return self.identifier_stack[-1]
@@ -232,7 +251,7 @@ class _GenerateRenderMethod(object):
[n.name for n in
main_identifiers.topleveldefs.values()]
)
- self.printer.write("\n\n")
+ self.printer.write_blanks(2)
if len(module_code):
self.write_module_code(module_code)
@@ -288,7 +307,7 @@ class _GenerateRenderMethod(object):
self.write_def_finish(self.node, buffered, filtered, cached)
self.printer.writeline(None)
- self.printer.write("\n\n")
+ self.printer.write_blanks(2)
if cached:
self.write_cache_decorator(
node, name,
@@ -299,7 +318,7 @@ class _GenerateRenderMethod(object):
"""write module-level template code, i.e. that which
is enclosed in <%! %> tags in the template."""
for n in module_code:
- self.write_source_comment(n)
+ self.printer.start_source(n.lineno)
self.printer.write_indented_block(n.text)
def write_inherit(self, node):
@@ -330,7 +349,7 @@ class _GenerateRenderMethod(object):
for node in namespaces.values():
if 'import' in node.attributes:
self.compiler.has_ns_imports = True
- self.write_source_comment(node)
+ self.printer.start_source(node.lineno)
if len(node.nodes):
self.printer.writeline("def make_namespace():")
export = []
@@ -402,7 +421,7 @@ class _GenerateRenderMethod(object):
self.printer.writeline(
"context.namespaces[(__name__, %s)] = ns" % repr(node.name))
- self.printer.write("\n")
+ self.printer.write_blanks(1)
if not len(namespaces):
self.printer.writeline("pass")
self.printer.writeline(None)
@@ -533,13 +552,6 @@ class _GenerateRenderMethod(object):
self.printer.writeline("__M_writer = context.writer()")
- def write_source_comment(self, node):
- """write a source comment containing the line number of the
- corresponding template line."""
- if self.last_source_line != node.lineno:
- self.printer.writeline("# SOURCE LINE %d" % node.lineno)
- self.last_source_line = node.lineno
-
def write_def_decl(self, node, identifiers):
"""write a locally-available callable referencing a top-level def"""
funcname = node.funcname
@@ -757,7 +769,7 @@ class _GenerateRenderMethod(object):
return target
def visitExpression(self, node):
- self.write_source_comment(node)
+ self.printer.start_source(node.lineno)
if len(node.escapes) or \
(
self.compiler.pagetag is not None and
@@ -779,7 +791,7 @@ class _GenerateRenderMethod(object):
self.printer.writeline("loop = __M_loop._exit()")
self.printer.writeline(None)
else:
- self.write_source_comment(node)
+ self.printer.start_source(node.lineno)
if self.compiler.enable_loop and node.keyword == 'for':
text = mangle_mako_loop(node, self.printer)
else:
@@ -801,7 +813,7 @@ class _GenerateRenderMethod(object):
self.printer.writeline("pass")
def visitText(self, node):
- self.write_source_comment(node)
+ self.printer.start_source(node.lineno)
self.printer.writeline("__M_writer(%s)" % repr(node.content))
def visitTextTag(self, node):
@@ -827,7 +839,7 @@ class _GenerateRenderMethod(object):
def visitCode(self, node):
if not node.ismodule:
- self.write_source_comment(node)
+ self.printer.start_source(node.lineno)
self.printer.write_indented_block(node.text)
if not self.in_def and len(self.identifiers.locally_assigned) > 0:
@@ -844,7 +856,7 @@ class _GenerateRenderMethod(object):
','.join([repr(x) for x in node.declared_identifiers()]))
def visitIncludeTag(self, node):
- self.write_source_comment(node)
+ self.printer.start_source(node.lineno)
args = node.attributes.get('args')
if args:
self.printer.writeline(
@@ -944,7 +956,7 @@ class _GenerateRenderMethod(object):
"runtime.Namespace('caller', context, "
"callables=ccall(__M_caller))",
"try:")
- self.write_source_comment(node)
+ self.printer.start_source(node.lineno)
self.printer.writelines(
"__M_writer(%s)" % self.create_filter_callable(
[], node.expression, True),