added __tostring comment at the beginning, if possible

eLua
Enrique García Cota 14 years ago
parent 395b02ecbe
commit f46ce9b86b
  1. 22
      inspect.lua
  2. 29
      spec/inspect_spec.lua

@ -24,7 +24,8 @@ local controlCharsTranslation = {
local function unescapeChar(c) return controlCharsTranslation[c] end
local function unescape(str)
return string.gsub( str, "(%c)", unescapeChar )
local result, _ = string.gsub( str, "(%c)", unescapeChar )
return result
end
local function isIdentifier(str)
@ -101,10 +102,20 @@ function Inspector:putTable(t)
if self.level >= self.depth then
self:puts('{...}')
else
local length = #t
local comma = false
self:puts('{')
self:down()
local length = #t
local mt = getmetatable(t)
local __tostring = type(mt) == 'table' and mt.__tostring
local string = type(__tostring) == 'function' and __tostring(t)
if type(string) == 'string' and #string > 0 then
self:puts(' -- ', unescape(string))
if length >= 1 then self:tabify() end -- tabify the array values
end
local comma = false
for i=1, length do
comma = self:putComma(comma)
self:puts(' '):putValue(t[i])
@ -117,14 +128,13 @@ function Inspector:putTable(t)
self:tabify():putKey(k):puts(' = '):putValue(t[k])
end
local mt = getmetatable(t)
if type(mt) == 'table' then
if mt then
comma = self:putComma(comma)
self:tabify():puts('<metatable> = '):putValue(mt)
end
self:up()
if #dictKeys > 0 then -- dictionary table. Justify closing }
if #dictKeys > 0 or mt then -- dictionary table. Justify closing }
self:tabify()
elseif length > 0 then -- array tables have one extra space before closing }
self:puts(' ')

@ -147,16 +147,33 @@ context( 'inspect', function()
end)
test('Should include the metatable as an extra hash attribute', function()
local foo = { foo = 1, __tostring = function(k) return 'foo' end }
local bar = setmetatable({a = 1}, foo)
assert_equal(inspect(bar), [[{
context('metatables', function()
test('Should include the metatable as an extra hash attribute', function()
local foo = { foo = 1, __mode = 'v' }
local bar = setmetatable({a = 1}, foo)
assert_equal(inspect(bar), [[{
a = 1,
<metatable> = {
__mode = "v",
foo = 1
}
}]])
end)
test('Should include the __tostring metamethod if it exists', function()
local foo = { foo = 1, __tostring = function() return 'hello\nworld' end }
local bar = setmetatable({a = 1}, foo)
assert_equal(inspect(bar), [[{ -- hello\nworld
a = 1,
<metatable> = {
__tostring = <function>
foo = 1,
__tostring = <function>,
foo = 1
}
}]])
end)
end)

Loading…
Cancel
Save