File: Macro.hx

package info (click to toggle)
haxe 1%3A4.3.7-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 44,520 kB
  • sloc: ml: 137,268; ansic: 2,491; makefile: 456; java: 386; cs: 336; cpp: 318; python: 318; sh: 75; objc: 64; php: 50; xml: 31; javascript: 11
file content (45 lines) | stat: -rw-r--r-- 899 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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 = "Type" + 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);
	}
}