diff options
author | 最萌小汐 <sumneko@hotmail.com> | 2018-12-13 20:50:03 +0800 |
---|---|---|
committer | 最萌小汐 <sumneko@hotmail.com> | 2018-12-13 20:50:03 +0800 |
commit | 6a5cdaaf251a61cac95c7959c5a6218daaeaa12c (patch) | |
tree | e8c4aa1c791de3d66b3147ebfa5f39556a7532f6 | |
parent | feba963bee80199f155d7312d1416c02080f07f0 (diff) | |
download | lua-language-server-6a5cdaaf251a61cac95c7959c5a6218daaeaa12c.zip |
合并hover的实现
-rw-r--r-- | server/libs/lua53/basic.lni | 1 | ||||
-rw-r--r-- | server/src/matcher/hover.lua | 129 | ||||
-rw-r--r-- | server/test/hover/init.lua | 18 |
3 files changed, 76 insertions, 72 deletions
diff --git a/server/libs/lua53/basic.lni b/server/libs/lua53/basic.lni index aae7a895..44e41379 100644 --- a/server/libs/lua53/basic.lni +++ b/server/libs/lua53/basic.lni @@ -257,5 +257,6 @@ type = 'table' [_VERSION] type = 'string' +value = 'Lua5.3' [xpcall] diff --git a/server/src/matcher/hover.lua b/server/src/matcher/hover.lua index ae2d8622..ba2fbc56 100644 --- a/server/src/matcher/hover.lua +++ b/server/src/matcher/hover.lua @@ -1,10 +1,20 @@ local findResult = require 'matcher.find_result' local findLib = require 'matcher.find_lib' -local Cache = {} -local OoCache = {} +local OriginTypes = { + ['any'] = true, + ['nil'] = true, + ['integer'] = true, + ['number'] = true, + ['boolean'] = true, + ['string'] = true, + ['thread'] = true, + ['userdata'] = true, + ['table'] = true, + ['function'] = true, +} -local function buildArgs(lib, oo) +local function buildLibArgs(lib, oo) if not lib.args then return '' end @@ -46,7 +56,7 @@ local function buildArgs(lib, oo) return table.concat(strs) end -local function buildReturns(lib) +local function buildLibReturns(lib) if not lib.returns then return '' end @@ -119,21 +129,6 @@ local function buildEnum(lib) return table.concat(strs) end -local function buildFunctionHover(lib, fullKey, oo) - local title = ('function %s(%s)%s'):format(fullKey, buildArgs(lib, oo), buildReturns(lib)) - local enum = buildEnum(lib) - local tip = lib.description or '' - return ([[ -```lua -%s -``` -%s -```lua -%s -``` -]]):format(title, tip, enum) -end - local function buildField(lib) if not lib.fields then return '' @@ -160,24 +155,6 @@ local function buildTableHover(lib, fullKey) ]]):format(title, tip, field) end -local function getLibHover(lib, fullKey, oo) - local cache = oo and OoCache or Cache - - if not cache[lib] then - if lib.type == 'function' then - cache[lib] = buildFunctionHover(lib, fullKey, oo) or '' - elseif lib.type == 'table' then - cache[lib] = buildTableHover(lib, fullKey) or '' - elseif lib.type == 'string' then - cache[lib] = lib.description or '' - else - cache[lib] = '*' .. lib.type - end - end - - return cache[lib] -end - local function buildValueName(result, source) local func = result.value local declarat = func.declarat or source @@ -258,16 +235,30 @@ local function buildValueReturns(result) return '\n -> ' .. table.concat(strs, ', ') end -local function buildValueFunctionHover(result, source) - local name = buildValueName(result, source) - local args = buildValueArgs(result, source) - local returns = buildValueReturns(result) +local function getFunctionHover(name, result, source, lib, oo) + local args = '' + local returns + local enum = '' + local tip = '' + if lib then + args = buildLibArgs(lib, oo) + returns = buildLibReturns(lib) + enum = buildEnum(lib) + tip = lib.description or '' + else + args = buildValueArgs(result, source) + returns = buildValueReturns(result) + end local title = ('function %s(%s)%s'):format(name, args, returns) return ([[ ```lua %s ``` -]]):format(title) +%s +```lua +%s +``` +]]):format(title, tip, enum) end local function findClass(result) @@ -280,7 +271,7 @@ local function findClass(result) local name = metatable.child['__name'] -- 值必须是字符串 if name and name.value and type(name.value.value) == 'string' then - return '*' .. name.value.value + return name.value.value end -- 查找meta表 __index 里的字段 local index = metatable.child['__index'] @@ -305,7 +296,7 @@ local function findClass(result) hasSet = true end end - return '*' .. field.value.value + return field.value.value end ::CONTINUE:: end @@ -313,29 +304,40 @@ local function findClass(result) return nil end -local function buildValueSimpleHover(result, source) - local valueType = result.value.type +local function getValueHover(name, valueType, result, source, lib) if valueType == 'nil' then valueType = 'any' end - local class = findClass(result) - if class then - valueType = class + if not lib then + local class = findClass(result) + if class then + valueType = class + end + end + + if not OriginTypes[valueType] then + valueType = '*' .. valueType + end + + local value + if lib then + value = lib.value + else + value = result.value.value + end + + local text + if value == nil then + text = ('%s %s'):format(valueType, name) + else + text = ('%s %s = %s'):format(valueType, name, value) end return ([[ ```lua %s ``` -]]):format(valueType) -end - -local function getValueHover(result, source) - if result.value.type == 'function' then - return buildValueFunctionHover(result, source) - else - return buildValueSimpleHover(result, source) - end +]]):format(text) end return function (vm, pos) @@ -349,10 +351,11 @@ return function (vm, pos) end local lib, fullKey, oo = findLib(result) - if lib then - local hover = getLibHover(lib, fullKey, oo) - return hover + local valueType = lib and lib.type or result.value.type + local name = fullKey or buildValueName(result, source) + if valueType == 'function' then + return getFunctionHover(name, result, source, lib, oo) + else + return getValueHover(name, valueType, result, source, lib) end - - return getValueHover(result, source) end diff --git a/server/test/hover/init.lua b/server/test/hover/init.lua index e4c7b65b..6e81a684 100644 --- a/server/test/hover/init.lua +++ b/server/test/hover/init.lua @@ -84,24 +84,24 @@ obj.<?xxx?>() TEST [[ local <?x?> = 1 ]] -"number" +"number x = 1" TEST [[ <?x?> = 1 ]] -"number" +"number x = 1" TEST [[ local t = {} t.<?x?> = 1 ]] -"number" +"number t.x = 1" TEST [[ t = {} t.<?x?> = 1 ]] -"number" +"number t.x = 1" TEST [[ local mt = {} @@ -109,7 +109,7 @@ mt.__name = 'class' local <?obj?> = setmetatable({}, mt) ]] -"*class" +"*class obj" TEST [[ local mt = {} @@ -118,7 +118,7 @@ mt.__index = mt local <?obj?> = setmetatable({}, mt) ]] -"*class" +"*class obj" TEST [[ local mt = {} @@ -127,7 +127,7 @@ mt.__index = mt local <?obj?> = setmetatable({}, mt) ]] -"*class" +"*class obj" TEST [[ local mt = {} @@ -136,10 +136,10 @@ mt.__index = mt local <?obj?> = setmetatable({}, mt) ]] -"*class" +"*class obj" TEST[[ local fs = require 'bee.filesystem' local <?root?> = fs.current_path() ]] -"*bee::filesystem" +"*bee::filesystem root" |