Mercurial > hg-stable
changeset 32930:c808507cfbf0
revsetlang: factor out helper to match ancestors() in parsed tree
More checks will be added.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sun, 18 Jun 2017 11:39:03 +0900 |
parents | 7f1d07d2c8f8 |
children | 3292c0df64f7 |
files | mercurial/revsetlang.py |
diffstat | 1 files changed, 18 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/revsetlang.py Sat Jun 17 13:34:18 2017 +0900 +++ b/mercurial/revsetlang.py Sun Jun 18 11:39:03 2017 +0900 @@ -236,6 +236,20 @@ return parser.buildargsdict(getlist(x), funcname, parser.splitargspec(keys), keyvaluenode='keyvalue', keynode='symbol') +def _isnamedfunc(x, funcname): + """Check if given tree matches named function""" + return x and x[0] == 'func' and getsymbol(x[1]) == funcname + +def _matchnamedfunc(x, funcname): + """Return args tree if given tree matches named function; otherwise None + + This can't be used for testing a nullary function since its args tree + is also None. Use _isnamedfunc() instead. + """ + if not _isnamedfunc(x, funcname): + return + return x[2] + # Constants for ordering requirement, used in _analyze(): # # If 'define', any nested functions and operations can change the ordering of @@ -286,14 +300,10 @@ >>> f('ancestors(A)', 'not ancestors(B)') ('list', ('symbol', 'A'), ('symbol', 'B')) """ - if (revs is not None - and revs[0] == 'func' - and getsymbol(revs[1]) == 'ancestors' - and bases is not None - and bases[0] == 'not' - and bases[1][0] == 'func' - and getsymbol(bases[1][1]) == 'ancestors'): - return ('list', revs[2], bases[1][2]) + ta = _matchnamedfunc(revs, 'ancestors') + tb = bases and bases[0] == 'not' and _matchnamedfunc(bases[1], 'ancestors') + if ta and tb: + return ('list', ta, tb) def _fixops(x): """Rewrite raw parsed tree to resolve ambiguous syntax which cannot be