diff options
Diffstat (limited to 'server-beta/src/core/hover')
-rw-r--r-- | server-beta/src/core/hover/init.lua | 12 | ||||
-rw-r--r-- | server-beta/src/core/hover/label.lua | 17 | ||||
-rw-r--r-- | server-beta/src/core/hover/name.lua | 38 |
3 files changed, 55 insertions, 12 deletions
diff --git a/server-beta/src/core/hover/init.lua b/server-beta/src/core/hover/init.lua index 9de5f4da..b99c14b2 100644 --- a/server-beta/src/core/hover/init.lua +++ b/server-beta/src/core/hover/init.lua @@ -4,8 +4,6 @@ local vm = require 'vm' local getLabel = require 'core.hover.label' local function getHoverAsFunction(source) - local uri = guide.getRoot(source).uri - local text = files.getText(uri) local values = vm.getValue(source) local labels = {} for _, value in ipairs(values) do @@ -21,10 +19,20 @@ local function getHoverAsFunction(source) } end +local function getHoverAsValue(source) + local label = getLabel(source) + return { + label = label, + source = source, + } +end + local function getHover(source) local isFunction = vm.hasType(source, 'function') if isFunction then return getHoverAsFunction(source) + else + return getHoverAsValue(source) end end diff --git a/server-beta/src/core/hover/label.lua b/server-beta/src/core/hover/label.lua index da8a0c84..759938d2 100644 --- a/server-beta/src/core/hover/label.lua +++ b/server-beta/src/core/hover/label.lua @@ -1,6 +1,8 @@ local buildName = require 'core.hover.name' local buildArg = require 'core.hover.arg' local buildReturn = require 'core.hover.return' +local vm = require 'vm' +local util = require 'utility' local function asFunction(source) local name = buildName(source) @@ -12,8 +14,23 @@ local function asFunction(source) 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 literal == nil then + return ('local %s: %s'):format(name, type) + else + return ('local %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) end end diff --git a/server-beta/src/core/hover/name.lua b/server-beta/src/core/hover/name.lua index ef7fee02..9eb066fc 100644 --- a/server-beta/src/core/hover/name.lua +++ b/server-beta/src/core/hover/name.lua @@ -18,18 +18,36 @@ local function asMethod(source) return ('%s:%s'):format(node, method) end -return function (source) - local parent = source.parent - if not parent then - return '' +local function asField(source) + local class = vm.eachField(source.node, function (info) + if info.key == 's|type' or info.key == 's|__name' then + if info.value and info.value.type == 'string' then + return info.value[1] + end + end + end) + local node = class or guide.getName(source.node) or '*' + local method = guide.getName(source) + return ('%s.%s'):format(node, method) +end + +local function buildName(source) + if source.type == 'local' + or source.type == 'getlocal' + or source.type == 'setlocal' then + return asLocal(source) or '' end - if parent.type == 'local' - or parent.type == 'getlocal' - or parent.type == 'setlocal' then - return asLocal(parent) or '' + if source.type == 'setmethod' then + return asMethod(source) or '' end - if parent.type == 'setmethod' then - return asMethod(parent) or '' + if source.type == 'setfield' then + return asField(source) or '' + end + local parent = source.parent + if parent then + return buildName(parent) end return '' end + +return buildName |