-
-
Save pulcheri/3847ba3c802550a96e2cd717eb6efce2 to your computer and use it in GitHub Desktop.
Macro to generate "value classes" in Haxe
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} | |
*/ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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