Files
CodenameEngine/source/funkin/backend/system/macros/Utils.hx
T
⍚~NexandNe_Eo 9a38232fd4 hxdiscord_rpc, away3D fork and much more
5H FOR COMPILING.

5
FUCKING
HOURS
FOR MACRO ERRORS.

Co-Authored-By: Ne_Eo <NeeEoo@users.noreply.github.com>
2024-03-23 01:29:48 +01:00

57 lines
1.3 KiB
Haxe

package funkin.backend.system.macros;
#if macro
import haxe.macro.Context;
import haxe.macro.Expr;
#end
class Utils {
macro public static function generateReflectionLike(totalArguments:Int, funcName:String, argsName:String) {
#if macro
totalArguments++;
var funcCalls = [];
for(i in 0...totalArguments) {
var args = [
for(d in 0...i) macro $i{argsName}[$v{d}]
];
funcCalls.push(macro $i{funcName}($a{args}));
}
var expr = {
pos: Context.currentPos(),
expr: ESwitch(
macro ($i{argsName}.length),
[
for(i in 0...totalArguments) {
values: [macro $v{i}],
expr: funcCalls[i],
guard: null,
}
],
macro throw "Too many arguments"
)
}
return expr;
#end
}
public static macro function safeSet(variable:Null<Expr>, value:Null<Expr>):Null<Expr> {
#if macro
return macro if (${value} != null) ${variable} = ${value};
#end
}
public static macro function safeSetWrapper(variable:Null<Expr>, value:Null<Expr>, wrapper:Null<Expr>):Null<Expr> {
#if macro
return macro if (${value} != null) ${variable} = ${wrapper}(${value});
#end
}
public static macro function safeReflection(variable:Null<Expr>, value:Null<Expr>, field:Null<Expr>):Null<Expr> {
#if macro
return macro if (Reflect.hasField(${value}, ${field})) ${variable} = Reflect.field(${value}, ${field});
#end
}
}