diff options
author | 最萌小汐 <sumneko@hotmail.com> | 2020-11-20 21:57:09 +0800 |
---|---|---|
committer | 最萌小汐 <sumneko@hotmail.com> | 2020-11-20 21:57:09 +0800 |
commit | 4ca61ec457822dd14966afa0752340ae8ce180a1 (patch) | |
tree | ae8adb1ad82c717868e551e699fd3cf3bb290089 /script/config.lua | |
parent | c63b2e404d8d2bb984afe3678a5ba2b2836380cc (diff) | |
download | lua-language-server-4ca61ec457822dd14966afa0752340ae8ce180a1.zip |
no longer beta
Diffstat (limited to 'script/config.lua')
-rw-r--r-- | script/config.lua | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/script/config.lua b/script/config.lua new file mode 100644 index 00000000..0544c317 --- /dev/null +++ b/script/config.lua @@ -0,0 +1,218 @@ +local util = require 'utility' +local define = require 'proto.define' + +local m = {} +m.version = 0 + +local function Boolean(v) + if type(v) == 'boolean' then + return true, v + end + return false +end + +local function Integer(v) + if type(v) == 'number' then + return true, math.floor(v) + end + return false +end + +local function String(v) + return true, tostring(v) +end + +local function Str2Hash(sep) + return function (v) + if type(v) == 'string' then + local t = {} + for s in v:gmatch('[^'..sep..']+') do + t[s] = true + end + return true, t + end + if type(v) == 'table' then + local t = {} + for _, s in ipairs(v) do + if type(s) == 'string' then + t[s] = true + end + end + return true, t + end + return false + end +end + +local function Array(checker) + return function (tbl) + if type(tbl) ~= 'table' then + return false + end + local t = {} + for _, v in ipairs(tbl) do + local ok, result = checker(v) + if ok then + t[#t+1] = result + end + end + return true, t + end +end + +local function Hash(keyChecker, valueChecker) + return function (tbl) + if type(tbl) ~= 'table' then + return false + end + local t = {} + for k, v in pairs(tbl) do + local ok1, key = keyChecker(k) + local ok2, value = valueChecker(v) + if ok1 and ok2 then + t[key] = value + end + end + if not next(t) then + return false + end + return true, t + end +end + +local function Or(...) + local checkers = {...} + return function (obj) + for _, checker in ipairs(checkers) do + local suc, res = checker(obj) + if suc then + return true, res + end + end + return false + end +end + +local ConfigTemplate = { + runtime = { + version = {'Lua 5.4', String}, + library = {{}, Str2Hash ';'}, + path = {{ + "?.lua", + "?/init.lua", + "?/?.lua" + }, Array(String)}, + special = {{}, Hash(String, String)}, + meta = {'${version} ${language}', String}, + }, + diagnostics = { + enable = {true, Boolean}, + globals = {{}, Str2Hash ';'}, + disable = {{}, Str2Hash ';'}, + severity = { + util.deepCopy(define.DiagnosticDefaultSeverity), + Hash(String, String), + }, + workspaceDelay = {0, Integer}, + workspaceRate = {100, Integer}, + }, + workspace = { + ignoreDir = {{}, Str2Hash ';'}, + ignoreSubmodules= {true, Boolean}, + useGitIgnore = {true, Boolean}, + maxPreload = {1000, Integer}, + preloadFileSize = {100, Integer}, + library = {{}, Hash( + String, + Or(Boolean, Array(String)) + )} + }, + completion = { + enable = {true, Boolean}, + callSnippet = {'Disable', String}, + keywordSnippet = {'Replace', String}, + displayContext = {6, Integer}, + }, + signatureHelp = { + enable = {true, Boolean}, + }, + hover = { + enable = {true, Boolean}, + viewString = {true, Boolean}, + viewStringMax = {1000, Integer}, + viewNumber = {true, Boolean}, + fieldInfer = {3000, Integer}, + }, + color = { + mode = {'Semantic', String}, + }, + luadoc = { + enable = {true, Boolean}, + }, + plugin = { + enable = {false, Boolean}, + path = {'.vscode/lua-plugin/*.lua', String}, + }, + intelliSense = { + searchDepth = {0, Integer}, + fastGlobal = {true, Boolean}, + }, +} + +local OtherTemplate = { + associations = {{}, Hash(String, String)}, + exclude = {{}, Hash(String, Boolean)}, +} + +local function init() + if m.config then + return + end + + m.config = {} + for c, t in pairs(ConfigTemplate) do + m.config[c] = {} + for k, info in pairs(t) do + m.config[c][k] = info[1] + end + end + + m.other = {} + for k, info in pairs(OtherTemplate) do + m.other[k] = info[1] + end +end + +function m.setConfig(config, other) + m.version = m.version + 1 + xpcall(function () + for c, t in pairs(config) do + for k, v in pairs(t) do + local region = ConfigTemplate[c] + if region then + local info = region[k] + local suc, v = info[2](v) + if suc then + m.config[c][k] = v + else + m.config[c][k] = info[1] + end + end + end + end + for k, v in pairs(other) do + local info = OtherTemplate[k] + local suc, v = info[2](v) + if suc then + m.other[k] = v + else + m.other[k] = info[1] + end + end + log.debug('Config update: ', util.dump(m.config), util.dump(m.other)) + end, log.error) +end + +init() + +return m |