-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCallByMeta
86 lines (77 loc) · 2.69 KB
/
CallByMeta
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
class CallByMeta{
static var used : Bool = false;
macro static public function use(){
var changed = false;
if(!used){
used = true;
var printer = new haxe.macro.Printer();
var here = __.here();
__.log().debug('"$here"');
SyntaxHub.classLevel.add(
{
data : function (cb:ClassBuilder){
var metadata = cb.target.meta.get();
var stx_call = metadata.ds().filter(
(md) -> {
//trace(md.name);
return md.name.startsWith(":stx.");
}
);
var shows = [];
//__.log().debug(metadata.map((md)->md.name));
if(stx_call.length>0){
changed = true;
var exprs = [];
for(call in stx_call){
var arr = call.name.split(".");
arr[0] = arr[0].substr(1);
var arg = call.params;
var show_args = arg.ds().map(
(x:HExpr) -> {
return switch(x.expr){
case EConst(CIdent("__")) :
var a = cb.target.module.split(".");
var b = cb.target.pack;
var c = cb.target.name;
var path = a;
if(c != a[a.length-1]){
path.push(c);
}
var expr = MacroStringTools.toFieldHExpr(path);
//trace(printer.printHExpr(expr));
expr;
default : x;
};
}
).prj();
shows.push(
{
name : call.name,
args : show_args.map(printer.printHExpr)
}
);
var expr = { pos : Context.currentPos(), expr : ECall(macro $p{arr},$p{show_args}) };
exprs.push(expr);
}
var fn = switch(macro function(){
$b{exprs};
}){
case { expr : EFunction(_,f) } : f;
case x : null;
}
var member = Member.method(
"__init__",
fn
);
member.isStatic = true;
cb.addMember(member);
}
return changed;
},
id : null
}
);
}
return macro {};
}
}