Skip to content

Commit 539601b

Browse files
authored
[macro] Build order vs inheritance (#11582)
* [macro] more predictable build macro order * [tests] add macro build order test * [tests] Run our build macro before utest build macro
1 parent 707ea41 commit 539601b

File tree

6 files changed

+97
-2
lines changed

6 files changed

+97
-2
lines changed

src/typing/typeloadCheck.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ module Inheritance = struct
513513
match m with
514514
| Meta.AutoBuild, el, p -> c.cl_meta <- (Meta.Build,el,{ c.cl_pos with pmax = c.cl_pos.pmin }(* prevent display metadata *)) :: m :: c.cl_meta
515515
| _ -> ()
516-
) csup.cl_meta;
516+
) (List.rev csup.cl_meta);
517517
if has_class_flag csup CFinal && not (((has_class_flag csup CExtern) && Meta.has Meta.Hack c.cl_meta) || (match c.cl_kind with KTypeParameter _ -> true | _ -> false)) then
518518
raise_typing_error ("Cannot extend a final " ^ if (has_class_flag c CInterface) then "interface" else "class") p;
519519
in
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Macro {
2+
static var id = 0;
3+
static function build(i:String) {
4+
if (haxe.macro.Context.getLocalClass().get().isInterface) return null;
5+
6+
var hasMacros = false;
7+
var fields = haxe.macro.Context.getBuildFields();
8+
for (f in fields) {
9+
if (f.name == "macros") {
10+
hasMacros = true;
11+
break;
12+
}
13+
}
14+
15+
if (!hasMacros)
16+
fields = (macro class A {
17+
public static var macros = [];
18+
}).fields.concat(fields);
19+
20+
var id = '_' + id++;
21+
fields.push((macro class A {
22+
static var $id = {macros.push($v{i}); 0;};
23+
}).fields[0]);
24+
25+
return fields;
26+
}
27+
}
+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
class Main {
2+
static function main() {
3+
trace("Foo");
4+
trace(Foo1.macros);
5+
trace(Foo2.macros);
6+
trace(Foo3.macros);
7+
trace(Foo4.macros);
8+
9+
trace("Bar");
10+
trace(Bar1.macros);
11+
trace(Bar2.macros);
12+
trace(Bar3.macros);
13+
14+
trace("Baz");
15+
trace(Baz1.macros);
16+
trace(Baz2.macros);
17+
trace(Baz3.macros);
18+
}
19+
}
20+
21+
@:autoBuild(Macro.build("I1"))
22+
interface I1 {}
23+
24+
@:autoBuild(Macro.build("I2"))
25+
interface I2 {}
26+
27+
@:autoBuild(Macro.build("auto Foo1 (1)"))
28+
@:autoBuild(Macro.build("auto Foo1 (2)"))
29+
@:build(Macro.build("Foo1"))
30+
class Foo1 implements I1 implements I2 {}
31+
32+
@:build(Macro.build("Foo2"))
33+
class Foo2 extends Foo1 {}
34+
35+
@:build(Macro.build("Foo3 (1)"))
36+
@:build(Macro.build("Foo3 (2)"))
37+
class Foo3 extends Foo2 {}
38+
39+
@:build(Macro.build("Foo4"))
40+
class Foo4 extends Foo3 {}
41+
42+
class Bar1 implements I2 implements I1 {}
43+
class Bar2 extends Bar1 {}
44+
class Bar3 extends Bar2 {}
45+
46+
@:autoBuild(Macro.build("I3"))
47+
interface I3 extends I1 {}
48+
49+
class Baz1 implements I3 implements I2 {}
50+
class Baz2 extends Baz1 {}
51+
class Baz3 extends Baz2 {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-main Main
2+
--interp
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
Main.hx:3: Foo
2+
Main.hx:4: [I2,I1,Foo1]
3+
Main.hx:5: [I2,I1,auto Foo1 (1),auto Foo1 (2),Foo2]
4+
Main.hx:6: [I2,I1,auto Foo1 (1),auto Foo1 (2),Foo3 (1),Foo3 (2)]
5+
Main.hx:7: [I2,I1,auto Foo1 (1),auto Foo1 (2),Foo4]
6+
Main.hx:9: Bar
7+
Main.hx:10: [I1,I2]
8+
Main.hx:11: [I1,I2]
9+
Main.hx:12: [I1,I2]
10+
Main.hx:14: Baz
11+
Main.hx:15: [I2,I1,I3]
12+
Main.hx:16: [I2,I1,I3]
13+
Main.hx:17: [I2,I1,I3]

tests/server/src/TestCase.hx

+3-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ using StringTools;
1818
using Lambda;
1919

2020
@:autoBuild(utils.macro.BuildHub.build())
21-
class TestCase implements ITest {
21+
interface ITestCase {}
22+
23+
class TestCase implements ITest implements ITestCase {
2224
static public var debugLastResult:{
2325
hasError:Bool,
2426
stdout:String,

0 commit comments

Comments
 (0)