소스 검색

[display] fix module-level texpr display handling

closes #10638
Simon Krajewski 3 년 전
부모
커밋
b164d49ed3
3개의 변경된 파일51개의 추가작업 그리고 15개의 파일을 삭제
  1. 19 7
      src/context/display/displayTexpr.ml
  2. 11 8
      src/typing/typeloadModule.ml
  3. 21 0
      tests/server/src/cases/display/issues/Issue10638.hx

+ 19 - 7
src/context/display/displayTexpr.ml

@@ -26,6 +26,14 @@ let find_class_by_position decls p =
 	in
 	loop decls
 
+let find_module_static_by_position decls p =
+	let rec loop dl = match dl with
+		| (EStatic d,_) :: dl when pos d.d_name = p -> d
+		| _ :: dl -> loop dl
+		| [] -> raise Not_found
+	in
+	loop decls
+
 let find_enum_by_position decls p =
 	let rec loop dl = match dl with
 		| (EEnum en,_) :: dl when pos en.d_name = p -> en
@@ -50,11 +58,10 @@ let find_abstract_by_position decls p =
 	in
 	loop decls
 
-let check_display_field ctx sc c cf =
-	let cff = find_field_by_position sc cf.cf_name_pos in
+let actually_check_display_field ctx c cff p =
 	let context_init = new TypeloadFields.context_init in
-	let cctx = TypeloadFields.create_class_context c context_init cf.cf_pos in
-	let ctx = TypeloadFields.create_typer_context_for_class ctx cctx cf.cf_pos in
+	let cctx = TypeloadFields.create_class_context c context_init p in
+	let ctx = TypeloadFields.create_typer_context_for_class ctx cctx p in
 	let cff = TypeloadFields.transform_field (ctx,cctx) c cff (ref []) (pos cff.cff_name) in
 	let display_modifier = Typeload.check_field_access ctx cff in
 	let fctx = TypeloadFields.create_field_context cctx cff true display_modifier in
@@ -62,6 +69,10 @@ let check_display_field ctx sc c cf =
 	flush_pass ctx PTypeField "check_display_field";
 	ignore(follow cf.cf_type)
 
+let check_display_field ctx sc c cf =
+	let cff = find_field_by_position sc cf.cf_name_pos in
+	actually_check_display_field ctx c cff cf.cf_pos
+
 let check_display_class ctx decls c =
 	let check_field sc cf =
 		if display_position#enclosed_in cf.cf_pos then
@@ -118,10 +129,11 @@ let check_display_abstract ctx decls a =
 
 let check_display_module_fields ctx decls m =
 	Option.may (fun c ->
-		let sc = find_class_by_position decls c.cl_name_pos in
 		List.iter (fun cf ->
-			if display_position#enclosed_in cf.cf_pos then
-				check_display_field ctx sc c cf;
+			if display_position#enclosed_in cf.cf_pos then begin
+				let cff = find_module_static_by_position decls cf.cf_name_pos in
+				actually_check_display_field ctx c (TypeloadModule.field_of_static_definition cff cf.cf_pos) cf.cf_pos;
+			end;
 			DisplayEmitter.check_display_metadata ctx cf.cf_meta
 		) c.cl_ordered_statics
 	) m.m_statics

+ 11 - 8
src/typing/typeloadModule.ml

@@ -199,6 +199,16 @@ module StrictMeta = struct
 			| _ -> []
 end
 
+let field_of_static_definition d p =
+	{
+		cff_name = d.d_name;
+		cff_doc = d.d_doc;
+		cff_pos = p;
+		cff_meta = d.d_meta;
+		cff_access = (AStatic,null_pos) :: d.d_flags;
+		cff_kind = d.d_data;
+	}
+
 (*
 	Build module structure : should be atomic - no type loading is possible
 *)
@@ -384,14 +394,7 @@ let module_pass_1 ctx m tdecls loadp =
 			let first_pos = ref null_pos in
 			let fields = List.map (fun (d,p) ->
 				first_pos := p;
-				{
-					cff_name = d.d_name;
-					cff_doc = d.d_doc;
-					cff_pos = p;
-					cff_meta = d.d_meta;
-					cff_access = (AStatic,null_pos) :: d.d_flags;
-					cff_kind = d.d_data;
-				}
+				field_of_static_definition d p;
 			) statics in
 			let p = let p = !first_pos in { p with pmax = p.pmin } in
 			let c = EClass {

+ 21 - 0
tests/server/src/cases/display/issues/Issue10638.hx

@@ -0,0 +1,21 @@
+package cases.display.issues;
+
+class Issue10638 extends DisplayTestCase {
+	/**
+		var x = {-1-}"f{-2-}oo"{-3-};
+
+		class Main {
+			static function main() {}
+		}
+	**/
+	function test(_) {
+		runHaxe(["--main", "Main"]);
+		runHaxeJson([], DisplayMethods.Hover, {
+			file: file,
+			offset: offset(2)
+		});
+		var result = parseHover();
+		Assert.same(range(1, 3), result.result.range);
+	}
+
+}