Merge pull request #13590 from bfredl/tsquery

treesitter: simplify query reading logic
This commit is contained in:
Björn Linse 2021-01-04 16:17:34 +01:00 committed by GitHub
commit 9223d1450d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -8,36 +8,10 @@ Query.__index = Query
local M = {} local M = {}
-- Filter the runtime query files, the spec is like regular runtime files but in the new `queries`
-- directory. They resemble ftplugins, that is that you can override queries by adding things in the
-- `queries` directory, and extend using the `after/queries` directory.
local function filter_files(file_list)
local main = nil
local after = {}
for _, fname in ipairs(file_list) do function M.get_query_files(lang, query_name, is_included)
-- Only get the name of the directory containing the queries directory local query_path = string.format('queries/%s/%s.scm', lang, query_name)
if vim.fn.fnamemodify(fname, ":p:h:h:h:t") == "after" then local lang_files = a.nvim_get_runtime_file(query_path, true)
table.insert(after, fname)
-- The first one is the one with most priority
elseif not main then
main = fname
end
end
return main and { main, unpack(after) } or after
end
local function runtime_query_path(lang, query_name)
return string.format('queries/%s/%s.scm', lang, query_name)
end
local function filtered_runtime_queries(lang, query_name)
return filter_files(a.nvim_get_runtime_file(runtime_query_path(lang, query_name), true) or {})
end
local function get_query_files(lang, query_name, is_included)
local lang_files = filtered_runtime_queries(lang, query_name)
if #lang_files == 0 then return {} end if #lang_files == 0 then return {} end
@ -51,10 +25,10 @@ local function get_query_files(lang, query_name, is_included)
local MODELINE_FORMAT = "^;+%s*inherits%s*:?%s*([a-z_,()]+)%s*$" local MODELINE_FORMAT = "^;+%s*inherits%s*:?%s*([a-z_,()]+)%s*$"
for _, file in ipairs(lang_files) do for _, file in ipairs(lang_files) do
local modeline = vim.fn.readfile(file, "", 1) local modeline = io.open(file, 'r'):read('*l')
if #modeline == 1 then if modeline then
local langlist = modeline[1]:match(MODELINE_FORMAT) local langlist = modeline:match(MODELINE_FORMAT)
if langlist then if langlist then
for _, incllang in ipairs(vim.split(langlist, ',', true)) do for _, incllang in ipairs(vim.split(langlist, ',', true)) do
@ -74,7 +48,7 @@ local function get_query_files(lang, query_name, is_included)
local query_files = {} local query_files = {}
for _, base_lang in ipairs(base_langs) do for _, base_lang in ipairs(base_langs) do
local base_files = get_query_files(base_lang, query_name, true) local base_files = M.get_query_files(base_lang, query_name, true)
vim.list_extend(query_files, base_files) vim.list_extend(query_files, base_files)
end end
vim.list_extend(query_files, lang_files) vim.list_extend(query_files, lang_files)
@ -86,10 +60,10 @@ local function read_query_files(filenames)
local contents = {} local contents = {}
for _,filename in ipairs(filenames) do for _,filename in ipairs(filenames) do
vim.list_extend(contents, vim.fn.readfile(filename)) table.insert(contents, io.open(filename, 'r'):read('*a'))
end end
return table.concat(contents, '\n') return table.concat(contents, '')
end end
local match_metatable = { local match_metatable = {
@ -110,7 +84,7 @@ end
-- --
-- @return The corresponding query, parsed. -- @return The corresponding query, parsed.
function M.get_query(lang, query_name) function M.get_query(lang, query_name)
local query_files = get_query_files(lang, query_name) local query_files = M.get_query_files(lang, query_name)
local query_string = read_query_files(query_files) local query_string = read_query_files(query_files)
if #query_string > 0 then if #query_string > 0 then