Show More
@@ -386,3 +386,52 b' class basealiasrules(object):' | |||
|
386 | 386 | elif sym.startswith('$'): |
|
387 | 387 | raise error.ParseError(_("'$' not for alias arguments")) |
|
388 | 388 | return (op, sym) |
|
389 | ||
|
390 | @classmethod | |
|
391 | def _builddefn(cls, defn, args): | |
|
392 | """Parse an alias definition into a tree and marks substitutions | |
|
393 | ||
|
394 | This function marks alias argument references as ``_aliasarg``. The | |
|
395 | parsing rule is provided by ``_parsedefn()``. | |
|
396 | ||
|
397 | ``args`` is a list of alias argument names, or None if the alias | |
|
398 | is declared as a symbol. | |
|
399 | ||
|
400 | >>> parsemap = { | |
|
401 | ... '$1 or foo': ('or', ('symbol', '$1'), ('symbol', 'foo')), | |
|
402 | ... '$1 or $bar': ('or', ('symbol', '$1'), ('symbol', '$bar')), | |
|
403 | ... '$10 or baz': ('or', ('symbol', '$10'), ('symbol', 'baz')), | |
|
404 | ... '"$1" or "foo"': ('or', ('string', '$1'), ('string', 'foo')), | |
|
405 | ... } | |
|
406 | >>> class aliasrules(basealiasrules): | |
|
407 | ... _parsedefn = staticmethod(parsemap.__getitem__) | |
|
408 | ... _getlist = staticmethod(lambda x: []) | |
|
409 | >>> builddefn = aliasrules._builddefn | |
|
410 | >>> def pprint(tree): | |
|
411 | ... print prettyformat(tree, ('_aliasarg', 'string', 'symbol')) | |
|
412 | >>> args = ['$1', '$2', 'foo'] | |
|
413 | >>> pprint(builddefn('$1 or foo', args)) | |
|
414 | (or | |
|
415 | ('_aliasarg', '$1') | |
|
416 | ('_aliasarg', 'foo')) | |
|
417 | >>> try: | |
|
418 | ... builddefn('$1 or $bar', args) | |
|
419 | ... except error.ParseError as inst: | |
|
420 | ... print parseerrordetail(inst) | |
|
421 | '$' not for alias arguments | |
|
422 | >>> args = ['$1', '$10', 'foo'] | |
|
423 | >>> pprint(builddefn('$10 or baz', args)) | |
|
424 | (or | |
|
425 | ('_aliasarg', '$10') | |
|
426 | ('symbol', 'baz')) | |
|
427 | >>> pprint(builddefn('"$1" or "foo"', args)) | |
|
428 | (or | |
|
429 | ('string', '$1') | |
|
430 | ('string', 'foo')) | |
|
431 | """ | |
|
432 | tree = cls._parsedefn(defn) | |
|
433 | if args: | |
|
434 | args = set(args) | |
|
435 | else: | |
|
436 | args = set() | |
|
437 | return cls._relabelargs(tree, args) |
@@ -2250,57 +2250,19 b' def _parsealiasdecl(decl):' | |||
|
2250 | 2250 | raise error.ParseError(_('invalid token'), pos) |
|
2251 | 2251 | return parser.simplifyinfixops(tree, ('list',)) |
|
2252 | 2252 | |
|
2253 | def _relabelaliasargs(tree, args): | |
|
2254 | return _aliasrules._relabelargs(tree, args) | |
|
2255 | ||
|
2256 | def _parsealiasdefn(defn, args): | |
|
2257 | """Parse alias definition ``defn`` | |
|
2258 | ||
|
2259 | This function marks alias argument references as ``_aliasarg``. | |
|
2260 | ||
|
2261 | ``args`` is a list of alias argument names, or None if the alias | |
|
2262 | is declared as a symbol. | |
|
2263 | ||
|
2264 | This returns "tree" as parsing result. | |
|
2265 | ||
|
2266 | >>> def prettyformat(tree): | |
|
2267 | ... return parser.prettyformat(tree, ('_aliasarg', 'string', 'symbol')) | |
|
2268 | >>> args = ['$1', '$2', 'foo'] | |
|
2269 | >>> print prettyformat(_parsealiasdefn('$1 or foo', args)) | |
|
2270 | (or | |
|
2271 | ('_aliasarg', '$1') | |
|
2272 | ('_aliasarg', 'foo')) | |
|
2273 | >>> try: | |
|
2274 | ... _parsealiasdefn('$1 or $bar', args) | |
|
2275 | ... except error.ParseError, inst: | |
|
2276 | ... print parser.parseerrordetail(inst) | |
|
2277 | '$' not for alias arguments | |
|
2278 | >>> args = ['$1', '$10', 'foo'] | |
|
2279 | >>> print prettyformat(_parsealiasdefn('$10 or foobar', args)) | |
|
2280 | (or | |
|
2281 | ('_aliasarg', '$10') | |
|
2282 | ('symbol', 'foobar')) | |
|
2283 | >>> print prettyformat(_parsealiasdefn('"$1" or "foo"', args)) | |
|
2284 | (or | |
|
2285 | ('string', '$1') | |
|
2286 | ('string', 'foo')) | |
|
2287 | """ | |
|
2288 | if args: | |
|
2289 | args = set(args) | |
|
2290 | else: | |
|
2291 | args = set() | |
|
2292 | ||
|
2253 | def _parsealiasdefn(defn): | |
|
2254 | """Parse alias definition ``defn``""" | |
|
2293 | 2255 | p = parser.parser(elements) |
|
2294 | 2256 | tree, pos = p.parse(_tokenizealias(defn)) |
|
2295 | 2257 | if pos != len(defn): |
|
2296 | 2258 | raise error.ParseError(_('invalid token'), pos) |
|
2297 |
|
|
|
2298 | return _relabelaliasargs(tree, args) | |
|
2259 | return parser.simplifyinfixops(tree, ('list', 'or')) | |
|
2299 | 2260 | |
|
2300 | 2261 | class _aliasrules(parser.basealiasrules): |
|
2301 | 2262 | """Parsing and expansion rule set of revset aliases""" |
|
2302 | 2263 | _section = _('revset alias') |
|
2303 | 2264 | _parsedecl = staticmethod(_parsealiasdecl) |
|
2265 | _parsedefn = staticmethod(_parsealiasdefn) | |
|
2304 | 2266 | _getlist = staticmethod(getlist) |
|
2305 | 2267 | |
|
2306 | 2268 | class revsetalias(object): |
@@ -2322,7 +2284,7 b' class revsetalias(object):' | |||
|
2322 | 2284 | return |
|
2323 | 2285 | |
|
2324 | 2286 | try: |
|
2325 |
self.replacement = _ |
|
|
2287 | self.replacement = _aliasrules._builddefn(value, self.args) | |
|
2326 | 2288 | except error.ParseError as inst: |
|
2327 | 2289 | self.error = _('failed to parse the definition of revset alias' |
|
2328 | 2290 | ' "%s": %s') % (self.name, |
General Comments 0
You need to be logged in to leave comments.
Login now