def visit(self, visitor, *args, **kwargs):
return visitor.visitInterface(self, *args, **kwargs)
+ def getMethodByName(self, name):
+ for method in self.iterMethods():
+ if method.name == name:
+ return method
+ return None
+
def iterMethods(self):
if self.base is not None:
for method in self.base.iterMethods():
yield method
raise StopIteration
+ def iterBases(self):
+ iface = self
+ while iface is not None:
+ yield iface
+ iface = iface.base
+ raise StopIteration
+
def iterBaseMethods(self):
if self.base is not None:
for iface, method in self.base.iterBaseMethods():
class Polymorphic(Type):
- def __init__(self, defaultType, switchExpr, switchTypes):
+ def __init__(self, switchExpr, switchTypes, defaultType, contextLess=True):
Type.__init__(self, defaultType.expr)
- self.defaultType = defaultType
self.switchExpr = switchExpr
self.switchTypes = switchTypes
+ self.defaultType = defaultType
+ self.contextLess = contextLess
def visit(self, visitor, *args, **kwargs):
return visitor.visitPolymorphic(self, *args, **kwargs)
return zip(cases, types)
+def EnumPolymorphic(enumName, switchExpr, switchTypes, defaultType, contextLess=True):
+ enumValues = [expr for expr, type in switchTypes]
+ enum = Enum(enumName, enumValues)
+ polymorphic = Polymorphic(switchExpr, switchTypes, defaultType, contextLess)
+ return enum, polymorphic
+
+
class Visitor:
'''Abstract visitor for the type hierarchy.'''
return interface
def visitPolymorphic(self, polymorphic):
- defaultType = self.visit(polymorphic.defaultType)
switchExpr = polymorphic.switchExpr
switchTypes = [(expr, self.visit(type)) for expr, type in polymorphic.switchTypes]
- return Polymorphic(defaultType, switchExpr, switchTypes)
+ defaultType = self.visit(polymorphic.defaultType)
+ return Polymorphic(switchExpr, switchTypes, defaultType, polymorphic.contextLess)
class MutableRebuilder(Rebuilder):
self.addFunctions(api.functions)
self.addInterfaces(api.interfaces)
- def get_function_by_name(self, name):
+ def getFunctionByName(self, name):
for function in self.functions:
if function.name == name:
return function