Repository: seaofvoices/darklua
Pull request #136 (2023-10-26 18:45:41)

Fix generic types on function types
- [x] add entry to the changelog


github-actions[bot]: Coverage after merging <b>fix-function-generics</b> into <b>main</b> will be<table><tbody><tr><th>87.00%</th></tr></tbody></table>

<details><summary>Coverage Report for Changed Files</summary><table><tbody><tr><th>File</th><th>Stmts</th><th>Branches</th><th>Funcs</th><th>Lines</th><th>Uncovered Lines</th></tr><tr><td colspan='6'><b>src</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs'>ast_converter.rs</a></td><td><b>87.84%</b></td><td>100%</td><td><b>88.57%</b></td><td><b>87.80%</b></td><td><a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1003'>1003</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1022'>1022</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1052'>1052</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1076'>1076</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1093'>1093</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1125-L1127'>1125&ndash;1127</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1142'>1142</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1170'>1170</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1212'>1212</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1227'>1227</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1243-L1245'>1243&ndash;1245</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1255'>1255</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1260-L1262'>1260&ndash;1262</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1277'>1277</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1297'>1297</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1428-L1430'>1428&ndash;1430</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1491-L1493'>1491&ndash;1493</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1544-L1546'>1544&ndash;1546</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1570-L1573'>1570&ndash;1573</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1608-L1610'>1608&ndash;1610</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1638-L1640'>1638&ndash;1640</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1644-L1646'>1644&ndash;1646</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1709-L1710'>1709&ndash;1710</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1739-L1741'>1739&ndash;1741</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1748-L1750'>1748&ndash;1750</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1769-L1771'>1769&ndash;1771</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1787-L1789'>1787&ndash;1789</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1794-L1796'>1794&ndash;1796</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1857'>1857</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1862-L1864'>1862&ndash;1864</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1884'>1884</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1890-L1892'>1890&ndash;1892</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1897-L1899'>1897&ndash;1899</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1932-L1937'>1932&ndash;1937</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1961-L1963'>1961&ndash;1963</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L1989'>1989</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2052'>2052</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2070-L2072'>2070&ndash;2072</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2107-L2110'>2107&ndash;2110</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2140'>2140</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2154'>2154</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2158-L2160'>2158&ndash;2160</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L218-L220'>218&ndash;220</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2214-L2216'>2214&ndash;2216</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2228-L2230'>2228&ndash;2230</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2234-L2236'>2234&ndash;2236</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2270'>2270</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L235'>235</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2353-L2355'>2353&ndash;2355</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L236-L237'>236&ndash;237</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2375-L2377'>2375&ndash;2377</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2398-L2400'>2398&ndash;2400</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2430-L2432'>2430&ndash;2432</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2448'>2448</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2452'>2452</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2475-L2477'>2475&ndash;2477</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2489-L2491'>2489&ndash;2491</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2510-L2512'>2510&ndash;2512</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2567-L2569'>2567&ndash;2569</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2576'>2576</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L265-L267'>265&ndash;267</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2766'>2766</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2839-L2846'>2839&ndash;2846</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2848-L2855'>2848&ndash;2855</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2857-L2867'>2857&ndash;2867</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2876'>2876</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2878-L2883'>2878&ndash;2883</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2886'>2886</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2898'>2898</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2908'>2908</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2911-L2913'>2911&ndash;2913</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2924-L2926'>2924&ndash;2926</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L2943-L2945'>2943&ndash;2945</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L485'>485</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L500-L502'>500&ndash;502</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L537-L539'>537&ndash;539</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L547'>547</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L561'>561</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L577-L579'>577&ndash;579</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L581-L582'>581&ndash;582</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L584-L586'>584&ndash;586</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L599-L601'>599&ndash;601</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L605'>605</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L614-L616'>614&ndash;616</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L657'>657</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L668-L670'>668&ndash;670</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L676-L678'>676&ndash;678</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L683-L686'>683&ndash;686</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L697'>697</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L721'>721</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L808'>808</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L812-L814'>812&ndash;814</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L897'>897</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L921'>921</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L933'>933</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L965'>965</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L982'>982</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/ast_converter.rs#L986-L989'>986&ndash;989</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/parser.rs'>parser.rs</a></td><td><b>99.29%</b></td><td>100%</td><td><b>74.19%</b></td><td><b>99.56%</b></td><td><a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/parser.rs#L37'>37</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/parser.rs#L43'>43</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/parser.rs#L55-L59'>55&ndash;59</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/parser.rs#L66'>66</a></td></tr><tr><td colspan='6'><b>src/generator</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs'>dense.rs</a></td><td><b>86.68%</b></td><td>100%</td><td><b>90.11%</b></td><td><b>86.35%</b></td><td><a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L1004'>1004</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L1013-L1014'>1013&ndash;1014</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L1019'>1019</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L1025'>1025</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L1034-L1042'>1034&ndash;1042</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L1044-L1050'>1044&ndash;1050</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L1052-L1060'>1052&ndash;1060</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L1065'>1065</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L1074'>1074</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L1086-L1089'>1086&ndash;1089</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L1093-L1096'>1093&ndash;1096</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L147-L148'>147&ndash;148</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L150'>150</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L164-L165'>164&ndash;165</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L167'>167</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L241-L253'>241&ndash;253</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L255-L261'>255&ndash;261</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L263-L264'>263&ndash;264</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L275-L277'>275&ndash;277</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L356'>356</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L404'>404</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L494'>494</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L50-L55'>50&ndash;55</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L57-L59'>57&ndash;59</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L6'>6</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L601-L603'>601&ndash;603</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L61-L63'>61&ndash;63</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L65-L67'>65&ndash;67</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L672'>672</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L68-L69'>68&ndash;69</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L691'>691</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L882'>882</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L900'>900</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L917'>917</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L943-L950'>943&ndash;950</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L969-L975'>969&ndash;975</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/dense.rs#L992-L996'>992&ndash;996</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs'>readable.rs</a></td><td><b>96.59%</b></td><td>100%</td><td><b>95.28%</b></td><td><b>96.71%</b></td><td><a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L1110'>1110</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L1134-L1138'>1134&ndash;1138</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L1158-L1159'>1158&ndash;1159</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L1189'>1189</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L1286'>1286</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L1296'>1296</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L1305'>1305</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L1314'>1314</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L1323'>1323</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L192-L193'>192&ndash;193</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L198'>198</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L203'>203</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L221-L222'>221&ndash;222</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L402'>402</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L46-L51'>46&ndash;51</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L53'>53</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L58'>58</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/readable.rs#L644-L645'>644&ndash;645</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs'>token_based.rs</a></td><td><b>90.81%</b></td><td>100%</td><td><b>94.02%</b></td><td><b>90.53%</b></td><td><a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L10'>10</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1004'>1004</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1019'>1019</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1024-L1028'>1024&ndash;1028</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1047-L1048'>1047&ndash;1048</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1061-L1062'>1061&ndash;1062</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1083-L1084'>1083&ndash;1084</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1098-L1100'>1098&ndash;1100</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1114-L1116'>1114&ndash;1116</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1125-L1127'>1125&ndash;1127</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L113'>113</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1136-L1138'>1136&ndash;1138</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1147-L1149'>1147&ndash;1149</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1298'>1298</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L130-L131'>130&ndash;131</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1368'>1368</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1405-L1413'>1405&ndash;1413</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L147-L148'>147&ndash;148</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1489-L1498'>1489&ndash;1498</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1523-L1525'>1523&ndash;1525</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1527-L1529'>1527&ndash;1529</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1546-L1555'>1546&ndash;1555</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L160-L161'>160&ndash;161</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L1630'>1630</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L182-L183'>182&ndash;183</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L203-L205'>203&ndash;205</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L2075-L2076'>2075&ndash;2076</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L2102-L2106'>2102&ndash;2106</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L2135-L2139'>2135&ndash;2139</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L2146-L2150'>2146&ndash;2150</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L2352'>2352</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L2356'>2356</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L2369'>2369</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L245'>245</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L297-L301'>297&ndash;301</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L377-L378'>377&ndash;378</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L384'>384</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L396'>396</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L430-L431'>430&ndash;431</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L453-L454'>453&ndash;454</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L470-L471'>470&ndash;471</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L513'>513</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L590-L591'>590&ndash;591</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L600-L601'>600&ndash;601</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L607-L608'>607&ndash;608</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L614'>614</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L626'>626</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L652-L653'>652&ndash;653</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L686-L687'>686&ndash;687</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L729'>729</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L755-L756'>755&ndash;756</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L787-L788'>787&ndash;788</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L797-L798'>797&ndash;798</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L80'>80</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L804-L805'>804&ndash;805</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L811'>811</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L823'>823</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L84'>84</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L845-L849'>845&ndash;849</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L890-L894'>890&ndash;894</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L912-L913'>912&ndash;913</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L986-L987'>986&ndash;987</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/generator/token_based.rs#L996-L997'>996&ndash;997</a></td></tr><tr><td colspan='6'><b>src/nodes/expressions</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/expressions/function.rs'>function.rs</a></td><td><b>88.50%</b></td><td>100%</td><td><b>90.48%</b></td><td><b>88.04%</b></td><td><a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/expressions/function.rs#L130-L132'>130&ndash;132</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/expressions/function.rs#L211'>211</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/expressions/function.rs#L223'>223</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/expressions/function.rs#L242-L252'>242&ndash;252</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/expressions/function.rs#L41-L44'>41&ndash;44</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/expressions/function.rs#L90'>90</a></td></tr><tr><td colspan='6'><b>src/nodes/statements</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/statements/function.rs'>function.rs</a></td><td><b>88.10%</b></td><td>100%</td><td><b>88.57%</b></td><td><b>88%</b></td><td><a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/statements/function.rs#L123-L125'>123&ndash;125</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/statements/function.rs#L174-L183'>174&ndash;183</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/statements/function.rs#L36-L40'>36&ndash;40</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/statements/function.rs#L400'>400</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/statements/function.rs#L41'>41</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/statements/function.rs#L413'>413</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/statements/function.rs#L42-L43'>42&ndash;43</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/statements/function.rs#L433-L444'>433&ndash;444</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/statements/local_function.rs'>local_function.rs</a></td><td><b>95.02%</b></td><td>100%</td><td><b>93.10%</b></td><td><b>95.47%</b></td><td><a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/statements/local_function.rs#L117-L121'>117&ndash;121</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/statements/local_function.rs#L267'>267</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/statements/local_function.rs#L280'>280</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/statements/local_function.rs#L306'>306</a></td></tr><tr><td colspan='6'><b>src/nodes/types</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/function.rs'>function.rs</a></td><td><b>64.74%</b></td><td>100%</td><td><b>73.44%</b></td><td><b>62.50%</b></td><td><a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/function.rs#L100-L105'>100&ndash;105</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/function.rs#L198-L206'>198&ndash;206</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/function.rs#L277-L286'>277&ndash;286</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/function.rs#L289-L298'>289&ndash;298</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/function.rs#L313-L322'>313&ndash;322</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/function.rs#L334-L341'>334&ndash;341</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/function.rs#L343-L350'>343&ndash;350</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/function.rs#L361-L368'>361&ndash;368</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/function.rs#L52-L54'>52&ndash;54</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/function.rs#L72-L78'>72&ndash;78</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/function.rs#L81-L87'>81&ndash;87</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/function.rs#L99'>99</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs'>generics.rs</a></td><td><b>64.74%</b></td><td>100%</td><td><b>64.39%</b></td><td><b>64.82%</b></td><td><a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L129-L131'>129&ndash;131</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L137-L139'>137&ndash;139</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L145-L147'>145&ndash;147</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L164-L174'>164&ndash;174</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L176-L186'>176&ndash;186</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L200-L210'>200&ndash;210</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L221-L227'>221&ndash;227</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L229-L235'>229&ndash;235</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L245-L251'>245&ndash;251</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L28-L30'>28&ndash;30</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L335-L338'>335&ndash;338</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L341-L344'>341&ndash;344</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L353-L356'>353&ndash;356</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L382-L384'>382&ndash;384</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L392-L394'>392&ndash;394</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L411-L416'>411&ndash;416</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L418-L423'>418&ndash;423</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L425-L429'>425&ndash;429</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L43'>43</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L430'>430</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L432-L437'>432&ndash;437</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L44-L45'>44&ndash;45</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L47-L50'>47&ndash;50</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L507'>507</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L51-L52'>51&ndash;52</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L522-L524'>522&ndash;524</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L526'>526</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L534'>534</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L54'>54</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L545-L547'>545&ndash;547</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L549'>549</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L55-L58'>55&ndash;58</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L589'>589</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L59'>59</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L590-L591'>590&ndash;591</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L604-L607'>604&ndash;607</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L610-L613'>610&ndash;613</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L622-L625'>622&ndash;625</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L636-L638'>636&ndash;638</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L642-L644'>642&ndash;644</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L648-L650'>648&ndash;650</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L654-L656'>654&ndash;656</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L68-L70'>68&ndash;70</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L704-L706'>704&ndash;706</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L71-L73'>71&ndash;73</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L833-L837'>833&ndash;837</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L840-L841'>840&ndash;841</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L843-L849'>843&ndash;849</a>, <a href='https://github.com/seaofvoices/darklua/blob/50c87f0f72e27511b7597a60f2357f647191c5f7/src/nodes/types/generics.rs#L863-L864'>863&ndash;864</a></td></tr></tbody></table></details>

Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b31c4c2..3286b7f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,7 @@
 
 ## Unreleased
 
