Major restructure for finding documentation and function source. Fixes some issues
This commit is contained in:
parent
6bd797c75e
commit
346afd61c0
101
function.lua
101
function.lua
|
@ -112,51 +112,43 @@ local function get_line_index (str, line_nr)
|
||||||
return index
|
return index
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_function_paramlist_and_body (str, start_line, end_line)
|
local function get_function_paramlist_and_body (info)
|
||||||
-- Will attempt to find a string which refer to a function starting on
|
-- Will attempt to find a string which refer to the function. This will
|
||||||
-- line `start_line` and ending on line `end_line`.
|
-- possibly require opening a file.
|
||||||
|
|
||||||
assert(type(str) == 'string')
|
-- Error check
|
||||||
assert(type(start_line) == 'number')
|
assert(type(info) == 'table')
|
||||||
assert(type(end_line) == 'number')
|
|
||||||
|
|
||||||
local start_line_index = get_line_index(str, start_line)
|
if info.defined_how == 'C' then
|
||||||
local end_line_index = get_line_index(str, end_line + 1)
|
error('[pretty.function/internal]: Cannot find source-code for C functions.', 2)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- First find the string to search through.
|
||||||
|
local str = info.source
|
||||||
|
if info.defined_how == 'file' then
|
||||||
|
-- Read file
|
||||||
|
local file = io.open(info.short_src, 'r')
|
||||||
|
str = file:read '*all'
|
||||||
|
file:close()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Calculate indices of the lines the function should be defined at.
|
||||||
|
local start_line_index = get_line_index(str, info.linedefined)
|
||||||
|
local end_line_index = get_line_index(str, info.lastlinedefined + 1)
|
||||||
|
|
||||||
|
-- Now find the function parameters and the function body.
|
||||||
local function_params, function_body = str:sub(start_line_index, end_line_index):match('.*%f[%a_]function%f[^%a_]%s*[a-zA-Z0-9_.]*%s*(%([a-zA-Z0-9_,. \t]*%))[ \t]*(.+)[ \t]*end')
|
local function_params, function_body = str:sub(start_line_index, end_line_index):match('.*%f[%a_]function%f[^%a_]%s*[a-zA-Z0-9_.]*%s*(%([a-zA-Z0-9_,. \t]*%))[ \t]*(.+)[ \t]*end')
|
||||||
|
assert(type(function_params) == 'string' and type(function_body) == 'string')
|
||||||
function_body = function_body:match('^%s*(.-)%s*$')
|
function_body = function_body:match('^%s*(.-)%s*$')
|
||||||
assert(type(function_params) == 'string' and type(function_body) == 'string')
|
assert(type(function_params) == 'string' and type(function_body) == 'string')
|
||||||
|
-- And return them.
|
||||||
return function_params, function_body
|
return function_params, function_body
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_function_body_from_file (filename, start_line, end_line)
|
local function get_function_string (...)
|
||||||
assert(type(filename) == 'string')
|
return string.format('function %s %s end', get_function_paramlist_and_body(...))
|
||||||
assert(type(start_line) == 'number')
|
|
||||||
assert(type(end_line) == 'number')
|
|
||||||
|
|
||||||
local file = io.open(filename, 'r')
|
|
||||||
local str = file:read('*all')
|
|
||||||
file:close()
|
|
||||||
return select(2, get_function_paramlist_and_body(str, start_line, end_line))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_full_function_str (...)
|
|
||||||
local function_params, function_body = get_function_paramlist_and_body(...)
|
|
||||||
return 'function '..function_params..' '..function_body..' end'
|
|
||||||
end
|
|
||||||
|
|
||||||
local function get_function_str_from_file (filename, start_line, end_line)
|
|
||||||
assert(type(filename) == 'string')
|
|
||||||
assert(type(start_line) == 'number')
|
|
||||||
assert(type(end_line) == 'number')
|
|
||||||
|
|
||||||
local file = io.open(filename, 'r')
|
|
||||||
local str = file:read('*all')
|
|
||||||
file:close()
|
|
||||||
return get_full_function_str(str, start_line, end_line)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local function width_of_strings_in_l (l, start_i, end_i)
|
local function width_of_strings_in_l (l, start_i, end_i)
|
||||||
-- FIXME: Copy of the one in pretty.lua
|
-- FIXME: Copy of the one in pretty.lua
|
||||||
local width = 0
|
local width = 0
|
||||||
|
@ -167,7 +159,7 @@ local function width_of_strings_in_l (l, start_i, end_i)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function add_indent_to_string (str, indent)
|
local function add_indent_to_string (str, indent)
|
||||||
assert(type(str) == 'string')
|
assert(type(str) == 'string')
|
||||||
assert(type(indent) == 'string')
|
assert(type(indent) == 'string')
|
||||||
|
|
||||||
return indent .. str:gsub('\n', '\n'..indent)
|
return indent .. str:gsub('\n', '\n'..indent)
|
||||||
|
@ -210,12 +202,7 @@ local function format_function_with_closure (value, depth, l, format_value)
|
||||||
|
|
||||||
local info = get_function_info(value)
|
local info = get_function_info(value)
|
||||||
|
|
||||||
local function_str = nil
|
local function_str = get_function_string(info)
|
||||||
if (info.defined_how == 'string') then
|
|
||||||
function_str = get_full_function_str(info.source, info.linedefined, info.lastlinedefined)
|
|
||||||
else
|
|
||||||
function_str = get_function_str_from_file(info.short_src, info.linedefined, info.lastlinedefined)
|
|
||||||
end
|
|
||||||
|
|
||||||
if info.nups > 0 then l[#l+1] = '(function () ' end
|
if info.nups > 0 then l[#l+1] = '(function () ' end
|
||||||
-- Upvalues
|
-- Upvalues
|
||||||
|
@ -247,11 +234,7 @@ return function (value, depth, l, format_value)
|
||||||
|
|
||||||
if info.defined_how == 'string' and l.options.embed_loaded_funcs then
|
if info.defined_how == 'string' and l.options.embed_loaded_funcs then
|
||||||
-- Function was defined as a string.
|
-- Function was defined as a string.
|
||||||
function_params, function_body = get_function_paramlist_and_body(info.source, info.linedefined, info.lastlinedefined)
|
function_params, function_body = get_function_paramlist_and_body(info)
|
||||||
--elseif info.defined_how == 'file' then
|
|
||||||
--function_body = get_function_body_from_file(info.short_src, info.linedefined, info.lastlinedefined)
|
|
||||||
----print(function_body)
|
|
||||||
--function_body = function_body or '...'
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if info.builtin and l.options.short_builtins then
|
if info.builtin and l.options.short_builtins then
|
||||||
|
@ -297,7 +280,7 @@ return function (value, depth, l, format_value)
|
||||||
|
|
||||||
-- Doc
|
-- Doc
|
||||||
if not info.doc then
|
if not info.doc then
|
||||||
local function_body = get_function_body_from_file(info.short_src, info.linedefined, info.lastlinedefined)
|
local function_body = select(2, get_function_paramlist_and_body(info))
|
||||||
if function_body then
|
if function_body then
|
||||||
local documentation = get_docs_from_function_body(function_body)
|
local documentation = get_docs_from_function_body(function_body)
|
||||||
info.doc = documentation ~= '' and documentation
|
info.doc = documentation ~= '' and documentation
|
||||||
|
@ -312,9 +295,13 @@ return function (value, depth, l, format_value)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- source
|
-- source
|
||||||
if not info.builtin and not info.doc then
|
if info.doc then -- Do nothing
|
||||||
|
elseif info.defined_how == 'string' then
|
||||||
|
l[#l+1] = indent
|
||||||
|
l[#l+1] = '-- Loaded from string'
|
||||||
|
elseif not info.builtin then
|
||||||
l[#l+1] = indent
|
l[#l+1] = indent
|
||||||
l[#l+1] = ('-- source_file: \'%s\' '):format(info.short_src)
|
l[#l+1] = ('-- Source file: \'%s\' '):format(info.short_src)
|
||||||
if info.linedefined == info.lastlinedefined then
|
if info.linedefined == info.lastlinedefined then
|
||||||
l[#l+1] = ('[Line: %i]'):format(info.linedefined)
|
l[#l+1] = ('[Line: %i]'):format(info.linedefined)
|
||||||
else
|
else
|
||||||
|
@ -325,7 +312,7 @@ return function (value, depth, l, format_value)
|
||||||
-- upvalues
|
-- upvalues
|
||||||
if info.nups > 0 and (not info.builtin and not info.doc) then
|
if info.nups > 0 and (not info.builtin and not info.doc) then
|
||||||
l[#l+1] = indent
|
l[#l+1] = indent
|
||||||
l[#l+1] = '-- up_values: '
|
l[#l+1] = '-- Up values: '
|
||||||
format_value(info.ups, depth + 1, l)
|
format_value(info.ups, depth + 1, l)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -335,15 +322,17 @@ return function (value, depth, l, format_value)
|
||||||
|
|
||||||
-- Native
|
-- Native
|
||||||
l[#l+1] = indent
|
l[#l+1] = indent
|
||||||
l[#l+1] = '-- native_repr: '
|
l[#l+1] = '-- Native Representation: '
|
||||||
l[#l+1] = tostring(value)
|
l[#l+1] = tostring(value)
|
||||||
|
|
||||||
-- Function body
|
-- Function body
|
||||||
l[#l+1] = indent
|
if info.defined_how ~= 'C' then
|
||||||
l[#l+1] = '--[[ function_body:\n\t'
|
l[#l+1] = indent
|
||||||
l[#l+1] = add_indent_to_string(get_function_str_from_file(info.short_src, info.linedefined, info.lastlinedefined), l.options.indent)
|
l[#l+1] = '--[[ Function Body:\n\t'
|
||||||
l[#l+1] = indent
|
l[#l+1] = add_indent_to_string(get_function_string(info), l.options.indent)
|
||||||
l[#l+1] = '--]]'
|
l[#l+1] = indent
|
||||||
|
l[#l+1] = '--]]'
|
||||||
|
end
|
||||||
|
|
||||||
-- Full info
|
-- Full info
|
||||||
l[#l+1] = indent
|
l[#l+1] = indent
|
||||||
|
|
|
@ -96,7 +96,7 @@ local func_line = curline(3)
|
||||||
format_test {
|
format_test {
|
||||||
name = 'Singleline elaborate function',
|
name = 'Singleline elaborate function',
|
||||||
input = function () end,
|
input = function () end,
|
||||||
expect = 'function ()\n -- source_file: \'./test/test_function.lua\' [Line: '..func_line..']\n\n ...\nend',
|
expect = 'function ()\n -- Source file: \'./test/test_function.lua\' [Line: '..func_line..']\n\n ...\nend',
|
||||||
}
|
}
|
||||||
|
|
||||||
local func_line = curline(3)
|
local func_line = curline(3)
|
||||||
|
@ -104,7 +104,7 @@ format_test {
|
||||||
name = 'Multiline elaborate function',
|
name = 'Multiline elaborate function',
|
||||||
input = function ()
|
input = function ()
|
||||||
end,
|
end,
|
||||||
expect = 'function ()\n -- source_file: \'./test/test_function.lua\' [Lines: '..func_line..' - '..(func_line+1)..']\n\n ...\nend',
|
expect = 'function ()\n -- Source file: \'./test/test_function.lua\' [Lines: '..func_line..' - '..(func_line+1)..']\n\n ...\nend',
|
||||||
}
|
}
|
||||||
|
|
||||||
local func_line = curline(3) -- Must be exactly 3 lines above function
|
local func_line = curline(3) -- Must be exactly 3 lines above function
|
||||||
|
@ -112,7 +112,7 @@ format_test {
|
||||||
name = 'Elaborate function with upvalue included 1',
|
name = 'Elaborate function with upvalue included 1',
|
||||||
input = function () l = TEST_UPVALUE end,
|
input = function () l = TEST_UPVALUE end,
|
||||||
adv_getlocal = true,
|
adv_getlocal = true,
|
||||||
expect = 'function ()\n -- source_file: \'./test/test_function.lua\' [Line: '..func_line..']\n -- up_values: { TEST_UPVALUE = 42 }\n\n ...\nend'
|
expect = 'function ()\n -- Source file: \'./test/test_function.lua\' [Line: '..func_line..']\n -- Up values: { TEST_UPVALUE = 42 }\n\n ...\nend'
|
||||||
}
|
}
|
||||||
|
|
||||||
local func_line = curline(3) -- Must be exactly 3 lines above function
|
local func_line = curline(3) -- Must be exactly 3 lines above function
|
||||||
|
@ -120,7 +120,7 @@ format_test {
|
||||||
name = 'Elaborate function with upvalue included 2',
|
name = 'Elaborate function with upvalue included 2',
|
||||||
input = function () TEST_UPVALUE = true end,
|
input = function () TEST_UPVALUE = true end,
|
||||||
adv_getlocal = true,
|
adv_getlocal = true,
|
||||||
expect = 'function ()\n -- source_file: \'./test/test_function.lua\' [Line: '..func_line..']\n -- up_values: { TEST_UPVALUE = 42 }\n\n ...\nend'
|
expect = 'function ()\n -- Source file: \'./test/test_function.lua\' [Line: '..func_line..']\n -- Up values: { TEST_UPVALUE = 42 }\n\n ...\nend'
|
||||||
}
|
}
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
@ -186,6 +186,18 @@ format_test {
|
||||||
expect = 'function ()\n -- Hi\n\n ...\nend',
|
expect = 'function ()\n -- Hi\n\n ...\nend',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
format_test {
|
||||||
|
name = 'Can find docs from string-loaded function',
|
||||||
|
input = loadstring 'return function ()\n--Hello\nend' (),
|
||||||
|
expect = 'function ()\n -- Hello\n\n ...\nend',
|
||||||
|
}
|
||||||
|
|
||||||
|
format_test {
|
||||||
|
name = 'String-loaded functions without docs, won\'t display Source file comment',
|
||||||
|
input = loadstring 'return function () end' (),
|
||||||
|
expect = 'function ()\n -- Loaded from string\n\n ...\nend',
|
||||||
|
}
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
-- Builtins
|
-- Builtins
|
||||||
|
|
||||||
|
@ -294,6 +306,7 @@ format_test {
|
||||||
expect = 'function () function_body() end',
|
expect = 'function () function_body() end',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
-- Indent functions nicely
|
-- Indent functions nicely
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user