From 904ea7aabce1d287fa022f5d3751eb8198af183c Mon Sep 17 00:00:00 2001
From: Michele Alberti <michele.alberti@cea.fr>
Date: Thu, 19 Dec 2019 15:12:17 +0100
Subject: [PATCH] [Server] Implement proposed API for get/set/exec files.

---
 src/plugins/server/kernel_ast.ml     | 35 ++++++++++++++++++++++++++++
 src/plugins/server/kernel_project.ml | 15 ++++++------
 src/plugins/server/main.ml           | 27 +++++++++++++++++++--
 3 files changed, 67 insertions(+), 10 deletions(-)

diff --git a/src/plugins/server/kernel_ast.ml b/src/plugins/server/kernel_ast.ml
index 9001f346b63..963b6f60eea 100644
--- a/src/plugins/server/kernel_ast.ml
+++ b/src/plugins/server/kernel_ast.ml
@@ -164,3 +164,38 @@ let () = Request.register ~page
     (fun kf -> Jbuffer.to_json PP.pp_global (Kernel_function.get_global kf))
 
 (* -------------------------------------------------------------------------- *)
+(* --- Files                                                              --- *)
+(* -------------------------------------------------------------------------- *)
+
+let () =
+  Request.register
+    ~page
+    ~descr:(Md.plain "Get the currently analyzed source file names")
+    ~kind:`GET
+    ~name:"kernel.ast.getFiles"
+    ~input:(module Junit) ~output:(module Jstring.Jlist)
+    Kernel.Files.get
+
+let () =
+  Request.register
+    ~page
+    ~descr:(Md.plain "Set the source file names to analyze.")
+    ~kind:`SET
+    ~name:"kernel.ast.setFiles"
+    ~input:(module Jstring.Jlist)
+    ~output:(module Junit)
+    Kernel.Files.set
+
+let () =
+  Request.register
+    ~page
+    ~descr:(Md.plain "Compute the AST of the currently set source file names.")
+    ~kind:`EXEC
+    ~name:"kernel.ast.execCompute"
+    ~input:(module Junit)
+    ~output:(module Junit)
+    (fun () ->
+       if not (Ast.is_computed ())
+       then File.init_from_cmdline ())
+
+(* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/server/kernel_project.ml b/src/plugins/server/kernel_project.ml
index 532a7b34f77..f992e0c9a2f 100644
--- a/src/plugins/server/kernel_project.ml
+++ b/src/plugins/server/kernel_project.ml
@@ -126,13 +126,12 @@ let () = Request.register ~page
 
 let () =
   Request.register
-    ~kind:`GET
-    ~page ~name:"kernel.project.getSourceFileNames"
-    ~descr:(Md.plain "Get the source file names of the current project")
-    ~input:(module Junit) ~output:(module Jstring.Jlist)
-    (fun () ->
-       List.map
-         (fun fname -> (Filepath.Normalized.of_string fname :> string))
-         (Kernel.Files.get ()))
+    ~page
+    ~descr:(Md.plain "Create a new project")
+    ~kind:`SET
+    ~name:"kernel.project.setCreate"
+    ~input:(module Jstring)
+    ~output:(module ProjectInfo)
+    Project.create
 
 (* -------------------------------------------------------------------------- *)
diff --git a/src/plugins/server/main.ml b/src/plugins/server/main.ml
index c00a228cf41..9d0e1f4dff6 100644
--- a/src/plugins/server/main.ml
+++ b/src/plugins/server/main.ml
@@ -147,10 +147,33 @@ let execute exec : _ response =
       exec.request (Cmdline.protect exn) ;
     `Error(exec.id,Printexc.to_string exn)
 
+let acceptable_between_yield = 0.25 (* seconds *)
+
 let execute_with_yield yield exec =
   let db = !Db.progress in
-  Db.progress := if exec.yield then yield else no_yield ;
-  Extlib.try_finally ~finally:(fun () -> Db.progress := db) execute exec
+  let yield, check =
+    if Senv.debug_atleast 1 then
+      let time = ref (Unix.gettimeofday ()) in
+      let check () =
+        let time' = Unix.gettimeofday () in
+        let diff = time' -. !time in
+        if diff > acceptable_between_yield
+        then
+          Senv.debug
+            "Db.progress missing during %s request (spent %fs between calls)"
+            exec.request
+            diff
+      in
+      (fun () ->
+         check ();
+         yield ();
+         time := Unix.gettimeofday ()),
+      check
+    else
+      yield, ignore
+  in
+  Db.progress := if exec.yield then yield else no_yield;
+  Extlib.try_finally ~finally:(fun () -> Db.progress := db; check ()) execute exec
 
 let execute_debug pp yield exec =
   if Senv.debug_atleast 1 then
-- 
GitLab