|
1 | 1 | from ..language.visitor import Visitor
|
2 | 2 |
|
3 | 3 |
|
4 |
| -class ValidationVisitor(Visitor): |
5 |
| - __slots__ = 'context', 'instance', 'type_info' |
| 4 | +class TypeInfoVisitor(Visitor): |
| 5 | + __slots__ = 'visitor', 'type_info' |
6 | 6 |
|
7 |
| - def __init__(self, instance, context, type_info): |
8 |
| - self.context = context |
9 |
| - self.instance = instance |
| 7 | + def __init__(self, type_info, visitor): |
10 | 8 | self.type_info = type_info
|
| 9 | + self.visitor = visitor |
11 | 10 |
|
12 | 11 | def enter(self, node, key, parent, path, ancestors):
|
13 | 12 | self.type_info.enter(node)
|
14 |
| - result = self.instance.enter(node, key, parent, path, ancestors) |
| 13 | + result = self.visitor.enter(node, key, parent, path, ancestors) |
15 | 14 | if result is False:
|
16 | 15 | self.type_info.leave(node)
|
17 |
| - |
18 |
| - return result |
| 16 | + return False |
19 | 17 |
|
20 | 18 | def leave(self, node, key, parent, path, ancestors):
|
21 |
| - result = self.instance.leave(node, key, parent, path, ancestors) |
22 |
| - |
| 19 | + self.visitor.leave(node, key, parent, path, ancestors) |
23 | 20 | self.type_info.leave(node)
|
24 |
| - return result |
| 21 | + |
| 22 | + |
| 23 | +class ParallelVisitor(Visitor): |
| 24 | + __slots__ = 'skipping', 'visitors' |
| 25 | + |
| 26 | + def __init__(self, visitors): |
| 27 | + self.visitors = visitors |
| 28 | + self.skipping = [None]*len(visitors) |
| 29 | + |
| 30 | + def enter(self, node, key, parent, path, ancestors): |
| 31 | + for i, visitor in enumerate(self.visitors): |
| 32 | + if not self.skipping[i]: |
| 33 | + result = visitor.enter(node, key, parent, path, ancestors) |
| 34 | + if result is False: |
| 35 | + self.skipping[i] = node |
| 36 | + |
| 37 | + def leave(self, node, key, parent, path, ancestors): |
| 38 | + for i, visitor in enumerate(self.visitors): |
| 39 | + if not self.skipping[i]: |
| 40 | + visitor.leave(node, key, parent, path, ancestors) |
| 41 | + else: |
| 42 | + self.skipping[i] = None |
0 commit comments