summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--changelog.md2
-rw-r--r--script/config/template.lua1
-rw-r--r--script/core/diagnostics/missing-return.lua2
-rw-r--r--script/core/diagnostics/unreachable-code.lua2
-rw-r--r--script/parser/compile.lua6
-rw-r--r--script/parser/guide.lua2
-rw-r--r--script/vm/tracer.lua2
-rw-r--r--test/type_inference/init.lua11
8 files changed, 22 insertions, 6 deletions
diff --git a/changelog.md b/changelog.md
index 321e40b8..a80ed3a9 100644
--- a/changelog.md
+++ b/changelog.md
@@ -4,9 +4,11 @@
* `CHG` completion: don't show loading process
* `FIX` [#1886]
* `FIX` [#1895]
+* `FIX` [#1889]
[#1886]: https://github.com/LuaLS/lua-language-server/issues/1886
[#1895]: https://github.com/LuaLS/lua-language-server/issues/1895
+[#1889]: https://github.com/LuaLS/lua-language-server/issues/1889
## 3.6.10
`2023-2-7`
diff --git a/script/config/template.lua b/script/config/template.lua
index e93ffa08..7a4d3f1b 100644
--- a/script/config/template.lua
+++ b/script/config/template.lua
@@ -210,6 +210,7 @@ local template = {
'assert',
'error',
'type',
+ 'os.exit',
}
),
['Lua.runtime.meta'] = Type.String >> '${version} ${language} ${encoding}',
diff --git a/script/core/diagnostics/missing-return.lua b/script/core/diagnostics/missing-return.lua
index 7333e5e3..2b5c90d2 100644
--- a/script/core/diagnostics/missing-return.lua
+++ b/script/core/diagnostics/missing-return.lua
@@ -7,7 +7,7 @@ local await = require 'await'
---@param block parser.object
---@return boolean
local function hasReturn(block)
- if block.hasReturn or block.hasError then
+ if block.hasReturn or block.hasExit then
return true
end
if block.type == 'if' then
diff --git a/script/core/diagnostics/unreachable-code.lua b/script/core/diagnostics/unreachable-code.lua
index 4f0a38b7..cbffe4db 100644
--- a/script/core/diagnostics/unreachable-code.lua
+++ b/script/core/diagnostics/unreachable-code.lua
@@ -23,7 +23,7 @@ end
---@param block parser.object
---@return boolean
local function hasReturn(block)
- if block.hasReturn or block.hasError then
+ if block.hasReturn or block.hasExit then
return true
end
if block.type == 'if' then
diff --git a/script/parser/compile.lua b/script/parser/compile.lua
index 7cc6f36b..917a68a4 100644
--- a/script/parser/compile.lua
+++ b/script/parser/compile.lua
@@ -118,6 +118,7 @@ local Specials = {
['assert'] = true,
['error'] = true,
['type'] = true,
+ ['os.exit'] = true,
}
local UnarySymbol = {
@@ -2899,14 +2900,15 @@ local function compileExpAsAction(exp)
end
if exp.type == 'call' then
- if exp.node.special == 'error' then
+ if exp.node.special == 'error'
+ or exp.node.special == 'os.exit' then
for i = #Chunk, 1, -1 do
local block = Chunk[i]
if block.type == 'ifblock'
or block.type == 'elseifblock'
or block.type == 'elseblock'
or block.type == 'function' then
- block.hasError = true
+ block.hasExit = true
break
end
end
diff --git a/script/parser/guide.lua b/script/parser/guide.lua
index 0b6de77d..ec5746c1 100644
--- a/script/parser/guide.lua
+++ b/script/parser/guide.lua
@@ -72,7 +72,7 @@ local type = type
---@field hasGoTo? true
---@field hasReturn? true
---@field hasBreak? true
----@field hasError? true
+---@field hasExit? true
---@field [integer] parser.object|any
---@field package _root parser.object
diff --git a/script/vm/tracer.lua b/script/vm/tracer.lua
index 6ce57d5c..a13d00e1 100644
--- a/script/vm/tracer.lua
+++ b/script/vm/tracer.lua
@@ -369,7 +369,7 @@ local lookIntoChild = util.switch()
local neverReturn = subBlock.hasReturn
or subBlock.hasGoTo
or subBlock.hasBreak
- or subBlock.hasError
+ or subBlock.hasExit
if neverReturn then
mergedNode = true
else
diff --git a/test/type_inference/init.lua b/test/type_inference/init.lua
index 5a9e1796..4e3c9d5b 100644
--- a/test/type_inference/init.lua
+++ b/test/type_inference/init.lua
@@ -2620,6 +2620,17 @@ end
print(<?n?>)
]]
+TEST 'integer' [[
+---@type integer?
+local n
+
+if not n then
+ os.exit()
+end
+
+print(<?n?>)
+]]
+
TEST 'table' [[
---@type table?
local n