Mercurial > hg
changeset 28892:0c135f37c6f8
parser: construct alias object by rule-set class
It was odd that the revsetalias did the whole parsing stuff in __init__().
Instead, this patch adds a factory function to the aliasrules class, and
makes the alias (= revsetalias) class a plain-old value object.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Mon, 29 Feb 2016 18:33:30 +0900 |
parents | ac30adb260ea |
children | ee11167fe1da |
files | mercurial/parser.py mercurial/revset.py |
diffstat | 2 files changed, 34 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/parser.py Fri Apr 08 16:42:43 2016 +0200 +++ b/mercurial/parser.py Mon Feb 29 18:33:30 2016 +0900 @@ -229,6 +229,19 @@ else: return inst.args[0] +class alias(object): + """Parsed result of alias""" + + def __init__(self, name, tree, args, err, replacement): + self.name = name + self.tree = tree + self.args = args + self.error = err + self.replacement = replacement + # whether own `error` information is already shown or not. + # this avoids showing same warning multiple times at each `findaliases`. + self.warned = False + class basealiasrules(object): """Parsing and expansion rule set of aliases @@ -430,3 +443,22 @@ else: args = set() return cls._relabelargs(tree, args) + + @classmethod + def build(cls, decl, defn): + """Parse an alias declaration and definition into an alias object""" + repl = efmt = None + name, tree, args, err = cls._builddecl(decl) + if err: + efmt = _('failed to parse the declaration of %(section)s ' + '"%(name)s": %(error)s') + else: + try: + repl = cls._builddefn(defn, args) + except error.ParseError as inst: + err = parseerrordetail(inst) + efmt = _('failed to parse the definition of %(section)s ' + '"%(name)s": %(error)s') + if err: + err = efmt % {'section': cls._section, 'name': name, 'error': err} + return alias(name, tree, args, err, repl)
--- a/mercurial/revset.py Fri Apr 08 16:42:43 2016 +0200 +++ b/mercurial/revset.py Mon Feb 29 18:33:30 2016 +0900 @@ -2256,31 +2256,6 @@ _parse = staticmethod(_parsealias) _getlist = staticmethod(getlist) -class revsetalias(object): - # whether own `error` information is already shown or not. - # this avoids showing same warning multiple times at each `findaliases`. - warned = False - - def __init__(self, name, value): - '''Aliases like: - - h = heads(default) - b($1) = ancestors($1) - ancestors(default) - ''' - r = _aliasrules._builddecl(name) - self.name, self.tree, self.args, self.error = r - if self.error: - self.error = _('failed to parse the declaration of revset alias' - ' "%s": %s') % (self.name, self.error) - return - - try: - self.replacement = _aliasrules._builddefn(value, self.args) - except error.ParseError as inst: - self.error = _('failed to parse the definition of revset alias' - ' "%s": %s') % (self.name, - parser.parseerrordetail(inst)) - def _getalias(aliases, tree): """If tree looks like an unexpanded alias, return it. Return None otherwise. @@ -2314,7 +2289,7 @@ """Expand aliases in tree, recursively. 'aliases' is a dictionary mapping user defined aliases to - revsetalias objects. + alias objects. """ if not isinstance(tree, tuple): # Do not expand raw strings @@ -2347,7 +2322,7 @@ def findaliases(ui, tree, showwarning=None): aliases = {} for k, v in ui.configitems('revsetalias'): - alias = revsetalias(k, v) + alias = _aliasrules.build(k, v) aliases[alias.name] = alias tree = _expandaliases(aliases, tree, [], {}) if showwarning: