summaryrefslogtreecommitdiff
path: root/script
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2022-07-05 16:04:12 +0800
committer最萌小汐 <sumneko@hotmail.com>2022-07-05 16:04:12 +0800
commite711f30dbcf840e8adec49a78d734d1a0306934b (patch)
treebb93c69ebfc9363554b939a1f93696fa4ad2f608 /script
parenta00de14e61b02e3b015fe33f8c01b748113bf4ce (diff)
downloadlua-language-server-e711f30dbcf840e8adec49a78d734d1a0306934b.zip
resolve #1280
Diffstat (limited to 'script')
-rw-r--r--script/core/diagnostics/assign-type-mismatch.lua26
-rw-r--r--script/vm/node.lua2
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