forked from EmmyLua/Emmy-love-api
-
Notifications
You must be signed in to change notification settings - Fork 2
/
metainfo.lua
118 lines (111 loc) · 2.65 KB
/
metainfo.lua
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
---@class my_nullable
---@field name "'nullable'"
---@field wrapped my_type
---@class my_many
---@field name "'many'"
---@field wrapped my_type
---@field num integer?
---@alias my_type my_nullable|my_many|string
---@param type my_type
---@return my_nullable
local function optional(type)
return {
name='nullable',
wrapped=type
}
end
---@param type my_type
---@param num integer?
---@return my_many
local function array(type, num)
return {
name='many',
wrapped=type,
num=num
}
end
---@param Type my_type
---@return string
local function stringify(Type)
if type(Type) == 'string' then
return Type
else
assert(type(Type) == 'table')
if Type.name == 'nullable' then
return stringify(Type.wrapped)..'|nil'
elseif Type.name == 'many' then
return stringify(Type.wrapped)..'[]'
else
assert(false, 'illegal type')
end
end
end
local metainfo = {
Love={
version="string",
functions=array("Function"),
modules=array("Module"),
types=array("Type"),
callbacks=array("Callback"),
},
Module={
name="string",
description="string",
types=array("Type"),
functions=array("Function"),
enums=array("Enum"),
},
Enum={
name="string",
description="string",
constants=array("EnumConstant"),
},
EnumConstant={
name="string",
description="string",
},
Type={
name="string",
description="string",
constructors=optional(array("string")),
functions=optional(array("Function")),
supertypes=optional(array("string")),
},
Callback={
name="string",
description="string",
variants=array("OneCallback", 1),
},
OneCallback={
returns=optional(array("CallbackField")),
arguments=optional(array("CallbackField")),
description=optional("string"),
},
CallbackField={
type="string",
name="string",
description="string",
table=optional(array("FunctionField")),
},
Function={
name="string",
description="string",
variants=array("OneFunction"),
},
OneFunction={
returns=optional(array("FunctionField")),
arguments=optional(array("FunctionField")),
description=optional("string"),
},
FunctionField={
type="string",
name="string",
default=optional("string"),
description="string",
table=optional(array("FunctionField")),
},
}
return {
metainfo = metainfo,
stringify = stringify
}