Async flag lost when alias with type parameters (@alias Name<T> async fun) is used
まだ誰も着手していません。
評価
調査の方向性
Reproduce with the issue's ---@alias Name<T> async fun(): T snippets and hover output. The async flag is likely dropped where generic alias types get substituted — start in script/vm/ (alias/global resolution) and script/compiler/ where function types are marked async, then check script/core/diagnostics/await-in-sync.lua for how the flag is read. Done means generic-parameterized async aliases report async on hover and trigger await-in-sync, verified via the repo's test harness under script/tests.
索引モデルが issue の本文から書いたものです。
説明
How are you using the lua-language-server?
NeoVim
Which OS are you using?
Linux
What is the issue affecting?
Type Checking
Expected Behaviour
When using alias generics where the alias is an async function, it should be marked with async when I give it a generic type.
```---@alias MyAsyncFunc<T> async fun(): T
---@type MyAsyncFunc<string>
local function my_function()
return "test"
end
my_function() -- on hover, it shows async
---@diagnostic enable: await-in-sync
local function async_context()
my_function() -- raises `await-in-sync` warning since the outer function is not marked as async
end
Actual Behaviour
When using alias generics like this, the async flag marked on those functions gets removed:
---@alias Name<T> async fun(): T
---@alias Name2<T> async fun(a: T)
---@alias Name3<T> async fun(a: T): T
Refer to the test cases below:
---@alias AsyncFuncT async fun(): any
---@alias AsyncGenericFuncT<T> async fun(): T
---@alias AnotherAsyncGenericFuncT<T> async fun(val: T)
---@alias DifferentAsyncFormat async fun<T>(val: T): T
---@class TestClass
---@field field AsyncFuncT
---@field generic_field AsyncGenericFuncT<string>
---@field another_generic AnotherAsyncGenericFuncT<integer>
---@field different DifferentAsyncFormat
---@type TestClass
local test_fields = {
field = function() end, --- correctly marks async
generic_field = function() -- the function is not tagged as async
return "hello" -- the return type is correctly tagged as string
end,
another_generic = function(num) -- the function is not tagged as async
print(num) -- the num is correctly tagged as integer
end,
different = function(x) -- correctly tags as async
return x
end,
}
---@type AsyncFuncT
local function test() end
test() -- correctly tags as async
---@type AsyncGenericFuncT<string>
local function test2()
return "hello" -- correctly tags the return type as string
end
test2() -- does not tag as async
---@type AnotherAsyncGenericFuncT<integer>
local function test3(num)
print(num) -- correctly tags as integer
end
test3(2) -- does not tag as async
---@type DifferentAsyncFormat
local function test4(x)
return x
end
test4(20) -- correctly tags as async
local function non_async()
test() -- if await-in-sync is enabled, this warns as expected
-- since the function is not tagged async
test2() -- gives no warning since its not tagged as async function
test3(2) -- gives no warns since its not tagged as async function
test4(4) -- warns as expected when await-in-sync is enabled
end
---@async
local function async_code()
test() -- no warning as expected when await-in-sync is enabled
test2()
test3(2)
test4(4) -- no warning as expected when await-in-sync is enabled
end
Normal alias with async fun():
Alias with generic with async fun():
Reproduction steps
Tested version: 3.19.1
Create an alias that has a generic beside the name, then hover the function or use it in a context where await-in-sync warning will appear.
Example:
---@alias MyAsyncFunc<T> async fun(): T
---@alias MyAsyncFuncNormal async fun(): any
---@type MyAsyncFunc<string>
local function my_function()
return "test"
end
---@type MyAsyncFuncNormal
local function working()
return "test"
end
---@diagnostic enable: await-in-sync
local function async_context()
my_function() -- should raise `await-in-sync` warning
working() -- warns with `await-in-sync`
end
Additional Notes
No response
Log File
No response
- 主要言語
- Lua
- スター
- 4.4k
- フォーク
- 446
- 平均マージ
- 8日 9時間
- マージ済み PR(30日)
- 1
環境構築
- Dockerfile または Docker Compose ファイルあり
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
LuaLS/lua-language-server のほかの issue
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
LuaLS/lua-language-server#1776 ·
-
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
LuaLS/lua-language-server#3470 ·
-
難易度 3/5 1〜2日 初心者へのやさしさ 68/100
LuaLS/lua-language-server#3468 ·
-
難易度 3/5 1〜2日 初心者へのやさしさ 65/100
LuaLS/lua-language-server#3463 · コメント 5 件 ·
-
難易度 4/5 3〜5日 初心者へのやさしさ 55/100
LuaLS/lua-language-server#3461 ·
LuaLS/lua-language-server の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
public-transport/transitous#2569 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 82/100
-
bug: (profiler): E484 "Can't open file .../vim/_core/shared" when stopping profiler on Neovim 0.12オープンbug
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
folke/snacks.nvim#2971 ·
-
severity: low
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
luainkernel/lunatik#1853 ·
メンテナーはふだん 1 日以内に返信
-
enhancement good first issue hacktoberfest runner
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100