Skip to content

Commit

Permalink
Make dispatch_on_note_type a function instead of staticmethod.
Browse files Browse the repository at this point in the history
Whould have liked to keep it static, be for python < 3.10 was causing
a staticmethod is not callable exception.
  • Loading branch information
namcsi committed Jul 17, 2023
1 parent 2995b67 commit 6537d17
Showing 1 changed file with 34 additions and 34 deletions.
68 changes: 34 additions & 34 deletions src/renopro/reify.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,40 @@ def handle_unify_error(error):
raise RuntimeError("Code should be unreachable") # nocoverage


def dispatch_on_node_type(meth):
""" "Dispatch method on node.ast_type if node is of type AST
or dispatch on node.type if node is of type Symbol.
"""
registry = {}

def dispatch(value):
try:
return registry[value]
except KeyError:
return meth

def register(value, func=None):
if func is None:
return lambda f: register(value, f)

registry[value] = func
return func

def wrapper(self, node, *args, **kw):
if isinstance(node, AST):
return dispatch(node.ast_type)(self, node, *args, **kw)
if isinstance(node, Symbol):
return dispatch(node.type)(self, node, *args, **kw)
return dispatch(type(node))(self, node, *args, **kw)

wrapper.register = register
wrapper.dispatch = dispatch
wrapper.registry = registry

return wrapper


class ReifiedAST:
"""Class for converting between reified and non-reified
representation of ASP programs."""
Expand Down Expand Up @@ -191,40 +225,6 @@ def reified_string_doc(self) -> str: # nocoverage
"""
return self._reified.asp_str(commented=True)

@staticmethod
def dispatch_on_node_type(meth):
""" "Dispatch on node.ast_type if node is of type AST or
dispatch on node.type if node is of type Symbol.
"""
registry = {}

def dispatch(value):
try:
return registry[value]
except KeyError:
return meth

def register(value, func=None):
if func is None:
return lambda f: register(value, f)

registry[value] = func
return func

def wrapper(self, node, *args, **kw):
if isinstance(node, AST):
return dispatch(node.ast_type)(self, node, *args, **kw)
if isinstance(node, Symbol):
return dispatch(node.type)(self, node, *args, **kw)
return dispatch(type(node))(self, node, *args, **kw)

wrapper.register = register
wrapper.dispatch = dispatch
wrapper.registry = registry

return wrapper

@dispatch_on_node_type
def reify_node(self, node):
"""Reify the input ast node by adding it's clorm fact
Expand Down

0 comments on commit 6537d17

Please sign in to comment.