def test_overridden_signatures(self): clsA = Class("ClsA") clsB = Class("ClsB") clsB.bases.append(clsA) methodA = Method("test") methodA.signatures.append(FunctionSignature()) methodA.signatures[0].context = methodA methodA.signatures[0].virtual = True methodB = Method("test") methodB.signatures.append(FunctionSignature()) methodB.signatures[0].context = methodB clsA.methods.append(methodA) methodA.context = clsA clsB.methods.append(methodB) methodB.context = clsB self.assertEqual(clsA.get_overridable_signatures(), [[methodA.signatures[0]]]) self.assertEqual(clsB.get_overridable_signatures(), []) methodB.signatures[0].virtual = True self.assertEqual(clsB.get_overridable_signatures(), [[methodB.signatures[0]]]) methodB.signatures[0].const = True self.assertEqual(clsB.get_overridable_signatures(), [[methodB.signatures[0], methodA.signatures[0]]])
def process_signatures(self): for context, function in self.signatures.iteritems(): for name, signatures in function.iteritems(): cxt = self.nodes.get(context) if not cxt: continue f = None if isinstance(cxt, (Class, Struct)): if all(sig.constructor for sig in signatures): cxt.constructors = signatures elif signatures[0].destructor: cxt.destructor = signatures[0] else: f = Method(name) cxt.methods.append(f) else: f = Function(name) cxt.nodes.append(f) if f: f.context = cxt f.signatures = signatures for sig in signatures: sig.context = f