darklua
darklua copied to clipboard
Add `remove_generalized_iteration` rule
Closes #203
Examples
Input
for i,v in {1,2,3} do
print(i,v)
end
Output
do local _DARKLUA_REMOVE_GENERALIZED_ITERATION_iterdf0c36eb99574eba, _DARKLUA_REMOVE_GENERALIZED_ITERATION_invardf0c36eb99574eba, _DARKLUA_REMOVE_GENERALIZED_ITERATION_controldf0c36eb99574eba={1,2,3} if type(_DARKLUA_REMOVE_GENERALIZED_ITERATION_iterdf0c36eb99574eba)=='table'then local _m=getmetatable(_DARKLUA_REMOVE_GENERALIZED_ITERATION_iterdf0c36eb99574eba)if type(_m)=='table'and type(_m.__iter)=='function'then _DARKLUA_REMOVE_GENERALIZED_ITERATION_iterdf0c36eb99574eba, _DARKLUA_REMOVE_GENERALIZED_ITERATION_invardf0c36eb99574eba, _DARKLUA_REMOVE_GENERALIZED_ITERATION_controldf0c36eb99574eba=_m.__iter()else _DARKLUA_REMOVE_GENERALIZED_ITERATION_iterdf0c36eb99574eba, _DARKLUA_REMOVE_GENERALIZED_ITERATION_invardf0c36eb99574eba, _DARKLUA_REMOVE_GENERALIZED_ITERATION_controldf0c36eb99574eba=pairs(_DARKLUA_REMOVE_GENERALIZED_ITERATION_iterdf0c36eb99574eba)end end for i,v in _DARKLUA_REMOVE_GENERALIZED_ITERATION_iterdf0c36eb99574eba,_DARKLUA_REMOVE_GENERALIZED_ITERATION_invardf0c36eb99574eba,_DARKLUA_REMOVE_GENERALIZED_ITERATION_controldf0c36eb99574eba do
print(i,v)
end
end
Notes
- Hash function
blake3was used - Adds
RuntimeIdentifierpublic struct which is for injecting variables in runtime - Adds GenericFor.mutate_expressions()
Limitations (Notes from #203)
- Using
pairs(input)does not necessarily conform to the order of Luau generic iteration (for example, consecutive array indices starting from 1 go first) - Doesn't handle iterating over userdata (with
__iterdefined), which is supported by Luau - There may also be issues with accessing
__iterif__metatableis set
Credits
- Thanks for @sircfenner (original issue post: #203) for the convention idea.
TO-DOs
- [x] Add tests (btw, the output was tested in
lua5.3)