Browse Source

[display] fix reference finding

Simon Krajewski 7 years ago
parent
commit
d00dacd401

+ 5 - 1
src/context/display/display.ml

@@ -10,7 +10,11 @@ open Globals
 open Genjson
 open DisplayPosition
 
-let reference_position = ref ("",null_pos,KVar)
+module ReferencePosition = struct
+	let reference_position = ref ("",null_pos,KVar)
+	let set (s,p,k) = reference_position := (s,{p with pfile = Path.unique_full_path p.pfile},k)
+	let get () = !reference_position
+end
 
 module ExprPreprocessing = struct
 	let find_before_pos com dm e =

+ 4 - 4
src/context/display/displayEmitter.ml

@@ -138,7 +138,7 @@ let display_module_type ctx mt p = match ctx.com.display.dms_kind with
 	| DMDefinition | DMTypeDefinition -> raise_position [(t_infos mt).mt_name_pos];
 	| DMUsage _ ->
 		let infos = t_infos mt in
-		reference_position := (snd infos.mt_path,infos.mt_name_pos,KModuleType)
+		ReferencePosition.set (snd infos.mt_path,infos.mt_name_pos,KModuleType)
 	| DMHover ->
 		let t = type_of_module_type mt in
 		let ct = completion_type_of_type ctx t in
@@ -194,7 +194,7 @@ let raise_position_of_type t =
 let display_variable ctx v p = match ctx.com.display.dms_kind with
 	| DMDefinition -> raise_position [v.v_pos]
 	| DMTypeDefinition -> raise_position_of_type v.v_type
-	| DMUsage _ -> reference_position := (v.v_name,v.v_pos,KVar)
+	| DMUsage _ -> ReferencePosition.set (v.v_name,v.v_pos,KVar)
 	| DMHover ->
 		let ct = completion_type_of_type ctx ~values:(get_value_meta v.v_meta) v.v_type in
 		raise_hover (make_ci_local v (v.v_type,ct)) p
@@ -211,7 +211,7 @@ let display_field ctx origin scope cf p = match ctx.com.display.dms_kind with
 			| _ ->
 				cf.cf_name,KClassField
 		in
-		reference_position := (name,cf.cf_name_pos,kind)
+		ReferencePosition.set (name,cf.cf_name_pos,kind)
 	| DMHover ->
 		let cf = if Meta.has Meta.Impl cf.cf_meta then
 			prepare_using_field cf
@@ -232,7 +232,7 @@ let maybe_display_field ctx origin scope cf p =
 let display_enum_field ctx en ef p = match ctx.com.display.dms_kind with
 	| DMDefinition -> raise_position [ef.ef_name_pos]
 	| DMTypeDefinition -> raise_position_of_type ef.ef_type
-	| DMUsage _ -> reference_position := (ef.ef_name,ef.ef_name_pos,KEnumField)
+	| DMUsage _ -> ReferencePosition.set (ef.ef_name,ef.ef_name_pos,KEnumField)
 	| DMHover ->
 		let ct = completion_type_of_type ctx ef.ef_type in
 		raise_hover (make_ci_enum_field (CompletionEnumField.make ef (Self (TEnumDecl en)) true) (ef.ef_type,ct)) p

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

@@ -147,7 +147,7 @@ let find_possible_references kind name (pack,decls) =
 	) decls
 
 let find_possible_references tctx cs =
-	let name,pos,kind = !Display.reference_position in
+	let name,pos,kind = Display.ReferencePosition.get () in
 	if not (CompilationServer.is_initialized cs) then begin
 		CompilationServer.set_initialized cs;
 		DisplayToplevel.read_class_paths tctx.com ["display";"references"];
@@ -171,7 +171,7 @@ let find_possible_references tctx cs =
 	()
 
 let find_references tctx com with_definition =
-	let name,pos,kind = !Display.reference_position in
+	let name,pos,kind = Display.ReferencePosition.get () in
 	let t = Timer.timer ["display";"references";"collect"] in
 	let symbols,relations = Statistics.collect_statistics tctx (SFPos pos) in
 	t();
@@ -182,17 +182,14 @@ let find_references tctx com with_definition =
 	in
 	let t = Timer.timer ["display";"references";"filter"] in
 	let usages = Hashtbl.fold (fun p sym acc ->
-		if p = pos then begin
-			let acc = if with_definition then p :: acc else acc in
-			(try loop acc (Hashtbl.find relations p)
-			with Not_found -> acc)
-		end else
-			acc
+		let acc = if with_definition then p :: acc else acc in
+		(try loop acc (Hashtbl.find relations p)
+		with Not_found -> acc)
 	) symbols [] in
 	let usages = List.sort (fun p1 p2 ->
 		let c = compare p1.pfile p2.pfile in
 		if c <> 0 then c else compare p1.pmin p2.pmin
 	) usages in
 	t();
-	Display.reference_position := ("",null_pos,KVar);
+	Display.ReferencePosition.set ("",null_pos,KVar);
 	DisplayException.raise_position usages

+ 7 - 7
src/typing/typerDisplay.ml

@@ -248,32 +248,32 @@ and display_expr ctx e_ast e dk with_type p =
 	| DMUsage _ ->
 		let rec loop e = match e.eexpr with
 		| TField(_,FEnum(_,ef)) ->
-			Display.reference_position := (ef.ef_name,ef.ef_name_pos,KEnumField);
+			Display.ReferencePosition.set (ef.ef_name,ef.ef_name_pos,KEnumField);
 		| TField(_,(FAnon cf | FInstance (_,_,cf) | FStatic (_,cf) | FClosure (_,cf))) ->
-			Display.reference_position := (cf.cf_name,cf.cf_name_pos,KClassField);
+			Display.ReferencePosition.set (cf.cf_name,cf.cf_name_pos,KClassField);
 		| TLocal v | TVar(v,_) ->
-			Display.reference_position := (v.v_name,v.v_pos,KVar);
+			Display.ReferencePosition.set (v.v_name,v.v_pos,KVar);
 		| TTypeExpr mt ->
 			let ti = t_infos mt in
-			Display.reference_position := (snd ti.mt_path,ti.mt_name_pos,KModuleType);
+			Display.ReferencePosition.set (snd ti.mt_path,ti.mt_name_pos,KModuleType);
 		| TNew(c,tl,_) ->
 			begin try
 				let _,cf = get_constructor ctx c tl p in
-				Display.reference_position := (snd c.cl_path,cf.cf_name_pos,KConstructor);
+				Display.ReferencePosition.set (snd c.cl_path,cf.cf_name_pos,KConstructor);
 			with Not_found ->
 				()
 			end
 		| TCall({eexpr = TConst TSuper},_) ->
 			begin try
 				let cf = get_super_constructor() in
-				Display.reference_position := (cf.cf_name,cf.cf_name_pos,KClassField);
+				Display.ReferencePosition.set (cf.cf_name,cf.cf_name_pos,KClassField);
 			with Not_found ->
 				()
 			end
 		| TConst TSuper ->
 			begin match ctx.curclass.cl_super with
 				| None -> ()
-				| Some (c,_) -> Display.reference_position := (snd c.cl_path,c.cl_name_pos,KModuleType);
+				| Some (c,_) -> Display.ReferencePosition.set (snd c.cl_path,c.cl_name_pos,KModuleType);
 			end
 		| TCall(e1,_) ->
 			loop e1