Browse Source

fix error position for duplicate type declaration (closes #7968) (#9188)

Dan Korostelev 5 years ago
parent
commit
09c0922cbc

+ 11 - 6
src/typing/typeloadModule.ml

@@ -192,8 +192,13 @@ end
 let module_pass_1 ctx m tdecls loadp =
 let module_pass_1 ctx m tdecls loadp =
 	let com = ctx.com in
 	let com = ctx.com in
 	let decls = ref [] in
 	let decls = ref [] in
-	let make_path name priv =
-		if List.exists (fun (t,_) -> snd (t_path t) = name) !decls then error ("Type name " ^ name ^ " is already defined in this module") loadp;
+	let make_path name priv p =
+		List.iter (fun (t2,(_,p2)) -> 
+			if snd (t_path t2) = name then begin
+				display_error ctx ("Type name " ^ name ^ " is already defined in this module") p;
+				error "Previous declaration here" p2;
+			end
+		) !decls;
 		if priv then (fst m.m_path @ ["_" ^ snd m.m_path], name) else (fst m.m_path, name)
 		if priv then (fst m.m_path @ ["_" ^ snd m.m_path], name) else (fst m.m_path, name)
 	in
 	in
 	let pt = ref None in
 	let pt = ref None in
@@ -212,7 +217,7 @@ let module_pass_1 ctx m tdecls loadp =
 			let name = fst d.d_name in
 			let name = fst d.d_name in
 			pt := Some p;
 			pt := Some p;
 			let priv = List.mem HPrivate d.d_flags in
 			let priv = List.mem HPrivate d.d_flags in
-			let path = make_path name priv in
+			let path = make_path name priv p in
 			let c = mk_class m path p (pos d.d_name) in
 			let c = mk_class m path p (pos d.d_name) in
 			(* we shouldn't load any other type until we propertly set cl_build *)
 			(* we shouldn't load any other type until we propertly set cl_build *)
 			c.cl_build <- (fun() -> error (s_type_path c.cl_path ^ " is not ready to be accessed, separate your type declarations in several files") p);
 			c.cl_build <- (fun() -> error (s_type_path c.cl_path ^ " is not ready to be accessed, separate your type declarations in several files") p);
@@ -233,7 +238,7 @@ let module_pass_1 ctx m tdecls loadp =
 			let name = fst d.d_name in
 			let name = fst d.d_name in
 			pt := Some p;
 			pt := Some p;
 			let priv = List.mem EPrivate d.d_flags in
 			let priv = List.mem EPrivate d.d_flags in
-			let path = make_path name priv in
+			let path = make_path name priv p in
 			if Meta.has (Meta.Custom ":fakeEnum") d.d_meta then error "@:fakeEnum enums is no longer supported in Haxe 4, use extern enum abstract instead" p;
 			if Meta.has (Meta.Custom ":fakeEnum") d.d_meta then error "@:fakeEnum enums is no longer supported in Haxe 4, use extern enum abstract instead" p;
 			let e = {
 			let e = {
 				e_path = path;
 				e_path = path;
@@ -259,7 +264,7 @@ let module_pass_1 ctx m tdecls loadp =
 			if has_meta Meta.Using d.d_meta then error "@:using on typedef is not allowed" p;
 			if has_meta Meta.Using d.d_meta then error "@:using on typedef is not allowed" p;
 			pt := Some p;
 			pt := Some p;
 			let priv = List.mem EPrivate d.d_flags in
 			let priv = List.mem EPrivate d.d_flags in
-			let path = make_path name priv in
+			let path = make_path name priv p in
 			let t = {
 			let t = {
 				t_path = path;
 				t_path = path;
 				t_module = m;
 				t_module = m;
@@ -284,7 +289,7 @@ let module_pass_1 ctx m tdecls loadp =
 		 	let name = fst d.d_name in
 		 	let name = fst d.d_name in
 			check_type_name name d.d_meta;
 			check_type_name name d.d_meta;
 			let priv = List.mem AbPrivate d.d_flags in
 			let priv = List.mem AbPrivate d.d_flags in
-			let path = make_path name priv in
+			let path = make_path name priv p in
 			let a = {
 			let a = {
 				a_path = path;
 				a_path = path;
 				a_private = priv;
 				a_private = priv;

+ 2 - 0
tests/misc/projects/Issue7968/Foo.hx

@@ -0,0 +1,2 @@
+typedef A = Int;
+typedef A = Float;

+ 5 - 0
tests/misc/projects/Issue7968/Main.hx

@@ -0,0 +1,5 @@
+import Foo;
+class Main {
+	static function main() {
+	}
+}

+ 1 - 0
tests/misc/projects/Issue7968/compile-fail.hxml

@@ -0,0 +1 @@
+-main Main

+ 2 - 0
tests/misc/projects/Issue7968/compile-fail.hxml.stderr

@@ -0,0 +1,2 @@
+Foo.hx:2: characters 1-18 : Type name A is already defined in this module
+Foo.hx:1: characters 1-16 : Previous declaration here