summaryrefslogtreecommitdiff
path: root/script/plugins/astHelper.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script/plugins/astHelper.lua')
-rw-r--r--script/plugins/astHelper.lua97
1 files changed, 97 insertions, 0 deletions
diff --git a/script/plugins/astHelper.lua b/script/plugins/astHelper.lua
new file mode 100644
index 00000000..bfe2dd27
--- /dev/null
+++ b/script/plugins/astHelper.lua
@@ -0,0 +1,97 @@
+local luadoc = require 'parser.luadoc'
+local ssub = require 'core.substring'
+local guide = require 'parser.guide'
+local _M = {}
+
+function _M.buildComment(t, value, pos)
+ return {
+ type = 'comment.short',
+ start = pos,
+ finish = pos,
+ text = "-@" .. t .. " " .. value,
+ virtual = true
+ }
+end
+
+function _M.InsertDoc(ast, comm)
+ local comms = ast.state.comms or {}
+ comms[#comms+1] = comm
+ ast.state.comms = comms
+end
+
+--- give the local/global variable add doc.class
+---@param ast parser.object
+---@param source parser.object local/global variable
+---@param classname string
+---@param group table?
+function _M.addClassDoc(ast, source, classname, group)
+ return _M.addDoc(ast, source, "class", classname, group)
+end
+
+--- give the local/global variable a luadoc comment
+---@param ast parser.object
+---@param source parser.object local/global variable
+---@param key string
+---@param value string
+---@param group table?
+function _M.addDoc(ast, source, key, value, group)
+ if source.type ~= 'local' and not guide.isGlobal(source) then
+ return false
+ end
+ local comment = _M.buildComment(key, value, source.start - 1)
+ local doc = luadoc.buildAndBindDoc(ast, source, comment, group)
+ if group then
+ group[#group+1] = doc
+ end
+ return doc
+end
+
+---remove `ast` function node `index` arg, the variable will be the function local variable
+---@param source parser.object function node
+---@param index integer
+---@return parser.object?
+function _M.removeArg(source, index)
+ if source.type == 'function' or source.type == 'call' then
+ local arg = table.remove(source.args, index)
+ if not arg then
+ return nil
+ end
+ arg.parent = arg.parent.parent
+ return arg
+ end
+ return nil
+end
+
+---把特定函数当成构造函数,`index` 参数是self
+---@param classname string
+---@param source parser.object function node
+---@param index integer
+---@return boolean, parser.object?
+function _M.addClassDocAtParam(ast, classname, source, index)
+ local arg = _M.removeArg(source, index)
+ if arg then
+ return not not _M.addClassDoc(ast, arg, classname), arg
+ end
+ return false
+end
+
+---把函数参数绑定类型
+---@param ast parser.object
+---@param typename string
+---@param source parser.object
+function _M.addParamTypeDoc(ast, typename, source)
+ if not guide.isParam(source) then
+ return false
+ end
+ local paramname = guide.getKeyName(source)
+ if not paramname then
+ return false
+ end
+ local comment = _M.buildComment("param",
+ ('%s %s'):format(paramname, typename),
+ source.start - 1)
+
+ return luadoc.buildAndBindDoc(ast, source.parent.parent, comment)
+end
+
+return _M