+* fix generic types on function types ([#136](https://github.com/seaofvoices/darklua/pull/136))
 * fix table types to allow string literal property types ([#135](https://github.com/seaofvoices/darklua/pull/135))
 
 ## 0.11.0
diff --git a/src/ast_converter.rs b/src/ast_converter.rs
index 9fa1dcd..4738422 100644
--- a/src/ast_converter.rs
+++ b/src/ast_converter.rs
@@ -1276,6 +1276,15 @@ impl<'a> AstConverter<'a> {
             .ok_or_else(|| ConvertError::GenericDeclaration {
                 generics: generics.to_string(),
             })?;
+
+        for type_variable in type_variables_iter {
+            generic_parameters.push_type_variable(type_variable);
+        }
+
+        for generic_pack in generic_type_packs_iter {
+            generic_parameters.push_generic_type_pack(generic_pack);
+        }
+
         if self.hold_token_data {
             let (opening_list, closing_list) =
                 self.extract_contained_span_tokens(generics.arrows())?;
@@ -1286,6 +1295,7 @@ impl<'a> AstConverter<'a> {
                 commas,
             });
         }
+
         Ok(generic_parameters)
     }
 
diff --git a/src/generator/dense.rs b/src/generator/dense.rs
index b4dbf85..792c066 100644
--- a/src/generator/dense.rs
+++ b/src/generator/dense.rs
@@ -237,6 +237,31 @@ impl DenseLuaGenerator {
         self.write_type(r#type);
         self.push_char(')');
     }
+
+    fn write_function_generics(&mut self, generics: &nodes::GenericParameters) {
+        if generics.is_empty() {
+            return;
+        }
+        self.push_char('<');
+        let mut write_comma = false;
+        for type_variable in generics.iter_type_variable() {
+            if write_comma {
+                self.push_char(',');
+            } else {
+                write_comma = true;
+            }
+            self.write_identifier(type_variable);
+        }
+        for generic_pack in generics.iter_generic_type_pack() {
+            if write_comma {
+                self.push_char(',');
+            } else {
+                write_comma = true;
+            }
+            self.write_generic_type_pack(generic_pack);
+        }
+        self.push_char('>');
+    }
 }
 
 impl Default for DenseLuaGenerator {
@@ -375,6 +400,10 @@ impl LuaGenerator for DenseLuaGenerator {
             self.push_str(method.get_name());
         }
 
+        if let Some(generics) = function.get_generic_parameters() {
+            self.write_function_generics(generics);
+        }
+
         self.push_char('(');
         self.write_function_parameters(
             function.get_parameters(),
@@ -460,6 +489,11 @@ impl LuaGenerator for DenseLuaGenerator {
     fn write_local_function(&mut self, function: &nodes::LocalFunctionStatement) {
         self.push_str("local function");
         self.push_str(function.get_name());
+
+        if let Some(generics) = function.get_generic_parameters() {
+            self.write_function_generics(generics);
+        }
+
         self.push_char('(');
 
         let parameters = function.get_parameters();
@@ -652,6 +686,11 @@ impl LuaGenerator for DenseLuaGenerator {
 
     fn write_function(&mut self, function: &nodes::FunctionExpression) {
         self.push_str("function");
+
+        if let Some(generics) = function.get_generic_parameters() {
+            self.write_function_generics(generics);
+        }
+
         self.push_char('(');
 
         let parameters = function.get_parameters();
@@ -961,29 +1000,8 @@ impl LuaGenerator for DenseLuaGenerator {
     }
 
     fn write_function_type(&mut self, function_type: &nodes::FunctionType) {
-        if let Some(generic_parameters) = function_type
-            .get_generic_parameters()
-            .filter(|generic_parameters| !generic_parameters.is_empty())
-        {
-            self.push_char('<');
-            let mut insert_comma = false;
-            for type_variable in generic_parameters.iter_type_variable() {
-                if insert_comma {
-                    self.push_char(',');
-                } else {
-                    insert_comma = true;
-                }
-                self.write_identifier(type_variable);
-            }
-            for generic_type_pack in generic_parameters.iter_generic_type_pack() {
-                if insert_comma {
-                    self.push_char(',');
-                } else {
-                    insert_comma = true;
-                }
-                self.write_generic_type_pack(generic_type_pack);
-            }
-            self.push_char('>');
+        if let Some(generics) = function_type.get_generic_parameters() {
+            self.write_function_generics(generics);
         }
 
         self.push_char('(');
diff --git a/src/generator/readable.rs b/src/generator/readable.rs
index 2a26af0..aa4792b 100644
--- a/src/generator/readable.rs
+++ b/src/generator/readable.rs
@@ -396,6 +396,33 @@ impl ReadableLuaGenerator {
         self.write_type(r#type);
         self.push_char(')');
     }
+
+    fn write_function_generics(&mut self, generics: &nodes::GenericParameters) {
+        if generics.is_empty() {
+            return;
+        }
+        self.push_char('<');
+        let mut write_comma = false;
+        for type_variable in generics.iter_type_variable() {
+            if write_comma {
+                self.push_char(',');
+                self.push_char(' ');
+            } else {
+                write_comma = true;
+            }
+            self.write_identifier(type_variable);
+        }
+        for generic_pack in generics.iter_generic_type_pack() {
+            if write_comma {
+                self.push_char(',');
+                self.push_char(' ');
+            } else {
+                write_comma = true;
+            }
+            self.write_generic_type_pack(generic_pack);
+        }
+        self.push_char('>');
+    }
 }
 
 impl Default for ReadableLuaGenerator {
@@ -556,6 +583,11 @@ impl LuaGenerator for ReadableLuaGenerator {
     fn write_local_function(&mut self, function: &nodes::LocalFunctionStatement) {
         self.push_str("local function ");
         self.raw_push_str(function.get_name());
+
+        if let Some(generics) = function.get_generic_parameters() {
+            self.write_function_generics(generics);
+        }
+
         self.raw_push_char('(');
 
         let parameters = function.get_parameters();
@@ -696,6 +728,10 @@ impl LuaGenerator for ReadableLuaGenerator {
             self.raw_push_str(method.get_name());
         }
 
+        if let Some(generics) = function.get_generic_parameters() {
+            self.write_function_generics(generics);
+        }
+
         self.raw_push_char('(');
         self.write_function_parameters(
             function.get_parameters(),
@@ -882,7 +918,13 @@ impl LuaGenerator for ReadableLuaGenerator {
     }
 
     fn write_function(&mut self, function: &nodes::FunctionExpression) {
-        self.push_str("function(");
+        self.push_str("function");
+
+        if let Some(generics) = function.get_generic_parameters() {
+            self.write_function_generics(generics);
+        }
+
+        self.push_char('(');
 
         let parameters = function.get_parameters();
         self.write_function_parameters(
@@ -1205,29 +1247,8 @@ impl LuaGenerator for ReadableLuaGenerator {
     }
 
     fn write_function_type(&mut self, function_type: &nodes::FunctionType) {
-        if let Some(generic_parameters) = function_type
-            .get_generic_parameters()
-            .filter(|generic_parameters| !generic_parameters.is_empty())
-        {
-            self.push_char('<');
-            let mut insert_comma = false;
-            for type_variable in generic_parameters.iter_type_variable() {
-                if insert_comma {
-                    self.push_char(',');
-                } else {
-                    insert_comma = true;
-                }
-                self.write_identifier(type_variable);
-            }
-            for generic_type_pack in generic_parameters.iter_generic_type_pack() {
-                if insert_comma {
-                    self.push_char(',');
-                } else {
-                    insert_comma = true;
-                }
-                self.write_generic_type_pack(generic_type_pack);
-            }
-            self.push_char('>');
+        if let Some(generics) = function_type.get_generic_parameters() {
+            self.write_function_generics(generics);
         }
 
         self.push_char('(');
diff --git a/src/generator/token_based.rs b/src/generator/token_based.rs
index ca1c2b1..63bee6d 100644
--- a/src/generator/token_based.rs
+++ b/src/generator/token_based.rs
@@ -340,6 +340,10 @@ impl<'a> TokenBasedLuaGenerator<'a> {
             self.write_function_name_with_tokens(name, &self.generate_function_name_tokens(name));
         }
 
+        if let Some(generics) = function.get_generic_parameters() {
+            self.write_function_generics(generics);
+        }
+
         self.write_token(&tokens.opening_parenthese);
 
         let parameter_count = function.parameters_count();
@@ -566,6 +570,10 @@ impl<'a> TokenBasedLuaGenerator<'a> {
         self.write_token(&tokens.function);
         self.write_identifier(function.get_identifier());
 
+        if let Some(generics) = function.get_generic_parameters() {
+            self.write_function_generics(generics);
+        }
+
         self.write_token(&tokens.opening_parenthese);
 
         let parameter_count = function.parameters_count();
@@ -758,6 +766,11 @@ impl<'a> TokenBasedLuaGenerator<'a> {
         tokens: &FunctionBodyTokens,
     ) {
         self.write_token(&tokens.function);
+
+        if let Some(generics) = function.get_generic_parameters() {
+            self.write_function_generics(generics);
+        }
+
         self.write_token(&tokens.opening_parenthese);
 
         let parameter_count = function.parameters_count();
@@ -954,18 +967,8 @@ impl<'a> TokenBasedLuaGenerator<'a> {
         function_type: &FunctionType,
         tokens: &FunctionTypeTokens,
     ) {
-        if let Some(generic_parameters) = function_type
-            .get_generic_parameters()
-            .filter(|generic_parameters| !generic_parameters.is_empty())
-        {
-            if let Some(generic_tokens) = generic_parameters.get_tokens() {
-                self.write_generic_parameters_with_tokens(generic_parameters, generic_tokens);
-            } else {
-                self.write_generic_parameters_with_tokens(
-                    generic_parameters,
-                    &self.generate_generic_parameters_tokens(generic_parameters),
-                );
-            }
+        if let Some(generic_parameters) = function_type.get_generic_parameters() {
+            self.write_function_generics(generic_parameters);
         }
 
         self.write_token(&tokens.opening_parenthese);
@@ -1011,6 +1014,20 @@ impl<'a> TokenBasedLuaGenerator<'a> {
         self.write_function_return_type(function_type.get_return_type());
     }
 
+    fn write_function_generics(&mut self, generic_parameters: &GenericParameters) {
+        if generic_parameters.is_empty() {
+            return;
+        }
+        if let Some(generic_tokens) = generic_parameters.get_tokens() {
+            self.write_generic_parameters_with_tokens(generic_parameters, generic_tokens);
+        } else {
+            self.write_generic_parameters_with_tokens(
+                generic_parameters,
+                &self.generate_generic_parameters_tokens(generic_parameters),
+            );
+        }
+    }
+
     fn write_generic_parameters_with_tokens(
         &mut self,
         generic_parameters: &GenericParameters,
diff --git a/src/nodes/expressions/function.rs b/src/nodes/expressions/function.rs
index e4fd54b..aec6053 100644
--- a/src/nodes/expressions/function.rs
+++ b/src/nodes/expressions/function.rs
@@ -116,10 +116,17 @@ impl FunctionExpression {
         self
     }
 
+    #[inline]
     pub fn set_generic_parameters(&mut self, generic_parameters: GenericParameters) {
         self.generic_parameters = Some(generic_parameters);
     }
 
+    #[inline]
+    pub fn get_generic_parameters(&self) -> Option<&GenericParameters> {
+        self.generic_parameters.as_ref()
+    }
+
+    #[inline]
     pub fn is_generic(&self) -> bool {
         self.generic_parameters.is_some()
     }
@@ -200,6 +207,9 @@ impl FunctionExpression {
         self.parameters
             .iter_mut()
             .for_each(TypedIdentifier::clear_comments);
+        if let Some(generics) = &mut self.generic_parameters {
+            generics.clear_comments();
+        }
         if let Some(tokens) = &mut self.tokens {
             tokens.clear_comments();
         }
@@ -209,6 +219,9 @@ impl FunctionExpression {
         self.parameters
             .iter_mut()
             .for_each(TypedIdentifier::clear_whitespaces);
+        if let Some(generics) = &mut self.generic_parameters {
+            generics.clear_whitespaces();
+        }
         if let Some(tokens) = &mut self.tokens {
             tokens.clear_whitespaces();
         }
@@ -218,12 +231,21 @@ impl FunctionExpression {
         for parameter in self.parameters.iter_mut() {
             parameter.replace_referenced_tokens(code);
         }
+        if let Some(generics) = &mut self.generic_parameters {
+            generics.replace_referenced_tokens(code);
+        }
         if let Some(tokens) = &mut self.tokens {
             tokens.replace_referenced_tokens(code);
         }
     }
 
     pub(crate) fn shift_token_line(&mut self, amount: usize) {
+        for parameter in self.parameters.iter_mut() {
+            parameter.shift_token_line(amount);
+        }
+        if let Some(generics) = &mut self.generic_parameters {
+            generics.shift_token_line(amount);
+        }
         if let Some(tokens) = &mut self.tokens {
             tokens.shift_token_line(amount);
         }
diff --git a/src/nodes/statements/function.rs b/src/nodes/statements/function.rs
index e3a98c2..4278022 100644
--- a/src/nodes/statements/function.rs
+++ b/src/nodes/statements/function.rs
@@ -307,10 +307,16 @@ impl FunctionStatement {
         self
     }
 
+    #[inline]
     pub fn set_generic_parameters(&mut self, generic_parameters: GenericParameters) {
         self.generic_parameters = Some(generic_parameters);
     }
 
+    #[inline]
+    pub fn get_generic_parameters(&self) -> Option<&GenericParameters> {
+        self.generic_parameters.as_ref()
+    }
+
     #[inline]
     pub fn get_block(&self) -> &Block {
         &self.block
@@ -390,6 +396,9 @@ impl FunctionStatement {
         self.parameters
             .iter_mut()
             .for_each(TypedIdentifier::clear_comments);
+        if let Some(generics) = &mut self.generic_parameters {
+            generics.clear_comments();
+        }
         if let Some(tokens) = &mut self.tokens {
             tokens.clear_comments();
         }
@@ -400,6 +409,9 @@ impl FunctionStatement {
         self.parameters
             .iter_mut()
             .for_each(TypedIdentifier::clear_whitespaces);
+        if let Some(generics) = &mut self.generic_parameters {
+            generics.clear_whitespaces();
+        }
         if let Some(tokens) = &mut self.tokens {
             tokens.clear_whitespaces();
         }
@@ -410,6 +422,9 @@ impl FunctionStatement {
         for parameter in self.parameters.iter_mut() {
             parameter.replace_referenced_tokens(code);
         }
+        if let Some(generics) = &mut self.generic_parameters {
+            generics.replace_referenced_tokens(code);
+        }
         if let Some(tokens) = &mut self.tokens {
             tokens.replace_referenced_tokens(code);
         }
@@ -420,6 +435,9 @@ impl FunctionStatement {
         for parameter in self.parameters.iter_mut() {
             parameter.shift_token_line(amount);
         }
+        if let Some(generics) = &mut self.generic_parameters {
+            generics.shift_token_line(amount);
+        }
         if let Some(tokens) = &mut self.tokens {
             tokens.shift_token_line(amount);
         }
diff --git a/src/nodes/statements/local_function.rs b/src/nodes/statements/local_function.rs
index 858f782..635e001 100644
--- a/src/nodes/statements/local_function.rs
+++ b/src/nodes/statements/local_function.rs
@@ -169,10 +169,16 @@ impl LocalFunctionStatement {
         self
     }
 
+    #[inline]
     pub fn set_generic_parameters(&mut self, generic_parameters: GenericParameters) {
         self.generic_parameters = Some(generic_parameters);
     }
 
+    #[inline]
+    pub fn get_generic_parameters(&self) -> Option<&GenericParameters> {
+        self.generic_parameters.as_ref()
+    }
+
     #[inline]
     pub fn mutate_parameters(&mut self) -> &mut Vec<TypedIdentifier> {
         &mut self.parameters
@@ -257,6 +263,9 @@ impl LocalFunctionStatement {
         self.parameters
             .iter_mut()
             .for_each(TypedIdentifier::clear_comments);
+        if let Some(generics) = &mut self.generic_parameters {
+            generics.clear_comments();
+        }
         if let Some(tokens) = self.tokens.as_mut() {
             tokens.clear_comments();
         }
@@ -267,6 +276,9 @@ impl LocalFunctionStatement {
         self.parameters
             .iter_mut()
             .for_each(TypedIdentifier::clear_whitespaces);
+        if let Some(generics) = &mut self.generic_parameters {
+            generics.clear_whitespaces();
+        }
         if let Some(tokens) = self.tokens.as_mut() {
             tokens.clear_whitespaces();
         }
@@ -277,6 +289,9 @@ impl LocalFunctionStatement {
         for parameter in self.parameters.iter_mut() {
             parameter.replace_referenced_tokens(code);
         }
+        if let Some(generics) = &mut self.generic_parameters {
+            generics.replace_referenced_tokens(code);
+        }
         if let Some(tokens) = self.tokens.as_mut() {
             tokens.replace_referenced_tokens(code);
         }
@@ -287,6 +302,9 @@ impl LocalFunctionStatement {
         for parameter in self.parameters.iter_mut() {
             parameter.shift_token_line(amount);
         }
+        if let Some(generics) = &mut self.generic_parameters {
+            generics.shift_token_line(amount);
+        }
         if let Some(tokens) = &mut self.tokens {
             tokens.shift_token_line(amount);
         }
diff --git a/src/nodes/types/function.rs b/src/nodes/types/function.rs
index fdea8d4..1ffd0b2 100644
--- a/src/nodes/types/function.rs
+++ b/src/nodes/types/function.rs
@@ -180,6 +180,7 @@ impl FunctionType {
         self
     }
 
+    #[inline]
     pub fn set_generic_parameters(&mut self, generic_parameters: GenericParameters) {
         self.generic_parameters = Some(generic_parameters);
     }
@@ -276,6 +277,9 @@ impl FunctionType {
         if let Some(tokens) = &mut self.tokens {
             tokens.clear_comments();
         }
+        if let Some(generics) = &mut self.generic_parameters {
+            generics.clear_comments();
+        }
         for argument in &mut self.arguments {
             argument.clear_comments();
         }
@@ -285,6 +289,9 @@ impl FunctionType {
         if let Some(tokens) = &mut self.tokens {
             tokens.clear_whitespaces();
         }
+        if let Some(generics) = &mut self.generic_parameters {
+            generics.clear_whitespaces();
+        }
         for argument in &mut self.arguments {
             argument.clear_whitespaces();
         }
@@ -294,6 +301,9 @@ impl FunctionType {
         if let Some(tokens) = &mut self.tokens {
             tokens.replace_referenced_tokens(code);
         }
+        if let Some(generics) = &mut self.generic_parameters {
+            generics.replace_referenced_tokens(code);
+        }
         for argument in &mut self.arguments {
             argument.replace_referenced_tokens(code);
         }
@@ -303,6 +313,9 @@ impl FunctionType {
         if let Some(tokens) = &mut self.tokens {
             tokens.shift_token_line(amount);
         }
+        if let Some(generics) = &mut self.generic_parameters {
+            generics.shift_token_line(amount);
+        }
         for argument in &mut self.arguments {
             argument.shift_token_line(amount);
         }
diff --git a/src/nodes/types/generics.rs b/src/nodes/types/generics.rs
index 8272045..df6fe25 100644
--- a/src/nodes/types/generics.rs
+++ b/src/nodes/types/generics.rs
@@ -106,6 +106,10 @@ impl GenericParameters {
         self.type_variables.push(type_variable.into());
     }
 
+    pub fn push_generic_type_pack(&mut self, generic_pack: GenericTypePack) {
+        self.generic_type_packs.push(generic_pack);
+    }
+
     #[inline]
     pub fn len(&self) -> usize {
         self.type_variables.len() + self.generic_type_packs.len()
@@ -156,6 +160,54 @@ impl GenericParameters {
     pub fn get_tokens(&self) -> Option<&GenericParametersTokens> {
         self.tokens.as_ref()
     }
+
+    pub fn clear_comments(&mut self) {
+        for identifier in &mut self.type_variables {
+            identifier.clear_comments();
+        }
+        for generic_pack in &mut self.generic_type_packs {
+            generic_pack.clear_comments();
+        }
+        if let Some(tokens) = &mut self.tokens {
+            tokens.clear_comments();
+        }
+    }
+
+    pub fn clear_whitespaces(&mut self) {
+        for identifier in &mut self.type_variables {
+            identifier.clear_whitespaces();
+        }
+        for generic_pack in &mut self.generic_type_packs {
+            generic_pack.clear_whitespaces();
+        }
+        if let Some(tokens) = &mut self.tokens {
+            tokens.clear_whitespaces();
+        }
+    }
+
+    pub(crate) fn replace_referenced_tokens(&mut self, code: &str) {
+        for identifier in &mut self.type_variables {
+            identifier.replace_referenced_tokens(code);
+        }
+        for generic_pack in &mut self.generic_type_packs {
+            generic_pack.replace_referenced_tokens(code);
+        }
+        if let Some(tokens) = &mut self.tokens {
+            tokens.replace_referenced_tokens(code);
+        }
+    }
+
+    pub(crate) fn shift_token_line(&mut self, amount: usize) {
+        for identifier in &mut self.type_variables {
+            identifier.shift_token_line(amount);
+        }
+        for generic_pack in &mut self.generic_type_packs {
+            generic_pack.shift_token_line(amount);
+        }
+        if let Some(tokens) = &mut self.tokens {
+            tokens.shift_token_line(amount);
+        }
+    }
 }
 
 #[derive(Clone, Debug, PartialEq, Eq)]
diff --git a/src/parser.rs b/src/parser.rs
index ee26813..2d89b36 100644
--- a/src/parser.rs
+++ b/src/parser.rs
@@ -1308,6 +1308,30 @@ mod test {
                         return_type_colon: Some(spaced_token(22, 23)),
                     }
                 }),
+            empty_local_function_with_two_generic_type("local function fn<T, U>() end")
+                => LocalFunctionStatement::from_name(create_identifier("fn", 15, 0), default_block())
+                .with_generic_parameters(
+                    GenericParameters::from_type_variable(create_identifier("T", 18, 0))
+                        .with_type_variable(create_identifier("U", 21, 0))
+                        .with_tokens(GenericParametersTokens {
+                            opening_list: token_at_first_line(17, 18),
+                            closing_list: token_at_first_line(22, 23),
+                            commas: vec![spaced_token(19, 20)],
+                        })
+                )
+                .with_tokens(LocalFunctionTokens {
+                    local: spaced_token(0, 5),
+                    function_body: FunctionBodyTokens {
+                        function: spaced_token(6, 14),
+                        opening_parenthese: token_at_first_line(23, 24),
+                        closing_parenthese: spaced_token(24, 25),
+                        end: token_at_first_line(26, 29),
+                        parameter_commas: Vec::new(),
+                        variable_arguments: None,
+                        variable_arguments_colon: None,
+                        return_type_colon: None,
+                    }
+                }),
             call_function("call()") => FunctionCall::from_name(
                 create_identifier("call", 0, 0)
             ).with_arguments(TupleArguments::default().with_tokens(TupleArgumentsTokens {
@@ -2430,6 +2454,7 @@ mod test {
                 )
                     .with_generic_parameters(
                         GenericParameters::from_type_variable(create_identifier("R", 10, 0))
+                            .with_type_variable(create_identifier("R2", 13, 0))
                             .with_tokens(GenericParametersTokens {
                                 opening_list: token_at_first_line(9, 10),
                                 closing_list: token_at_first_line(15, 16),


Test patch:
diff --git a/tests/ast_fuzzer/mod.rs b/tests/ast_fuzzer/mod.rs
index c6b209d..9fa2c56 100644
--- a/tests/ast_fuzzer/mod.rs
+++ b/tests/ast_fuzzer/mod.rs
@@ -1024,6 +1024,10 @@ impl AstFuzzer {
                         has_variadic_type || self.random.function_is_variadic(),
                     );
 
+                    if let Some(generics) = self.generate_function_generics() {
+                        function.set_generic_parameters(generics);
+                    }
+
                     if has_return_type {
                         function.set_return_type(self.pop_return_type());
                     }
@@ -1049,6 +1053,10 @@ impl AstFuzzer {
                         has_variadic_type || self.random.function_is_variadic(),
                     );
 
+                    if let Some(generics) = self.generate_function_generics() {
+                        function.set_generic_parameters(generics);
+                    }
+
                     if has_return_type {
                         function.set_return_type(self.pop_return_type());
                     }
@@ -1073,6 +1081,10 @@ impl AstFuzzer {
                         has_variadic_type || self.random.function_is_variadic(),
                     );
 
+                    if let Some(generics) = self.generate_function_generics() {
+                        function.set_generic_parameters(generics);
+                    }
+
                     if has_return_type {
                         function.set_return_type(self.pop_return_type());
                     }
@@ -1365,6 +1377,10 @@ impl AstFuzzer {
 
                     let mut function_type = FunctionType::new(self.pop_return_type());
 
+                    if let Some(generics) = self.generate_function_generics() {
+                        function_type.set_generic_parameters(generics);
+                    }
+
                     for argument in
                         arguments
                             .into_iter()
@@ -1465,6 +1481,31 @@ impl AstFuzzer {
         }
     }
 
+    fn generate_function_generics(&mut self) -> Option<GenericParameters> {
+        let generic_types_count = self.random.function_generic_types();
+        if generic_types_count > 0 {
+            let mut generics = if self.random.function_generic_type_is_generic_pack() {
+                GenericParameters::from_generic_type_pack(GenericTypePack::new(
+                    self.random.identifier(),
+                ))
+            } else {
+                GenericParameters::from_type_variable(self.random.identifier())
+            };
+
+            for _ in 1..generic_types_count {
+                if self.random.function_generic_type_is_generic_pack() {
+                    generics.push_generic_type_pack(GenericTypePack::new(self.random.identifier()))
+                } else {
+                    generics.push_type_variable(self.random.identifier())
+                }
+            }
+
+            Some(generics)
+        } else {
+            None
+        }
+    }
+
     fn generate_function(&mut self, function_work: impl Fn(usize, bool, bool) -> AstFuzzerWork) {
         let parameters = self.random.function_parameters();
         let has_return_type = self.random.function_return_type() && self.budget.take_type();
diff --git a/tests/ast_fuzzer/random.rs b/tests/ast_fuzzer/random.rs
index e4c2dae..f523748 100644
--- a/tests/ast_fuzzer/random.rs
+++ b/tests/ast_fuzzer/random.rs
@@ -264,6 +264,14 @@ impl RandomAst {
     pub fn table_type_indexer(&self) -> bool {
         thread_rng().gen_bool(0.25)
     }
+
+    pub fn function_generic_types(&self) -> usize {
+        normal_sample(0.0, 2.0)
+    }
+
+    pub fn function_generic_type_is_generic_pack(&self) -> bool {
+        thread_rng().gen_bool(0.4)
+    }
 }
 
 #[inline]
diff --git a/tests/fuzz_generator.rs b/tests/fuzz_generator.rs
index 8d06d9b..ed456d0 100644
--- a/tests/fuzz_generator.rs
+++ b/tests/fuzz_generator.rs
@@ -83,8 +83,6 @@ macro_rules! fuzz_test_block {
         generator.write_block(&block);
         let lua_code = generator.into_string();
 
-        println!("block written to string");
-
         // let mut temp_file = std::path::PathBuf::from(env!("CARGO_TARGET_TMPDIR"));
         // temp_file.push("fuzzed-code.lua");
         // std::fs::write(&temp_file, &lua_code).expect("Unable to write file");
@@ -106,8 +104,6 @@ macro_rules! fuzz_test_block {
             ),
         };
 
-        println!("written block parsed");
-
         let mut compare_generator = darklua_core::generator::ReadableLuaGenerator::default();
         compare_generator.write_block(&generated_block);
         let generated_lua_code = compare_generator.into_string();