Bläddra i källkod

fixed interfaces generation and conflicting classes.

Nicolas Cannasse 18 år sedan
förälder
incheckning
0760ee977d
2 ändrade filer med 30 tillägg och 10 borttagningar
  1. 1 0
      doc/CHANGES.txt
  2. 29 10
      genas3.ml

+ 1 - 0
doc/CHANGES.txt

@@ -4,6 +4,7 @@
 	fixed prototype bug in neko when "Main" class is defined
 	fixed prototype bug in neko when "Main" class is defined
 	fixed flash9 xml iterator methods
 	fixed flash9 xml iterator methods
 	bugfix in flash9 ByteArray serialization
 	bugfix in flash9 ByteArray serialization
+	fixed genAS3 conflicting classes and interfaces
 
 
 2007-05-18: 1.13
 2007-05-18: 1.13
 	fixed bug with local variable masking package in catch type
 	fixed bug with local variable masking package in catch type

+ 29 - 10
genas3.ml

@@ -28,7 +28,7 @@ type context = {
 	mutable in_value : string option;
 	mutable in_value : string option;
 	mutable in_static : bool;
 	mutable in_static : bool;
 	mutable handle_break : bool;
 	mutable handle_break : bool;
-	mutable imports : (string,string list) Hashtbl.t;
+	mutable imports : (string,string list list) Hashtbl.t;
 	mutable locals : (string,string) PMap.t;
 	mutable locals : (string,string) PMap.t;
 	mutable inv_locals : (string,string) PMap.t;
 	mutable inv_locals : (string,string) PMap.t;
 	mutable local_types : t list;
 	mutable local_types : t list;
@@ -48,12 +48,16 @@ let s_path ctx path p =
 	| (["flash"],"FlashXml__") ->
 	| (["flash"],"FlashXml__") ->
 		"Xml"
 		"Xml"
 	| (pack,name) ->
 	| (pack,name) ->
-		(try
-			let pack2 = Hashtbl.find ctx.imports name in
-			if pack2 <> pack then Typer.error ("The classes " ^ Ast.s_type_path (pack,name) ^ " and " ^ Ast.s_type_path (pack2,name) ^ " conflicts") p;
+		try
+			(match Hashtbl.find ctx.imports name with
+			| p :: _ when p = pack ->
+				name
+			| packs ->
+				if not (List.mem pack packs) then Hashtbl.replace ctx.imports name (packs @ [pack]);
+				Ast.s_type_path path)
 		with Not_found ->
 		with Not_found ->
-			Hashtbl.add ctx.imports name pack);
-		name
+			Hashtbl.add ctx.imports name [pack];
+			name
 
 
 let s_ident n =
 let s_ident n =
 	match n with
 	match n with
@@ -76,6 +80,8 @@ let init dir path =
 	let dir = dir :: fst path in
 	let dir = dir :: fst path in
 	create [] dir;
 	create [] dir;
 	let ch = open_out (String.concat "/" dir ^ "/" ^ snd path ^ ".as") in
 	let ch = open_out (String.concat "/" dir ^ "/" ^ snd path ^ ".as") in
+	let imports = Hashtbl.create 0 in
+	Hashtbl.add imports (snd path) [fst path];
 	{
 	{
 		tabs = "";
 		tabs = "";
 		ch = ch;
 		ch = ch;
@@ -84,7 +90,7 @@ let init dir path =
 		in_value = None;
 		in_value = None;
 		in_static = false;
 		in_static = false;
 		handle_break = false;
 		handle_break = false;
-		imports = Hashtbl.create 0;
+		imports = imports;
 		curclass = null_class;
 		curclass = null_class;
 		locals = PMap.empty;
 		locals = PMap.empty;
 		inv_locals = PMap.empty;
 		inv_locals = PMap.empty;
@@ -96,8 +102,11 @@ let init dir path =
 
 
 let close ctx =
 let close ctx =
 	output_string ctx.ch (Printf.sprintf "package %s {\n" (String.concat "." (fst ctx.path)));
 	output_string ctx.ch (Printf.sprintf "package %s {\n" (String.concat "." (fst ctx.path)));
-	Hashtbl.iter (fun name pack ->
-		if ctx.path <> (pack,name) then output_string ctx.ch ("\timport " ^ Ast.s_type_path (pack,name) ^ ";\n");
+	Hashtbl.iter (fun name paths ->
+		List.iter (fun pack ->
+			let path = pack, name in
+			if path <> ctx.path then output_string ctx.ch ("\timport " ^ Ast.s_type_path path ^ ";\n");
+		) paths
 	) ctx.imports;
 	) ctx.imports;
 	output_string ctx.ch (Buffer.contents ctx.buf);
 	output_string ctx.ch (Buffer.contents ctx.buf);
 	close_out ctx.ch
 	close_out ctx.ch
@@ -727,7 +736,17 @@ let generate_field ctx static f =
 	| _ ->
 	| _ ->
 		if ctx.curclass.cl_path = (["flash"],"Boot") && f.cf_name = "init" then
 		if ctx.curclass.cl_path = (["flash"],"Boot") && f.cf_name = "init" then
 			generate_boot_init ctx
 			generate_boot_init ctx
-		else if not ctx.curclass.cl_interface then begin
+		else if ctx.curclass.cl_interface then
+			match follow f.cf_type with
+			| TFun (args,r) ->
+				print ctx "function %s(" f.cf_name;
+				concat ctx "," (fun (arg,o,t) ->
+					print ctx "%s : %s" arg (type_str ctx t p);
+					if o then spr ctx " = null";
+				) args;
+				print ctx ") : %s " (type_str ctx r p);
+			| _ -> ()
+		else begin
 			print ctx "%s var %s : %s" rights (s_ident f.cf_name) (type_str ctx f.cf_type p);
 			print ctx "%s var %s : %s" rights (s_ident f.cf_name) (type_str ctx f.cf_type p);
 			match f.cf_expr with
 			match f.cf_expr with
 			| None -> ()
 			| None -> ()