Use '<key>' and '<metatable> on keys correctly

This commit is contained in:
kikito 2014-09-12 15:36:38 +02:00
parent b9b780caad
commit 1fb5373a45
2 changed files with 29 additions and 10 deletions

View File

@ -138,13 +138,16 @@ end
local copySequence = function(s) local copySequence = function(s)
local copy, len = {}, #s local copy, len = {}, #s
for i=1, len do copy[i] = copy[i] end for i=1, len do copy[i] = s[i] end
return copy, len return copy, len
end end
local function makePath(path, key) local function makePath(path, ...)
local keys = {...}
local newPath, len = copySequence(path) local newPath, len = copySequence(path)
newPath[len + 1] = key for i=1, #keys do
newPath[len + i] = keys[i]
end
return newPath return newPath
end end
@ -157,7 +160,7 @@ local function processRecursive(process, item, path)
local processedKey local processedKey
for k,v in pairs(processed) do for k,v in pairs(processed) do
processedKey = processRecursive(process, k, makePath(path, '<key>')) processedKey = processRecursive(process, k, makePath(path, k, '<key>'))
if processedKey ~= nil then if processedKey ~= nil then
processedCopy[processedKey] = processRecursive(process, v, makePath(path, processedKey)) processedCopy[processedKey] = processRecursive(process, v, makePath(path, processedKey))
end end

View File

@ -249,14 +249,30 @@ describe( 'inspect', function()
assert.equals(inspect(dict, {process = removeA}), '{\n b = 2\n}') assert.equals(inspect(dict, {process = removeA}), '{\n b = 2\n}')
end) end)
it('marks key paths with <key>', function() it('marks key paths with <key> and metatables with <metatable>', function()
local names = {a = 1} local t = { [{a=1}] = setmetatable({b=2}, {c=3}) }
local paths = {}
local addPath = function(item, path) paths[#paths + 1] = path; return item end
inspect(names, {process = addPath}) local items = {}
local addItem = function(item, path)
items[#items + 1] = {item = item, path = path}
return item
end
inspect(t, {process = addItem})
assert.same(items, {
{item = t, path = {}},
{item = {a=1}, path = {{a=1}, '<key>'}},
{item = 'a', path = {{a=1}, '<key>', 'a', '<key>'}},
{item = 1, path = {{a=1}, '<key>', 'a'}},
{item = setmetatable({b=2}, {c=3}), path = {{a=1}}},
{item = 'b', path = {{a=1}, 'b', '<key>'}},
{item = 2, path = {{a=1}, 'b'}},
{item = {c=3}, path = {{a=1}, '<metatable>'}},
{item = 'c', path = {{a=1}, '<metatable>', 'c', '<key>'}},
{item = 3, path = {{a=1}, '<metatable>', 'c'}}
})
assert.same(paths, { {}, {'<key>'}, {'a'} })
end) end)
end) end)