瀏覽代碼

extern enums

Nicolas Cannasse 19 年之前
父節點
當前提交
993ff96877
共有 9 個文件被更改,包括 22 次插入27 次删除
  1. 1 0
      ast.ml
  2. 1 3
      genjs.ml
  3. 9 9
      genneko.ml
  4. 1 3
      genswf8.ml
  5. 2 5
      genswf9.ml
  6. 1 3
      parser.ml
  7. 3 3
      std/StdTypes.hx
  8. 1 0
      type.ml
  9. 3 1
      typer.ml

+ 1 - 0
ast.ml

@@ -199,6 +199,7 @@ type class_field =
 
 type enum_param =
 	| EPrivate
+	| EExtern
 
 type type_param_flag =
 	| HInterface

+ 1 - 3
genjs.ml

@@ -638,9 +638,7 @@ let generate_type ctx = function
 		| None -> ()
 		| Some e -> ctx.inits <- Transform.block_vars e :: ctx.inits);
 		if not c.cl_extern then generate_class ctx c
-	| TEnumDecl { e_path = ([],"Bool") } ->
-		()
-	| TEnumDecl e when PMap.is_empty e.e_constrs ->
+	| TEnumDecl e when e.e_extern ->
 		()
 	| TEnumDecl e -> generate_enum ctx e
 	| TTypeDecl _ -> ()

+ 9 - 9
genneko.ml

@@ -516,23 +516,23 @@ let gen_enum e =
 		| _ -> []
 	),p)
 
-let gen_type ctx t =
+let gen_type ctx t acc =
 	match t with
 	| TClassDecl c ->
 		(match c.cl_init with
 		| None -> ()
 		| Some e -> ctx.inits <- e :: ctx.inits);
 		if c.cl_extern then
-			null (pos c.cl_pos)
+			acc
 		else
-			gen_class ctx c
+			gen_class ctx c :: acc
 	| TEnumDecl e ->
-		if e.e_path = ([],"Bool") || PMap.is_empty e.e_constrs then
-			null (pos e.e_pos)
+		if e.e_extern then
+			acc
 		else
-			gen_enum e
+			gen_enum e :: acc
 	| TTypeDecl t ->
-		null (pos t.t_pos)
+		acc
 
 let gen_static_vars ctx t =
 	match t with
@@ -587,7 +587,7 @@ let gen_boot hres =
 
 let gen_name acc t =
 	match t with
-	| TEnumDecl e when PMap.is_empty e.e_constrs || e.e_path = ([],"Bool") ->
+	| TEnumDecl e when e.e_extern ->
 		acc
 	| TEnumDecl e ->
 		let p = pos e.e_pos in
@@ -624,7 +624,7 @@ let generate file types hres =
 	) , { psource = "<header>"; pline = 1; } in
 	let packs = List.concat (List.map (gen_package h) types) in
 	let names = List.fold_left gen_name [] types in
-	let methods = List.map (gen_type ctx) types in
+	let methods = List.fold_left (fun acc t -> gen_type ctx t acc) [] types in
 	let boot = gen_boot hres in
 	let inits = List.map (gen_expr ctx) (List.rev ctx.inits) in
 	let vars = List.concat (List.map (gen_static_vars ctx) types) in

+ 1 - 3
genswf8.ml

@@ -1229,9 +1229,7 @@ let gen_type_def ctx t =
 		let flag = is_protected ctx (TInst (c,[])) true in
 		List.iter (gen_class_static_field ctx c flag) c.cl_ordered_statics;
 		PMap.iter (fun _ f -> gen_class_field ctx f flag) c.cl_fields;
-	| TEnumDecl { e_path = ([],"Bool") } ->
-		()
-	| TEnumDecl e when PMap.is_empty e.e_constrs ->
+	| TEnumDecl e when e.e_extern ->
 		()
 	| TEnumDecl e ->
 		gen_package ctx (fst e.e_path);

+ 2 - 5
genswf9.ml

