507 @classmethod |
507 @classmethod |
508 def _expand(cls, aliases, tree, expanding, cache): |
508 def _expand(cls, aliases, tree, expanding, cache): |
509 if not isinstance(tree, tuple): |
509 if not isinstance(tree, tuple): |
510 return tree |
510 return tree |
511 a = cls._getalias(aliases, tree) |
511 a = cls._getalias(aliases, tree) |
512 if a is not None: |
512 if a is None: |
513 if a.error: |
513 return tuple(cls._expand(aliases, t, expanding, cache) |
514 raise error.Abort(a.error) |
514 for t in tree) |
515 if a in expanding: |
515 if a.error: |
516 raise error.ParseError(_('infinite expansion of %(section)s ' |
516 raise error.Abort(a.error) |
517 '"%(name)s" detected') |
517 if a in expanding: |
518 % {'section': cls._section, |
518 raise error.ParseError(_('infinite expansion of %(section)s ' |
519 'name': a.name}) |
519 '"%(name)s" detected') |
520 expanding.append(a) |
520 % {'section': cls._section, 'name': a.name}) |
521 if a.name not in cache: |
521 expanding.append(a) |
522 cache[a.name] = cls._expand(aliases, a.replacement, expanding, |
522 if a.name not in cache: |
523 cache) |
523 cache[a.name] = cls._expand(aliases, a.replacement, expanding, |
524 result = cache[a.name] |
524 cache) |
525 expanding.pop() |
525 result = cache[a.name] |
526 if a.args is not None: |
526 expanding.pop() |
527 l = cls._getlist(tree[2]) |
527 if a.args is None: |
528 if len(l) != len(a.args): |
528 return result |
529 raise error.ParseError(_('invalid number of arguments: %d') |
529 l = cls._getlist(tree[2]) |
530 % len(l)) |
530 if len(l) != len(a.args): |
531 l = [cls._expand(aliases, t, [], cache) for t in l] |
531 raise error.ParseError(_('invalid number of arguments: %d') |
532 result = cls._expandargs(result, dict(zip(a.args, l))) |
532 % len(l)) |
533 else: |
533 l = [cls._expand(aliases, t, [], cache) for t in l] |
534 result = tuple(cls._expand(aliases, t, expanding, cache) |
534 return cls._expandargs(result, dict(zip(a.args, l))) |
535 for t in tree) |
|
536 return result |
|
537 |
535 |
538 @classmethod |
536 @classmethod |
539 def expand(cls, aliases, tree): |
537 def expand(cls, aliases, tree): |
540 """Expand aliases in tree, recursively. |
538 """Expand aliases in tree, recursively. |
541 |
539 |