# Pastebin xaMSLVPy and call_ pos env fty el uel = let env, efty = Env.expand_type env fty in (match efty with | r, Tapply ((_, x), argl) when Typing_env.is_typedef env x -> let env, fty = Typing_tdef.expand_typedef env r x argl in call_ pos env fty el uel | _, (Tany | Tunresolved []) -> let el = el @ uel in let env, _ = lmap expr env el in Typing_hooks.dispatch_fun_call_hooks [] (List.map fst (el @ uel)) env; env, (Reason.Rnone, Tany) | r, Tunresolved tyl -> let env, retl = lmap (fun env ty -> call pos env ty el uel) env tyl in TUtils.in_var env (r, Tunresolved retl) | r2, Tfun ft -> let pos_def = Reason.to_pos r2 in let () = check_arity ~check_min:(uel = []) env pos pos_def (List.length el + List.length uel) ft.ft_arity in let env, var_param = variadic_param env ft in let env, tyl = lmap expr env el in let pos_tyl = List.combine (List.map fst el) tyl in let todos = ref [] in let env = wfold_left_default (call_param todos) (env, var_param) ft.ft_params pos_tyl in let env, _ = lmap unpack_expr env uel in let env = fold_fun_list env !todos in Typing_hooks.dispatch_fun_call_hooks ft.ft_params (List.map fst (el @ uel)) env; env, ft.ft_ret | r2, Tanon (arity, id) when uel = [] -> let env, tyl = lmap expr env el in let anon = Env.get_anonymous env id in let fpos = Reason.to_pos r2 in (match anon with | None -> Errors.anonymous_recursive_call pos; env, (Reason.Rnone, Tany) | Some anon -> let () = check_arity env pos fpos (List.length tyl) arity in let tyl = List.map (fun x -> None, x) tyl in anon env tyl) | _, Tarray _ when not (Env.is_strict env) -> (* Relaxing call_user_func to work with an array in partial mode *) env, (Reason.Rnone, Tany) | _, ty -> bad_call pos ty; env, (Reason.Rnone, Tany) )