-
Notifications
You must be signed in to change notification settings - Fork 12
/
autoctor.croc
49 lines (37 loc) · 1.13 KB
/
autoctor.croc
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
module samples.autoctor
local NOINIT = {}
function autofield(name: string, type: string, init: any = NOINIT) =
{ name = name, type = type, init = init }
function autoctor(c: class, fields: array, isOverride: bool = false)
{
local params, assignments = [], []
foreach(field; fields)
{
object.addField(c, field.name, field.init)
if(field.init is NOINIT)
params.append("{}: {}".format(field.name, field.type))
else
params.append("{}: {} = {}".format(field.name, field.type, field.init))
assignments.append(":{0} = {0}".format(field.name))
}
local ctorCode = "function constructor({}) {{ {} }".format(",".join(params), "; ".join(assignments))
local ctor = compiler.runString("return " ~ ctorCode)
object.(isOverride ? 'addMethodOverride' : 'addMethod')(c, "constructor", ctor)
return c
}
function autoctorOverride(c: class, fields: array) =
autoctor(c, fields, true)
// ===================================================================
@autoctor(
[
autofield('x', "int")
autofield('y', "int", 2)
autofield('z', "int", 3)
])
class Class
{}
function main()
{
local c = Class(4)
writefln("{} {} {}", c.x, c.y, c.z)
}