summaryrefslogtreecommitdiff
path: root/script/plugins/astHelper.lua
blob: bfe2dd27bf674cdeec8c7378ab4a9f1aff47965d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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