summaryrefslogtreecommitdiff
path: root/script
diff options
context:
space:
mode:
Diffstat (limited to 'script')
-rw-r--r--script/core/diagnostics/param-type-mismatch.lua33
-rw-r--r--script/vm/type.lua5
2 files changed, 27 insertions, 11 deletions
diff --git a/script/core/diagnostics/param-type-mismatch.lua b/script/core/diagnostics/param-type-mismatch.lua
index a05b03e4..e4917456 100644
--- a/script/core/diagnostics/param-type-mismatch.lua
+++ b/script/core/diagnostics/param-type-mismatch.lua
@@ -42,20 +42,31 @@ return function (uri, callback)
await.delay()
local funcNode = vm.compileNode(source.node)
for i, arg in ipairs(source.args) do
+ if i == 1 and source.node.type == 'getmethod' then
+ goto CONTINUE
+ end
local refNode = vm.compileNode(arg)
local defNode = getDefNode(funcNode, i)
- if defNode then
- if not vm.canCastType(uri, defNode, refNode) then
- callback {
- start = arg.start,
- finish = arg.finish,
- message = lang.script('DIAG_PARAM_TYPE_MISMATCH', {
- def = vm.getInfer(defNode):view(uri),
- ref = vm.getInfer(refNode):view(uri),
- })
- }
- end
+ if not defNode then
+ goto CONTINUE
+ end
+ if arg.type == 'getfield'
+ or arg.type == 'getindex' then
+ -- 由于无法对字段进行类型收窄,
+ -- 因此将假值移除再进行检查
+ refNode = refNode:copy():setTruthy()
+ end
+ if not vm.canCastType(uri, defNode, refNode) then
+ callback {
+ start = arg.start,
+ finish = arg.finish,
+ message = lang.script('DIAG_PARAM_TYPE_MISMATCH', {
+ def = vm.getInfer(defNode):view(uri),
+ ref = vm.getInfer(refNode):view(uri),
+ })
+ }
end
+ ::CONTINUE::
end
end)
end
diff --git a/script/vm/type.lua b/script/vm/type.lua
index 982f937d..d8adac6e 100644
--- a/script/vm/type.lua
+++ b/script/vm/type.lua
@@ -58,6 +58,11 @@ function vm.isSubType(uri, child, parent, mark)
return false
end
end
+ if child:isOptional() then
+ if not vm.isSubType(uri, 'nil', parent, mark) then
+ return false
+ end
+ end
return true
end