Advertisement
Drakim

Haxe data capsule macro

Dec 15th, 2012
288
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Haxe 1.35 KB | None | 0 0
  1. @:macro class DataCapsule {
  2.   static public function get(_struct:Dynamic):haxe.macro.Expr {
  3.     var capsuleName = '';
  4.     var myfields:Array<String> = Reflect.fields(_struct);
  5.     var myproperties = new Array<Field>();
  6.     var i = 0;
  7.     while(i < myfields.length) {
  8.       capsuleName+=myfields[i];
  9.       var proptype:String = Std.string(Type.getClass(myfields[i]));
  10.       myproperties.push({
  11.         pos: haxe.macro.Context.currentPos(),
  12.         name: myfields[i],
  13.         kind: haxe.macro.Expr.FieldType.FVar(TPath({ sub:null, name:'Int', pack:[], params:[] })),
  14.         access: [haxe.macro.Expr.Access.APublic]
  15.       });
  16.       i++;
  17.     }
  18.     myproperties.push({
  19.       pos: haxe.macro.Context.currentPos(),
  20.       name: 'new',
  21.       kind: haxe.macro.Expr.FieldType.FFun({ret:null,params:[],expr:{expr:EReturn(),pos:haxe.macro.Context.currentPos()},args:[]}),
  22.       access: [haxe.macro.Expr.Access.APublic]
  23.     });
  24.    
  25.     var newclass = {
  26.       pack : ['fiend','dynamics'],
  27.       name : capsuleName,
  28.       pos : haxe.macro.Context.currentPos(),
  29.       meta : [],
  30.       params : [],
  31.       isExtern : false,
  32.       kind : TDClass(),
  33.       fields : myproperties
  34.     };
  35.     haxe.macro.Context.defineType(newclass);
  36.     return { expr : ENew({pack:['fiend','dynamics'],name:capsuleName,params:[]},[]), pos: haxe.macro.Context.currentPos() };
  37.   }
  38. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement