1
0
Fork 0

treesitter: add playground and first attempt at sql in rust

This commit is contained in:
Felipe 2023-11-20 23:44:28 -03:00
parent 90e655005c
commit 5ed657277d
Signed by: pitbuster
SSH key fingerprint: SHA256:NLWXDJvkNDPTnUszcKt0McVeXWKTe5Lz0cIocZbA/pY
5 changed files with 121 additions and 0 deletions

3
.gitmodules vendored
View file

@ -146,3 +146,6 @@
[submodule "pack/general/opt/core.nvim"] [submodule "pack/general/opt/core.nvim"]
path = pack/general/opt/core.nvim path = pack/general/opt/core.nvim
url = https://github.com/niuiic/core.nvim url = https://github.com/niuiic/core.nvim
[submodule "pack/general/start/playground"]
path = pack/general/start/playground
url = https://github.com/nvim-treesitter/playground

83
after/plugin/rust_sql.lua Normal file
View file

@ -0,0 +1,83 @@
local run_formatter = function(text)
vim.notify(text)
vim.notify("----")
local result = {}
require("plenary.job"):new({
command = "sqlfluff",
cwd = "/usr/bin",
args = { "format", "-" },
writer = text,
on_stdout = function(_, line)
table.insert(result, line)
end,
}):sync()
-- add the surrounding r#"..."# back
for _, line in ipairs(result) do
vim.notify(line)
end
-- table.insert(result, "\"#")
return result
end
local embedded_sql = vim.treesitter.query.parse(
"rust",
[[
(macro_invocation
(scoped_identifier
path: (identifier) @path (#eq? @path "sqlx")
name: (identifier) @name (#any-of? @name "query" "query_scalar" "query_as"))
(token_tree
(raw_string_literal) @sql)
(#offset! @sql 0 3 0 -2)
)
]]
)
local get_root = function(bufnr)
local parser = vim.treesitter.get_parser(bufnr, "rust", {})
local tree = parser:parse()[1]
return tree:root()
end
local format = function(bufnr)
bufnr = bufnr or vim.api.nvim_get_current_buf()
if vim.api.nvim_get_option_value("filetype", { buf = bufnr }) ~= "rust" then
vim.notify("SQL format an only be used in Rust")
return
end
local root = get_root(bufnr)
local changes = {}
for id, node in embedded_sql:iter_captures(root, bufnr, 0, -1) do
local name = embedded_sql.captures[id]
if name == "sql" then
-- {start row, start col, end row, end col }
local range = { node:range() }
local indentation = string.rep(" ", range[2])
-- run the formatter on the node text
local formatted = run_formatter(vim.treesitter.get_node_text(node, bufnr))
-- add indentation
for idx, line in ipairs(formatted) do
formatted[idx] = indentation .. line
end
-- add changes in reverse order
table.insert(changes, 1, {
start = range[1],
final = range[3],
formatted = formatted,
})
end
end
for _, change in ipairs(changes) do
vim.api.nvim_buf_set_lines(bufnr, change.start, change.final, false, change.formatted)
end
end
vim.api.nvim_create_user_command("SqlFormat", function()
format()
end, {})

View file

@ -159,6 +159,7 @@ require("nvim-treesitter.configs").setup({
"php", "php",
"proto", "proto",
"python", "python",
"query",
"regex", "regex",
"ron", "ron",
"rst", "rst",
@ -174,6 +175,29 @@ require("nvim-treesitter.configs").setup({
"yaml", "yaml",
}, },
highlight = { enable = true, indent = true }, highlight = { enable = true, indent = true },
playground = {
enable = true,
disable = {},
updatetime = 25, -- Debounced time for highlighting nodes in the playground from source code
persist_queries = false, -- Whether the query persists across vim sessions
keybindings = {
toggle_query_editor = 'o',
toggle_hl_groups = 'i',
toggle_injected_languages = 't',
toggle_anonymous_nodes = 'a',
toggle_language_display = 'I',
focus_language = 'f',
unfocus_language = 'F',
update = 'R',
goto_node = '<cr>',
show_help = '?',
},
},
query_linter = {
enable = true,
use_virtual_text = true,
lint_events = { "BufWrite", "CursorHold" },
},
}) })
---- Filetypes --- ---- Filetypes ---

@ -0,0 +1 @@
Subproject commit ba48c6a62a280eefb7c85725b0915e021a1a0749

View file

@ -0,0 +1,10 @@
; Inject into sqlx::query!(r#"..."#, ...) as sql
(macro_invocation
(scoped_identifier
path: (identifier) @path (#eq? @path "sqlx")
name: (identifier) @name (#any-of? @name "query" "query_scalar" "query_as")
)
(token_tree (raw_string_literal) @sql)
(#offset! @sql 0 3 0 -2)
)