Skip to content

Instantly share code, notes, and snippets.

@pulcheri
Forked from puffnfresh/Example.hx
Created July 5, 2017 09:30
Show Gist options
  • Save pulcheri/3847ba3c802550a96e2cd717eb6efce2 to your computer and use it in GitHub Desktop.
Save pulcheri/3847ba3c802550a96e2cd717eb6efce2 to your computer and use it in GitHub Desktop.
Macro to generate "value classes" in Haxe
import precog.macro.ValueClass;
class ABC implements ValueClass {
var a: Int;
var b: Bool;
var c: String;
}
/*
class ABC extends ValueClass {
public var a(default, null): Int;
public var b(default, null): Bool;
public var c(default, null): String;
public function new(a: Int, b: Bool, c: String) {
this.a = a;
this.b = b;
this.c = c;
}
}
*/
package;
import haxe.macro.Expr;
import haxe.macro.Context;
@:remove @:autoBuild(ValueClassImpl.build())
extern interface ValueClass {}
class ValueClassImpl {
#if macro
public static function build() {
var fields = Context.getBuildFields();
var args = [];
var states = [];
for (f in fields) {
switch (f.kind) {
case FVar(t,_):
args.push({name:f.name, type:t, opt:false, value:null});
states.push(macro $p{["this", f.name]} = $i{f.name});
f.access.push(APublic);
default:
}
}
fields.push({
name: "new",
access: [APublic],
pos: Context.currentPos(),
kind: FFun({
args: args,
expr: macro $b{states},
params: [],
ret: null
})
});
return fields;
}
#end
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment