From 66d3949198e7e38bec7a4176b4e4af12be2daead Mon Sep 17 00:00:00 2001 From: Thomas Jiang Date: Mon, 16 Jul 2018 16:11:25 -0700 Subject: [PATCH] Gate coroutines behind directory Summary: We want to gate coroutines behind a specific directory in `www` when we ship to `www`. I have chosen to gate it behind `flib/core/hack/lib/experimental` for the time being. Added this as a `tast_check`, which involved added `at_method_` to the visitor. Differential Revision: D8555694 fbshipit-source-id: 1016e792d07cd4ba15b14367e699a5cf0f1e6603 --- hphp/hack/src/annotated_ast/aast.ml | 4 +++- hphp/hack/src/errors/error_codes.ml | 1 + hphp/hack/src/errors/errors.ml | 4 ++++ hphp/hack/src/errors/errors_sig.ml | 1 + .../tast_check.ml => stubs/coroutine_check.ml} | 13 +++---------- hphp/hack/src/stubs/coroutine_errors.ml | 10 ++++++++++ hphp/hack/src/typing/tast_check/tast_check.ml | 1 + hphp/hack/src/typing/tast_env.ml | 2 ++ hphp/hack/src/typing/tast_env.mli | 3 +++ hphp/hack/src/typing/tast_visitor.ml | 18 ++++++++++++------ hphp/hack/test/errors/error_map.ml | 1 + 11 files changed, 41 insertions(+), 17 deletions(-) copy hphp/hack/src/{typing/tast_check/tast_check.ml => stubs/coroutine_check.ml} (51%) create mode 100644 hphp/hack/src/stubs/coroutine_errors.ml diff --git a/hphp/hack/src/annotated_ast/aast.ml b/hphp/hack/src/annotated_ast/aast.ml index ea1cc348f32..de3b2fd02d8 100644 --- a/hphp/hack/src/annotated_ast/aast.ml +++ b/hphp/hack/src/annotated_ast/aast.ml @@ -360,8 +360,10 @@ and gconst = { cst_is_define: bool; } +and fun_def = fun_ + and def = - | Fun of fun_ + | Fun of fun_def | Class of class_ | Typedef of typedef | Constant of gconst diff --git a/hphp/hack/src/errors/error_codes.ml b/hphp/hack/src/errors/error_codes.ml index 4c4bce62b7c..6faf7c6a0e2 100644 --- a/hphp/hack/src/errors/error_codes.ml +++ b/hphp/hack/src/errors/error_codes.ml @@ -492,6 +492,7 @@ module Typing = struct | ReassignMutableThis | MutableExpressionAsMultipleMutableArguments | InvalidUnsetTargetInRx + | CoroutineOutsideExperimental (* EXTEND HERE WITH NEW VALUES IF NEEDED *) [@@ deriving enum, show { with_path = false } ] let err_code = to_enum diff --git a/hphp/hack/src/errors/errors.ml b/hphp/hack/src/errors/errors.ml index 326a9590114..e09e7d5b0fc 100644 --- a/hphp/hack/src/errors/errors.ml +++ b/hphp/hack/src/errors/errors.ml @@ -2719,6 +2719,10 @@ let invalid_ppl_static_call pos reason = let error_msg = "Cannot call a static method on a <<__PPL>> class "^reason in add (Typing.err_code Typing.InvalidPPLStaticCall) pos error_msg +let coroutine_outside_experimental pos = + add (Typing.err_code Typing.CoroutineOutsideExperimental) pos + Coroutine_errors.error_message + let return_disposable_mismatch pos1_return_disposable pos1 pos2 = let m1 = "This is marked <<__ReturnDisposable>>." in let m2 = "This is not marked <<__ReturnDisposable>>." in diff --git a/hphp/hack/src/errors/errors_sig.ml b/hphp/hack/src/errors/errors_sig.ml index 3b689c40e1c..659279ddc82 100644 --- a/hphp/hack/src/errors/errors_sig.ml +++ b/hphp/hack/src/errors/errors_sig.ml @@ -472,6 +472,7 @@ module type S = sig val coroutinness_mismatch : bool -> Pos.t -> Pos.t -> unit val invalid_ppl_call : Pos.t -> string -> unit val invalid_ppl_static_call : Pos.t -> string -> unit + val coroutine_outside_experimental : Pos.t -> unit val return_disposable_mismatch : bool -> Pos.t -> Pos.t -> unit val fun_reactivity_mismatch : Pos.t -> string -> Pos.t -> string -> unit val frozen_in_incorrect_scope : Pos.t -> unit diff --git a/hphp/hack/src/typing/tast_check/tast_check.ml b/hphp/hack/src/stubs/coroutine_check.ml similarity index 51% copy from hphp/hack/src/typing/tast_check/tast_check.ml copy to hphp/hack/src/stubs/coroutine_check.ml index 7c28baaacb2..13cbef5301d 100644 --- a/hphp/hack/src/typing/tast_check/tast_check.ml +++ b/hphp/hack/src/stubs/coroutine_check.ml @@ -7,13 +7,6 @@ * *) -let visitor = Tast_visitor.iter_with [ - Shape_field_check.handler; - Sketchy_null_check.handler; - Tautology_check.handler; - Type_test_hint_check.handler; - Ppl_check.handler; -] - -let program = visitor#go -let def = visitor#go_def +let handler = object + inherit Tast_visitor.handler_base +end diff --git a/hphp/hack/src/stubs/coroutine_errors.ml b/hphp/hack/src/stubs/coroutine_errors.ml new file mode 100644 index 00000000000..45c86f8270f --- /dev/null +++ b/hphp/hack/src/stubs/coroutine_errors.ml @@ -0,0 +1,10 @@ +(** + * Copyright (c) 2018, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the "hack" directory of this source tree. + * + *) + +let error_message = "" diff --git a/hphp/hack/src/typing/tast_check/tast_check.ml b/hphp/hack/src/typing/tast_check/tast_check.ml index 7c28baaacb2..73a3ab9889c 100644 --- a/hphp/hack/src/typing/tast_check/tast_check.ml +++ b/hphp/hack/src/typing/tast_check/tast_check.ml @@ -13,6 +13,7 @@ let visitor = Tast_visitor.iter_with [ Tautology_check.handler; Type_test_hint_check.handler; Ppl_check.handler; + Coroutine_check.handler; ] let program = visitor#go diff --git a/hphp/hack/src/typing/tast_env.ml b/hphp/hack/src/typing/tast_env.ml index b85d016af10..21976925c38 100644 --- a/hphp/hack/src/typing/tast_env.ml +++ b/hphp/hack/src/typing/tast_env.ml @@ -63,6 +63,8 @@ let save = Typing_env.save SMap.empty let forward_compat_ge = Typing_env.forward_compat_ge let error_if_forward_compat_ge = Typing_env.error_if_forward_compat_ge +let get_file = Typing_env.get_file + let fully_expand = Typing_expand.fully_expand let get_class_ids = Typing_utils.get_class_ids diff --git a/hphp/hack/src/typing/tast_env.mli b/hphp/hack/src/typing/tast_env.mli index 78f39e2bbb0..939bf522b71 100644 --- a/hphp/hack/src/typing/tast_env.mli +++ b/hphp/hack/src/typing/tast_env.mli @@ -64,6 +64,9 @@ val forward_compat_ge : env -> int -> bool val error_if_forward_compat_ge : env -> int -> (unit -> unit) -> unit (** Call the func if the forward compatibility level is new enough *) +val get_file : env -> Relative_path.t +(* Return the {!Relative_path.t} of the file the env is from *) + val expand_type : env -> Tast.ty -> env * Tast.ty (** Expand a type variable ({!Typing_defs.Tvar}) to the type it refers to. *) diff --git a/hphp/hack/src/typing/tast_visitor.ml b/hphp/hack/src/typing/tast_visitor.ml index ee169fa06cc..8c8b7d7dbeb 100644 --- a/hphp/hack/src/typing/tast_visitor.ml +++ b/hphp/hack/src/typing/tast_visitor.ml @@ -104,10 +104,11 @@ end class type handler = object method minimum_forward_compat_level : int - method at_fun_ : Env.t -> Tast.fun_ -> unit method at_class_ : Env.t -> Tast.class_ -> unit method at_typedef : Env.t -> Tast.typedef -> unit method at_gconst : Env.t -> Tast.gconst -> unit + method at_fun_def : Env.t -> Tast.fun_def -> unit + method at_method_ : Env.t -> Tast.method_ -> unit method at_expr : Env.t -> Tast.expr -> unit method at_stmt : Env.t -> Tast.stmt -> unit @@ -126,10 +127,11 @@ end class virtual handler_base : handler = object method minimum_forward_compat_level = 0 - method at_fun_ _ _ = () method at_class_ _ _ = () method at_typedef _ _ = () method at_gconst _ _ = () + method at_fun_def _ _ = () + method at_method_ _ _ = () method at_expr _ _ = () method at_stmt _ _ = () @@ -147,10 +149,6 @@ let iter_with (handlers : handler list) : iter = object inherit iter as super - method! on_fun_ env x = - List.iter handlers (if_enabled env (fun v -> v#at_fun_ env x)); - super#on_fun_ env x; - method! on_class_ env x = List.iter handlers (if_enabled env (fun v -> v#at_class_ env x)); super#on_class_ env x; @@ -163,6 +161,14 @@ let iter_with (handlers : handler list) : iter = object List.iter handlers (if_enabled env (fun v -> v#at_gconst env x)); super#on_gconst env x; + method! on_fun_def env x = + List.iter handlers (if_enabled env (fun v -> v#at_fun_def env x)); + super#on_fun_def env x; + + method! on_method_ env x = + List.iter handlers (if_enabled env (fun v -> v#at_method_ env x)); + super#on_method_ env x; + method! on_expr env x = List.iter handlers (if_enabled env (fun v -> v#at_expr env x)); super#on_expr env x; diff --git a/hphp/hack/test/errors/error_map.ml b/hphp/hack/test/errors/error_map.ml index 7a606343200..7c83bc08132 100644 --- a/hphp/hack/test/errors/error_map.ml +++ b/hphp/hack/test/errors/error_map.ml @@ -486,4 +486,5 @@ InvalidTraversableInRx = 4267 ReassignMutableThis = 4268 MutableExpressionAsMultipleMutableArguments = 4269 InvalidUnsetTargetInRx = 4270 +CoroutineOutsideExperimental = 4271 |}] -- 2.11.4.GIT