summaryrefslogtreecommitdiff
path: root/script-beta
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2019-12-05 17:20:53 +0800
committer最萌小汐 <sumneko@hotmail.com>2019-12-05 17:20:53 +0800
commit51185264ab76b43571689dd717b3e685d4ff9c73 (patch)
tree1fe952e64d6bdef81f280eafdfbe3d27e022ca5c /script-beta
parent96e499f4c62d7e444c74a4afebfd02211f3f9c16 (diff)
downloadlua-language-server-51185264ab76b43571689dd717b3e685d4ff9c73.zip
更新hover
Diffstat (limited to 'script-beta')
-rw-r--r--script-beta/core/hover/init.lua3
-rw-r--r--script-beta/core/hover/label.lua17
-rw-r--r--script-beta/core/hover/table.lua67
-rw-r--r--script-beta/vm/getValue.lua47
4 files changed, 93 insertions, 41 deletions
diff --git a/script-beta/core/hover/init.lua b/script-beta/core/hover/init.lua
index ae4df936..fd8654e3 100644
--- a/script-beta/core/hover/init.lua
+++ b/script-beta/core/hover/init.lua
@@ -48,7 +48,8 @@ return function (uri, offset)
or source.type == 'setglobal'
or source.type == 'getglobal'
or source.type == 'field'
- or source.type == 'method' then
+ or source.type == 'method'
+ or source.type == 'string' then
return getHover(source)
end
end)
diff --git a/script-beta/core/hover/label.lua b/script-beta/core/hover/label.lua
index e9b987e1..799ad662 100644
--- a/script-beta/core/hover/label.lua
+++ b/script-beta/core/hover/label.lua
@@ -89,6 +89,21 @@ local function asLibrary(source)
end
end
+local function asString(source)
+ local str = source[1]
+ if type(str) ~= 'string' then
+ return ''
+ end
+ local len = #str
+ local charLen = utf8.len(str, 1, -1, true)
+ -- TODO 翻译
+ if len == charLen then
+ return ('%d 个字节'):format(len)
+ else
+ return ('%d 个字节,%d 个字符'):format(len, charLen)
+ end
+end
+
return function (source, caller)
if source.type == 'function' then
return asFunction(source, caller)
@@ -107,5 +122,7 @@ return function (source, caller)
or source.type == 'field'
or source.type == 'method' then
return asField(source)
+ elseif source.type == 'string' then
+ return asString(source)
end
end
diff --git a/script-beta/core/hover/table.lua b/script-beta/core/hover/table.lua
index 466d572b..f625d973 100644
--- a/script-beta/core/hover/table.lua
+++ b/script-beta/core/hover/table.lua
@@ -18,37 +18,54 @@ local function getField(info)
local class = getClass(info.source)
local literal = vm.getLiteral(info.source)
local key = getKey(info)
- local label
- if literal then
- label = ('%s: %s = %s'):format(key, class or type, util.viewLiteral(literal))
- else
- label = ('%s: %s'):format(key, class or type)
+ return key, class or type, literal
+end
+
+local function mergeLiteral(a, b)
+ if not a then
+ return b
+ end
+ local view = util.viewLiteral(a)
+ if not b then
+ return { view, [view] = true }
+ end
+ if b[view] then
+ return b
end
- return label, key
+ b[view] = true
+ b[#b+1] = view
+ return b
end
return function (source)
- local fields = {}
- local keys = {}
+ local literals = {}
+ local classes = {}
vm.eachField(source, function (info)
- local field, key = getField(info)
- fields[#fields+1] = field
- keys[field] = key
+ local key, class, literal = getField(info)
+ classes[key] = vm.mergeTypeViews(class, classes[key])
+ literals[key] = mergeLiteral(literal, literals[key])
end)
- local fieldsBuf
- if #fields == 0 then
- fieldsBuf = '{}'
- else
- table.sort(fields, function (a, b)
- return keys[a] < keys[b]
- end)
- local lines = {}
- lines[#lines+1] = '{'
- for _, field in ipairs(fields) do
- lines[#lines+1] = ' ' .. field .. ','
+ if not next(classes) then
+ return '{}'
+ end
+ local keys = {}
+ for k in pairs(classes) do
+ keys[#keys+1] = k
+ end
+ table.sort(keys)
+ local lines = {}
+ lines[#lines+1] = '{'
+ for _, key in ipairs(keys) do
+ local class = classes[key]
+ local literal = literals[key]
+ if literal then
+ table.sort(literal)
+ local view = table.concat(literal, '|')
+ lines[#lines+1] = (' %s: %s = %s,'):format(key, class, view)
+ else
+ lines[#lines+1] = (' %s: %s,'):format(key, class)
end
- lines[#lines+1] = '}'
- fieldsBuf = table.concat(lines, '\n')
end
- return fieldsBuf
+ lines[#lines+1] = '}'
+ return table.concat(lines, '\n')
end
diff --git a/script-beta/vm/getValue.lua b/script-beta/vm/getValue.lua
index 67954360..f4b1ff68 100644
--- a/script-beta/vm/getValue.lua
+++ b/script-beta/vm/getValue.lua
@@ -868,21 +868,7 @@ function vm.hasType(source, type)
return false
end
-function vm.viewType(values)
- if not values then
- return 'any'
- end
- if type(values) ~= 'table' then
- return values or 'any'
- end
- local types = {}
- for i = 1, #values do
- local tp = values[i].type
- if not types[tp] then
- types[tp] = true
- types[#types+1] = tp
- end
- end
+local function viewTypes(types)
if #types == 0 then
return 'any'
end
@@ -909,6 +895,37 @@ function vm.viewType(values)
return table.concat(types, '|')
end
+function vm.viewType(values)
+ if not values then
+ return 'any'
+ end
+ if type(values) ~= 'table' then
+ return values or 'any'
+ end
+ local types = {}
+ for i = 1, #values do
+ local tp = values[i].type
+ if not types[tp] and tp ~= 'any' then
+ types[tp] = true
+ types[#types+1] = tp
+ end
+ end
+ return viewTypes(types)
+end
+
+function vm.mergeTypeViews(...)
+ local types = {}
+ for _, view in ipairs {...} do
+ for tp in view:gmatch '[^|]+' do
+ if not types[tp] and tp ~= 'any' then
+ types[tp] = true
+ types[#types+1] = tp
+ end
+ end
+ end
+ return viewTypes(types)
+end
+
function vm.getType(source)
local values = vm.getValue(source)
return vm.viewType(values)