Это можно сделать действительно тривиально, вам даже не нужен какой-либо "строково-типизированный код" (передача имени класса и метода в макрос).
Вы можете просто передать выражение точки-пути в макрос:
import haxe.macro.Expr;
class Main {
static function main() {
trace(resolveDotPath(haxe.Json.parse)("{}")); // {}
trace(resolveDotPath(Math.random)()); // 0.34622209081586863
}
static macro function resolveDotPath(dotPath:Expr):Expr {
return macro $dotPath;
}
}
Однако - кажется, в этот момент вы могли бы просто вызвать функцию напрямую?
Если вы не знаете, что такое класс во время вызова макроса, макросы, вероятно, вам мало помогут и не позволят вам генерировать строго типизированный код во время компиляции.
Существует разница между передачей некоторого экземпляра Class<T>
макросу, который может прийти откуда угодно, и передачей пути к конкретной точке / имени класса в виде строкового литерала. Если класс для рассматриваемого вызова неизвестен во время компиляции, все, что может сделать макрос, - это сгенерировать код отражения для вас, так как это должно быть решено в время выполнения .