diff options
Diffstat (limited to 'script')
-rw-r--r-- | script/core/diagnostics/param-type-mismatch.lua | 33 | ||||
-rw-r--r-- | script/vm/type.lua | 5 |
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 |