瀏覽代碼

fix server/module, get all data from hxb cache directly

Rudy Ges 1 年之前
父節點
當前提交
037b92416f
共有 4 個文件被更改,包括 33 次插入20 次删除
  1. 4 1
      src/compiler/hxb/hxbAbstractReader.ml
  2. 12 5
      src/compiler/hxb/hxbReader.ml
  3. 9 6
      src/context/display/displayJson.ml
  4. 8 8
      src/core/json/genjson.ml

+ 4 - 1
src/compiler/hxb/hxbAbstractReader.ml

@@ -9,6 +9,9 @@ class virtual hxb_abstract_reader = object(self)
 		reader#read (self :> hxb_reader_api) input
 
 	method read_chunks (chunks : cached_chunks) (stats : HxbReader.hxb_reader_stats) =
+		fst (self#read_chunks_until chunks stats HEND)
+
+	method read_chunks_until (chunks : cached_chunks) (stats : HxbReader.hxb_reader_stats) (until : HxbData.chunk_kind) =
 		let reader = new HxbReader.hxb_reader stats in
-		reader#read_chunks (self :> hxb_reader_api) chunks
+		reader#read_chunks_until (self :> hxb_reader_api) chunks until
 end

+ 12 - 5
src/compiler/hxb/hxbReader.ml

@@ -1786,12 +1786,19 @@ class hxb_reader
 			self#read_efld
 
 	method read_chunks (new_api : hxb_reader_api) (chunks : cached_chunks) =
+		fst (self#read_chunks_until new_api chunks HEND)
+
+	method read_chunks_until (new_api : hxb_reader_api) (chunks : cached_chunks) end_chunk =
 		api <- new_api;
-		List.iter (fun (kind,data) ->
-			ch <- IO.input_bytes data;
-			self#read_chunk_data kind
-		) chunks;
-		current_module
+		let rec loop = function
+			| (kind,data) :: chunks ->
+				ch <- IO.input_bytes data;
+				self#read_chunk_data kind;
+				if kind = end_chunk then chunks else loop chunks
+			| [] -> die "" __LOC__
+		in
+		let remaining = loop chunks in
+		(current_module, remaining)
 
 	method read (new_api : hxb_reader_api) (file_ch : IO.input) =
 		api <- new_api;

+ 9 - 6
src/context/display/displayJson.ml

@@ -105,6 +105,7 @@ class display_handler (jsonrpc : jsonrpc_handler) com (cs : CompilationCache.t)
 end
 
 class hxb_reader_api_com
+	~(headers_only : bool)
 	(com : Common.context)
 	(cc : CompilationCache.context_cache)
 = object(self)
@@ -125,6 +126,7 @@ class hxb_reader_api_com
 
 	method resolve_type (pack : string list) (mname : string) (tname : string) =
 		let path = (pack,mname) in
+
 		let m = self#find_module path in
 		List.find (fun t -> snd (t_path t) = tname) m.m_types
 
@@ -135,7 +137,7 @@ class hxb_reader_api_com
 			cc#find_module m_path
 		with Not_found ->
 			let mc = cc#get_hxb_module m_path in
-			self#read_chunks mc.mc_chunks com.hxb_reader_stats
+			fst (self#read_chunks_until mc.mc_chunks com.hxb_reader_stats (if headers_only then HEND else TYPF))
 
 	method basic_types =
 		com.basic
@@ -144,8 +146,8 @@ class hxb_reader_api_com
 		i
 end
 
-let find_module com cc path p =
-	(new hxb_reader_api_com com cc)#find_module path
+let find_module ~(headers_only : bool) com cc path =
+	(new hxb_reader_api_com ~headers_only com cc)#find_module path
 
 type handler_context = {
 	com : Common.context;
@@ -335,11 +337,11 @@ let handler =
 			let cs = hctx.display#get_cs in
 			let cc = cs#get_context sign in
 			let m = try
-				find_module hctx.com cc path null_pos
+				find_module ~headers_only:true hctx.com cc path
 			with Not_found ->
 				hctx.send_error [jstring "No such module"]
 			in
-			hctx.send_result (generate_module cs cc m)
+			hctx.send_result (generate_module (cc#get_hxb) (find_module ~headers_only:true hctx.com cc) m)
 		);
 		"server/type", (fun hctx ->
 			let sign = Digest.from_hex (hctx.jsonrpc#get_string_param "signature") in
@@ -347,7 +349,8 @@ let handler =
 			let typeName = hctx.jsonrpc#get_string_param "typeName" in
 			let cc = hctx.display#get_cs#get_context sign in
 			let m = try
-				find_module hctx.com cc path null_pos
+				(* TODO: try with headers only *)
+				find_module ~headers_only:false hctx.com cc path
 			with Not_found ->
 				hctx.send_error [jstring "No such module"]
 			in

+ 8 - 8
src/core/json/genjson.ml

@@ -701,7 +701,7 @@ let generate_module_type ctx mt =
 
 (* module *)
 
-let generate_module cs cc m =
+let generate_module modules find_module m =
 	jobject [
 		"id",jint m.m_id;
 		"path",generate_module_path m.m_path;
@@ -715,16 +715,16 @@ let generate_module cs cc m =
 		"dependencies",jarray (PMap.fold (fun (sign,mpath) acc ->
 			(jobject [
 				"path",jstring (s_type_path mpath);
-				"sign",jstring (Digest.to_hex ((cs#get_context sign)#find_module mpath).m_extra.m_sign);
+				"sign",jstring (Digest.to_hex (find_module mpath).m_extra.m_sign);
 			]) :: acc
 		) m.m_extra.m_deps []);
-		"dependents",jarray (List.map (fun m -> (jobject [
-			"path",jstring (s_type_path m.m_path);
-			"sign",jstring (Digest.to_hex m.m_extra.m_sign);
-		])) (Hashtbl.fold (fun _ m' acc ->
-			if PMap.mem m.m_id m'.m_extra.m_deps then m' :: acc
+		"dependents",jarray (List.map (fun (path, sign) -> (jobject [
+			"path",jstring (s_type_path path);
+			"sign",jstring (Digest.to_hex sign);
+		])) (Hashtbl.fold (fun _ (m':HxbData.module_cache) acc ->
+			if PMap.mem m.m_id m'.mc_extra.m_deps then (m'.mc_path, m'.mc_extra.m_sign) :: acc
 			else acc
-		) cc#get_modules []));
+		) modules []));
 	]
 
 let create_context ?jsonrpc gm = {