Merge pull request #20570 from lewis6991/refactor/lua2dox

refactor: lua2dox
This commit is contained in:
Lewis Russell
2022-10-11 08:28:36 +01:00
committed by GitHub
2 changed files with 163 additions and 235 deletions

View File

@@ -50,108 +50,46 @@ However I have put in a hack that will insert the "missing" close paren.
The effect is that you will get the function documented, but not with the parameter list you might expect.
]]
local function class(BaseClass, ClassInitialiser)
local function class()
local newClass = {} -- a new class newClass
if not ClassInitialiser and type(BaseClass) == 'function' then
ClassInitialiser = BaseClass
BaseClass = nil
elseif type(BaseClass) == 'table' then
-- our new class is a shallow copy of the base class!
for i,v in pairs(BaseClass) do
newClass[i] = v
end
newClass._base = BaseClass
end
-- the class will be the metatable for all its newInstanceects,
-- and they will look up their methods in it.
newClass.__index = newClass
-- expose a constructor which can be called by <classname>(<args>)
local classMetatable = {}
classMetatable.__call = function(class_tbl, ...)
setmetatable(newClass, {
__call = function(class_tbl, ...)
local newInstance = {}
setmetatable(newInstance, newClass)
--if init then
-- init(newInstance,...)
if class_tbl.init then
class_tbl.init(newInstance, ...)
else
-- make sure that any stuff from the base class is initialized!
if BaseClass and BaseClass.init then
BaseClass.init(newInstance, ...)
end
end
return newInstance
end
newClass.init = ClassInitialiser
newClass.is_a = function(this, klass)
local thisMetatable = getmetatable(this)
while thisMetatable do
if thisMetatable == klass then
return true
end
thisMetatable = thisMetatable._base
end
return false
end
setmetatable(newClass, classMetatable)
})
return newClass
end
--! \class TCore_Clock
--! \brief a clock
local TCore_Clock = class()
--! \brief get the current time
function TCore_Clock.GetTimeNow()
local gettimeofday = os.gettimeofday -- luacheck: ignore 143 Accessing an undefined field of a global variable.
if gettimeofday then
return gettimeofday()
else
return os.time()
end
end
--! \brief constructor
function TCore_Clock.init(this,T0)
if T0 then
this.t0 = T0
else
this.t0 = TCore_Clock.GetTimeNow()
end
end
--! \brief get time string
function TCore_Clock.getTimeStamp(this,T0)
local t0
if T0 then
t0 = T0
else
t0 = this.t0
end
return os.date('%c %Z',t0)
end
--! \brief write to stdout
local function TCore_IO_write(Str)
if (Str) then
if Str then
io.write(Str)
end
end
--! \brief write to stdout
local function TCore_IO_writeln(Str)
if (Str) then
if Str then
io.write(Str)
end
io.write("\n")
io.write('\n')
end
--! \brief trims a string
local function string_trim(Str)
return Str:match("^%s*(.-)%s*$")
return Str:match('^%s*(.-)%s*$')
end
--! \brief split a string
@@ -162,11 +100,11 @@ end
---@return string[]
local function string_split(Str, Pattern)
local splitStr = {}
local fpat = "(.-)" .. Pattern
local fpat = '(.-)' .. Pattern
local last_end = 1
local str, e, cap = string.find(Str, fpat, 1)
while str do
if str ~= 1 or cap ~= "" then
if str ~= 1 or cap ~= '' then
table.insert(splitStr, cap)
end
last_end = e + 1
@@ -179,7 +117,6 @@ local function string_split(Str, Pattern)
return splitStr
end
--! \class TCore_Commandline
--! \brief reads/parses commandline
local TCore_Commandline = class()
@@ -213,7 +150,6 @@ function TStream_Read.getContents(this,Filename)
assert(Filename)
-- get lines from file
-- syphon lines to our table
--TCore_Debug_show_var('Filename',Filename)
local filecontents = {}
for line in io.lines(Filename) do
table.insert(filecontents, line)
@@ -371,7 +307,7 @@ local function checkComment4fn(Fn_magic,MagicLines)
return fn_magic
end
local types = {"number", "string", "table", "list", "boolean", "function"}
local types = { 'number', 'string', 'table', 'list', 'boolean', 'function' }
--! \brief run the filter
function TLua2DoX_filter.readfile(this, AppStamp, Filename)
@@ -379,7 +315,7 @@ function TLua2DoX_filter.readfile(this,AppStamp,Filename)
local outStream = TStream_Write()
this.outStream = outStream -- save to this obj
if (inStream:getContents(Filename)) then
if inStream:getContents(Filename) then
-- output the file
local line
local fn_magic -- function name/def from magic comment
@@ -395,8 +331,6 @@ function TLua2DoX_filter.readfile(this,AppStamp,Filename)
local l = 0
while not (inStream:eof()) do
line = string_trim(inStream:getLine())
-- TCore_Debug_show_var('inStream',inStream)
-- TCore_Debug_show_var('line',line )
l = l + 1
if string.sub(line, 1, 2) == '--' then -- it's a comment
-- Allow people to write style similar to EmmyLua (since they are basically the same)
@@ -414,22 +348,23 @@ function TLua2DoX_filter.readfile(this,AppStamp,Filename)
local magic_split = string_split(magic, ' ')
if magic_split[1] == 'param' then
for _, type in ipairs(types) do
magic = magic:gsub("^param%s+([a-zA-Z_?]+)%s+.*%((" .. type .. ")%)", "param %1 %2" )
magic = magic:gsub("^param%s+([a-zA-Z_?]+)%s+.*%((" .. type .. "|nil)%)", "param %1 %2" )
magic = magic:gsub('^param%s+([a-zA-Z_?]+)%s+.*%((' .. type .. ')%)', 'param %1 %2')
magic =
magic:gsub('^param%s+([a-zA-Z_?]+)%s+.*%((' .. type .. '|nil)%)', 'param %1 %2')
end
magic_split = string_split(magic, ' ')
elseif magic_split[1] == 'return' then
for _, type in ipairs(types) do
magic = magic:gsub("^return%s+.*%((" .. type .. ")%)", "return %1" )
magic = magic:gsub("^return%s+.*%((" .. type .. "|nil)%)", "return %1" )
magic = magic:gsub('^return%s+.*%((' .. type .. ')%)', 'return %1')
magic = magic:gsub('^return%s+.*%((' .. type .. '|nil)%)', 'return %1')
end
magic_split = string_split(magic, ' ')
end
if magic_split[1] == "generic" then
local generic_name, generic_type = line:match("@generic%s*(%w+)%s*:?%s*(.*)")
if generic_type == "" then
generic_type = "any"
if magic_split[1] == 'generic' then
local generic_name, generic_type = line:match('@generic%s*(%w+)%s*:?%s*(.*)')
if generic_type == '' then
generic_type = 'any'
end
generic[generic_name] = generic_type
else
@@ -440,9 +375,9 @@ function TLua2DoX_filter.readfile(this,AppStamp,Filename)
if magic_split[type_index] then
-- fix optional parameters
if magic_split[type_index] and magic_split[2]:find("%?$") then
if not magic_split[type_index]:find("nil") then
magic_split[type_index] = magic_split[type_index] .. "|nil"
if magic_split[type_index] and magic_split[2]:find('%?$') then
if not magic_split[type_index]:find('nil') then
magic_split[type_index] = magic_split[type_index] .. '|nil'
end
magic_split[2] = magic_split[2]:sub(1, -2)
end
@@ -454,8 +389,10 @@ function TLua2DoX_filter.readfile(this,AppStamp,Filename)
end
-- surround some types by ()
for _, type in ipairs(types) do
magic_split[type_index] = magic_split[type_index]:gsub("^(" .. type .. "|nil):?$", "(%1)")
magic_split[type_index] = magic_split[type_index]:gsub("^(" .. type .. "):?$", "(%1)")
magic_split[type_index] =
magic_split[type_index]:gsub('^(' .. type .. '|nil):?$', '(%1)')
magic_split[type_index] =
magic_split[type_index]:gsub('^(' .. type .. '):?$', '(%1)')
end
end
@@ -471,7 +408,7 @@ function TLua2DoX_filter.readfile(this,AppStamp,Filename)
line = string.sub(line, 5) -- nibble head
local comment = ''
local closeSquare, hitend, thisComment
while (not hitend) and (not inStream:eof()) do
while not hitend and (not inStream:eof()) do
closeSquare = string.find(line, ']]')
if not closeSquare then -- need to look on another line
thisComment = line .. '\n'
@@ -510,12 +447,6 @@ function TLua2DoX_filter.readfile(this,AppStamp,Filename)
-- ....v...
if pos_fn then
-- we've got a function
local fn_type
if string.find(line,'^local%s+') then
fn_type = ''--'static ' -- static functions seem to be excluded
else
fn_type = ''
end
local fn = TString_removeCommentFromLine(string_trim(string.sub(line, pos_fn + 8)))
if fn_magic then
fn = fn_magic
@@ -537,28 +468,31 @@ function TLua2DoX_filter.readfile(this,AppStamp,Filename)
end
-- Big hax
if string.find(fn, ":") then
if string.find(fn, ':') then
-- TODO: We need to add a first parameter of "SELF" here
-- local colon_place = string.find(fn, ":")
-- local name = string.sub(fn, 1, colon_place)
fn = fn:gsub(":", ".", 1)
outStream:writeln("/// @param self")
fn = fn:gsub(':', '.', 1)
outStream:writeln('/// @param self')
local paren_start = string.find(fn, "(", 1, true)
local paren_finish = string.find(fn, ")", 1, true)
local paren_start = string.find(fn, '(', 1, true)
local paren_finish = string.find(fn, ')', 1, true)
-- Nothing in between the parens
local comma
if paren_finish == paren_start + 1 then
comma = ""
comma = ''
else
comma = ", "
comma = ', '
end
fn = string.sub(fn, 1, paren_start) .. "self" .. comma .. string.sub(fn, paren_start + 1)
fn = string.sub(fn, 1, paren_start)
.. 'self'
.. comma
.. string.sub(fn, paren_start + 1)
end
-- add vanilla function
outStream:writeln(fn_type .. 'function ' .. fn .. '{}')
outStream:writeln('function ' .. fn .. '{}')
end
else
this:warning(inStream:getLineNo(), 'something weird here')
@@ -593,16 +527,14 @@ local TApp = class()
--! \brief constructor
function TApp.init(this)
local t0 = TCore_Clock()
this.timestamp = t0:getTimeStamp()
this.timestamp = os.date('%c %Z', os.time())
this.name = 'Lua2DoX'
this.version = '0.2 20130128'
this.copyright = 'Copyright (c) Simon Dales 2012-13'
end
function TApp.getRunStamp(this)
return this.name .. ' (' .. this.version .. ') '
.. this.timestamp
return this.name .. ' (' .. this.version .. ') ' .. this.timestamp
end
function TApp.getVersion(this)
@@ -642,5 +574,4 @@ else
filter:readfile(appStamp, filename)
end
--eof

