10 class Hook(mdis
.dispatcher
.Hook
):
11 def __call__(self
, call
):
12 hook
= super().__call
__(call
)
14 class ConcreteHook(hook
.__class
__):
15 @functools.wraps(hook
.__call
__)
16 @contextlib.contextmanager
17 def __call__(self
, dispatcher
, node
, *args
, **kwargs
):
18 return hook(dispatcher
, node
, *args
, **kwargs
)
20 return ConcreteHook(*tuple(self
))
26 return super().__init
__()
32 def __exit__(self
, exc_type
, exc_value
, exc_traceback
):
37 raise ValueError("empty code")
40 for (level
, stmt
) in self
:
41 line
= ((" " * level
* 4) + stmt
)
44 return "\n".join(lines
)
46 def emit(self
, stmt
, level
=0):
47 item
= ((level
+ self
.__level
), stmt
)
51 class Visitor(mdis
.visitor
.ContextVisitor
):
52 def __init__(self
, root
):
53 self
.__walker
= mdis
.walker
.Walker()
55 self
.traverse(root
=root
)
57 return super().__init
__()
59 def traverse(self
, root
):
61 for node
in self
.__walker
(root
):
62 self
.traverse(root
=node
)