|
@@ -0,0 +1,45 @@
|
|
|
+package;
|
|
|
+
|
|
|
+import haxe.ds.Option;
|
|
|
+import haxe.macro.Context;
|
|
|
+import haxe.macro.Expr;
|
|
|
+import haxe.macro.Type;
|
|
|
+
|
|
|
+class Macro {
|
|
|
+ public static function build() {
|
|
|
+ switch Context.getLocalType() {
|
|
|
+ case TInst(_, [Context.follow(_) => TAnonymous(_.get() => a)]):
|
|
|
+ return buildAnon(a);
|
|
|
+ case _: throw 'assert';
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ static function buildAnon(a:AnonType):Type {
|
|
|
+ var sig = Context.signature(a);
|
|
|
+ var name = sig;
|
|
|
+ try return Context.getType(name) catch(e:Dynamic) {}
|
|
|
+ var pos = Context.currentPos();
|
|
|
+ var fields = [];
|
|
|
+ for(field in a.fields) {
|
|
|
+ var meta = field.meta.get();
|
|
|
+
|
|
|
+ fields.push({
|
|
|
+ kind: FieldType.FVar(Context.toComplexType(field.type)),
|
|
|
+ name: field.name,
|
|
|
+ pos: field.pos,
|
|
|
+ meta: meta,
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ Context.defineType({
|
|
|
+ fields: fields,
|
|
|
+ kind: TDStructure,
|
|
|
+ name: name,
|
|
|
+ pack: [],
|
|
|
+ pos: pos,
|
|
|
+ });
|
|
|
+
|
|
|
+ return Context.getType(name);
|
|
|
+ }
|
|
|
+}
|