summaryrefslogtreecommitdiff
path: root/script-beta/src/core/hover/label.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script-beta/src/core/hover/label.lua')
-rw-r--r--script-beta/src/core/hover/label.lua103
1 files changed, 103 insertions, 0 deletions
diff --git a/script-beta/src/core/hover/label.lua b/script-beta/src/core/hover/label.lua
new file mode 100644
index 00000000..72ce60f4
--- /dev/null
+++ b/script-beta/src/core/hover/label.lua
@@ -0,0 +1,103 @@
+local buildName = require 'core.hover.name'
+local buildArg = require 'core.hover.arg'
+local buildReturn = require 'core.hover.return'
+local buildTable = require 'core.hover.table'
+local vm = require 'vm'
+local util = require 'utility'
+
+local function asFunction(source)
+ local name = buildName(source)
+ local arg = buildArg(source)
+ local rtn = buildReturn(source)
+ local lines = {}
+ lines[1] = ('function %s(%s)'):format(name, arg)
+ lines[2] = rtn
+ return table.concat(lines, '\n')
+end
+
+local function asLocal(source)
+ local name = buildName(source)
+ local type = vm.getType(source)
+ local literal = vm.getLiteral(source)
+ if type == 'table' then
+ type = buildTable(source)
+ end
+ if literal == nil then
+ return ('local %s: %s'):format(name, type)
+ else
+ return ('local %s: %s = %s'):format(name, type, util.viewLiteral(literal))
+ end
+end
+
+local function asGlobal(source)
+ local name = buildName(source)
+ local type = vm.getType(source)
+ local literal = vm.getLiteral(source)
+ if type == 'table' then
+ type = buildTable(source)
+ end
+ if literal == nil then
+ return ('global %s: %s'):format(name, type)
+ else
+ return ('global %s: %s = %s'):format(name, type, util.viewLiteral(literal))
+ end
+end
+
+local function isGlobalField(source)
+ if source.type == 'field'
+ or source.type == 'method' then
+ source = source.parent
+ end
+ if source.type == 'setfield'
+ or source.type == 'getfield'
+ or source.type == 'setmethod'
+ or source.type == 'getmethod'
+ or source.type == 'tablefield' then
+ local node = source.node
+ if node.type == 'setglobal'
+ or node.type == 'getglobal' then
+ return true
+ end
+ return isGlobalField(node)
+ else
+ return false
+ end
+end
+
+local function asField(source)
+ if isGlobalField(source) then
+ return asGlobal(source)
+ end
+ local name = buildName(source)
+ local type = vm.getType(source)
+ local literal = vm.getLiteral(source)
+ if type == 'table' then
+ type = buildTable(source)
+ end
+ if literal == nil then
+ return ('field %s: %s'):format(name, type)
+ else
+ return ('field %s: %s = %s'):format(name, type, util.viewLiteral(literal))
+ end
+end
+
+return function (source)
+ if source.type == 'function' then
+ return asFunction(source)
+ elseif source.type == 'local'
+ or source.type == 'getlocal'
+ or source.type == 'setlocal' then
+ return asLocal(source)
+ elseif source.type == 'setglobal'
+ or source.type == 'getglobal' then
+ return asGlobal(source)
+ elseif source.type == 'getfield'
+ or source.type == 'setfield'
+ or source.type == 'getmethod'
+ or source.type == 'setmethod'
+ or source.type == 'tablefield'
+ or source.type == 'field'
+ or source.type == 'method' then
+ return asField(source)
+ end
+end