diff options
author | 最萌小汐 <sumneko@hotmail.com> | 2019-11-28 20:05:10 +0800 |
---|---|---|
committer | 最萌小汐 <sumneko@hotmail.com> | 2019-11-28 20:05:10 +0800 |
commit | 1038520109da932c2e648da6ffa9bf25d36944b8 (patch) | |
tree | 697c69fce6f50825f8c13d9cdbad8b8f5726c6e3 /script-beta | |
parent | 37bc70744d6642b964ba513bab99b8f0091483f7 (diff) | |
download | lua-language-server-1038520109da932c2e648da6ffa9bf25d36944b8.zip |
支持class
Diffstat (limited to 'script-beta')
-rw-r--r-- | script-beta/core/hover/class.lua | 27 | ||||
-rw-r--r-- | script-beta/core/hover/label.lua | 51 | ||||
-rw-r--r-- | script-beta/core/hover/name.lua | 33 |
3 files changed, 53 insertions, 58 deletions
diff --git a/script-beta/core/hover/class.lua b/script-beta/core/hover/class.lua new file mode 100644 index 00000000..6d28ee8a --- /dev/null +++ b/script-beta/core/hover/class.lua @@ -0,0 +1,27 @@ +local vm = require 'vm' + +local function getClass(source, deep) + if deep > 3 then + return nil + end + local class = vm.eachField(source, function (info) + if info.key == 's|type' or info.key == 's|__name' or info.key == 's|name' then + if info.value and info.value.type == 'string' then + return info.value[1] + end + end + end) + if class then + return class + end + return vm.eachMeta(source, function (meta) + local cl = getClass(meta, deep + 1) + if cl then + return cl + end + end) +end + +return function (source) + return getClass(source, 1) +end diff --git a/script-beta/core/hover/label.lua b/script-beta/core/hover/label.lua index 774ca231..765b01c2 100644 --- a/script-beta/core/hover/label.lua +++ b/script-beta/core/hover/label.lua @@ -2,6 +2,7 @@ local buildName = require 'core.hover.name' local buildArg = require 'core.hover.arg' local buildReturn = require 'core.hover.return' local buildTable = require 'core.hover.table' +local getClass = require 'core.hover.class' local vm = require 'vm' local util = require 'utility' @@ -15,32 +16,36 @@ local function asFunction(source) return table.concat(lines, '\n') end -local function asLocal(source) +local function asValue(source, title) local name = buildName(source) + local class = getClass(source) local type = vm.getType(source) local literal = vm.getLiteral(source) + local cont if type == 'table' then - type = buildTable(source) + cont = buildTable(source) + type = nil end - if literal == nil then - return ('local %s: %s'):format(name, type) - else - return ('local %s: %s = %s'):format(name, type, util.viewLiteral(literal)) + local pack = {} + pack[#pack+1] = title + pack[#pack+1] = name .. ':' + pack[#pack+1] = class or type + if literal then + pack[#pack+1] = '=' + pack[#pack+1] = util.viewLiteral(literal) + end + if cont then + pack[#pack+1] = cont end + return table.concat(pack, ' ') +end + +local function asLocal(source) + return asValue(source, 'local') end local function asGlobal(source) - local name = buildName(source) - local type = vm.getType(source) - local literal = vm.getLiteral(source) - if type == 'table' then - type = buildTable(source) - end - if literal == nil then - return ('global %s: %s'):format(name, type) - else - return ('global %s: %s = %s'):format(name, type, util.viewLiteral(literal)) - end + return asValue(source, 'global') end local function isGlobalField(source) @@ -74,17 +79,7 @@ local function asField(source) if isGlobalField(source) then return asGlobal(source) end - local name = buildName(source) - local type = vm.getType(source) - local literal = vm.getLiteral(source) - if type == 'table' then - type = buildTable(source) - end - if literal == nil then - return ('field %s: %s'):format(name, type) - else - return ('field %s: %s = %s'):format(name, type, util.viewLiteral(literal)) - end + return asValue(source, 'field') end return function (source) diff --git a/script-beta/core/hover/name.lua b/script-beta/core/hover/name.lua index 7fe5b194..0d5f65ad 100644 --- a/script-beta/core/hover/name.lua +++ b/script-beta/core/hover/name.lua @@ -1,35 +1,8 @@ -local guide = require 'parser.guide' -local vm = require 'vm' - -local function getClass(source, deep) - if deep and deep > 3 then - return nil - end - local class = vm.eachField(source, function (info) - if info.key == 's|type' or info.key == 's|__name' or info.key == 's|name' then - if info.value and info.value.type == 'string' then - return info.value[1] - end - end - end) - if class then - return class - end - return vm.eachMeta(source, function (meta) - local cl = getClass(meta, deep and (deep + 1) or 1) - if cl then - return cl - end - end) -end +local guide = require 'parser.guide' +local getClass = require 'core.hover.class' local function asLocal(source) - local class = getClass(source) - if class then - return ('%s: %s'):format(guide.getName(source), class) - else - return guide.getName(source) - end + return guide.getName(source) end local function asMethod(source) |