Browse Source

[typer] allow `using` module's private types

closes #8145
Simon Krajewski 5 years ago
parent
commit
2ae4cb0837
3 changed files with 22 additions and 7 deletions
  1. 2 2
      src/typing/finalization.ml
  2. 5 5
      src/typing/typeload.ml
  3. 15 0
      tests/unit/src/unit/issues/Issue8145.hx

+ 2 - 2
src/typing/finalization.ml

@@ -26,7 +26,7 @@ let get_main ctx types =
 					p := c.cl_pos;
 					c, PMap.find "main" c.cl_statics
 			with Not_found -> try
-				let t = Typeload.find_type_in_module_raise m name null_pos in
+				let t = Typeload.find_type_in_module_raise ctx m name null_pos in
 				match t with
 				| TEnumDecl _ | TTypeDecl _ | TAbstractDecl _ ->
 					error ("Invalid -main : " ^ s_type_path path ^ " is not a class") null_pos
@@ -37,7 +37,7 @@ let get_main ctx types =
 				error ("Invalid -main : " ^ s_type_path path ^ " does not have static function main") !p
 		in
 		let ft = Type.field_type f in
-		let fmode, r = 
+		let fmode, r =
 			match follow ft with
 			| TFun ([],r) -> FStatic (c,f), r
 			| _ -> error ("Invalid -main : " ^ s_type_path path ^ " has invalid main function") c.cl_pos

+ 5 - 5
src/typing/typeload.ml

@@ -86,12 +86,12 @@ let find_type_in_module m tname =
 	) m.m_types
 
 (* raises Type_not_found *)
-let find_type_in_module_raise m tname p =
+let find_type_in_module_raise ctx m tname p =
 	try
 		List.find (fun mt ->
 			let infos = t_infos mt in
 			if snd infos.mt_path = tname then
-				if infos.mt_private then
+				if ctx.m.curmod != infos.mt_module && infos.mt_private then
 					raise_error (Type_not_found (m.m_path,tname,Private_type)) p
 				else
 					true
@@ -104,7 +104,7 @@ let find_type_in_module_raise m tname p =
 (* raises Module_not_found or Type_not_found *)
 let load_type_raise ctx mpath tname p =
 	let m = ctx.g.do_load_module ctx mpath p in
-	find_type_in_module_raise m tname p
+	find_type_in_module_raise ctx m tname p
 
 (* raises Not_found *)
 let load_type ctx mpath tname p = try
@@ -193,7 +193,7 @@ let load_unqualified_type_def ctx mname tname p =
 		if resume then
 			find_type_in_module m tname
 		else
-			find_type_in_module_raise m tname p
+			find_type_in_module_raise ctx m tname p
 	in
 	find_in_unqualified_modules ctx mname p find_type ~resume:false
 
@@ -209,7 +209,7 @@ let load_module ctx path p =
 
 let load_qualified_type_def ctx pack mname tname p =
 	let m = load_module ctx (pack,mname) p in
-	find_type_in_module_raise m tname p
+	find_type_in_module_raise ctx m tname p
 
 (*
 	load a type or a subtype definition

+ 15 - 0
tests/unit/src/unit/issues/Issue8145.hx

@@ -0,0 +1,15 @@
+package unit.issues;
+
+using unit.issues.Issue8145.Helper;
+
+class Issue8145 extends unit.Test {
+	function test() {
+		eq("foo", "foo".foo());
+	}
+}
+
+private class Helper {
+	public static function foo(s:String) {
+		return s;
+	}
+}