comparison mercurial/revsetlang.py @ 35542:beb667c9880f

revset: parse x^:: as (x^):: (issue5764) We have to make '::' a valid primary expression to parse 'x^::' as '(x)^(::)' first, but that doesn't change the language because a prefix operator '::y' precedes a primary '::'. I can't think of an intuitive meaning of '::', so it's just rejected. Given 'x::y' can be considered to default to {x = roots(), y = heads()}, '::' could be 'roots()::heads()', which seems not any useful.
author Yuya Nishihara <yuya@tcha.org>
date Sat, 30 Dec 2017 17:55:23 +0900
parents dd911f95cbda
children 2df8d12f23bc
comparison
equal deleted inserted replaced
35541:58fda95a0202 35542:beb667c9880f
25 "#": (21, None, None, ("relation", 21), None), 25 "#": (21, None, None, ("relation", 21), None),
26 "##": (20, None, None, ("_concat", 20), None), 26 "##": (20, None, None, ("_concat", 20), None),
27 "~": (18, None, None, ("ancestor", 18), None), 27 "~": (18, None, None, ("ancestor", 18), None),
28 "^": (18, None, None, ("parent", 18), "parentpost"), 28 "^": (18, None, None, ("parent", 18), "parentpost"),
29 "-": (5, None, ("negate", 19), ("minus", 5), None), 29 "-": (5, None, ("negate", 19), ("minus", 5), None),
30 "::": (17, None, ("dagrangepre", 17), ("dagrange", 17), "dagrangepost"), 30 "::": (17, "dagrangeall", ("dagrangepre", 17), ("dagrange", 17),
31 "..": (17, None, ("dagrangepre", 17), ("dagrange", 17), "dagrangepost"), 31 "dagrangepost"),
32 "..": (17, "dagrangeall", ("dagrangepre", 17), ("dagrange", 17),
33 "dagrangepost"),
32 ":": (15, "rangeall", ("rangepre", 15), ("range", 15), "rangepost"), 34 ":": (15, "rangeall", ("rangepre", 15), ("range", 15), "rangepost"),
33 "not": (10, None, ("not", 10), None, None), 35 "not": (10, None, ("not", 10), None, None),
34 "!": (10, None, ("not", 10), None, None), 36 "!": (10, None, ("not", 10), None, None),
35 "and": (5, None, None, ("and", 5), None), 37 "and": (5, None, None, ("and", 5), None),
36 "&": (5, None, None, ("and", 5), None), 38 "&": (5, None, None, ("and", 5), None),
286 # x^:y means (x^) : y, not x ^ (:y) 288 # x^:y means (x^) : y, not x ^ (:y)
287 # x^: means (x^) :, not x ^ (:) 289 # x^: means (x^) :, not x ^ (:)
288 post = ('parentpost', x[1]) 290 post = ('parentpost', x[1])
289 if x[2][0] == 'dagrangepre': 291 if x[2][0] == 'dagrangepre':
290 return _fixops(('dagrange', post, x[2][1])) 292 return _fixops(('dagrange', post, x[2][1]))
293 elif x[2][0] == 'dagrangeall':
294 return _fixops(('dagrangepost', post))
291 elif x[2][0] == 'rangepre': 295 elif x[2][0] == 'rangepre':
292 return _fixops(('range', post, x[2][1])) 296 return _fixops(('range', post, x[2][1]))
293 elif x[2][0] == 'rangeall': 297 elif x[2][0] == 'rangeall':
294 return _fixops(('rangepost', post)) 298 return _fixops(('rangepost', post))
295 elif op == 'or': 299 elif op == 'or':
311 return _analyze(_build('_ and not _', *x[1:])) 315 return _analyze(_build('_ and not _', *x[1:]))
312 elif op == 'only': 316 elif op == 'only':
313 return _analyze(_build('only(_, _)', *x[1:])) 317 return _analyze(_build('only(_, _)', *x[1:]))
314 elif op == 'onlypost': 318 elif op == 'onlypost':
315 return _analyze(_build('only(_)', x[1])) 319 return _analyze(_build('only(_)', x[1]))
320 elif op == 'dagrangeall':
321 raise error.ParseError(_("can't use '::' in this context"))
316 elif op == 'dagrangepre': 322 elif op == 'dagrangepre':
317 return _analyze(_build('ancestors(_)', x[1])) 323 return _analyze(_build('ancestors(_)', x[1]))
318 elif op == 'dagrangepost': 324 elif op == 'dagrangepost':
319 return _analyze(_build('descendants(_)', x[1])) 325 return _analyze(_build('descendants(_)', x[1]))
320 elif op == 'negate': 326 elif op == 'negate':