Skip to content

Commit 5a052f8

Browse files
committed
Convert Lua's python data structure from list to dict
1 parent 2ef9eef commit 5a052f8

5 files changed

Lines changed: 159 additions & 163 deletions

File tree

lsl_definitions/generators/keywords.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def dump_slua_syntax(
6060
pretty: bool = False,
6161
) -> bytes:
6262
"""Generate SLua syntax XML for viewer"""
63-
ll_module = next(m for m in slua_definitions.modules if m.name == "ll")
63+
ll_module = slua_definitions.modules["ll"]
6464
header_comment = b"""<!-- SLua (Server Lua) keywords file for Second Life Viewer.
6565
This file is auto-generated by https://github.com/secondlife/lsl-definitions. -->"""
6666
syntax = {
@@ -73,12 +73,12 @@ def dump_slua_syntax(
7373
}
7474

7575
# types
76-
for class_ in sorted(slua_definitions.base_classes, key=lambda x: x.name):
76+
for class_ in sorted(slua_definitions.base_classes.values(), key=lambda x: x.name):
7777
syntax["types"][class_.name] = class_.to_keywords_dict()
78-
for alias in sorted(slua_definitions.type_aliases, key=lambda x: x.name):
78+
for alias in sorted(slua_definitions.type_aliases.values(), key=lambda x: x.name):
7979
if alias.export:
8080
syntax["types"][alias.name] = alias.to_keywords_dict()
81-
for class_ in sorted(slua_definitions.classes, key=lambda x: x.name):
81+
for class_ in sorted(slua_definitions.classes.values(), key=lambda x: x.name):
8282
syntax["types"][class_.name] = class_.to_keywords_dict()
8383

8484
# events
@@ -88,10 +88,10 @@ def dump_slua_syntax(
8888
syntax["events"][event.name] = event.to_slua_dict(slua_definitions)
8989

9090
# functions
91-
for func in sorted(slua_definitions.functions, key=lambda x: x.name):
91+
for func in sorted(slua_definitions.functions.values(), key=lambda x: x.name):
9292
if not func.local_only and not func.slua_removed:
9393
syntax["functions"][func.name] = func.to_keywords_dict()
94-
for module in sorted(slua_definitions.modules, key=lambda x: x.name):
94+
for module in sorted(slua_definitions.modules.values(), key=lambda x: x.name):
9595
if module.name not in {"ll", "llcompat"}:
9696
syntax["functions"].update(module.to_keywords_functions_dict())
9797
syntax["functions"].update(ll_module.to_keywords_functions_dict())
@@ -100,14 +100,14 @@ def dump_slua_syntax(
100100
syntax["functions"][func.compute_slua_name()] = func.to_slua_dict(slua_definitions)
101101

102102
# constants
103-
for const in slua_definitions.builtin_constants:
103+
for const in slua_definitions.builtin_constants.values():
104104
syntax["constants"][const.name] = const.to_keywords_dict()
105-
for module in sorted(slua_definitions.modules, key=lambda x: x.name):
105+
for module in sorted(slua_definitions.modules.values(), key=lambda x: x.name):
106106
syntax["constants"].update(module.to_keywords_constants_dict())
107107
for const in sorted(definitions.constants.values(), key=lambda x: x.name):
108108
if not const.private and not const.slua_removed:
109109
syntax["constants"][const.name] = const.to_slua_dict(slua_definitions)
110-
for const in slua_definitions.global_constants:
110+
for const in slua_definitions.global_constants.values():
111111
if const.name not in syntax["constants"] and not const.private:
112112
syntax["constants"][const.name] = const.to_keywords_dict()
113113

lsl_definitions/generators/slua.py

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
@register("slua_lsp_defs")
2323
def gen_luau_lsp_defs(definitions: LSLDefinitions, slua_definitions: SLuaDefinitions) -> str:
2424
"""Generate SLua definitions for Luau Language Server"""
25-
ll_module = [m for m in slua_definitions.modules if m.name == "ll"][0]
26-
llcompat_module = [m for m in slua_definitions.modules if m.name == "llcompat"][0]
25+
ll_module = slua_definitions.modules["ll"]
26+
llcompat_module = slua_definitions.modules["llcompat"]
2727

2828
defs = io.StringIO()
2929
defs.write("""-- Second Life SLua (Server Lua) definitions file for luau-lsp.
@@ -37,12 +37,12 @@ def gen_luau_lsp_defs(definitions: LSLDefinitions, slua_definitions: SLuaDefinit
3737

3838
# 1. Luau builtins unneeded. Luau-lsp already know about these
3939
# 2. SLua base classes. These only depend on Luau builtins
40-
classes = slua_definitions.base_classes + slua_definitions.classes
40+
classes = list(slua_definitions.base_classes.values()) + list(slua_definitions.classes.values())
4141
classes.sort(key=lambda x: x.name)
4242
for class_ in (class_ for class_ in classes if class_.name[0].islower()):
4343
class_.write_luau_def(defs)
4444
defs.write("\n")
45-
for alias in slua_definitions.type_aliases:
45+
for alias in slua_definitions.type_aliases.values():
4646
defs.write(alias.to_luau_def())
4747
defs.write("\n")
4848
defs.write("\n")
@@ -51,14 +51,14 @@ def gen_luau_lsp_defs(definitions: LSLDefinitions, slua_definitions: SLuaDefinit
5151
for class_ in (class_ for class_ in classes if class_.name[0].isupper()):
5252
class_.write_luau_def(defs)
5353
defs.write("\n")
54-
for func in slua_definitions.functions:
54+
for func in slua_definitions.functions.values():
5555
if func.private or func.local_only:
5656
continue
5757
if not func.typechecker_flags.fully_defined:
5858
defs.write("-- ")
5959
defs.write("declare ")
6060
func.write_luau_global_def(defs)
61-
for module in sorted(slua_definitions.modules, key=lambda x: x.name):
61+
for module in sorted(slua_definitions.modules.values(), key=lambda x: x.name):
6262
if module.name in {"ll", "llcompat"}:
6363
continue
6464
if module.name == "string":
@@ -68,13 +68,13 @@ def gen_luau_lsp_defs(definitions: LSLDefinitions, slua_definitions: SLuaDefinit
6868
module.write_luau_def(defs)
6969
if module.name == "string":
7070
defs.write("--]]\n")
71-
for var in slua_definitions.global_variables:
71+
for var in slua_definitions.global_variables.values():
7272
defs.write("declare ")
7373
defs.write(var.to_luau_def())
7474
defs.write("\n")
7575
ll_module.write_luau_def(defs)
7676
llcompat_module.write_luau_def(defs)
77-
for const in sorted(slua_definitions.global_constants, key=lambda x: x.name):
77+
for const in sorted(slua_definitions.global_constants.values(), key=lambda x: x.name):
7878
if const.private:
7979
continue
8080
defs.write("declare ")
@@ -89,8 +89,7 @@ def gen_selene_yml(definitions: LSLDefinitions, slua_definitions: SLuaDefinition
8989
"""Generate SLua standard library for Selene linter
9090
https://kampfkarren.github.io/selene/usage/std.html
9191
"""
92-
classes = {c.name: c for c in slua_definitions.base_classes + slua_definitions.classes}
93-
type_aliases = {a.name: a for a in slua_definitions.type_aliases}
92+
classes = {**slua_definitions.base_classes, **slua_definitions.classes}
9493

9594
file = io.StringIO()
9695
file.write("""# Second Life SLua (Server Lua) standard library definition file for selene.
@@ -131,8 +130,8 @@ def selene_type(type_str: str, default="any") -> str | dict | None:
131130
}
132131
if type_str in type_map:
133132
return type_map[type_str]
134-
if type_str in type_aliases:
135-
return type_aliases[type_str].selene_type
133+
if type_str in slua_definitions.type_aliases:
134+
return slua_definitions.type_aliases[type_str].selene_type
136135
if type_str.startswith("{") and type_str.endswith("}"):
137136
return "table"
138137
if "|" in type_str:
@@ -187,11 +186,11 @@ def selene_function(func: SLuaFunction, method=False) -> dict:
187186

188187
def selene_class(class_: SLuaClassDeclaration) -> dict:
189188
fields = {}
190-
for method in class_.methods:
189+
for method in class_.methods.values():
191190
fields[method.name] = selene_function(method, method=True)
192-
for func in class_.functions:
191+
for func in class_.functions.values():
193192
fields[func.name] = selene_function(func, method=False)
194-
for prop in class_.properties:
193+
for prop in class_.properties.values():
195194
fields[prop.name] = selene_property(prop)
196195
return fields
197196

@@ -203,50 +202,49 @@ def selene_module(module: SLuaModule) -> dict:
203202
{
204203
f"{module.name}.{const.name}": selene_property(const)
205204
# for func in sorted(self.functions, key=lambda x: x.name)
206-
for const in module.constants
205+
for const in module.constants.values()
207206
if not const.private
208207
}
209208
)
210209
globals.update(
211210
{
212211
f"{module.name}.{func.name}": selene_function(func)
213212
# for func in sorted(self.functions, key=lambda x: x.name)
214-
for func in module.functions
213+
for func in module.functions.values()
215214
if not func.private and not func.local_only
216215
}
217216
)
218217
return globals
219218

220219
# Duplicate quaternion module as rotation. The callable aspect of quaternion
221220
# prevents us from being able to de-duplicate this with structs.
222-
modules = {m.name: m for m in slua_definitions.modules}
223-
modules["rotation"] = SLuaModule(
221+
slua_definitions.modules["rotation"] = SLuaModule(
224222
name="rotation",
225-
comment=modules["quaternion"].comment,
226-
callable=modules["quaternion"].callable,
227-
constants=modules["quaternion"].constants,
228-
functions=modules["quaternion"].functions,
223+
comment=slua_definitions.modules["quaternion"].comment,
224+
callable=slua_definitions.modules["quaternion"].callable,
225+
constants=slua_definitions.modules["quaternion"].constants,
226+
functions=slua_definitions.modules["quaternion"].functions,
229227
)
230228

231-
for const in slua_definitions.global_variables:
229+
for const in slua_definitions.global_variables.values():
232230
if not const.private and const.name != "rotation":
233231
selene["globals"][const.name] = selene_property(const)
234-
for const in sorted(slua_definitions.global_constants, key=lambda x: x.name):
232+
for const in sorted(slua_definitions.global_constants.values(), key=lambda x: x.name):
235233
if not const.private:
236234
selene["globals"][const.name] = selene_property(const)
237-
for func in sorted(slua_definitions.functions, key=lambda x: x.name):
235+
for func in sorted(slua_definitions.functions.values(), key=lambda x: x.name):
238236
if not func.private and not func.local_only:
239237
selene["globals"][func.name] = selene_function(func)
240-
for module in sorted(modules.values(), key=lambda x: x.name):
238+
for module in sorted(slua_definitions.modules.values(), key=lambda x: x.name):
241239
if module.name not in {"ll", "llcompat"}:
242240
selene["globals"].update(selene_module(module))
243-
selene["globals"].update(selene_module(modules["ll"]))
244-
selene["globals"].update(selene_module(modules["llcompat"]))
241+
selene["globals"].update(selene_module(slua_definitions.modules["ll"]))
242+
selene["globals"].update(selene_module(slua_definitions.modules["llcompat"]))
245243
for class_ in classes.values():
246244
selene["structs"][class_.name] = selene_class(class_)
247245

248246
# Fix up LLEvents argument types
249-
event_names = [m for m in slua_definitions.type_aliases if m.name == "LLEventName"][
247+
event_names = [m for m in slua_definitions.type_aliases.values() if m.name == "LLEventName"][
250248
0
251249
].selene_type
252250
for method_name in ["on", "once", "off", "handlers"]:

lsl_definitions/generators/slua_lsp_docs.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,11 @@ def add_module(self, module: SLuaModule) -> None:
9090
learn_more_link=doc_url(module.name, None),
9191
)
9292
# for const in sorted(self.constants, key=lambda x: x.name)
93-
for const in module.constants:
93+
for const in module.constants.values():
9494
if not const.private:
9595
self.add_constant(const, module=module.name)
9696
# for func in sorted(self.functions, key=lambda x: x.name)
97-
for func in module.functions:
97+
for func in module.functions.values():
9898
if not func.private and not func.local_only:
9999
self.add_function(func, module=module.name)
100100

@@ -106,31 +106,30 @@ def gen_slua_lsp_docs(definitions: LSLDefinitions, slua_definitions: SLuaDefinit
106106

107107
# Duplicate quaternion module as rotation. The callable aspect of quaternion
108108
# prevents us from being able to de-duplicate this with structs.
109-
modules = {m.name: m for m in slua_definitions.modules}
110-
modules["rotation"] = SLuaModule(
109+
slua_definitions.modules["rotation"] = SLuaModule(
111110
name="rotation",
112-
comment=modules["quaternion"].comment,
113-
callable=modules["quaternion"].callable,
114-
constants=modules["quaternion"].constants,
115-
functions=modules["quaternion"].functions,
111+
comment=slua_definitions.modules["quaternion"].comment,
112+
callable=slua_definitions.modules["quaternion"].callable,
113+
constants=slua_definitions.modules["quaternion"].constants,
114+
functions=slua_definitions.modules["quaternion"].functions,
116115
)
117116

118117
# class docs are unused if generated
119118
# for const in slua_definitions.globalVariables:
120119
# if not const.private and const.name != "rotation":
121120
# selene["globals"][const.name] = selene_property(const)
122-
for func in slua_definitions.functions:
121+
for func in slua_definitions.functions.values():
123122
if not func.private and not func.local_only and not func.slua_removed:
124123
builder.add_function(func)
125-
for module in sorted(modules.values(), key=lambda x: x.name):
124+
for module in sorted(slua_definitions.modules.values(), key=lambda x: x.name):
126125
if module.name not in {"ll", "llcompat"}:
127126
builder.add_module(module)
128-
builder.add_module(modules["ll"])
129-
builder.add_module(modules["llcompat"])
127+
builder.add_module(slua_definitions.modules["ll"])
128+
builder.add_module(slua_definitions.modules["llcompat"])
130129
# builtin docs are unused if generated
131130
# for const in slua_definitions.builtin_constants:
132131
# builder.add_constant(const)
133-
for const in sorted(slua_definitions.global_constants, key=lambda x: x.name):
132+
for const in sorted(slua_definitions.global_constants.values(), key=lambda x: x.name):
134133
if not const.private:
135134
builder.add_constant(const)
136135
# class docs are unused if generated

0 commit comments

Comments
 (0)