summaryrefslogtreecommitdiff
path: root/server/src/core/hover_function.lua
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/core/hover_function.lua')
-rw-r--r--server/src/core/hover_function.lua71
1 files changed, 71 insertions, 0 deletions
diff --git a/server/src/core/hover_function.lua b/server/src/core/hover_function.lua
new file mode 100644
index 00000000..08581a3e
--- /dev/null
+++ b/server/src/core/hover_function.lua
@@ -0,0 +1,71 @@
+local function buildValueArgs(func, source, select)
+ local names = {}
+ local values = {}
+ if func.args then
+ for i, arg in ipairs(func.args) do
+ names[i] = arg.key
+ end
+ end
+ if func.argValues then
+ for i, value in ipairs(func.argValues) do
+ values[i] = value.type
+ end
+ end
+ local strs = {}
+ local argLabel
+ local start = 1
+ if source.object then
+ start = 2
+ if select then
+ select = select + 1
+ end
+ end
+ local max
+ if func.built then
+ max = #names
+ else
+ max = math.max(#names, #values)
+ end
+ for i = start, max do
+ local name = names[i]
+ local value = values[i] or 'any'
+ if name then
+ strs[#strs+1] = name .. ': ' .. value
+ else
+ strs[#strs+1] = value
+ end
+ if i == select then
+ argLabel = strs[#strs]
+ end
+ end
+ if func.hasDots then
+ strs[#strs+1] = '...'
+ end
+ return table.concat(strs, ', '), argLabel
+end
+
+local function buildValueReturns(func)
+ if not func.hasReturn then
+ return ''
+ end
+ local strs = {}
+ if func.returns then
+ for i, rtn in ipairs(func.returns) do
+ strs[i] = rtn.type
+ end
+ end
+ if #strs == 0 then
+ strs[1] = 'any'
+ end
+ return '\n -> ' .. table.concat(strs, ', ')
+end
+
+return function (name, func, source, select)
+ local args, argLabel = buildValueArgs(func, source, select)
+ local returns = buildValueReturns(func)
+ local title = ('function %s(%s)%s'):format(name, args, returns)
+ return {
+ label = title,
+ argLabel = argLabel,
+ }
+end