Forráskód Böngészése

[cs] fields named as enclosing types (fixes #4639)

Aleksandr Kuzmenko 6 éve
szülő
commit
02846e4a32
2 módosított fájl, 53 hozzáadás és 17 törlés
  1. 42 17
      src/generators/gencs.ml
  2. 11 0
      tests/unit/src/unit/issues/Issue4639.hx

+ 42 - 17
src/generators/gencs.ml

@@ -750,9 +750,34 @@ let generate con =
 			ns
 		in
 
+		let change_class_field cl name =
+			let change_ctor name = if name = "new" then snd cl.cl_path else name in
+			let rec gen name =
+				let name = name ^ "_" ^ name in
+				if PMap.mem name cl.cl_fields || PMap.mem name cl.cl_statics then gen name
+				else name
+			in
+			change_id (if name = snd cl.cl_path then gen name else (change_ctor name))
+		in
+		let change_enum_field enum name =
+			let rec gen name =
+				let name = name ^ "_" ^ name in
+				if PMap.mem name enum.e_constrs then gen name
+				else name
+			in
+			change_id (if name = snd enum.e_path then gen name else name)
+		in
 		let change_field = change_id in
 		let write_id w name = write w (change_id name) in
+		let write_class_field cl w name = write w (change_class_field cl name) in
+		let write_enum_field enum w name = write w (change_enum_field enum name) in
 		let write_field w name = write w (change_field name) in
+		let get_write_field field_access =
+			match field_access with
+			| FInstance (cl,_,f) | FStatic (cl,f) | FClosure (Some (cl,_),f) -> write_class_field cl
+			| FEnum (enum,f) -> write_enum_field enum
+			| _ -> write_field
+		in
 
 		let ptr =
 			if Common.defined gen.gcon Define.Unsafe then
@@ -1221,7 +1246,7 @@ let generate con =
 						if is_event (gen.greal_type ef.etype) propname then begin
 							expr_s w ef;
 							write w ".";
-							write_field w propname;
+							(get_write_field f) w propname;
 							write w " += ";
 							expr_s w ev
 						end else
@@ -1232,7 +1257,7 @@ let generate con =
 						if is_event (gen.greal_type ef.etype) propname then begin
 							expr_s w ef;
 							write w ".";
-							write_field w propname;
+							(get_write_field f) w propname;
 							write w " -= ";
 							expr_s w ev
 						end else
@@ -1246,7 +1271,7 @@ let generate con =
 							else begin
 								expr_s w ef;
 								write w ".";
-								write_field w propname
+								(get_write_field f) w propname
 							end
 						else
 							do_call w e []
@@ -1256,17 +1281,17 @@ let generate con =
 						if is_extern_prop (gen.greal_type ef.etype) propname then begin
 							expr_s w ef;
 							write w ".";
-							write_field w propname;
+							(get_write_field f) w propname;
 							write w " = ";
 							expr_s w v
 						end else
 							do_call w e [v]
-					| TField (e, (FStatic(_, cf) | FInstance(_, _, cf))) when Meta.has Meta.Native cf.cf_meta ->
+					| TField (e, ((FStatic(_, cf) | FInstance(_, _, cf)) as f)) when Meta.has Meta.Native cf.cf_meta ->
 						let rec loop meta = match meta with
 							| (Meta.Native, [EConst (String s), _],_) :: _ ->
-								expr_s w e; write w "."; write_field w s
+								expr_s w e; write w "."; (get_write_field f) w s
 							| _ :: tl -> loop tl
-							| [] -> expr_s w e; write w "."; write_field w (cf.cf_name)
+							| [] -> expr_s w e; write w "."; (get_write_field f) w (cf.cf_name)
 						in
 						loop cf.cf_meta
 					| TConst c ->
@@ -1309,9 +1334,9 @@ let generate con =
 					| TIdent "__sizeof__" -> write w "sizeof"
 					| TLocal var ->
 						write_id w var.v_name
-					| TField (_, FEnum(e, ef)) ->
+					| TField (_, (FEnum(e, ef) as f)) ->
 						let s = ef.ef_name in
-						print w "%s." ("global::" ^ module_s (TEnumDecl e)); write_field w s
+						print w "%s." ("global::" ^ module_s (TEnumDecl e)); (get_write_field f) w s
 					| TArray (e1, e2) ->
 						expr_s w e1; write w "["; expr_s w e2; write w "]"
 					| TBinop ((Ast.OpAssign as op), e1, e2)
@@ -1337,7 +1362,7 @@ let generate con =
 							| TAbstractDecl a -> write w (t_s (TAbstract(a, List.map (fun _ -> t_empty) a.a_params)))
 						);
 						write w ".";
