Browse Source

[server] re-cache display modules

Probably breaks everyone's code...

see #8596
Simon Krajewski 6 years ago
parent
commit
912a32f63d
3 changed files with 47 additions and 2 deletions
  1. 15 2
      src/compiler/server.ml
  2. 11 0
      src/context/compilationServer.ml
  3. 21 0
      tests/server/src/Main.hx

+ 15 - 2
src/compiler/server.ml

@@ -422,11 +422,23 @@ let rec wait_loop process_params verbose accept =
 	while true do
 		let read, write, close = accept() in
 		let was_compilation = ref false in
+		let removed_modules = ref [] in
+		let recache_removed_modules () =
+			List.iter (fun (k,m) ->
+				try
+					ignore(CompilationServer.find_module cs k);
+				with Not_found ->
+					CompilationServer.cache_module cs k m
+			) !removed_modules;
+			removed_modules := [];
+		in
 		let maybe_cache_context com =
 			if com.display.dms_full_typing then begin
 				CompilationServer.cache_context cs com;
 				ServerMessage.cached_modules com "" (List.length com.modules);
-			end;
+				removed_modules := [];
+			end else
+				recache_removed_modules();
 		in
 		let create params =
 			let ctx = create_context params in
@@ -460,7 +472,8 @@ let rec wait_loop process_params verbose accept =
 					let fkey = (file,sign) in
 					(* force parsing again : if the completion point have been changed *)
 					CompilationServer.remove_file cs fkey;
-					CompilationServer.taint_modules cs file;
+					removed_modules := CompilationServer.filter_modules cs file;
+					delays := recache_removed_modules :: !delays;
 				end;
 				try
 					if (Hashtbl.find arguments sign) <> ctx.com.class_path then begin

+ 11 - 0
src/context/compilationServer.ml

@@ -119,6 +119,17 @@ let cache_module cs key value =
 let taint_modules cs file =
 	Hashtbl.iter (fun _ m -> if m.m_extra.m_file = file then m.m_extra.m_dirty <- Some m) cs.cache.c_modules
 
+let filter_modules cs file =
+	let removed = DynArray.create () in
+	Hashtbl.filter_map_inplace (fun k m ->
+		if m.m_extra.m_file = file then begin
+			DynArray.add removed (k,m);
+			None
+		end else
+			Some m
+	) cs.cache.c_modules;
+	DynArray.to_list removed
+
 let iter_modules cs com f =
 	let sign = Define.get_signature com.defines in
 	Hashtbl.iter (fun (_,sign') m -> if sign = sign' then f m) cs.cache.c_modules

+ 21 - 0
tests/server/src/Main.hx

@@ -96,6 +96,27 @@ class ServerTests extends HaxeServerTestCase {
 		runHaxe(args);
 		assertSuccess();
 	}
+
+	function testDisplayModuleRecache() {
+		vfs.putContent("HelloWorld.hx", getTemplate("HelloWorld.hx"));
+		var args = ["--main", "HelloWorld", "--interp"];
+		runHaxe(args);
+		runHaxe(args);
+		assertReuse("HelloWorld");
+
+		var args2 = ["--main", "HelloWorld", "--interp", "--display", "HelloWorld.hx@64@type"];
+		runHaxe(args2);
+
+		runHaxe(args);
+		assertReuse("HelloWorld");
+
+		// make sure we still invalidate if the file does change
+		vfs.touchFile("HelloWorld.hx");
+		runHaxe(args2);
+
+		runHaxe(args);
+		assertSkipping("HelloWorld");
+	}
 }
 
 class Main {