forked from rsdn/nemerle
/
JsKnownMembers.n
62 lines (56 loc) · 2.21 KB
/
JsKnownMembers.n
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
using Nemerle;
using Nemerle.Collections;
using Nemerle.Text;
using Nemerle.Utility;
using Nemerle.Compiler;
using Nemerle.Compiler.Typedtree;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Nemerle.WUI.Reactive
{
module JsKnownMembers
{
public Convert(call : TExpr.Call, builder : TExpr -> JsAST) : JsAST
{
def result = match(call) {
| Call(MethodRef(obj = o, meth = meth), parms, _) => ConvertMethod(o.Type.TypeInfo.FullName, builder(o), meth, parms.Map(p => builder(p.expr)))
| Call(StaticRef(from = fromType, mem = meth) as left, parms, _) => ConvertMethod(fromType.TypeInfo.FullName, builder(left), meth, parms.Map(p => builder(p.expr)))
}
result
}
public ConvertMethod(typeName : string, left : JsAST, member : IMember, parms : list[JsAST]) : JsAST
{
match(member.Name, parms) {
| ("op_Inequality", _) => JsAST.Call(JsAST.OpCode("!="), parms)
| ("Concat", h :: t) when typeName == typeof(string).FullName => JsAST.Call(JsAST.MethodRef(h, "concat"), t)
| ("ToUpper", []) when typeName == typeof(string).FullName => JsAST.Call(JsAST.MethodRef(left, "toUpperCase"), [])
| _ => JsAST.Call(JsAST.MethodRef(left, RemoveGetSet(member.Name)), parms)
}
}
public ConvertField(typeName : string, member : IMember, parms : list[JsAST]) : JsAST
{
match(member.Name) {
| _ when typeName == typeof(list[_].Nil).FullName => JsAST.Array([])
| _ =>
Message.Warning($"member.Name $(member.Name) unsupported by type $typeName");
JsAST.NotImpl();
}
}
public ConvertProperty(typeName : string, member : IMember, parms : list[JsAST]) : JsAST
{
match(member.Name) {
| _ when typeName == typeof(list[_].Nil).FullName => JsAST.Array([])
| _ =>
Message.Warning($"member.Name $(member.Name) unsupported by type $typeName");
JsAST.NotImpl();
}
}
private RemoveGetSet(method : string) : string {
if(method.StartsWith("get_") || method.StartsWith("set_"))
method.Substring(4);
else
method;
}
}
}