public TypeInfo typeCheck(TypeEnv tenv) throws TypeException { TypeInfo[] params = ((ParamListEx2) parameters()).types(); TypeInfo retType = TypeInfo.get(type()); funcType = TypeInfo.function(retType, params); TypeInfo oldType = tenv.put(0, index, funcType); if (oldType != null) throw new TypeException("function redefinition: " + name(), this); bodyEnv = new TypeEnv(size, tenv); for (int i = 0; i < params.length; i++) bodyEnv.put(0, i, params[i]); TypeInfo bodyType = ((ASTreeTypeEx) revise(body())).typeCheck(bodyEnv); bodyType.assertSubtypeOf(retType, tenv, this); return funcType; }