Beispiel #1
0
  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()
Beispiel #2
0
  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
Beispiel #3
0
 def getMethod(self):
   c = self.node.type.name
   n = "_constructor"
   m = env.getMethodType(c, n)
   return c, n, m
Beispiel #4
0
 def getMethod(self):
   c = env.getVarType('super')
   n = self.node.method.name
   return c, n, env.getMethodType(c, n)