diff -r 371f59c6a89e -r 9467d5337292 mercurial/revsetlang.py --- a/mercurial/revsetlang.py Sat Jul 08 12:49:46 2017 +0900 +++ b/mercurial/revsetlang.py Sat Jul 08 13:07:59 2017 +0900 @@ -21,6 +21,8 @@ elements = { # token-type: binding-strength, primary, prefix, infix, suffix "(": (21, None, ("group", 1, ")"), ("func", 1, ")"), None), + "[": (21, None, None, ("subscript", 1, "]"), None), + "#": (21, None, None, ("relation", 21), None), "##": (20, None, None, ("_concat", 20), None), "~": (18, None, None, ("ancestor", 18), None), "^": (18, None, None, ("parent", 18), "parentpost"), @@ -39,6 +41,7 @@ "=": (3, None, None, ("keyvalue", 3), None), ",": (2, None, None, ("list", 2), None), ")": (0, None, None, None, None), + "]": (0, None, None, None, None), "symbol": (0, "symbol", None, None, None), "string": (0, "string", None, None, None), "end": (0, None, None, None, None), @@ -47,7 +50,7 @@ keywords = {'and', 'or', 'not'} _quoteletters = {'"', "'"} -_simpleopletters = set(pycompat.iterbytestr("():=,-|&+!~^%")) +_simpleopletters = set(pycompat.iterbytestr("()[]#:=,-|&+!~^%")) # default set of valid characters for the initial letter of symbols _syminitletters = set(pycompat.iterbytestr( @@ -331,6 +334,9 @@ # make number of arguments deterministic: # x + y + z -> (or x y z) -> (or (list x y z)) return (op, _fixops(('list',) + x[1:])) + elif op == 'subscript' and x[1][0] == 'relation': + # x#y[z] ternary + return _fixops(('relsubscript', x[1][1], x[1][2], x[2])) return (op,) + tuple(_fixops(y) for y in x[1:]) @@ -369,10 +375,16 @@ return (op, _analyze(x[1], defineorder), order) elif op == 'group': return _analyze(x[1], order) - elif op in ('dagrange', 'range', 'parent', 'ancestor'): + elif op in ('dagrange', 'range', 'parent', 'ancestor', 'relation', + 'subscript'): ta = _analyze(x[1], defineorder) tb = _analyze(x[2], defineorder) return (op, ta, tb, order) + elif op == 'relsubscript': + ta = _analyze(x[1], defineorder) + tb = _analyze(x[2], defineorder) + tc = _analyze(x[3], defineorder) + return (op, ta, tb, tc, order) elif op == 'list': return (op,) + tuple(_analyze(y, order) for y in x[1:]) elif op == 'keyvalue': @@ -481,10 +493,14 @@ wb, tb = _optimize(x[2], small) order = x[3] return wa + wb, (op, ta, tb, order) - elif op in ('parent', 'ancestor'): + elif op in ('parent', 'ancestor', 'relation', 'subscript'): w, t = _optimize(x[1], small) order = x[3] return w, (op, t, x[2], order) + elif op == 'relsubscript': + w, t = _optimize(x[1], small) + order = x[4] + return w, (op, t, x[2], x[3], order) elif op == 'list': ws, ts = zip(*(_optimize(y, small) for y in x[1:])) return sum(ws), (op,) + ts