diff options
author | 最萌小汐 <sumneko@hotmail.com> | 2022-07-05 16:04:12 +0800 |
---|---|---|
committer | 最萌小汐 <sumneko@hotmail.com> | 2022-07-05 16:04:12 +0800 |
commit | e711f30dbcf840e8adec49a78d734d1a0306934b (patch) | |
tree | bb93c69ebfc9363554b939a1f93696fa4ad2f608 /script | |
parent | a00de14e61b02e3b015fe33f8c01b748113bf4ce (diff) | |
download | lua-language-server-e711f30dbcf840e8adec49a78d734d1a0306934b.zip |
resolve #1280
Diffstat (limited to 'script')
-rw-r--r-- | script/core/diagnostics/assign-type-mismatch.lua | 26 | ||||
-rw-r--r-- | script/vm/node.lua | 2 |
2 files changed, 27 insertions, 1 deletions
diff --git a/script/core/diagnostics/assign-type-mismatch.lua b/script/core/diagnostics/assign-type-mismatch.lua index a3d63ca8..d98aa021 100644 --- a/script/core/diagnostics/assign-type-mismatch.lua +++ b/script/core/diagnostics/assign-type-mismatch.lua @@ -30,6 +30,20 @@ local function hasMarkType(source) return false end +---@param source parser.object +---@return boolean +local function hasMarkClass(source) + if not source.bindDocs then + return false + end + for _, doc in ipairs(source.bindDocs) do + if doc.type == 'doc.class' then + return true + end + end + return false +end + ---@async return function (uri, callback) local state = files.getState(uri) @@ -72,6 +86,18 @@ return function (uri, callback) if vm.canCastType(uri, varNode, valueNode) then return end + + if value.type == 'select' + and value.sindex == 1 + and value.vararg + and value.vararg.type == 'call' + and value.vararg.node.special == 'setmetatable' + and hasMarkClass(source) then + if vm.canCastType(uri, valueNode:copy():remove 'table', varNode) then + return + end + end + callback { start = source.start, finish = source.finish, diff --git a/script/vm/node.lua b/script/vm/node.lua index f0d0b0ba..5d8bcd75 100644 --- a/script/vm/node.lua +++ b/script/vm/node.lua @@ -227,7 +227,7 @@ function mt:remove(name) or (c.type == 'doc.type.boolean' and name == 'false' and c[1] == false) or (c.type == 'doc.type.table' and name == 'table') or (c.type == 'doc.type.array' and name == 'table') - or (c.type == 'doc.type.sign' and name == 'table') + or (c.type == 'doc.type.sign' and name == 'table') or (c.type == 'doc.type.function' and name == 'function') then table.remove(self, index) self[c] = nil |