From e711f30dbcf840e8adec49a78d734d1a0306934b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=80=E8=90=8C=E5=B0=8F=E6=B1=90?= Date: Tue, 5 Jul 2022 16:04:12 +0800 Subject: resolve #1280 --- script/core/diagnostics/assign-type-mismatch.lua | 26 ++++++++++++++++++++++++ script/vm/node.lua | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) (limited to 'script') 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 -- cgit v1.2.3