From 97fcd0ac81435cf8d44355e3ea7e616a2f87b4b9 Mon Sep 17 00:00:00 2001 From: Chen Asraf Date: Thu, 26 Feb 2026 15:13:25 +0200 Subject: [PATCH] feat(treesitter): install firestore rules parser --- .../nvim/lua/casraf/plugins/treesitter.lua | 31 +++++++++++ .../queries/firestore_rules/highlights.scm | 53 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 .config/nvim/queries/firestore_rules/highlights.scm diff --git a/.config/nvim/lua/casraf/plugins/treesitter.lua b/.config/nvim/lua/casraf/plugins/treesitter.lua index 5b061669..2fff6e2e 100644 --- a/.config/nvim/lua/casraf/plugins/treesitter.lua +++ b/.config/nvim/lua/casraf/plugins/treesitter.lua @@ -95,6 +95,37 @@ return { vim.filetype.add({ extension = { ejs = "ejs" } }) vim.treesitter.language.register("embedded_template", "ejs") + + -- Firestore Rules tree-sitter parser + local parser_config = require('nvim-treesitter.parsers').get_parser_configs() + parser_config.firestore_rules = { + install_info = { + url = "https://github.com/grimsteel/tree-sitter-firestore-rules", + files = { "src/parser.c" }, + branch = "main", + generate_requires_npm = false, + requires_generate_from_grammar = false, + }, + filetype = "firestorerules", + } + vim.filetype.add({ + pattern = { + ["firestore%.rules"] = "firestorerules", + ["storage%.rules"] = "firestorerules", + [".*%.rules"] = { + priority = -1, + function(path, bufnr) + local content = vim.api.nvim_buf_get_lines(bufnr, 0, 5, false) + for _, line in ipairs(content) do + if line:match("service%s+cloud%.firestore") or line:match("service%s+firebase%.storage") then + return "firestorerules" + end + end + end, + }, + }, + }) + vim.treesitter.language.register("firestore_rules", "firestorerules") end, 0) end } diff --git a/.config/nvim/queries/firestore_rules/highlights.scm b/.config/nvim/queries/firestore_rules/highlights.scm new file mode 100644 index 00000000..da7ecd2b --- /dev/null +++ b/.config/nvim/queries/firestore_rules/highlights.scm @@ -0,0 +1,53 @@ +(bool) @constant.builtin +(type) @type.builtin +(number) @number +(hex_number) @number +(string) @string +(bytes) @string.special +"null" @constant.builtin +(action) @constant.builtin +(path) @module +(comment) @comment +(function_block function_name: (ident) @function) +(call function_name: (ident) @function) +"cloud.firestore" @variable.builtin +"rules_version" @variable.builtin +[ + "match" + "allow" + "if" + "return" + "function" + "let" + "service" +] @keyword +[ + "*" + "/" + "+" + "%" + "in" + "is" + "-" + ">=" + "<=" + ">" + "<" + "==" + "=" + "!=" + "&&" + "||" +] @operator +[ + ":" + ";" +] @punctuation.delimiter +[ + "{" + "}" + "[" + "]" + "(" + ")" +] @punctuation.bracket