Description
How are you using the lua-language-server?
Visual Studio Code Extension (sumneko.lua)
Which OS are you using?
Windows
What is the issue affecting?
Annotations, Type Checking, Hover
Expected Behaviour
LuaLS correctly narrows a function overload based on the arguments of the function and the inner function params are also narrowed correctly.
Actual Behaviour
LuaLS either defaults to the base outer function definition, or narrows enough to get the hover over the inner function params correct, but type checking the params fail to narrow fields of said params.
Reproduction steps
I have no clue how to reproduce this, it just happens whenever it feels like it after a while and does not persist after a refresh. However, it still happens quite often and it is getting mildly annoying. Sometimes it happens after modifying the file a little bit, it just seems random.
Additional Notes
The Factorio modding community heavily uses automatically generated LuaLS annotations from the machine readable API documentation for Factorio. One function in particular, script.on_event(), seems to have endlessly caused trouble with LuaLS over the years and recently we have switched to using overloads, since that fit the purpose of the function better. Several of us have been encountering an issue with this method specifically, and nobody has been able to reproduce it consistently.
Here's a link to the API docs for the aforementioned function:
https://lua-api.factorio.com/latest/classes/LuaBootstrap.html#on_event
The first parameter, event
, further referred to as the event ID, is either an enum value or a string, or an array of enum values or strings. For the purposes of this bug report, we can ignore the array, because it is irrelevant to the issue.
The second parameter, handler
, is a function that takes one argument, also called event
, which contains all of the information relevant to the event indicated by the enum. Each event ID has it's own overload for script.on_event, and each overload's event parameter is a separate class, all of which extend from a base class, EventData.
The third parameter, filters
, is irrelevant to the bug.
Sometimes, for no apparent reason whatsoever, LuaLS fails to narrow the handler event parameter based on the event ID. The most commonly experienced bug is when someone tries to use event.player_index. A significant number of events have a field for player_index, an integer, but not all of them do, so it is not a part of the base EventData class. This means that if LuaLS ever fails to narrow an overload for one of these functions, event.player_index is a very common target for undefined-field warnings.
Here's a screenshot of the bug in action:
And here's a github gist for all of the related typedefs for script.on_event:
https://gist.github.com/CodeGreen0386/3f78b82dbeb7eadf07e66c983e6de637
Log File
No response