Skip to content

Commit b869212

Browse files
committed
resolve class[1] by ---@field [integer] type
1 parent 3ef5739 commit b869212

File tree

3 files changed

+49
-12
lines changed

3 files changed

+49
-12
lines changed

changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
local y = x--[[@as integer]] -- y is `integer` here
2525
```
2626
* `NEW` generic: resolve `T[]` by `table<integer, type>` or `---@field [integer] type`
27+
* `NEW` resolve `class[1]` by `---@field [integer] type`
2728
* `NEW` diagnostic: `missing-parameter`
2829
* `CHG` diagnostic: no longer mark `redundant-parameter` as `Unnecessary`
2930
* `FIX` diagnostic: `unused-function` does not recognize recursion

script/vm/compiler.lua

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -199,22 +199,50 @@ function vm.getClassFields(suri, object, key, ref, pushResult)
199199
-- check ---@field
200200
local hasFounded = {}
201201
for _, field in ipairs(set.fields) do
202-
if type(key) == 'table' then
203-
local fieldNode = vm.compileNode(field.field)
204-
if vm.isSubType(suri, key.name, fieldNode) then
205-
if not searchedFields[key] then
202+
local fieldKey = guide.getKeyName(field)
203+
if fieldKey then
204+
-- ---@field x boolean -> class.x
205+
if key == nil
206+
or fieldKey == key then
207+
if not searchedFields[fieldKey] then
206208
pushResult(field)
207-
hasFounded[key] = true
209+
hasFounded[fieldKey] = true
208210
end
209211
end
210-
else
211-
local fieldKey = guide.getKeyName(field)
212-
if fieldKey then
213-
if key == nil
214-
or fieldKey == key then
215-
if not searchedFields[fieldKey] then
212+
end
213+
if not hasFounded[fieldKey] then
214+
local keyType = type(key)
215+
if keyType == 'table' then
216+
-- ---@field [integer] boolean -> class[integer]
217+
local fieldNode = vm.compileNode(field.field)
218+
if vm.isSubType(suri, key.name, fieldNode) then
219+
local nkey = '|' .. key.name
220+
if not searchedFields[nkey] then
216221
pushResult(field)
217-
hasFounded[fieldKey] = true
222+
hasFounded[nkey] = true
223+
end
224+
end
225+
else
226+
local typeName
227+
if keyType == 'number' then
228+
if math.tointeger(key) then
229+
typeName = 'integer'
230+
else
231+
typeName = 'number'
232+
end
233+
elseif keyType == 'boolean'
234+
or keyType == 'string' then
235+
typeName = keyType
236+
end
237+
if typeName then
238+
-- ---@field [integer] boolean -> class[1]
239+
local fieldNode = vm.compileNode(field.field)
240+
if vm.isSubType(suri, typeName, fieldNode) then
241+
local nkey = '|' .. typeName
242+
if not searchedFields[nkey] then
243+
pushResult(field)
244+
hasFounded[nkey] = true
245+
end
218246
end
219247
end
220248
end

test/type_inference/init.lua

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1810,3 +1810,11 @@ local t
18101810
18111811
t.<?x?>
18121812
]]
1813+
1814+
TEST 'boolean' [[
1815+
---@class A
1816+
---@field [integer] boolean
1817+
local t
1818+
1819+
local <?x?> = t[1]
1820+
]]

0 commit comments

Comments
 (0)