diff --git a/tests/misc/projects/Issue11582/Macro2.macro.hx b/tests/misc/projects/Issue11582/Macro2.macro.hx new file mode 100644 index 00000000000..71b46b7a989 --- /dev/null +++ b/tests/misc/projects/Issue11582/Macro2.macro.hx @@ -0,0 +1,72 @@ +import haxe.macro.Context; +import haxe.macro.Expr; + +using StringTools; + +class Macro2 { + static var id = 0; + + static function registerBuild(i:String, fields:Array) { + if (Context.getLocalClass().get().isInterface) return null; + + var hasMacros = false; + for (f in fields) { + if (f.name == "macros") { + hasMacros = true; + break; + } + } + + if (!hasMacros) + fields = (macro class A { + public static var macros = []; + }).fields.concat(fields); + + var id = '_' + id++; + fields.push((macro class A { + static var $id = {macros.push($v{i}); 0;}; + }).fields[0]); + + return fields; + } + + static function isAsync(f:Field):Bool { + return Lambda.exists(f.meta, m -> m.name == ":async"); + } + + @:buildOrder(Late) + public static function buildTest() { + var fields = haxe.macro.Context.getBuildFields(); + var asyncArg = {name: "async", type: macro :Async}; + + // Add `async` arg to tests with `@:async` metadata + for (f in fields) { + if (!f.name.startsWith("test")) continue; + + switch f.kind { + case FFun({args: [], ret: ret, expr: expr, params: []}) if (isAsync(f)): + f.kind = FFun({args: [asyncArg], ret: ret, expr: expr, params: []}); + + case _: + } + } + + return registerBuild("Base Test", fields); + } + + public static function autoAsync() { + var fields = haxe.macro.Context.getBuildFields(); + + // Add `@:async` to all tests + for (f in fields) { + if (!f.name.startsWith("test")) continue; + + switch f.kind { + case FFun(_): f.meta.push({name: ":async", params: [], pos: f.pos}); + case _: + } + } + + return registerBuild("Auto async", fields); + } +} diff --git a/tests/misc/projects/Issue11582/Macro3.macro.hx b/tests/misc/projects/Issue11582/Macro3.macro.hx new file mode 100644 index 00000000000..6b47ba6768a --- /dev/null +++ b/tests/misc/projects/Issue11582/Macro3.macro.hx @@ -0,0 +1,72 @@ +import haxe.macro.Context; +import haxe.macro.Expr; + +using StringTools; + +class Macro3 { + static var id = 0; + + static function registerBuild(i:String, fields:Array) { + if (Context.getLocalClass().get().isInterface) return null; + + var hasMacros = false; + for (f in fields) { + if (f.name == "macros") { + hasMacros = true; + break; + } + } + + if (!hasMacros) + fields = (macro class A { + public static var macros = []; + }).fields.concat(fields); + + var id = '_' + id++; + fields.push((macro class A { + static var $id = {macros.push($v{i}); 0;}; + }).fields[0]); + + return fields; + } + + static function isAsync(f:Field):Bool { + return Lambda.exists(f.meta, m -> m.name == ":async"); + } + + public static function buildTest() { + var fields = haxe.macro.Context.getBuildFields(); + var asyncArg = {name: "async", type: macro :Async}; + + // Add `async` arg to tests with `@:async` metadata + for (f in fields) { + if (!f.name.startsWith("test")) continue; + + switch f.kind { + case FFun({args: [], ret: ret, expr: expr, params: []}) if (isAsync(f)): + f.kind = FFun({args: [asyncArg], ret: ret, expr: expr, params: []}); + + case _: + } + } + + return registerBuild("Base Test", fields); + } + + @:buildOrder(Early) + public static function autoAsync() { + var fields = haxe.macro.Context.getBuildFields(); + + // Add `@:async` to all tests + for (f in fields) { + if (!f.name.startsWith("test")) continue; + + switch f.kind { + case FFun(_): f.meta.push({name: ":async", params: [], pos: f.pos}); + case _: + } + } + + return registerBuild("Auto async", fields); + } +} diff --git a/tests/misc/projects/Issue11582/Main2.hx b/tests/misc/projects/Issue11582/Main2.hx new file mode 100644 index 00000000000..5ea07cdb310 --- /dev/null +++ b/tests/misc/projects/Issue11582/Main2.hx @@ -0,0 +1,25 @@ +class Main2 { + static function main() { + trace("TestFoo", TestFoo.macros); + trace("TestBar", TestBar.macros); + } +} + +class Async { + public function done() {} +} + +@:autoBuild(Macro2.buildTest()) +class BaseTest {} + +class TestFoo extends BaseTest { + @:async + function test() async.done(); +} + +@:autoBuild(Macro2.autoAsync()) +class AsyncTest extends BaseTest {} + +class TestBar extends AsyncTest { + function test() async.done(); +} diff --git a/tests/misc/projects/Issue11582/Main3.hx b/tests/misc/projects/Issue11582/Main3.hx new file mode 100644 index 00000000000..155f07acdcb --- /dev/null +++ b/tests/misc/projects/Issue11582/Main3.hx @@ -0,0 +1,25 @@ +class Main3 { + static function main() { + trace("TestFoo", TestFoo.macros); + trace("TestBar", TestBar.macros); + } +} + +class Async { + public function done() {} +} + +@:autoBuild(Macro3.buildTest()) +class BaseTest {} + +class TestFoo extends BaseTest { + @:async + function test() async.done(); +} + +@:autoBuild(Macro3.autoAsync()) +class AsyncTest extends BaseTest {} + +class TestBar extends AsyncTest { + function test() async.done(); +} diff --git a/tests/misc/projects/Issue11582/compile-early.hxml b/tests/misc/projects/Issue11582/compile-early.hxml new file mode 100644 index 00000000000..1eeff146d55 --- /dev/null +++ b/tests/misc/projects/Issue11582/compile-early.hxml @@ -0,0 +1,2 @@ +-main Main3 +--interp diff --git a/tests/misc/projects/Issue11582/compile-early.hxml.stdout b/tests/misc/projects/Issue11582/compile-early.hxml.stdout new file mode 100644 index 00000000000..bdd3facc6d3 --- /dev/null +++ b/tests/misc/projects/Issue11582/compile-early.hxml.stdout @@ -0,0 +1,2 @@ +Main3.hx:3: TestFoo,[Base Test] +Main3.hx:4: TestBar,[Auto async,Base Test] diff --git a/tests/misc/projects/Issue11582/compile-late.hxml b/tests/misc/projects/Issue11582/compile-late.hxml new file mode 100644 index 00000000000..e0934b3797b --- /dev/null +++ b/tests/misc/projects/Issue11582/compile-late.hxml @@ -0,0 +1,2 @@ +-main Main2 +--interp diff --git a/tests/misc/projects/Issue11582/compile-late.hxml.stdout b/tests/misc/projects/Issue11582/compile-late.hxml.stdout new file mode 100644 index 00000000000..23c28e6c353 --- /dev/null +++ b/tests/misc/projects/Issue11582/compile-late.hxml.stdout @@ -0,0 +1,2 @@ +Main2.hx:3: TestFoo,[Base Test] +Main2.hx:4: TestBar,[Auto async,Base Test]