Commit b01a24a4 authored by Yuki Shiino's avatar Yuki Shiino Committed by Commit Bot

bind-gen: Improve newline-handling in code generation

Use of "${ x | trim }" of Mako template unconditionally removes
whitespaces including newlines.  It makes it hard to insert empty
lines in generated code.

This patch revisits the newline problem again, and improves it.

Bug: 839389
Change-Id: If838b4766fe8938e7f7c2bfb2ff8802d56ac9441
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1883830Reviewed-by: default avatarHitoshi Yoshida <peria@chromium.org>
Commit-Queue: Yuki Shiino <yukishiino@chromium.org>
Cr-Commit-Position: refs/heads/master@{#709894}
parent cca2286e
...@@ -264,7 +264,11 @@ class CodeNode(object): ...@@ -264,7 +264,11 @@ class CodeNode(object):
@property @property
def renderer(self): def renderer(self):
return self._renderer or self.outer.renderer # Always use the renderer of the root node in order not to mix renderers
# during rendering of a single code node tree.
if self.outer is not None:
return self.outer.renderer
return self._renderer
@property @property
def current_render_state(self): def current_render_state(self):
...@@ -366,7 +370,7 @@ class SequenceNode(CodeNode): ...@@ -366,7 +370,7 @@ class SequenceNode(CodeNode):
template_text = CodeNode.format_template( template_text = CodeNode.format_template(
"""\ """\
% for node in {element_nodes}: % for node in {element_nodes}:
${node | trim}\\ ${node}\\
% if not loop.last: % if not loop.last:
{separator}\\ {separator}\\
% endif % endif
...@@ -454,12 +458,16 @@ class SymbolScopeNode(SequenceNode): ...@@ -454,12 +458,16 @@ class SymbolScopeNode(SequenceNode):
insert corresponding SymbolDefinitionNodes appropriately. insert corresponding SymbolDefinitionNodes appropriately.
""" """
def __init__(self, code_nodes=None, renderer=None): def __init__(self,
code_nodes=None,
separator="\n",
separator_last="",
renderer=None):
SequenceNode.__init__( SequenceNode.__init__(
self, self,
code_nodes=code_nodes, code_nodes=code_nodes,
separator="\n", separator=separator,
separator_last="\n", separator_last=separator_last,
renderer=renderer) renderer=renderer)
self._registered_code_symbols = set() self._registered_code_symbols = set()
...@@ -703,8 +711,8 @@ class ConditionalExitNode(ConditionalNode): ...@@ -703,8 +711,8 @@ class ConditionalExitNode(ConditionalNode):
template_text = CodeNode.format_template( template_text = CodeNode.format_template(
"""\ """\
if (${{{conditional}}}) {{ if (${{{conditional}}}) {{
${{{body} | trim}} ${{{body}}}
}} }}\\
""", **gensyms) """, **gensyms)
template_vars = { template_vars = {
gensyms["conditional"]: cond, gensyms["conditional"]: cond,
...@@ -803,10 +811,10 @@ class FunctionDefinitionNode(CodeNode): ...@@ -803,10 +811,10 @@ class FunctionDefinitionNode(CodeNode):
template_text = CodeNode.format_template( template_text = CodeNode.format_template(
"""\ """\
${{{comment} | trim}} ${{{comment}}}
${{{return_type}}} ${{{name}}}(${{{arg_decls}}}) {{ ${{{return_type}}} ${{{name}}}(${{{arg_decls}}}) {{
${{{body} | trim}} ${{{body}}}
}} }}\\
""", **gensyms) """, **gensyms)
template_vars = { template_vars = {
gensyms["name"]: name, gensyms["name"]: name,
......
...@@ -103,7 +103,7 @@ class CodeNodeTest(unittest.TestCase): ...@@ -103,7 +103,7 @@ class CodeNodeTest(unittest.TestCase):
appropriately. appropriately.
""" """
renderer = MakoRenderer() renderer = MakoRenderer()
root = SymbolScopeNode(renderer=renderer) root = SymbolScopeNode(separator_last="\n", renderer=renderer)
root.register_code_symbols([ root.register_code_symbols([
SymbolNode("var1", "int ${var1} = ${var2} + ${var3};"), SymbolNode("var1", "int ${var1} = ${var2} + ${var3};"),
...@@ -127,7 +127,7 @@ int var1 = var2 + var3; ...@@ -127,7 +127,7 @@ int var1 = var2 + var3;
def test_symbol_definition_with_exit_branches(self): def test_symbol_definition_with_exit_branches(self):
renderer = MakoRenderer() renderer = MakoRenderer()
root = SymbolScopeNode(renderer=renderer) root = SymbolScopeNode(separator_last="\n", renderer=renderer)
root.register_code_symbols([ root.register_code_symbols([
SymbolNode("var1", "int ${var1} = 1;"), SymbolNode("var1", "int ${var1} = 1;"),
...@@ -175,7 +175,7 @@ var3; ...@@ -175,7 +175,7 @@ var3;
def test_symbol_definition_with_nested_exit_branches(self): def test_symbol_definition_with_nested_exit_branches(self):
renderer = MakoRenderer() renderer = MakoRenderer()
root = SymbolScopeNode(renderer=renderer) root = SymbolScopeNode(separator_last="\n", renderer=renderer)
root.register_code_symbols([ root.register_code_symbols([
SymbolNode("var1", "int ${var1} = 1;"), SymbolNode("var1", "int ${var1} = 1;"),
...@@ -229,11 +229,12 @@ if (true) { ...@@ -229,11 +229,12 @@ if (true) {
def test_function_definition_minimum(self): def test_function_definition_minimum(self):
renderer = MakoRenderer() renderer = MakoRenderer()
root = FunctionDefinitionNode( root = SymbolScopeNode(separator_last="\n", renderer=renderer)
name=LiteralNode("blink::bindings::func"), root.append(
arg_decls=[], FunctionDefinitionNode(
return_type=LiteralNode("void"), name=LiteralNode("blink::bindings::func"),
renderer=renderer) arg_decls=[],
return_type=LiteralNode("void")))
self.assertRenderResult(root, """\ self.assertRenderResult(root, """\
...@@ -244,6 +245,7 @@ void blink::bindings::func() { ...@@ -244,6 +245,7 @@ void blink::bindings::func() {
def test_function_definition_full(self): def test_function_definition_full(self):
renderer = MakoRenderer() renderer = MakoRenderer()
root = SymbolScopeNode(separator_last="\n", renderer=renderer)
local_vars = [ local_vars = [
SymbolNode("var1", "int ${var1} = 1;"), SymbolNode("var1", "int ${var1} = 1;"),
...@@ -257,18 +259,15 @@ void blink::bindings::func() { ...@@ -257,18 +259,15 @@ void blink::bindings::func() {
TextNode("return ${var2};"), TextNode("return ${var2};"),
]) ])
root = FunctionDefinitionNode( root.append(
name=LiteralNode("blink::bindings::func"), FunctionDefinitionNode(
arg_decls=[LiteralNode("int arg1"), name=LiteralNode("blink::bindings::func"),
LiteralNode("int arg2")], arg_decls=[LiteralNode("int arg1"),
return_type=LiteralNode("void"), LiteralNode("int arg2")],
local_vars=local_vars, return_type=LiteralNode("void"),
body=func_body, local_vars=local_vars,
comment=LiteralNode("""\ body=func_body,
// comment1 comment=LiteralNode("// comment1\n// comment2")))
// comment2
"""),
renderer=renderer)
self.assertRenderResult( self.assertRenderResult(
root, """\ root, """\
...@@ -286,8 +285,8 @@ void blink::bindings::func(int arg1, int arg2) { ...@@ -286,8 +285,8 @@ void blink::bindings::func(int arg1, int arg2) {
def test_template_error_handling(self): def test_template_error_handling(self):
renderer = MakoRenderer() renderer = MakoRenderer()
root = SymbolScopeNode(renderer=renderer) root = SymbolScopeNode(renderer=renderer)
root.append( root.append(
SymbolScopeNode([ SymbolScopeNode([
# Have Mako raise a NameError. # Have Mako raise a NameError.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment