Skip to content

Commit 5a4d68f

Browse files
committed
add yet another metatable implementation..
1 parent 4a98537 commit 5a4d68f

19 files changed

Lines changed: 775 additions & 69 deletions

nattlua/definitions/lua/globals.nlua

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,34 @@ analyzer function setmetatable(tbl: Table, meta: Table | nil)
503503
end
504504

505505
if meta.Type == "table" then
506-
if meta.Self then
506+
if meta.NewMetaTable and not meta.Self then
507+
-- @NewMetaTable mode: build an inferred Self from tbl's fields
508+
-- This is informational (no contract enforcement)
509+
local inferred_self = types.Table()
510+
for _, kv in ipairs(tbl:GetData()) do
511+
local key = kv.key
512+
local val = kv.val
513+
-- Widen literal values to their base types for the inferred self
514+
if val:IsLiteral() and val.Type ~= "function" and val.Type ~= "table" and val.Widen then
515+
val = val:Widen()
516+
end
517+
inferred_self:Set(key, val)
518+
end
519+
inferred_self:SetMetaTable(meta)
520+
meta.Self = inferred_self
521+
elseif meta.NewMetaTable and meta.Self then
522+
-- Subsequent setmetatable calls: merge additional fields
523+
for _, kv in ipairs(tbl:GetData()) do
524+
local key = kv.key
525+
local val = kv.val
526+
if val:IsLiteral() and val.Type ~= "function" and val.Type ~= "table" and val.Widen then
527+
val = val:Widen()
528+
end
529+
if not meta.Self:HasKey(key) then
530+
meta.Self:Set(key, val)
531+
end
532+
end
533+
elseif meta.Self then
507534
analyzer:ErrorIfFalse(tbl:FollowsContract(meta.Self))
508535
tbl:CopyLiteralness2(meta.Self)
509536
tbl:SetContract(meta.Self)

nattlua/types/table.lua

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ META:GetSet("BaseTable", nil--[[# as TTable | false]])
3838
META:GetSet("ReferenceId", nil--[[# as string | false]])
3939
META:GetSet("Self", nil--[[# as false | TTable]])
4040
META:GetSet("Self2", nil--[[# as false | TTable]])
41+
META:GetSet("NewMetaTable", false--[[# as boolean]])
4142
META:GetSet("Contracts", nil--[[# as List<|TTable|>]])
4243
META:GetSet("CreationScope", nil--[[# as any]])
4344
META:GetSet("AnalyzerEnvironment", false--[[# as false | "runtime" | "typesystem"]])
@@ -85,6 +86,14 @@ function META:SetSelf(tbl--[[#: TTable]])
8586
self.Self = tbl
8687
end
8788

89+
function META:SetNewMetaTable(val)
90+
if val and val.Type == "symbol" and val:IsTrue() then
91+
self.NewMetaTable = true
92+
else
93+
self.NewMetaTable = false
94+
end
95+
end
96+
8897
function META.Equal(
8998
a--[[#: TTable]],
9099
b--[[#: TBaseType]],
@@ -1099,6 +1108,7 @@ function META:Copy(map--[[#: Map<|any, any|> | nil]], copy_tables)
10991108
end
11001109

11011110
copy.Self2 = self.Self2
1111+
copy.NewMetaTable = self.NewMetaTable
11021112
copy.MetaTable = self.MetaTable --copy_val(self.MetaTable, map, copy_tables)
11031113
copy.Contract = self:GetContract() --copy_val(self.Contract, map, copy_tables)
11041114
copy:SetAnalyzerEnvironment(self:GetAnalyzerEnvironment())
@@ -1465,6 +1475,7 @@ function META.New()
14651475
Name = false,
14661476
Self = false,
14671477
Self2 = false,
1478+
NewMetaTable = false,
14681479
literal_data_cache = {},
14691480
Contracts = {},
14701481
TypeOverride = false,

test/tests/nattlua/analyzer/complex/self/base_parser.nlua

Lines changed: 0 additions & 1 deletion
This file was deleted.

test/tests/nattlua/analyzer/complex/self/base_type.nlua

Lines changed: 0 additions & 8 deletions
This file was deleted.

test/tests/nattlua/analyzer/complex/self/function.nlua

Lines changed: 0 additions & 4 deletions
This file was deleted.

test/tests/nattlua/analyzer/complex/self/json.nlua

Lines changed: 0 additions & 1 deletion
This file was deleted.

test/tests/nattlua/analyzer/complex/self/lexer.nlua

Lines changed: 0 additions & 1 deletion
This file was deleted.

test/tests/nattlua/analyzer/complex/self/nodes.nlua

Lines changed: 0 additions & 21 deletions
This file was deleted.

test/tests/nattlua/analyzer/complex/self/number.nlua

Lines changed: 0 additions & 6 deletions
This file was deleted.

test/tests/nattlua/analyzer/complex/self/range.nlua

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)