diff options
Diffstat (limited to 'script/core')
-rw-r--r-- | script/core/semantic-tokens.lua | 528 |
1 files changed, 269 insertions, 259 deletions
diff --git a/script/core/semantic-tokens.lua b/script/core/semantic-tokens.lua index 4c45c429..1b6b0a7e 100644 --- a/script/core/semantic-tokens.lua +++ b/script/core/semantic-tokens.lua @@ -9,140 +9,164 @@ local converter = require 'proto.converter' local infer = require 'core.infer' local config = require 'config' -local Care = {} -Care['getglobal'] = function (source, options, results) - local isLib = vm.isGlobalLibraryName(source[1]) - local isFunc = false - local value = source.value +local Care = util.switch() + : case 'getglobal' + : case 'setglobal' + : call(function (source, options, results) + local isLib = vm.isGlobalLibraryName(source[1]) + local isFunc = false + local value = source.value - if value and value.type == 'function' then - isFunc = true - elseif source.parent.type == 'call' then - isFunc = true - elseif options.isEnhanced then - isFunc = infer.hasType(source, 'function') - end + if value and value.type == 'function' then + isFunc = true + elseif source.parent.type == 'call' then + isFunc = true + elseif options.isEnhanced then + isFunc = infer.hasType(source, 'function') + end - local type = isFunc and define.TokenTypes['function'] or define.TokenTypes.variable - local modifier = isLib and define.TokenModifiers.defaultLibrary or define.TokenModifiers.static + local type = isFunc and define.TokenTypes['function'] or define.TokenTypes.variable + local modifier = isLib and define.TokenModifiers.defaultLibrary or define.TokenModifiers.static - results[#results+1] = { - start = source.start, - finish = source.finish, - type = type, - modifieres = modifier, - } -end -Care['setglobal'] = Care['getglobal'] -Care['getmethod'] = function (source, options, results) - local method = source.method - if method and method.type == 'method' then results[#results+1] = { - start = method.start, - finish = method.finish, - type = define.TokenTypes.method, - modifieres = source.type == 'setmethod' and define.TokenModifiers.declaration or nil, + start = source.start, + finish = source.finish, + type = type, + modifieres = modifier, } - end -end -Care['setmethod'] = Care['getmethod'] -Care['field'] = function (source, options, results) - local modifiers = 0 - if source.parent and source.parent.type == 'tablefield' then - modifiers = define.TokenModifiers.declaration - end - if source.parent then - local value = source.parent.value - if value and value.type == 'function' then + end) + : case 'getmethod' + : case 'setmethod' + : call(function (source, options, results) + local method = source.method + if method and method.type == 'method' then results[#results+1] = { - start = source.start, - finish = source.finish, + start = method.start, + finish = method.finish, type = define.TokenTypes.method, - modifieres = modifiers, + modifieres = source.type == 'setmethod' and define.TokenModifiers.declaration or nil, } - return end - end - if options.isEnhanced and infer.hasType(source, 'function') then - results[#results+1] = { - start = source.start, - finish = source.finish, - type = define.TokenTypes.method, - modifieres = modifiers, - } - return - end - if source.parent.parent.type == 'call' then - results[#results+1] = { - start = source.start, - finish = source.finish, - type = define.TokenTypes.method, - modifieres = modifiers, - } - return - end - results[#results+1] = { - start = source.start, - finish = source.finish, - type = define.TokenTypes.property, - modifieres = modifiers, - } -end -Care['getlocal'] = function (source, options, results) - local loc = source.node - -- 1. 值为函数的局部变量 | Local variable whose value is a function - if loc.refs then - for _, ref in ipairs(loc.refs) do - if ref.value and ref.value.type == 'function' then + end) + : case 'field' + : call(function (source, options, results) + local modifiers = 0 + if source.parent and source.parent.type == 'tablefield' then + modifiers = define.TokenModifiers.declaration + end + if source.parent then + local value = source.parent.value + if value and value.type == 'function' then results[#results+1] = { start = source.start, finish = source.finish, - type = define.TokenTypes['function'], + type = define.TokenTypes.method, + modifieres = modifiers, } return end end - end - -- 2. 对象 | Object - if source.parent.type == 'getmethod' - or source.parent.type == 'setmethod' - and source.parent.node == source then - return - end - -- 3. 特殊变量 | Special variable - if source[1] == '_ENV' - or source[1] == 'self' then - return - end - -- 4. 函数的参数 | Function parameters - if loc.parent and loc.parent.type == 'funcargs' then - results[#results+1] = { - start = source.start, - finish = source.finish, - type = define.TokenTypes.parameter, - modifieres = define.TokenModifiers.declaration, - } - return - end - -- 5. References to other functions - if options.isEnhanced and infer.hasType(loc, 'function') then + if options.isEnhanced and infer.hasType(source, 'function') then + results[#results+1] = { + start = source.start, + finish = source.finish, + type = define.TokenTypes.method, + modifieres = modifiers, + } + return + end + if source.parent.parent.type == 'call' then + results[#results+1] = { + start = source.start, + finish = source.finish, + type = define.TokenTypes.method, + modifieres = modifiers, + } + return + end results[#results+1] = { start = source.start, finish = source.finish, - type = define.TokenTypes['function'], - modifieres = source.type == 'setlocal' and define.TokenModifiers.declaration or nil, + type = define.TokenTypes.property, + modifieres = modifiers, } - return - end - -- 6. Class declaration - if options.isEnhanced then - -- search all defs - for _, def in ipairs(vm.getDefs(source)) do - if def.bindDocs then - for _, doc in ipairs(def.bindDocs) do + end) + : case 'getlocal' + : case 'setlocal' + : call(function (source, options, results) + local loc = source.node + -- 1. 值为函数的局部变量 | Local variable whose value is a function + if loc.refs then + for _, ref in ipairs(loc.refs) do + if ref.value and ref.value.type == 'function' then + results[#results+1] = { + start = source.start, + finish = source.finish, + type = define.TokenTypes['function'], + } + return + end + end + end + -- 2. 对象 | Object + if source.parent.type == 'getmethod' + or source.parent.type == 'setmethod' + and source.parent.node == source then + return + end + -- 3. 特殊变量 | Special variable + if source[1] == '_ENV' + or source[1] == 'self' then + return + end + -- 4. 函数的参数 | Function parameters + if loc.parent and loc.parent.type == 'funcargs' then + results[#results+1] = { + start = source.start, + finish = source.finish, + type = define.TokenTypes.parameter, + modifieres = define.TokenModifiers.declaration, + } + return + end + -- 5. References to other functions + if options.isEnhanced and infer.hasType(loc, 'function') then + results[#results+1] = { + start = source.start, + finish = source.finish, + type = define.TokenTypes['function'], + modifieres = source.type == 'setlocal' and define.TokenModifiers.declaration or nil, + } + return + end + -- 6. Class declaration + if options.isEnhanced then + -- search all defs + for _, def in ipairs(vm.getDefs(source)) do + if def.bindDocs then + for _, doc in ipairs(def.bindDocs) do + if doc.type == "doc.class" and doc.bindSources then + for _, src in ipairs(doc.bindSources) do + if src == def then + results[#results+1] = { + start = source.start, + finish = source.finish, + type = define.TokenTypes.class, + } + return + end + end + end + end + end + end + else + -- only search this local + if loc.bindDocs then + for i, doc in ipairs(loc.bindDocs) do if doc.type == "doc.class" and doc.bindSources then for _, src in ipairs(doc.bindSources) do - if src == def then + if src == loc then results[#results+1] = { start = source.start, finish = source.finish, @@ -155,186 +179,172 @@ Care['getlocal'] = function (source, options, results) end end end - else - -- only search this local - if loc.bindDocs then - for i, doc in ipairs(loc.bindDocs) do - if doc.type == "doc.class" and doc.bindSources then - for _, src in ipairs(doc.bindSources) do - if src == loc then - results[#results+1] = { - start = source.start, - finish = source.finish, - type = define.TokenTypes.class, - } - return - end - end + -- 6. const 变量 | Const variable + if loc.attrs then + for _, attr in ipairs(loc.attrs) do + local name = attr[1] + if name == 'const' then + results[#results+1] = { + start = source.start, + finish = source.finish, + type = define.TokenTypes.variable, + modifieres = define.TokenModifiers.static, + } + return + elseif name == 'close' then + results[#results+1] = { + start = source.start, + finish = source.finish, + type = define.TokenTypes.variable, + modifieres = define.TokenModifiers.abstract, + } + return end end end - end - -- 6. const 变量 | Const variable - if loc.attrs then - for _, attr in ipairs(loc.attrs) do - local name = attr[1] - if name == 'const' then - results[#results+1] = { - start = source.start, - finish = source.finish, - type = define.TokenTypes.variable, - modifieres = define.TokenModifiers.static, - } - return - elseif name == 'close' then - results[#results+1] = { - start = source.start, - finish = source.finish, - type = define.TokenTypes.variable, - modifieres = define.TokenModifiers.abstract, - } - return - end + -- 7. 函数调用 | Function call + if source.parent.type == 'call' + and source.parent.node == source then + return end - end - -- 7. 函数调用 | Function call - if source.parent.type == 'call' - and source.parent.node == source then - return - end - local isLocal = loc.parent ~= guide.getRoot(loc) - -- 8. 其他 | Other - results[#results+1] = { - start = source.start, - finish = source.finish, - type = define.TokenTypes.variable, - modifieres = isLocal and define.TokenModifiers['local'] or nil, - } -end -Care['setlocal'] = Care['getlocal'] -Care['local'] = function (source, options, results) -- Local declaration, i.e. "local x", "local y = z", or "local function() end" - if source[1] == '_ENV' - or source[1] == 'self' then - return - end - if source.parent and source.parent.type == 'funcargs' then + local isLocal = loc.parent ~= guide.getRoot(loc) + -- 8. 其他 | Other results[#results+1] = { start = source.start, finish = source.finish, - type = define.TokenTypes.parameter, - modifieres = define.TokenModifiers.declaration, + type = define.TokenTypes.variable, + modifieres = isLocal and define.TokenModifiers['local'] or nil, } - return - end - if source.value then - local isFunction = false - - if options.isEnhanced then - isFunction = source.value.type == 'function' or infer.hasType(source.value, 'function') - else - isFunction = source.value.type == 'function' + end) + : case 'local' + : call(function (source, options, results) -- Local declaration, i.e. "local x", "local y = z", or "local function() end" + if source[1] == '_ENV' + or source[1] == 'self' then + return end - - if isFunction then - -- Function declaration, either a new one or an alias for another one + if source.parent and source.parent.type == 'funcargs' then results[#results+1] = { start = source.start, finish = source.finish, - type = define.TokenTypes['function'], + type = define.TokenTypes.parameter, modifieres = define.TokenModifiers.declaration, } return end - end - if source.value and source.value.type == 'table' and source.bindDocs then - for _, doc in ipairs(source.bindDocs) do - if doc.type == "doc.class" then - -- Class declaration (explicit) + if source.value then + local isFunction = false + + if options.isEnhanced then + isFunction = source.value.type == 'function' or infer.hasType(source.value, 'function') + else + isFunction = source.value.type == 'function' + end + + if isFunction then + -- Function declaration, either a new one or an alias for another one results[#results+1] = { start = source.start, finish = source.finish, - type = define.TokenTypes.class, + type = define.TokenTypes['function'], modifieres = define.TokenModifiers.declaration, } return end end - end - if source.attrs then - for _, attr in ipairs(source.attrs) do - local name = attr[1] - if name == 'const' then - results[#results+1] = { - start = source.start, - finish = source.finish, - type = define.TokenTypes.variable, - modifieres = define.TokenModifiers.declaration | define.TokenModifiers.static, - } - return - elseif name == 'close' then - results[#results+1] = { - start = source.start, - finish = source.finish, - type = define.TokenTypes.variable, - modifieres = define.TokenModifiers.declaration | define.TokenModifiers.abstract, - } - return + if source.value and source.value.type == 'table' and source.bindDocs then + for _, doc in ipairs(source.bindDocs) do + if doc.type == "doc.class" then + -- Class declaration (explicit) + results[#results+1] = { + start = source.start, + finish = source.finish, + type = define.TokenTypes.class, + modifieres = define.TokenModifiers.declaration, + } + return + end + end + end + if source.attrs then + for _, attr in ipairs(source.attrs) do + local name = attr[1] + if name == 'const' then + results[#results+1] = { + start = source.start, + finish = source.finish, + type = define.TokenTypes.variable, + modifieres = define.TokenModifiers.declaration | define.TokenModifiers.static, + } + return + elseif name == 'close' then + results[#results+1] = { + start = source.start, + finish = source.finish, + type = define.TokenTypes.variable, + modifieres = define.TokenModifiers.declaration | define.TokenModifiers.abstract, + } + return + end end end - end - local isLocal = source.parent ~= guide.getRoot(source) - local modifiers = define.TokenModifiers.declaration + local isLocal = source.parent ~= guide.getRoot(source) + local modifiers = define.TokenModifiers.declaration - if isLocal then - modifiers = modifiers | define.TokenModifiers.definition - end + if isLocal then + modifiers = modifiers | define.TokenModifiers.definition + end - results[#results+1] = { - start = source.start, - finish = source.finish, - type = define.TokenTypes.variable, - modifieres = modifiers, - } -end -Care['doc.return.name'] = function (source, options, results) - results[#results+1] = { - start = source.start, - finish = source.finish, - type = define.TokenTypes.parameter, - } -end -Care['doc.tailcomment'] = function (source, options, results) - results[#results+1] = { - start = source.start, - finish = source.finish, - type = define.TokenTypes.comment, - } -end -Care['doc.type.name'] = function (source, options, results) - if source.typeGeneric then + results[#results+1] = { + start = source.start, + finish = source.finish, + type = define.TokenTypes.variable, + modifieres = modifiers, + } + end) + : case 'doc.return.name' + : call(function (source, options, results) results[#results+1] = { start = source.start, finish = source.finish, - type = define.TokenTypes.macro, + type = define.TokenTypes.parameter, } - end -end - -Care['nonstandardSymbol.comment'] = function (source, options, results) - results[#results+1] = { - start = source.start, - finish = source.finish, - type = define.TokenTypes.comment, - } -end -Care['nonstandardSymbol.continue'] = function (source, options, results) - results[#results+1] = { - start = source.start, - finish = source.finish, - type = define.TokenTypes.keyword, - } -end + end) + : case 'doc.tailcomment' + : call(function (source, options, results) + results[#results+1] = { + start = source.start, + finish = source.finish, + type = define.TokenTypes.comment, + } + end) + : case 'doc.type.name' + : call(function (source, options, results) + if source.typeGeneric then + results[#results+1] = { + start = source.start, + finish = source.finish, + type = define.TokenTypes.macro, + } + end + end) + : case 'nonstandardSymbol.comment' + : call(function (source, options, results) + results[#results+1] = { + start = source.start, + finish = source.finish, + type = define.TokenTypes.comment, + } + end) + : case 'nonstandardSymbol.continue' + : call(function (source, options, results) + results[#results+1] = { + start = source.start, + finish = source.finish, + type = define.TokenTypes.keyword, + } + end) + : getMap() local function buildTokens(uri, results) local tokens = {} |