-						write_field w (field_name s)
+						(get_write_field s) w (field_name s)
 					| TField (e, s) when is_pointer gen e.etype ->
 						(* take off the extra cast if possible *)
 						let e = match e.eexpr with
@@ -1345,9 +1370,9 @@ let generate con =
 								e1
 							| _ -> e
 						in
-						expr_s w e; write w "->"; write_field w (field_name s)
+						expr_s w e; write w "->"; (get_write_field s) w (field_name s)
 					| TField (e, s) ->
-						expr_s w e; write w "."; write_field w (field_name s)
+						expr_s w e; write w "."; (get_write_field s) w (field_name s)
 					| TTypeExpr mt ->
 						(match change_md mt with
 							| TClassDecl { cl_path = (["haxe"], "Int64") } -> write w ("global::" ^ module_s mt)
@@ -1946,7 +1971,7 @@ let generate con =
 			let visibility = if is_interface then "" else "public" in
 			let visibility, modifiers = get_fun_modifiers event.cf_meta visibility ["event"] in
 			let v_n = if is_static then "static" else "" in
-			gen_field_decl w visibility v_n modifiers (t_s (run_follow gen t)) (change_field event.cf_name);
+			gen_field_decl w visibility v_n modifiers (t_s (run_follow gen t)) (change_class_field cl event.cf_name);
 			if custom && not is_interface then begin
 				write w " ";
 				begin_block w;
@@ -1982,7 +2007,7 @@ let generate con =
 			let v_n = if is_static then "static" else if is_override && not is_interface then "override" else if is_virtual then "virtual" else "" in
 			gen_nocompletion w prop.cf_meta;
 
-			gen_field_decl w visibility v_n modifiers (t_s (run_follow gen t)) (change_field prop.cf_name);
+			gen_field_decl w visibility v_n modifiers (t_s (run_follow gen t)) (change_class_field cl prop.cf_name);
 
 			let check cf = match cf with
 				| Some ({ cf_overloads = o :: _ } as cf) ->
@@ -2053,7 +2078,7 @@ let generate con =
 			gen_attributes w cf.cf_meta;
 			let is_interface = cl.cl_interface in
 			let name, is_new, is_explicit_iface = match cf.cf_name with
-				| "new" -> snd cl.cl_path, true, false
+				| "new" -> cf.cf_name, true, false
 				| name when String.contains name '.' ->
 					let fn_name, path = parse_explicit_iface name in
 					(s_type_path path) ^ "." ^ fn_name, false, true
@@ -2094,7 +2119,7 @@ let generate con =
 						let access, modifiers = get_fun_modifiers cf.cf_meta "public" [] in
 						let modifiers = modifiers @ modf in
 						gen_nocompletion w cf.cf_meta;
-						gen_field_decl w access (if is_static then "static" else "") modifiers (t_s (run_follow gen cf.cf_type)) (change_field name);
+						gen_field_decl w access (if is_static then "static" else "") modifiers (t_s (run_follow gen cf.cf_type)) (change_class_field cl name);
 						(match cf.cf_expr with
 							| Some e ->
 								write w " = ";
@@ -2157,7 +2182,7 @@ let generate con =
 					gen_nocompletion w cf.cf_meta;
 
 					(* public static void funcName *)
-					gen_field_decl w visibility v_n modifiers (if not is_new then (rett_s (run_follow gen ret_type)) else "") (change_field name);
+					gen_field_decl w visibility v_n modifiers (if not is_new then (rett_s (run_follow gen ret_type)) else "") (change_class_field cl name);
 
 					let params, params_ext = get_string_params cl cf.cf_params in
 					(* <T>(string arg1, object arg2) with T : object *)

+ 11 - 0
tests/unit/src/unit/issues/Issue4639.hx

@@ -0,0 +1,11 @@
+package unit.issues;
+
+class Issue4639 extends unit.Test {
+	static var Issue4639:Int = 10;
+	function test() {
+		eq(10, Issue4639);
+		eq(A, A);
+	}
+}
+
+private enum A { A; }