# HG changeset patch # User Yuya Nishihara # Date 2017-04-24 12:37:11 # Node ID 6367318327f03877834561c6f18d0c0bebe8d7b1 # Parent dd28b1f55eb86f9a47d0176214d4076498fdb3ed templater: adjust binding strength of '%' and '|' operators (BC) This makes 'foo|bar%baz' parsed as '(foo|bar)%baz', not 'foo|(bar%baz)'. Perhaps it was a mistake that '%' preceded '|'. Both '|' and '%' can be considered a kind of function application, and '|' is more like a '.' operator seen in OO languages. So IMHO '|' should have the same (or higher) binding as '%'. The BC breakage should be minimal since both '|' and '%' operators have strict requirements for their operands and 'foo|bar%baz' was invalid: - right-hand side of '|' must be a symbol - left-hand side of '%' must be a dict or list - right-hand side of '%' must be a string or symbol diff --git a/mercurial/templater.py b/mercurial/templater.py --- a/mercurial/templater.py +++ b/mercurial/templater.py @@ -34,7 +34,7 @@ from . import ( elements = { # token-type: binding-strength, primary, prefix, infix, suffix "(": (20, None, ("group", 1, ")"), ("func", 1, ")"), None), - "%": (16, None, None, ("%", 16), None), + "%": (15, None, None, ("%", 15), None), "|": (15, None, None, ("|", 15), None), "*": (5, None, None, ("*", 5), None), "/": (5, None, None, ("/", 5), None), diff --git a/tests/test-command-template.t b/tests/test-command-template.t --- a/tests/test-command-template.t +++ b/tests/test-command-template.t @@ -134,6 +134,20 @@ But negate binds closer still: (string '\n')) -3 +Filters bind as close as map operator: + + $ hg debugtemplate -r0 -v '{desc|splitlines % "{line}\n"}' + (template + (% + (| + (symbol 'desc') + (symbol 'splitlines')) + (template + (symbol 'line') + (string '\n')))) + line 1 + line 2 + Keyword arguments: $ hg debugtemplate -r0 -v '{foo=bar|baz}'