+
+class Visitor:
+
+ def visit(self, type, *args, **kwargs):
+ return type.visit(self, *args, **kwargs)
+
+ __call__ = visit
+
+ def visit_void(self, type, *args, **kwargs):
+ raise NotImplementedError
+
+ def visit_literal(self, type, *args, **kwargs):
+ raise NotImplementedError
+
+ def visit_string(self, type, *args, **kwargs):
+ raise NotImplementedError
+
+ def visit_const(self, type, *args, **kwargs):
+ raise NotImplementedError
+
+ def visit_struct(self, type, *args, **kwargs):
+ raise NotImplementedError
+
+ def visit_array(self, type, *args, **kwargs):
+ raise NotImplementedError
+
+ def visit_blob(self, type, *args, **kwargs):
+ raise NotImplementedError
+
+ def visit_enum(self, type, *args, **kwargs):
+ raise NotImplementedError
+
+ def visit_bitmask(self, type, *args, **kwargs):
+ raise NotImplementedError
+
+ def visit_pointer(self, type, *args, **kwargs):
+ raise NotImplementedError
+
+ def visit_alias(self, type, *args, **kwargs):
+ raise NotImplementedError
+
+ def visit_opaque(self, type, *args, **kwargs):
+ raise NotImplementedError
+
+
+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_alias(self, alias):
+ type = self.visit(alias.type)
+ return Alias(alias.expr, type)
+
+ def visit_opaque(self, opaque):
+ return opaque
+
+