def check(self): if isinstance(self.node.value, tree.Native): return args = tuple(f.name for f in self.node.formals.getType()) try: super_method = env.getMethodType(env.getSuperClass(self.c), self.node.id.name) # If this is none, the superclass does not exist if super_method[0] == 'undefined': return if self.node.override: sargs = super_method[:-1] if len(args) != len(sargs): TypeCheckError("Overriding method does not have the same number of arguments as " + "overridden method", self.token).report() else: for arg, sarg in zip(args, sargs): if arg != sarg: TypeCheckError("Overriding method argument types do not match overridden method " +"types", self.token).report() break method_type = self.getType() if not getattr(method_type, 'suppress_errors', False) and not method_type.subsetOf(super_method[-1]): TypeCheckError("Overriding method type is not compatible with overridden method type", self.node.type.token).report() else: TypeCheckError("Overriding method must use override keyword", self.token).report() except SymbolError, e: if self.node.override: TypeCheckError("Method is set to override, but does not exist in ancestor classes", self.token).report() else: e.ignore()
def getMethod(self): if isinstance(self.node.method, tree.Identifier): c = env.getVarType('this') n = self.node.method.name elif isinstance(self.node.method, tree.Dot): c = self.node.method.parent.getType().name n = self.node.method.child.name else: print "WARNING: I missed something. What else can a method call be made of?" try: m = env.getMethodType(c,n) return c, n, m except SymbolError, e: if getattr(c, 'suppress_errors', False): e.ignore() else: e.setToken(self.token) e.report() return None
def getMethod(self): c = self.node.type.name n = "_constructor" m = env.getMethodType(c, n) return c, n, m
def getMethod(self): c = env.getVarType('super') n = self.node.method.name return c, n, env.getMethodType(c, n)