local files = require 'files' local guide = require 'parser.guide' local matchKey = require 'core.matchkey' local define = require 'proto.define' local function buildSource(uri, source, key, results) if source.type == 'local' or source.type == 'setlocal' or source.type == 'setglobal' then local name = source[1] if matchKey(key, name) then results[#results+1] = { name = name, kind = define.SymbolKind.Variable, uri = uri, range = { source.start, source.finish }, } end elseif source.type == 'setfield' or source.type == 'tablefield' then local field = source.field local name = field[1] if matchKey(key, name) then results[#results+1] = { name = name, kind = define.SymbolKind.Field, uri = uri, range = { field.start, field.finish }, } end elseif source.type == 'setmethod' then local method = source.method local name = method[1] if matchKey(key, name) then results[#results+1] = { name = name, kind = define.SymbolKind.Method, uri = uri, range = { method.start, method.finish }, } end end end local function searchFile(uri, key, results) local ast = files.getAst(uri) if not ast then return end guide.eachSource(ast.ast, function (source) buildSource(uri, source, key, results) end) end return function (key) local results = {} for uri in files.eachFile() do searchFile(files.getOriginUri(uri), key, results) end return results end