summaryrefslogtreecommitdiff
path: root/script/vm
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2022-06-18 01:58:48 +0800
committer最萌小汐 <sumneko@hotmail.com>2022-06-18 01:58:48 +0800
commit53d376ce281906fd856fac42073a072906b2628e (patch)
treed72c05a6100b9f8da4650106653a85ec2a55c044 /script/vm
parentbc4e205a4953a7f3a99bafc9fc88295f929beab1 (diff)
downloadlua-language-server-53d376ce281906fd856fac42073a072906b2628e.zip
update
Diffstat (limited to 'script/vm')
-rw-r--r--script/vm/type.lua34
1 files changed, 34 insertions, 0 deletions
diff --git a/script/vm/type.lua b/script/vm/type.lua
index db378878..ebea8c30 100644
--- a/script/vm/type.lua
+++ b/script/vm/type.lua
@@ -202,3 +202,37 @@ function vm.getTableKey(uri, tnode, vnode)
end
return result
end
+
+---@param uri uri
+---@param defNode vm.node
+---@param refNode vm.node
+---@return boolean
+function vm.canCastType(uri, defNode, refNode)
+ local defInfer = vm.getInfer(defNode)
+
+ if defInfer:hasUnknown(uri) then
+ return true
+ end
+
+ -- allow `local x = {};x = nil`,
+ -- but not allow `local x ---@type table;x = nil`
+ local allowNil = defInfer:hasType(uri, 'table')
+ and not defNode:hasType 'table'
+
+ -- allow `local x = 0;x = 1.0`,
+ -- but not allow `local x ---@type integer;x = 1.0`
+ local allowNumber = defInfer:hasType(uri, 'integer')
+ and not defNode:hasType 'integer'
+
+ if allowNil and vm.isSubType(uri, refNode, 'nil') then
+ return true
+ end
+ if allowNumber and vm.isSubType(uri, refNode, 'number') then
+ return true
+ end
+ if vm.isSubType(uri, refNode, defNode) then
+ return true
+ end
+
+ return false
+end