Mercurial > public > mercurial-scm > hg-stable
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': |