summaryrefslogtreecommitdiff
path: root/server/src/core/hover
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/core/hover')
-rw-r--r--server/src/core/hover/hover.lua6
-rw-r--r--server/src/core/hover/name.lua69
2 files changed, 12 insertions, 63 deletions
diff --git a/server/src/core/hover/hover.lua b/server/src/core/hover/hover.lua
index c7aba17e..f09bfce4 100644
--- a/server/src/core/hover/hover.lua
+++ b/server/src/core/hover/hover.lua
@@ -220,5 +220,11 @@ return function (source, lsp, select)
if source.type == 'name' and source:bindValue() then
return hoverAsValue(source, lsp, select)
end
+ if source.type == 'simple' then
+ source = source[#source]
+ if source.type == 'name' and source:bindValue() then
+ return hoverAsValue(source, lsp, select)
+ end
+ end
return nil
end
diff --git a/server/src/core/hover/name.lua b/server/src/core/hover/name.lua
index 52bcfef4..e5880884 100644
--- a/server/src/core/hover/name.lua
+++ b/server/src/core/hover/name.lua
@@ -1,4 +1,9 @@
+local getName = require 'core.name'
+
return function (source)
+ if not source then
+ return ''
+ end
local value = source:bindValue()
if not value then
return ''
@@ -22,67 +27,5 @@ return function (source)
return name or ''
end
- local key
- if declarat:get 'simple' then
- local simple = declarat:get 'simple'
- local chars = {}
- for i, obj in ipairs(simple) do
- if obj.type == 'name' then
- chars[i] = obj[1]
- elseif obj.type == 'index' then
- chars[i] = '[?]'
- elseif obj.type == 'call' then
- chars[i] = '(?)'
- elseif obj.type == ':' then
- chars[i] = ':'
- elseif obj.type == '.' then
- chars[i] = '.'
- else
- chars[i] = '*' .. obj.type
- end
- if obj == declarat then
- break
- end
- end
- key = table.concat(chars)
- elseif declarat.type == 'name' then
- key = declarat[1]
- elseif declarat.type == 'string' then
- key = ('%q'):format(declarat[1])
- elseif declarat.type == 'number' or declarat.type == 'boolean' then
- key = tostring(declarat[1])
- elseif declarat.type == 'simple' then
- local chars = {}
- for i, obj in ipairs(declarat) do
- if obj.type == 'name' then
- chars[i] = obj[1]
- elseif obj.type == 'index' then
- chars[i] = '[?]'
- elseif obj.type == 'call' then
- chars[i] = '(?)'
- elseif obj.type == ':' then
- chars[i] = ':'
- elseif obj.type == '.' then
- chars[i] = '.'
- else
- chars[i] = '*' .. obj.type
- end
- end
- -- 这里有个特殊处理
- -- function mt:func() 以 mt.func 的形式调用时
- -- hover 显示为 mt.func(self)
- if chars[#chars-1] == ':' then
- if not source:get 'object' then
- chars[#chars-1] = '.'
- end
- elseif chars[#chars-1] == '.' then
- if source:get 'object' then
- chars[#chars-1] = ':'
- end
- end
- key = table.concat(chars)
- else
- key = ''
- end
- return key
+ return getName(declarat, source)
end