-all_types = {}
-
-
-class Visitor:
-
- def visit(self, type, *args, **kwargs):
- return type.visit(self, *args, **kwargs)
-
- def visit_void(self, void, *args, **kwargs):
- raise NotImplementedError
-
- def visit_literal(self, literal, *args, **kwargs):
- raise NotImplementedError
-
- def visit_string(self, string, *args, **kwargs):
- raise NotImplementedError
-
- def visit_const(self, const, *args, **kwargs):
- raise NotImplementedError
-
- def visit_struct(self, struct, *args, **kwargs):
- raise NotImplementedError
-
- def visit_array(self, array, *args, **kwargs):
- raise NotImplementedError
-
- def visit_blob(self, blob, *args, **kwargs):
- raise NotImplementedError
-
- def visit_enum(self, enum, *args, **kwargs):
- raise NotImplementedError
-
- def visit_bitmask(self, bitmask, *args, **kwargs):
- raise NotImplementedError
-
- def visit_pointer(self, pointer, *args, **kwargs):
- raise NotImplementedError
-
- def visit_handle(self, handle, *args, **kwargs):
- raise NotImplementedError
-
- def visit_alias(self, alias, *args, **kwargs):
- raise NotImplementedError
-
- def visit_opaque(self, opaque, *args, **kwargs):
- raise NotImplementedError
-
- def visit_interface(self, interface, *args, **kwargs):
- raise NotImplementedError
-
-
-class OnceVisitor(Visitor):
-
- def __init__(self):
- self.__visited = set()
-
- def visit(self, type, *args, **kwargs):
- if type not in self.__visited:
- self.__visited.add(type)
- return type.visit(self, *args, **kwargs)
- return None
-
-
-class Rebuilder(Visitor):
-
- def visit_void(self, void):
- return void
-
- def visit_literal(self, literal):
- return literal
-
- def visit_string(self, string):
- return string
-
- def visit_const(self, const):
- return Const(const.type)
-
- def visit_struct(self, struct):
- members = [self.visit(member) for member in struct.members]
- return Struct(struct.name, members)
-
- def visit_array(self, array):
- type = self.visit(array.type)
- return Array(type, array.length)
-
- def visit_blob(self, blob):
- type = self.visit(blob.type)
- return Blob(type, blob.size)
-
- def visit_enum(self, enum):
- return enum
-
- def visit_bitmask(self, bitmask):
- type = self.visit(bitmask.type)
- return Bitmask(type, bitmask.values)
-
- def visit_pointer(self, pointer):
- type = self.visit(pointer.type)
- return Pointer(type)
-
- def visit_handle(self, handle):
- type = self.visit(handle.type)
- return Handle(handle.name, type, handle.range)
-
- def visit_alias(self, alias):
- type = self.visit(alias.type)
- return Alias(alias.expr, type)
-
- def visit_opaque(self, opaque):
- return opaque
-
-