fix(luals-meta): generate globals in c2 and echo @lua commands (#5385)

Co-authored-by: Mm2PL <miau@mail.kotmisia.pl>
This commit is contained in:
nerix 2024-05-22 15:23:33 +02:00 committed by GitHub
parent da526b379b
commit ec6b1ef24d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 78 additions and 72 deletions

View file

@ -13,6 +13,7 @@
- Dev: Make printing of strings in tests easier. (#5379) - Dev: Make printing of strings in tests easier. (#5379)
- Dev: Refactor and document `Scrollbar`. (#5334, #5393) - Dev: Refactor and document `Scrollbar`. (#5334, #5393)
- Dev: Reduced the amount of scale events. (#5404, #5406) - Dev: Reduced the amount of scale events. (#5404, #5406)
- Dev: All Lua globals now show in the `c2` global in the LuaLS metadata. (#5385)
## 2.5.1 ## 2.5.1

View file

@ -16,7 +16,7 @@ c2.EventType = {}
---@class CommandContext ---@class CommandContext
---@field words string[] The words typed when executing the command. For example `/foo bar baz` will result in `{"/foo", "bar", "baz"}`. ---@field words string[] The words typed when executing the command. For example `/foo bar baz` will result in `{"/foo", "bar", "baz"}`.
---@field channel Channel The channel the command was executed in. ---@field channel c2.Channel The channel the command was executed in.
---@class CompletionList ---@class CompletionList
---@field values string[] The completions ---@field values string[] The completions
@ -30,98 +30,98 @@ c2.EventType = {}
-- Begin src/common/Channel.hpp -- Begin src/common/Channel.hpp
---@alias ChannelType integer ---@alias c2.ChannelType integer
---@type { None: ChannelType, Direct: ChannelType, Twitch: ChannelType, TwitchWhispers: ChannelType, TwitchWatching: ChannelType, TwitchMentions: ChannelType, TwitchLive: ChannelType, TwitchAutomod: ChannelType, TwitchEnd: ChannelType, Irc: ChannelType, Misc: ChannelType } ---@type { None: c2.ChannelType, Direct: c2.ChannelType, Twitch: c2.ChannelType, TwitchWhispers: c2.ChannelType, TwitchWatching: c2.ChannelType, TwitchMentions: c2.ChannelType, TwitchLive: c2.ChannelType, TwitchAutomod: c2.ChannelType, TwitchEnd: c2.ChannelType, Irc: c2.ChannelType, Misc: c2.ChannelType }
ChannelType = {} c2.ChannelType = {}
-- End src/common/Channel.hpp -- End src/common/Channel.hpp
-- Begin src/controllers/plugins/api/ChannelRef.hpp -- Begin src/controllers/plugins/api/ChannelRef.hpp
---@alias Platform integer ---@alias c2.Platform integer
--- This enum describes a platform for the purpose of searching for a channel. --- This enum describes a platform for the purpose of searching for a channel.
--- Currently only Twitch is supported because identifying IRC channels is tricky. --- Currently only Twitch is supported because identifying IRC channels is tricky.
---@type { Twitch: Platform } ---@type { Twitch: c2.Platform }
Platform = {} c2.Platform = {}
---@class Channel ---@class c2.Channel
Channel = {} c2.Channel = {}
--- Returns true if the channel this object points to is valid. --- Returns true if the channel this object points to is valid.
--- If the object expired, returns false --- If the object expired, returns false
--- If given a non-Channel object, it errors. --- If given a non-Channel object, it errors.
--- ---
---@return boolean success ---@return boolean success
function Channel:is_valid() end function c2.Channel:is_valid() end
--- Gets the channel's name. This is the lowercase login name. --- Gets the channel's name. This is the lowercase login name.
--- ---
---@return string name ---@return string name
function Channel:get_name() end function c2.Channel:get_name() end
--- Gets the channel's type --- Gets the channel's type
--- ---
---@return ChannelType ---@return c2.ChannelType
function Channel:get_type() end function c2.Channel:get_type() end
--- Get the channel owner's display name. This may contain non-lowercase ascii characters. --- Get the channel owner's display name. This may contain non-lowercase ascii characters.
--- ---
---@return string name ---@return string name
function Channel:get_display_name() end function c2.Channel:get_display_name() end
--- Sends a message to the target channel. --- Sends a message to the target channel.
--- Note that this does not execute client-commands. --- Note that this does not execute client-commands.
--- ---
---@param message string ---@param message string
---@param execute_commands boolean Should commands be run on the text? ---@param execute_commands boolean Should commands be run on the text?
function Channel:send_message(message, execute_commands) end function c2.Channel:send_message(message, execute_commands) end
--- Adds a system message client-side --- Adds a system message client-side
--- ---
---@param message string ---@param message string
function Channel:add_system_message(message) end function c2.Channel:add_system_message(message) end
--- Returns true for twitch channels. --- Returns true for twitch channels.
--- Compares the channel Type. Note that enum values aren't guaranteed, just --- Compares the channel Type. Note that enum values aren't guaranteed, just
--- that they are equal to the exposed enum. --- that they are equal to the exposed enum.
--- ---
---@return boolean ---@return boolean
function Channel:is_twitch_channel() end function c2.Channel:is_twitch_channel() end
--- Returns a copy of the channel mode settings (subscriber only, r9k etc.) --- Returns a copy of the channel mode settings (subscriber only, r9k etc.)
--- ---
---@return RoomModes ---@return RoomModes
function Channel:get_room_modes() end function c2.Channel:get_room_modes() end
--- Returns a copy of the stream status. --- Returns a copy of the stream status.
--- ---
---@return StreamStatus ---@return StreamStatus
function Channel:get_stream_status() end function c2.Channel:get_stream_status() end
--- Returns the Twitch user ID of the owner of the channel. --- Returns the Twitch user ID of the owner of the channel.
--- ---
---@return string ---@return string
function Channel:get_twitch_id() end function c2.Channel:get_twitch_id() end
--- Returns true if the channel is a Twitch channel and the user owns it --- Returns true if the channel is a Twitch channel and the user owns it
--- ---
---@return boolean ---@return boolean
function Channel:is_broadcaster() end function c2.Channel:is_broadcaster() end
--- Returns true if the channel is a Twitch channel and the user is a moderator in the channel --- Returns true if the channel is a Twitch channel and the user is a moderator in the channel
--- Returns false for broadcaster. --- Returns false for broadcaster.
--- ---
---@return boolean ---@return boolean
function Channel:is_mod() end function c2.Channel:is_mod() end
--- Returns true if the channel is a Twitch channel and the user is a VIP in the channel --- Returns true if the channel is a Twitch channel and the user is a VIP in the channel
--- Returns false for broadcaster. --- Returns false for broadcaster.
--- ---
---@return boolean ---@return boolean
function Channel:is_vip() end function c2.Channel:is_vip() end
---@return string ---@return string
function Channel:__tostring() end function c2.Channel:__tostring() end
--- Finds a channel by name. --- Finds a channel by name.
--- Misc channels are marked as Twitch: --- Misc channels are marked as Twitch:
@ -132,15 +132,15 @@ function Channel:__tostring() end
--- - /automod --- - /automod
--- ---
---@param name string Which channel are you looking for? ---@param name string Which channel are you looking for?
---@param platform Platform Where to search for the channel? ---@param platform c2.Platform Where to search for the channel?
---@return Channel? ---@return c2.Channel?
function Channel.by_name(name, platform) end function c2.Channel.by_name(name, platform) end
--- Finds a channel by the Twitch user ID of its owner. --- Finds a channel by the Twitch user ID of its owner.
--- ---
---@param id string ID of the owner of the channel. ---@param id string ID of the owner of the channel.
---@return Channel? ---@return c2.Channel?
function Channel.by_twitch_id(id) end function c2.Channel.by_twitch_id(id) end
---@class RoomModes ---@class RoomModes
---@field unique_chat boolean You might know this as r9kbeta or robot9000. ---@field unique_chat boolean You might know this as r9kbeta or robot9000.

View file

@ -134,11 +134,13 @@ class Reader:
def read_class_body(self) -> list[list[str]]: def read_class_body(self) -> list[list[str]]:
"""The reader must be at the first line of the class/struct body. All comments inside the class are returned.""" """The reader must be at the first line of the class/struct body. All comments inside the class are returned."""
items = [] items = []
nesting = -1 # for the opening brace
while (line := self.peek_line()) is not None: while (line := self.peek_line()) is not None:
if line.startswith("};"): if line.startswith("};") and nesting == 0:
self.next_line() self.next_line()
break break
if not is_comment_start(line): if not is_comment_start(line):
nesting += line.count("{") - line.count("}")
self.next_line() self.next_line()
continue continue
doc = self.next_doc_comment() doc = self.next_doc_comment()
@ -231,21 +233,6 @@ def read_file(path: Path, out: TextIOWrapper):
else: else:
header = doc_comment header = doc_comment
# include block
if header[0].startswith("@includefile "):
for comment in header:
if not comment.startswith("@includefile "):
panic(
path,
reader.line_no(),
f"Invalid include block - got line '{comment}'",
)
filename = comment.split(" ", 1)[1]
out.write(f"-- Begin src/{filename}\n\n")
read_file(repo_root / "src" / filename, out)
out.write(f"-- End src/{filename}\n\n")
continue
# enum # enum
if header[0].startswith("@exposeenum "): if header[0].startswith("@exposeenum "):
if len(header) > 1: if len(header) > 1:
@ -270,7 +257,7 @@ def read_file(path: Path, out: TextIOWrapper):
continue continue
# class # class
if header[0].startswith("@lua@class "): elif header[0].startswith("@lua@class "):
name = header[0].split(" ", 1)[1] name = header[0].split(" ", 1)[1]
classname = name.split(":")[0].strip() classname = name.split(":")[0].strip()
printmsg(path, reader.line_no(), f"class {classname}") printmsg(path, reader.line_no(), f"class {classname}")
@ -311,11 +298,29 @@ def read_file(path: Path, out: TextIOWrapper):
for func in funcs: for func in funcs:
write_func(path, reader.line_no(), func, out) write_func(path, reader.line_no(), func, out)
continue continue
# global function # global function
if header[-1].startswith("@exposed "): elif header[-1].startswith("@exposed "):
write_func(path, reader.line_no(), doc_comment, out) write_func(path, reader.line_no(), doc_comment, out)
continue continue
else:
for comment in header:
inline_command(path, reader.line_no(), comment, out)
def inline_command(path: Path, line: int, comment: str, out: TextIOWrapper):
if comment.startswith("@includefile "):
filename = comment.split(" ", 1)[1]
out.write(f"-- Begin src/{filename}\n\n")
read_file(repo_root / "src" / filename, out)
out.write(f"-- End src/{filename}\n\n")
elif comment.startswith("@lua@class"):
panic(
path,
line,
"Unexpected @lua@class command. @lua@class must be placed at the start of the comment block!",
)
elif comment.startswith("@lua@"):
out.write(f'---{comment.replace("@lua", "", 1)}\n')
if __name__ == "__main__": if __name__ == "__main__":

View file

@ -32,7 +32,7 @@ class Channel : public std::enable_shared_from_this<Channel>
public: public:
// This is for Lua. See scripts/make_luals_meta.py // This is for Lua. See scripts/make_luals_meta.py
/** /**
* @exposeenum ChannelType * @exposeenum c2.ChannelType
*/ */
enum class Type { enum class Type {
None, None,

View file

@ -39,7 +39,7 @@ enum class EventType {
/** /**
* @lua@class CommandContext * @lua@class CommandContext
* @lua@field words string[] The words typed when executing the command. For example `/foo bar baz` will result in `{"/foo", "bar", "baz"}`. * @lua@field words string[] The words typed when executing the command. For example `/foo bar baz` will result in `{"/foo", "bar", "baz"}`.
* @lua@field channel Channel The channel the command was executed in. * @lua@field channel c2.Channel The channel the command was executed in.
*/ */
/** /**

View file

@ -13,7 +13,7 @@ namespace chatterino::lua::api {
/** /**
* This enum describes a platform for the purpose of searching for a channel. * This enum describes a platform for the purpose of searching for a channel.
* Currently only Twitch is supported because identifying IRC channels is tricky. * Currently only Twitch is supported because identifying IRC channels is tricky.
* @exposeenum Platform * @exposeenum c2.Platform
*/ */
enum class LPlatform { enum class LPlatform {
Twitch, Twitch,
@ -21,7 +21,7 @@ enum class LPlatform {
}; };
/** /**
* @lua@class Channel * @lua@class c2.Channel
*/ */
struct ChannelRef { struct ChannelRef {
static void createMetatable(lua_State *L); static void createMetatable(lua_State *L);
@ -49,7 +49,7 @@ public:
* If given a non-Channel object, it errors. * If given a non-Channel object, it errors.
* *
* @lua@return boolean success * @lua@return boolean success
* @exposed Channel:is_valid * @exposed c2.Channel:is_valid
*/ */
static int is_valid(lua_State *L); static int is_valid(lua_State *L);
@ -57,15 +57,15 @@ public:
* Gets the channel's name. This is the lowercase login name. * Gets the channel's name. This is the lowercase login name.
* *
* @lua@return string name * @lua@return string name
* @exposed Channel:get_name * @exposed c2.Channel:get_name
*/ */
static int get_name(lua_State *L); static int get_name(lua_State *L);
/** /**
* Gets the channel's type * Gets the channel's type
* *
* @lua@return ChannelType * @lua@return c2.ChannelType
* @exposed Channel:get_type * @exposed c2.Channel:get_type
*/ */
static int get_type(lua_State *L); static int get_type(lua_State *L);
@ -73,7 +73,7 @@ public:
* Get the channel owner's display name. This may contain non-lowercase ascii characters. * Get the channel owner's display name. This may contain non-lowercase ascii characters.
* *
* @lua@return string name * @lua@return string name
* @exposed Channel:get_display_name * @exposed c2.Channel:get_display_name
*/ */
static int get_display_name(lua_State *L); static int get_display_name(lua_State *L);
@ -83,7 +83,7 @@ public:
* *
* @lua@param message string * @lua@param message string
* @lua@param execute_commands boolean Should commands be run on the text? * @lua@param execute_commands boolean Should commands be run on the text?
* @exposed Channel:send_message * @exposed c2.Channel:send_message
*/ */
static int send_message(lua_State *L); static int send_message(lua_State *L);
@ -91,7 +91,7 @@ public:
* Adds a system message client-side * Adds a system message client-side
* *
* @lua@param message string * @lua@param message string
* @exposed Channel:add_system_message * @exposed c2.Channel:add_system_message
*/ */
static int add_system_message(lua_State *L); static int add_system_message(lua_State *L);
@ -101,7 +101,7 @@ public:
* that they are equal to the exposed enum. * that they are equal to the exposed enum.
* *
* @lua@return boolean * @lua@return boolean
* @exposed Channel:is_twitch_channel * @exposed c2.Channel:is_twitch_channel
*/ */
static int is_twitch_channel(lua_State *L); static int is_twitch_channel(lua_State *L);
@ -113,7 +113,7 @@ public:
* Returns a copy of the channel mode settings (subscriber only, r9k etc.) * Returns a copy of the channel mode settings (subscriber only, r9k etc.)
* *
* @lua@return RoomModes * @lua@return RoomModes
* @exposed Channel:get_room_modes * @exposed c2.Channel:get_room_modes
*/ */
static int get_room_modes(lua_State *L); static int get_room_modes(lua_State *L);
@ -121,7 +121,7 @@ public:
* Returns a copy of the stream status. * Returns a copy of the stream status.
* *
* @lua@return StreamStatus * @lua@return StreamStatus
* @exposed Channel:get_stream_status * @exposed c2.Channel:get_stream_status
*/ */
static int get_stream_status(lua_State *L); static int get_stream_status(lua_State *L);
@ -129,7 +129,7 @@ public:
* Returns the Twitch user ID of the owner of the channel. * Returns the Twitch user ID of the owner of the channel.
* *
* @lua@return string * @lua@return string
* @exposed Channel:get_twitch_id * @exposed c2.Channel:get_twitch_id
*/ */
static int get_twitch_id(lua_State *L); static int get_twitch_id(lua_State *L);
@ -137,7 +137,7 @@ public:
* Returns true if the channel is a Twitch channel and the user owns it * Returns true if the channel is a Twitch channel and the user owns it
* *
* @lua@return boolean * @lua@return boolean
* @exposed Channel:is_broadcaster * @exposed c2.Channel:is_broadcaster
*/ */
static int is_broadcaster(lua_State *L); static int is_broadcaster(lua_State *L);
@ -146,7 +146,7 @@ public:
* Returns false for broadcaster. * Returns false for broadcaster.
* *
* @lua@return boolean * @lua@return boolean
* @exposed Channel:is_mod * @exposed c2.Channel:is_mod
*/ */
static int is_mod(lua_State *L); static int is_mod(lua_State *L);
@ -155,7 +155,7 @@ public:
* Returns false for broadcaster. * Returns false for broadcaster.
* *
* @lua@return boolean * @lua@return boolean
* @exposed Channel:is_vip * @exposed c2.Channel:is_vip
*/ */
static int is_vip(lua_State *L); static int is_vip(lua_State *L);
@ -165,7 +165,7 @@ public:
/** /**
* @lua@return string * @lua@return string
* @exposed Channel:__tostring * @exposed c2.Channel:__tostring
*/ */
static int to_string(lua_State *L); static int to_string(lua_State *L);
@ -184,9 +184,9 @@ public:
* - /automod * - /automod
* *
* @lua@param name string Which channel are you looking for? * @lua@param name string Which channel are you looking for?
* @lua@param platform Platform Where to search for the channel? * @lua@param platform c2.Platform Where to search for the channel?
* @lua@return Channel? * @lua@return c2.Channel?
* @exposed Channel.by_name * @exposed c2.Channel.by_name
*/ */
static int get_by_name(lua_State *L); static int get_by_name(lua_State *L);
@ -194,8 +194,8 @@ public:
* Finds a channel by the Twitch user ID of its owner. * Finds a channel by the Twitch user ID of its owner.
* *
* @lua@param id string ID of the owner of the channel. * @lua@param id string ID of the owner of the channel.
* @lua@return Channel? * @lua@return c2.Channel?
* @exposed Channel.by_twitch_id * @exposed c2.Channel.by_twitch_id
*/ */
static int get_by_twitch_id(lua_State *L); static int get_by_twitch_id(lua_State *L);
}; };