From 568694644d498e6023747e3f8421a0eeafd9dd43 Mon Sep 17 00:00:00 2001 From: fesily Date: Thu, 11 May 2023 11:58:40 +0800 Subject: [PATCH 01/10] meta:support metatable --- meta/template/basic.lua | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/meta/template/basic.lua b/meta/template/basic.lua index c024b2226..0bbf2f3d9 100644 --- a/meta/template/basic.lua +++ b/meta/template/basic.lua @@ -209,9 +209,46 @@ function select(index, ...) end ---@return function function setfenv(f, table) end + +---@class metatable +---@field __mode 'v'|'k'|'kv' +---@field __metatable any +---@field __tostring fun(t):string +---@field __gc fun(t) +---@field __add fun(t1,t2):any +---@field __sub fun(t1,t2):any +---@field __mul fun(t1,t2):any +---@field __div fun(t1,t2):any +---@field __mod fun(t1,t2):any +---@field __pow fun(t1,t2):any +---@field __unm fun(t):any +---#if VERSION >= 5.3 then +---@field __idiv fun(t1,t2):any +---@field __band fun(t1,t2):any +---@field __bor fun(t1,t2):any +---@field __bxor fun(t1,t2):any +---@field __bnot fun(t):any +---@field __shl fun(t1,t2):any +---@field __shr fun(t1,t2):any +---#end +---@field __concat fun(t1,t2):any +---@field __len fun(t):integer +---@field __eq fun(t1,t2):boolean +---@field __lt fun(t1,t2):boolean +---@field __le fun(t1,t2):boolean +---@field __index table|fun(t,k) +---@field __newindex table|fun(t,k,v) +---@field __call fun(t,...) +---#if VERSION > 5.1 or VERSION == JIT then +---@field __pairs fun(t):fun(t,k,v) +---#end +---#if VERSION == JIT or VERSION == 5.2 then +---@field __ipairs fun(t):fun(t,k,v) +---#end + ---#DES 'setmetatable' ---@param table table ----@param metatable? table +---@param metatable? metatable ---@return table function setmetatable(table, metatable) end From b890bbfc8e60e90f78f102a17312f3ca28f170b6 Mon Sep 17 00:00:00 2001 From: fesily Date: Thu, 11 May 2023 14:42:51 +0800 Subject: [PATCH 02/10] add base class --- meta/template/basic.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta/template/basic.lua b/meta/template/basic.lua index 0bbf2f3d9..7004cc44a 100644 --- a/meta/template/basic.lua +++ b/meta/template/basic.lua @@ -210,7 +210,7 @@ function select(index, ...) end function setfenv(f, table) end ----@class metatable +---@class metatable : table ---@field __mode 'v'|'k'|'kv' ---@field __metatable any ---@field __tostring fun(t):string From 3d837666e6a0e01a5c1f207d56ba81fd99bdcd52 Mon Sep 17 00:00:00 2001 From: fesily Date: Thu, 11 May 2023 14:43:12 +0800 Subject: [PATCH 03/10] delete __index --- meta/template/basic.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/meta/template/basic.lua b/meta/template/basic.lua index 7004cc44a..05c631883 100644 --- a/meta/template/basic.lua +++ b/meta/template/basic.lua @@ -236,7 +236,6 @@ function setfenv(f, table) end ---@field __eq fun(t1,t2):boolean ---@field __lt fun(t1,t2):boolean ---@field __le fun(t1,t2):boolean ----@field __index table|fun(t,k) ---@field __newindex table|fun(t,k,v) ---@field __call fun(t,...) ---#if VERSION > 5.1 or VERSION == JIT then From a41227005417301dcf2f2d93abcba8ed3521901c Mon Sep 17 00:00:00 2001 From: fesily Date: Mon, 22 May 2023 15:48:33 +0800 Subject: [PATCH 04/10] Update basic.lua --- meta/template/basic.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/meta/template/basic.lua b/meta/template/basic.lua index 05c631883..7004cc44a 100644 --- a/meta/template/basic.lua +++ b/meta/template/basic.lua @@ -236,6 +236,7 @@ function setfenv(f, table) end ---@field __eq fun(t1,t2):boolean ---@field __lt fun(t1,t2):boolean ---@field __le fun(t1,t2):boolean +---@field __index table|fun(t,k) ---@field __newindex table|fun(t,k,v) ---@field __call fun(t,...) ---#if VERSION > 5.1 or VERSION == JIT then From 2bf30bdd364a4c7a02340d2ebb5360cf8002f2f1 Mon Sep 17 00:00:00 2001 From: fesily Date: Wed, 31 May 2023 16:38:35 +0800 Subject: [PATCH 05/10] fix assign-type-mismatch --- meta/template/basic.lua | 58 +++++++++---------- .../core/diagnostics/assign-type-mismatch.lua | 2 +- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/meta/template/basic.lua b/meta/template/basic.lua index 7004cc44a..0dad91ba6 100644 --- a/meta/template/basic.lua +++ b/meta/template/basic.lua @@ -210,40 +210,40 @@ function select(index, ...) end function setfenv(f, table) end ----@class metatable : table ----@field __mode 'v'|'k'|'kv' ----@field __metatable any ----@field __tostring fun(t):string ----@field __gc fun(t) ----@field __add fun(t1,t2):any ----@field __sub fun(t1,t2):any ----@field __mul fun(t1,t2):any ----@field __div fun(t1,t2):any ----@field __mod fun(t1,t2):any ----@field __pow fun(t1,t2):any ----@field __unm fun(t):any +---@class metatable +---@field __mode 'v'|'k'|'kv'|nil +---@field __metatable any|nil +---@field __tostring fun(t):string|nil +---@field __gc fun(t)|nil +---@field __add fun(t1,t2):any|nil +---@field __sub fun(t1,t2):any|nil +---@field __mul fun(t1,t2):any|nil +---@field __div fun(t1,t2):any|nil +---@field __mod fun(t1,t2):any|nil +---@field __pow fun(t1,t2):any|nil +---@field __unm fun(t):any|nil ---#if VERSION >= 5.3 then ----@field __idiv fun(t1,t2):any ----@field __band fun(t1,t2):any ----@field __bor fun(t1,t2):any ----@field __bxor fun(t1,t2):any ----@field __bnot fun(t):any ----@field __shl fun(t1,t2):any ----@field __shr fun(t1,t2):any +---@field __idiv fun(t1,t2):any|nil +---@field __band fun(t1,t2):any|nil +---@field __bor fun(t1,t2):any|nil +---@field __bxor fun(t1,t2):any|nil +---@field __bnot fun(t):any|nil +---@field __shl fun(t1,t2):any|nil +---@field __shr fun(t1,t2):any|nil ---#end ----@field __concat fun(t1,t2):any ----@field __len fun(t):integer ----@field __eq fun(t1,t2):boolean ----@field __lt fun(t1,t2):boolean ----@field __le fun(t1,t2):boolean ----@field __index table|fun(t,k) ----@field __newindex table|fun(t,k,v) ----@field __call fun(t,...) +---@field __concat fun(t1,t2):any|nil +---@field __len fun(t):integer|nil +---@field __eq fun(t1,t2):boolean|nil +---@field __lt fun(t1,t2):boolean|nil +---@field __le fun(t1,t2):boolean|nil +---@field __index table|fun(t,k)|nil +---@field __newindex table|fun(t,k,v)|nil +---@field __call fun(t,...)|nil ---#if VERSION > 5.1 or VERSION == JIT then ----@field __pairs fun(t):fun(t,k,v) +---@field __pairs fun(t):fun(t,k,v)|nil ---#end ---#if VERSION == JIT or VERSION == 5.2 then ----@field __ipairs fun(t):fun(t,k,v) +---@field __ipairs fun(t):fun(t,k,v)|nil ---#end ---#DES 'setmetatable' diff --git a/script/core/diagnostics/assign-type-mismatch.lua b/script/core/diagnostics/assign-type-mismatch.lua index 8472e87c5..32d6d7f7d 100644 --- a/script/core/diagnostics/assign-type-mismatch.lua +++ b/script/core/diagnostics/assign-type-mismatch.lua @@ -103,7 +103,7 @@ return function (uri, callback) -- local Cat = setmetatable({}, {__index = Animal}) 允许逆变 if hasMarkClass(source) then - if vm.canCastType(uri, valueNode:copy():remove 'table', varNode) then + if vm.canCastType(uri, valueNode:copy():remove 'metatable', varNode) then return end end From 1c08c00fea5e8cd83bcc2b805b5324d26fb53e58 Mon Sep 17 00:00:00 2001 From: fesily Date: Wed, 31 May 2023 16:47:37 +0800 Subject: [PATCH 06/10] reset --- meta/template/basic.lua | 2 +- script/core/diagnostics/assign-type-mismatch.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/meta/template/basic.lua b/meta/template/basic.lua index 0dad91ba6..62ab999ed 100644 --- a/meta/template/basic.lua +++ b/meta/template/basic.lua @@ -248,7 +248,7 @@ function setfenv(f, table) end ---#DES 'setmetatable' ---@param table table ----@param metatable? metatable +---@param metatable? metatable|table ---@return table function setmetatable(table, metatable) end diff --git a/script/core/diagnostics/assign-type-mismatch.lua b/script/core/diagnostics/assign-type-mismatch.lua index 32d6d7f7d..8472e87c5 100644 --- a/script/core/diagnostics/assign-type-mismatch.lua +++ b/script/core/diagnostics/assign-type-mismatch.lua @@ -103,7 +103,7 @@ return function (uri, callback) -- local Cat = setmetatable({}, {__index = Animal}) 允许逆变 if hasMarkClass(source) then - if vm.canCastType(uri, valueNode:copy():remove 'metatable', varNode) then + if vm.canCastType(uri, valueNode:copy():remove 'table', varNode) then return end end From 8eb261e699023a2e85872d2031fdddae78e18f67 Mon Sep 17 00:00:00 2001 From: fesily Date: Wed, 31 May 2023 16:51:40 +0800 Subject: [PATCH 07/10] fix test --- test/type_inference/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/type_inference/init.lua b/test/type_inference/init.lua index 8797cfdd3..1521cc5af 100644 --- a/test/type_inference/init.lua +++ b/test/type_inference/init.lua @@ -1209,7 +1209,7 @@ local t = {} f(t, function () end) ]] -TEST 'table' [[ +TEST 'table|nil' [[ local = setmetatable({}, { __index = function () end }) ]] From d35909dcf28a61f67c11c34216b31f85e4a05d1d Mon Sep 17 00:00:00 2001 From: fesily Date: Wed, 31 May 2023 16:53:41 +0800 Subject: [PATCH 08/10] fix test --- test/hover/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/hover/init.lua b/test/hover/init.lua index e77d8c988..7ef5dfc1d 100644 --- a/test/hover/init.lua +++ b/test/hover/init.lua @@ -454,7 +454,7 @@ mt.c = 3 local = setmetatable({}, {__index = mt}) ]] [[ -local obj: { +local obj: table|nil { a: integer = 1, b: integer = 2, c: integer = 3, From de98b5c16e0c54bcbbe12840b376273295845fdd Mon Sep 17 00:00:00 2001 From: fesily Date: Thu, 1 Jun 2023 08:44:55 +0800 Subject: [PATCH 09/10] getReturnOfSetMetaTable remove nil --- script/vm/compiler.lua | 11 +++++++++++ test/hover/init.lua | 2 +- test/type_inference/init.lua | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/script/vm/compiler.lua b/script/vm/compiler.lua index f455d6da7..3927e3596 100644 --- a/script/vm/compiler.lua +++ b/script/vm/compiler.lua @@ -522,6 +522,17 @@ local function getReturnOfSetMetaTable(args) end end) end + --过滤nil + local len = #node + for i = len, 1, -1 do + local n = node[i] + if n.cate == 'type' then + if n.name == 'nil' then + table.remove(node, i) + break + end + end + end return node end diff --git a/test/hover/init.lua b/test/hover/init.lua index 7ef5dfc1d..e77d8c988 100644 --- a/test/hover/init.lua +++ b/test/hover/init.lua @@ -454,7 +454,7 @@ mt.c = 3 local = setmetatable({}, {__index = mt}) ]] [[ -local obj: table|nil { +local obj: { a: integer = 1, b: integer = 2, c: integer = 3, diff --git a/test/type_inference/init.lua b/test/type_inference/init.lua index 1521cc5af..8797cfdd3 100644 --- a/test/type_inference/init.lua +++ b/test/type_inference/init.lua @@ -1209,7 +1209,7 @@ local t = {} f(t, function () end) ]] -TEST 'table|nil' [[ +TEST 'table' [[ local = setmetatable({}, { __index = function () end }) ]] From 0c3e35427e70cf83178e338e854f70e9f8124bf9 Mon Sep 17 00:00:00 2001 From: fesily Date: Thu, 1 Jun 2023 10:22:23 +0800 Subject: [PATCH 10/10] Update compiler.lua --- script/vm/compiler.lua | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/script/vm/compiler.lua b/script/vm/compiler.lua index 3927e3596..6b4636fc5 100644 --- a/script/vm/compiler.lua +++ b/script/vm/compiler.lua @@ -523,16 +523,7 @@ local function getReturnOfSetMetaTable(args) end) end --过滤nil - local len = #node - for i = len, 1, -1 do - local n = node[i] - if n.cate == 'type' then - if n.name == 'nil' then - table.remove(node, i) - break - end - end - end + node:remove 'nil' return node end