@@ -1253,14 +1253,11 @@ let generate_enum ctx e =
 	ctx.classes <- sc :: ctx.classes;
 	ctx.statics <- st :: ctx.statics
 
-let can_generate_enum e = 
-	e.e_path <> ([] , "Bool") && not (PMap.is_empty e.e_constrs)
-
 let generate_type ctx t =
 	match t with
 	| TClassDecl c -> if not c.cl_extern then generate_class ctx c
 	| TTypeDecl _ -> ()
-	| TEnumDecl e -> if can_generate_enum e then generate_enum ctx e
+	| TEnumDecl e -> if not e.e_extern then generate_enum ctx e
 
 let generate_inits ctx types =
 	let f = begin_fun ctx [] [] false in
@@ -1276,7 +1273,7 @@ let generate_inits ctx types =
 				f3_kind = A3FClass (index_nz_int (!slot - 1));
 				f3_metas = None;
 			} :: acc
-		| TEnumDecl e when can_generate_enum e ->
+		| TEnumDecl e when not e.e_extern ->
 			incr slot;
 			generate_enum_init ctx e (!slot - 1);
 			{

+ 1 - 3
parser.ml

@@ -163,15 +163,13 @@ and parse_import = parser
 
 and parse_common_params = parser
 	| [< '(Kwd Private,_); l = parse_common_params >] -> (HPrivate, EPrivate) :: l
+	| [< '(Kwd Extern,_); l = parse_common_params >] -> (HExtern, EExtern) :: l
 	| [< >] -> []
 
 and parse_enum_params = parser
-	| [< '(Kwd Private,_); l, p = parse_enum_params >] -> EPrivate :: l , p
 	| [< '(Kwd Enum,p) >] -> [] , p
 
 and parse_class_params = parser
-	| [< '(Kwd Extern,_); l, p = parse_class_params >] -> HExtern :: l , p
-	| [< '(Kwd Private,_); l, p = parse_class_params >] -> HPrivate :: l , p
 	| [< '(Kwd Class,p) >] -> [] , p
 	| [< '(Kwd Interface,p) >] -> [HInterface] , p
 

+ 3 - 3
std/StdTypes.hx

@@ -25,7 +25,7 @@
 
 // standard haXe types
 
-enum Void { }
+extern enum Void { }
 
 extern class Float { }
 
@@ -37,12 +37,12 @@ typedef UInt = Int
 typedef UInt = Int
 #end
 
-enum Bool {
+extern enum Bool {
 	true;
 	false;
 }
 
-enum Dynamic<T> {
+extern enum Dynamic<T> {
 }
 
 typedef Iterator<T> = {

+ 1 - 0
type.ml

@@ -131,6 +131,7 @@ and tenum = {
 	e_pos : Ast.pos;
 	e_doc : Ast.documentation;
 	e_private : bool;
+	e_extern : bool;
 	mutable e_types : (string * t) list;
 	mutable e_constrs : (string , tenum_field) PMap.t;
 }

+ 3 - 1
typer.ml

@@ -560,6 +560,7 @@ let type_type_params ctx path p (n,flags) =
 			e_path = (fst path @ [snd path],n);
 			e_pos = p;
 			e_private = true;
+			e_extern = true;
 			e_types = [];
 			e_constrs = PMap.empty;
 			e_doc = None;
@@ -2080,7 +2081,7 @@ let type_module ctx m tdecls loadp =
 			let path = decl_with_name name p priv in
 			let c = mk_class path p doc priv in
 			decls := TClassDecl c :: !decls
-		| EEnum (name,doc,_,flags,_) ->
+		| EEnum (name,doc,_,flags,l) ->
 			let priv = List.mem EPrivate flags in
 			let path = decl_with_name name p priv in
 			let e = {
@@ -2089,6 +2090,7 @@ let type_module ctx m tdecls loadp =
 				e_doc = doc;
 				e_types = [];
 				e_private = priv;
+				e_extern = List.mem EExtern flags || l = [];
 				e_constrs = PMap.empty;
 			} in
 			decls := TEnumDecl e :: !decls