View File

@@ -25,9 +25,8 @@ LANG=""
test_executable() {
P_EXE="$1"
#########
WHICH=`which ${P_EXE}`
if test -z "${WHICH}"
then
WHICH=$(which "$P_EXE")
if test -z "${WHICH}"; then
echo "not found \"${P_EXE}\""
else
EXE="${P_EXE}"
@@ -57,30 +56,28 @@ do_readlink(){
pushd . > /dev/null
TARGET_FILE=$1
cd `dirname $TARGET_FILE`
TARGET_FILE=`basename $TARGET_FILE`
cd "$(dirname $TARGET_FILE)"
TARGET_FILE=$(basename "$TARGET_FILE")
# Iterate down a (possible) chain of symlinks
while [ -L "$TARGET_FILE" ]
do
TARGET_FILE=`readlink $TARGET_FILE`
cd `dirname $TARGET_FILE`
TARGET_FILE=`basename $TARGET_FILE`
while [ -L "$TARGET_FILE" ]; do
TARGET_FILE=$(readlink "$TARGET_FILE")
cd $(dirname "$TARGET_FILE")
TARGET_FILE=$(basename "$TARGET_FILE")
done
PHYS_DIR=`pwd -P`
PHYS_DIR=$(pwd -P)
RESULT=$PHYS_DIR
popd > /dev/null
}
##main
set_lua
if test -z "${EXE}"
then
if test -z "${EXE}"; then
echo "no lua interpreter found"
exit 1
else
BASENAME=`basename "$0"`
BASENAME=$(basename "$0")
do_readlink "$0"
DIRNAME="${RESULT}"
@@ -89,5 +86,5 @@ else
${EXE} ${LUASCRIPT} $@
fi
#
##eof