mirror of
https://github.com/ribru17/ts_query_ls.git
synced 2025-12-23 05:36:52 +00:00
LSP implementation for Tree-sitter's query files
| .github/workflows | ||
| src | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
An LSP implementation for tree-sitter query files
Configuration
{
"settings": {
// Where to look for parsers, of the form <lang>.(so|dll|dylib)
// or tree-sitter-<lang>.wasm
"parser_install_directories": ["a/list/of", "parser/installation/paths"],
// A list of parser aliases (e.g. point queries/ecma/*.scm files to the
// javascript parser)
"parser_aliases": {
"ecma": "javascript"
},
// A list of patterns to aid the LSP in finding a language, given a file
// path. Patterns must have one capture group which represents the language
// name. Ordered from highest to lowest precedence.
"language_retrieval_patterns": [
// E.g. zed support
"languages/src/([^/]+)/[^/]+\\.scm$"
// The following fallbacks are *always* provided:
//
// tree-sitter-([^/]+)/queries/[^/]+\.scm$
// queries/([^/]+)/[^/]+\.scm$
]
}
}
Example setup (for Neovim):
vim.api.nvim_create_autocmd('FileType', {
pattern = 'query',
callback = function(ev)
if vim.bo[ev.buf].buftype == 'nofile' then
return
end
vim.lsp.start {
name = 'ts_query_ls',
cmd = { '/path/to/ts_query_ls/target/release/ts_query_ls' },
root_dir = vim.fs.root(0, { 'queries' }),
settings = {
parser_install_directories = {
-- If using nvim-treesitter with lazy.nvim
vim.fs.joinpath(
vim.fn.stdpath('data'),
'/lazy/nvim-treesitter/parser/'
),
},
parser_aliases = {
ecma = 'javascript',
},
language_retrieval_patterns = {
'languages/src/([^/]+)/[^/]+\\.scm$',
},
},
}
end,
})
Checklist
- References for captures
- Renaming captures
- Completions for capture names in a pattern (for predicates)
- Completions for node names
- Fix utility functions, making them robust when it comes to UTF-16 code points
- Go to definition for captures
- Recognition/completion of supertypes (requires
tree-sitter 0.25) - Completions and diagnostics for a supertype's subtypes
- Completions field names
- Diagnostics for unrecognized nodes
- Diagnostics for referencing undefined capture groups in predicates
- Diagnostics for incorrect syntax
- Diagnostics for impossible patterns
- Currently not possible without a full (sometimes expensive) run of the query file. This should either be implemented as a user command, or core methods should be exposed to gather pattern information more efficiently
- Recognize parsers built for
WASM - Document formatting compatible with the
nvim-treesitterformatter - Code cleanup
- Add tests for all* functionality
*All handlers are tested, but core functionality like language loading will be more complicated, and does not yet have test coverage.
Packaging
homebrew(in progress, requires repo to reach 75 GitHub stars)nixpkgsmason.nvim(in progress)
And others?
References
Many thanks to @lucario387, and the
asm-lsp,
jinja-lsp,
beancount-language-server,
and helix-editor projects for the
amazing code that I took inspiration from!