summaryrefslogtreecommitdiff
path: root/server-beta/src/core/hover
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2019-11-22 15:54:11 +0800
committer最萌小汐 <sumneko@hotmail.com>2019-11-22 15:54:11 +0800
commit4d6f36e241d2bbda3fa28fb32e60d534e87a7ece (patch)
treea43c57f8e44d7e4ab6f3658f54304f420f3d0023 /server-beta/src/core/hover
parentfbd1394858972c92439d927fa30dabcfd55dc705 (diff)
downloadlua-language-server-4d6f36e241d2bbda3fa28fb32e60d534e87a7ece.zip
更新 hover
Diffstat (limited to 'server-beta/src/core/hover')
-rw-r--r--server-beta/src/core/hover/init.lua12
-rw-r--r--server-beta/src/core/hover/label.lua17
-rw-r--r--server-beta/src/core/hover/name.lua38
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