Parcourir la source

make sure multiple `@:build` macros are run (closes #4454)

Simon Krajewski il y a 9 ans
Parent
commit
fe1ce12fbb

+ 20 - 0
tests/misc/projects/Issue4454/Main.hx

@@ -0,0 +1,20 @@
+#if !macro
+@:build(Main.build1())
+@:build(Main.build2())
+#end
+class Main {
+    #if macro
+    static function build1() {
+        Sys.stderr().writeString("Build 1");
+        return haxe.macro.Context.getBuildFields();
+    }
+
+    static function build2() {
+        Sys.stderr().writeString("Build 2");
+        return haxe.macro.Context.getBuildFields();
+    }
+    #end
+
+    static function main() {
+    }
+}

+ 2 - 0
tests/misc/projects/Issue4454/compile.hxml

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

+ 1 - 0
tests/misc/projects/Issue4454/compile.hxml.stderr

@@ -0,0 +1 @@
+Build 1Build 2

+ 4 - 4
typeload.ml

@@ -1820,7 +1820,7 @@ let is_java_native_function meta = try
 
 let build_module_def ctx mt meta fvars context_init fbuild =
 	let loop (f_build,f_enum) = function
-		| Meta.Build,args,p -> Some (fun () ->
+		| Meta.Build,args,p -> (fun () ->
 				let epath, el = (match args with
 					| [ECall (epath,el),p] -> epath, el
 					| _ -> error "Invalid build parameters" p
@@ -1835,7 +1835,7 @@ let build_module_def ctx mt meta fvars context_init fbuild =
 				(match r with
 				| None -> error "Build failure" p
 				| Some e -> fbuild e)
-			),f_enum
+			) :: f_build,f_enum
 		| Meta.Enum,_,p -> f_build,Some (fun () ->
 				begin match mt with
 					| TClassDecl ({cl_kind = KAbstractImpl a} as c) ->
@@ -1850,8 +1850,8 @@ let build_module_def ctx mt meta fvars context_init fbuild =
 			f_build,f_enum
 	in
 	(* let errors go through to prevent resume if build fails *)
-	let f_build,f_enum = List.fold_left loop (None,None) meta in
-	(match f_build with None -> () | Some f -> f());
+	let f_build,f_enum = List.fold_left loop ([],None) meta in
+	List.iter (fun f -> f()) (List.rev f_build);
 	(match f_enum with None -> () | Some f -> f())
 
 module ClassInitializer = struct