Mercurial > hg
diff mercurial/parser.py @ 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 | 2e9f5453ab5a |
children | ee11167fe1da |
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)