From a84647cb574284b175395aca818e897a2d640937 Mon Sep 17 00:00:00 2001 From: Lucian Wischik Date: Tue, 10 Dec 2019 22:46:22 -0800 Subject: [PATCH] expose defered_decl count Summary: The deferred-decl machinery already counts how many decls needed to be fetched. But it only incremeents that count if a threshold is provided (and hence has the potential to raise a Defer exception). I want to re-use that counting machinery, for use in serverless-IDE and other uses of `compute_tast_and_errors`. But those uses are typically single-threaded, don't have a worker queue, and can never defer. This diff therefore (1) exposes the counter, (2) lets the counter be incremented even if no threshold is provided. Reviewed By: 2BitSalute Differential Revision: D18879091 fbshipit-source-id: 5ad7b65bf857de69bbd4c7edfb92e2f672201bc2 --- hphp/hack/src/typing/deferred_decl.ml | 10 +++++++--- hphp/hack/src/typing/typing_check_service.ml | 2 +- hphp/hack/src/typing/typing_classes_heap.ml | 5 +++-- hphp/hack/test/unit/server_tests.ml | 7 +++++-- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/hphp/hack/src/typing/deferred_decl.ml b/hphp/hack/src/typing/deferred_decl.ml index e526610b88d..72cb6f7f1ef 100644 --- a/hphp/hack/src/typing/deferred_decl.ml +++ b/hphp/hack/src/typing/deferred_decl.ml @@ -20,10 +20,12 @@ let (counter : int ref) = ref 0 let (enabled : bool ref) = ref true -let should_defer ~(d : Relative_path.t) ~(threshold : int) : unit = +let should_defer ~(d : Relative_path.t) ~(threshold_opt : int option) : unit = if !enabled then ( counter := !counter + 1; - if threshold < !counter then raise (Defer d) + match threshold_opt with + | Some threshold when threshold < !counter -> raise (Defer d) + | _ -> () ) let add ~(d : deferment) : unit = @@ -34,5 +36,7 @@ let reset ~enable = counter := 0; enabled := enable -let get ~(f : deferment -> 'a) : 'a list = +let get_deferments ~(f : deferment -> 'a) : 'a list = Relative_path.Set.fold !deferments ~init:[] ~f:(fun d l -> f d :: l) + +let get_counter () : int = !counter diff --git a/hphp/hack/src/typing/typing_check_service.ml b/hphp/hack/src/typing/typing_check_service.ml index b2172b0cf48..df0c9d7ae46 100644 --- a/hphp/hack/src/typing/typing_check_service.ml +++ b/hphp/hack/src/typing/typing_check_service.ml @@ -209,7 +209,7 @@ let process_file if InferMissing.global_inference @@ GlobalOptions.tco_infer_missing opts then Typing_global_inference.StateSubConstraintGraphs.save global_tvenvs; - let deferred_files = Deferred_decl.get ~f:(fun d -> Declare d) in + let deferred_files = Deferred_decl.get_deferments ~f:(fun d -> Declare d) in let result = match deferred_files with | [] -> (Errors.merge errors' errors, []) diff --git a/hphp/hack/src/typing/typing_classes_heap.ml b/hphp/hack/src/typing/typing_classes_heap.ml index 50a710d6636..5c92a744824 100644 --- a/hphp/hack/src/typing/typing_classes_heap.ml +++ b/hphp/hack/src/typing/typing_classes_heap.ml @@ -95,8 +95,9 @@ module Classes = struct | None -> raise Exit | Some (file, Naming_table.TClass) -> - Option.iter (defer_threshold ()) ~f:(fun threshold -> - Deferred_decl.should_defer ~d:file ~threshold); + Deferred_decl.should_defer + ~d:file + ~threshold_opt:(defer_threshold ()); let class_type = Errors.run_in_decl_mode file (fun () -> Decl.declare_class_in_file file class_name) diff --git a/hphp/hack/test/unit/server_tests.ml b/hphp/hack/test/unit/server_tests.ml index eeca43b36cc..f433530425e 100644 --- a/hphp/hack/test/unit/server_tests.ml +++ b/hphp/hack/test/unit/server_tests.ml @@ -33,7 +33,7 @@ let test_dmesg_parser () = input let ensure_count (count : int) : unit = - let deferred = Deferred_decl.get ~f:(fun d -> d) in + let deferred = Deferred_decl.get_deferments ~f:(fun d -> d) in Asserter.Int_asserter.assert_equals count (List.length deferred) @@ -66,7 +66,10 @@ let ensure_threshold ~(threshold : int) ~(limit : int) ~(expected : int) : unit for i = 1 to limit do let path = Printf.sprintf "foo-%d" i in let relative_path = Relative_path.create Relative_path.Dummy path in - try Deferred_decl.should_defer ~d:relative_path ~threshold + try + Deferred_decl.should_defer + ~d:relative_path + ~threshold_opt:(Some threshold) with Deferred_decl.Defer d -> Asserter.Bool_asserter.assert_equals (i >= threshold) -- 2.11.4.GIT