diff --git a/.github/workflows/check_query_files.yml b/.github/workflows/check_query_files.yml index 053bb0db..5f7f9f7b 100644 --- a/.github/workflows/check_query_files.yml +++ b/.github/workflows/check_query_files.yml @@ -1,7 +1,6 @@ name: Check loading of syntax files on: - push: pull_request: schedule: - cron: '0 0 * * *' # every day at midnight @@ -10,6 +9,9 @@ jobs: luacheck: name: Check Query Files runs-on: ubuntu-latest + env: + NVIM_TAG: stable + APPIMAGE: nvim-linux-x86_64.appimage steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 @@ -20,11 +22,12 @@ jobs: - name: Prepare env: NVIM_TAG: stable + APPIMAGE: nvim-linux-x86_64.appimage run: | sudo apt-get update && sudo apt-get install libfuse2 sudo add-apt-repository universe - wget https://github.com/neovim/neovim/releases/download/${NVIM_TAG}/nvim.appimage - chmod u+x nvim.appimage + wget https://github.com/neovim/neovim/releases/download/${NVIM_TAG}/${APPIMAGE} + chmod u+x ${APPIMAGE} mkdir -p ~/.local/share/nvim/site/pack/nvim-treesitter-textobject/start ln -s $(pwd) ~/.local/share/nvim/site/pack/nvim-treesitter-textobject/start mkdir -p ~/.local/share/nvim/site/pack/nvim-treesitter/start @@ -32,7 +35,7 @@ jobs: git clone https://github.com/nvim-treesitter/nvim-treesitter.git - name: Compile parsers - run: ./nvim.appimage --headless -c "TSInstallSync all" -c "q" + run: ./${APPIMAGE} --headless -c "TSInstallSync all" -c "q" - name: Check query files - run: ./nvim.appimage --headless -c "luafile ./scripts/check-queries.lua" -c "q" + run: ./${APPIMAGE} --headless -c "luafile ./scripts/check-queries.lua" -c "q" diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 4edfe3cf..159a4b88 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,6 +1,6 @@ name: Linting and style checking -on: [push, pull_request] +on: pull_request jobs: luacheck: diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cf0d912b..972138fe 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,9 +1,7 @@ name: Tests on: - push: pull_request: - types: [opened, synchronize, reopened, ready_for_review] branches: - 'master' diff --git a/.github/workflows/update-readme.yml b/.github/workflows/update-readme.yml index ede52333..3f80fc6b 100644 --- a/.github/workflows/update-readme.yml +++ b/.github/workflows/update-readme.yml @@ -9,6 +9,8 @@ jobs: update-readme: name: Update README.md runs-on: ubuntu-latest + env: + APPIMAGE: nvim-linux-x86_64.appimage steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 @@ -20,8 +22,8 @@ jobs: run: | sudo apt-get update && sudo apt-get install libfuse2 sudo add-apt-repository universe - wget https://github.com/neovim/neovim/releases/download/nightly/nvim.appimage - chmod u+x nvim.appimage + wget https://github.com/neovim/neovim/releases/download/nightly/${APPIMAGE} + chmod u+x ${APPIMAGE} mkdir -p ~/.local/share/nvim/site/pack/nvim-treesitter-textobject/start ln -s $(pwd) ~/.local/share/nvim/site/pack/nvim-treesitter-textobject/start mkdir -p ~/.local/share/nvim/site/pack/nvim-treesitter/start @@ -29,14 +31,14 @@ jobs: git clone https://github.com/nvim-treesitter/nvim-treesitter.git - name: Compile parsers - run: ./nvim.appimage --headless -c "TSInstallSync all" -c "q" + run: ./${APPIMAGE} --headless -c "TSInstallSync all" -c "q" # inspired by nvim-lspconfigs - name: Check README run: | git config user.email "actions@github" git config user.name "Github Actions" - ./nvim.appimage --headless -c "luafile ./scripts/update-readme.lua" -c "q" || echo "Needs update" + ./${APPIMAGE} --headless -c "luafile ./scripts/update-readme.lua" -c "q" || echo "Needs update" git add README.md git commit -m "docs: update queries in README" || echo 'No commit necessary!' git clean -xf diff --git a/README.md b/README.md index 44d8c3a3..c6299f64 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ require'nvim-treesitter.configs'.setup { -- nvim_buf_set_keymap) which plugins like which-key display ["ic"] = { query = "@class.inner", desc = "Select inner part of a class region" }, -- You can also use captures from other query groups like `locals.scm` - ["as"] = { query = "@scope", query_group = "locals", desc = "Select language scope" }, + ["as"] = { query = "@local.scope", query_group = "locals", desc = "Select language scope" }, }, -- You can choose the select mode (default is charwise 'v') -- @@ -129,7 +129,7 @@ require'nvim-treesitter.configs'.setup { -- -- You can pass a query group to use query from `queries//.scm file in your runtime path. -- Below example nvim-treesitter's `locals.scm` and `folds.scm`. They also provide highlights.scm and indent.scm. - ["]s"] = { query = "@scope", query_group = "locals", desc = "Next scope" }, + ["]s"] = { query = "@local.scope", query_group = "locals", desc = "Next scope" }, ["]z"] = { query = "@fold", query_group = "folds", desc = "Next fold" }, }, goto_next_end = { @@ -332,7 +332,7 @@ Here are some rules about the query names that should be noted. cpp🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 ⬜ 🟩 -css🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ +css🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ cuda🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 ⬜ 🟩 @@ -344,6 +344,8 @@ Here are some rules about the query names that should be noted. elm⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 ⬜ ⬜ ⬜ 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ +enforce⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 ⬜ 🟩 🟩 🟩 ⬜ 🟩 ⬜ ⬜ ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 ⬜ ⬜ + fennel🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 ⬜ 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 fish🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ 🟩 ⬜ 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 ⬜ ⬜ 🟩 🟩 ⬜ 🟩 @@ -370,7 +372,7 @@ Here are some rules about the query names that should be noted. java⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ -javascript🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ +javascript🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 julia🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 ⬜ 🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ @@ -378,7 +380,7 @@ Here are some rules about the query names that should be noted. latex⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ -lua🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 ⬜ ⬜ +lua🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 ⬜ 🟩 matlab⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 ⬜ 🟩 ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 ⬜ 🟩 @@ -388,6 +390,8 @@ Here are some rules about the query names that should be noted. nix⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ +ocaml⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ + odin🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 ⬜ ⬜ ⬜ ⬜ 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 ⬜ ⬜ perl⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 ⬜ ⬜ ⬜ ⬜ @@ -412,29 +416,31 @@ Here are some rules about the query names that should be noted. scala⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 🟩 ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 ⬜ ⬜ ⬜ 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ -scss🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ +scss🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ slang🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 ⬜ 🟩 supercollider⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 🟩 ⬜ ⬜ 🟩 🟩 ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 ⬜ 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ +svelte⬜ ⬜ ⬜ ⬜ 🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ + swift⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 🟩 🟩 🟩 ⬜ 🟩 ⬜ ⬜ ⬜ ⬜ 🟩 🟩 ⬜ ⬜ ⬜ 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ tact🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 ⬜ ⬜ terraform🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 -toml⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ +toml⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ -tsx🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ +tsx🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 twig⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 -typescript🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ ⬜ ⬜ ⬜ +typescript🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 v🟩 🟩 ⬜ 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 ⬜ 🟩 -verilog⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 ⬜ ⬜ ⬜ 🟩 ⬜ 🟩 ⬜ 🟩 ⬜ ⬜ ⬜ 🟩 ⬜ 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ +verilog⬜ ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ 🟩 ⬜ ⬜ ⬜ ⬜ 🟩 🟩 ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ ⬜ vim🟩 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 ⬜ 🟩 ⬜ ⬜ ⬜ 🟩 🟩 🟩 ⬜ ⬜ 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 🟩 ⬜ 🟩 diff --git a/lua/nvim-treesitter/textobjects/lsp_interop.lua b/lua/nvim-treesitter/textobjects/lsp_interop.lua index d89d2ead..ca8b8bbb 100644 --- a/lua/nvim-treesitter/textobjects/lsp_interop.lua +++ b/lua/nvim-treesitter/textobjects/lsp_interop.lua @@ -111,7 +111,11 @@ function M.peek_definition_code(query_string, query_group, lsp_request, context) if vim.tbl_contains(vim.api.nvim_list_wins(), floating_win) then vim.api.nvim_set_current_win(floating_win) else - local params = vim.lsp.util.make_position_params() + local win_id = vim.api.nvim_get_current_win() + local params = vim.fn.has "nvim-0.11" == 0 and vim.lsp.util.make_position_params() + or function(client) + return vim.lsp.util.make_position_params(win_id, client.offset_encoding) + end return vim.lsp.buf_request( 0, lsp_request, diff --git a/queries/apex/textobjects.scm b/queries/apex/textobjects.scm index 03c04a85..27941ef0 100644 --- a/queries/apex/textobjects.scm +++ b/queries/apex/textobjects.scm @@ -99,6 +99,12 @@ ] @comment.outer ; assignment -(variable_declarator - name: (identifier) @assignment.lhs - value: (_) @assignment.rhs) @assignment.inner @assignment.outer +(field_declaration + (variable_declarator + name: (identifier) @assignment.lhs + value: (_) @assignment.rhs) @assignment.inner) @assignment.outer + +(local_variable_declaration + (variable_declarator + name: (identifier) @assignment.lhs + value: (_) @assignment.rhs) @assignment.inner) @assignment.outer diff --git a/queries/css/textobjects.scm b/queries/css/textobjects.scm index 4d132431..bd5f6b85 100644 --- a/queries/css/textobjects.scm +++ b/queries/css/textobjects.scm @@ -18,3 +18,5 @@ (declaration (property_name) @assignment.inner) + +(comment) @comment.outer diff --git a/queries/ecma/textobjects.scm b/queries/ecma/textobjects.scm index c274990e..820953e5 100644 --- a/queries/ecma/textobjects.scm +++ b/queries/ecma/textobjects.scm @@ -1,6 +1,9 @@ (function_declaration body: (statement_block)) @function.outer +(generator_function_declaration + body: (statement_block)) @function.outer + (function_expression body: (statement_block)) @function.outer @@ -15,6 +18,17 @@ "}" (#make-range! "function.inner" @_start @_end))) +(generator_function_declaration + body: (statement_block + . + "{" + . + (_) @_start @_end + (_)? @_end + . + "}" + (#make-range! "function.inner" @_start @_end))) + (function_expression body: (statement_block . @@ -58,7 +72,18 @@ (#make-range! "function.inner" @_start @_end))) (class_declaration - body: (class_body) @class.inner) @class.outer + body: (class_body)) @class.outer + +(class_declaration + body: (class_body + . + "{" + . + (_) @_start @_end + (_)? @_end + . + "}" + (#make-range! "class.inner" @_start @_end))) (export_statement (class_declaration)) @class.outer @@ -182,39 +207,6 @@ ","? @_end (#make-range! "parameter.outer" @parameter.inner @_end)) -; If the array/object pattern is the first parameter, treat its elements as the argument list -(formal_parameters - . - (_ - [ - (object_pattern - "," @_start - . - (_) @parameter.inner) - (array_pattern - "," @_start - . - (_) @parameter.inner) - ]) - (#make-range! "parameter.outer" @_start @parameter.inner)) - -(formal_parameters - . - (_ - [ - (object_pattern - . - (_) @parameter.inner - . - ","? @_end) - (array_pattern - . - (_) @parameter.inner - . - ","? @_end) - ]) - (#make-range! "parameter.outer" @parameter.inner @_end)) - ; arguments (arguments "," @_start @@ -239,9 +231,10 @@ ; number (number) @number.inner -(variable_declarator - name: (_) @assignment.lhs - value: (_) @assignment.inner @assignment.rhs) @assignment.outer +(lexical_declaration + (variable_declarator + name: (_) @assignment.lhs + value: (_) @assignment.inner @assignment.rhs)) @assignment.outer (variable_declarator name: (_) @assignment.inner) @@ -250,3 +243,133 @@ (pair key: (_) @assignment.lhs value: (_) @assignment.inner @assignment.rhs) @assignment.outer) + +(return_statement + (_) @return.inner) @return.outer + +(return_statement) @statement.outer + +[ + (if_statement) + (expression_statement) + (for_statement) + (while_statement) + (do_statement) + (for_in_statement) + (export_statement) + (lexical_declaration) +] @statement.outer + +; 1. default import +(import_statement + (import_clause + (identifier) @parameter.inner @parameter.outer)) + +; 2. namespace import e.g. `* as React` +(import_statement + (import_clause + (namespace_import + (identifier) @parameter.inner) @parameter.outer)) + +; 3. named import e.g. `import { Bar, Baz } from ...` +(import_statement + (import_clause + (named_imports + (import_specifier) @parameter.inner))) + +; 3‑A. named import followed by a comma +((import_statement + (import_clause + (named_imports + (import_specifier) @_start + . + "," @_end))) + (#make-range! "parameter.outer" @_start @_end)) + +; 3‑B. comma followed by named import +((import_statement + (import_clause + (named_imports + "," @_start + . + (import_specifier) @_end))) + (#make-range! "parameter.outer" @_start @_end)) + +; 3-C. only one named import without a comma +(import_statement + (import_clause + (named_imports + . + (import_specifier) @parameter.outer .))) + +; Treat list or object elements as @parameter +; 1. parameter.inner +(object + (_) @parameter.inner) + +(array + (_) @parameter.inner) + +(object_pattern + (_) @parameter.inner) + +(array_pattern + (_) @parameter.inner) + +; 2. parameter.outer: Only one element, no comma +(object + . + (_) @parameter.outer .) + +(array + . + (_) @parameter.outer .) + +(object_pattern + . + (_) @parameter.outer .) + +(array_pattern + . + (_) @parameter.outer .) + +; 3. parameter.outer: Comma before or after +([ + (object + "," @_start + . + (_) @_end) + (array + "," @_start + . + (_) @_end) + (object_pattern + "," @_start + . + (_) @_end) + (array_pattern + "," @_start + . + (_) @_end) +] + (#make-range! "parameter.outer" @_start @_end)) + +([ + (object + (_) @_start + . + "," @_end) + (array + (_) @_start + . + "," @_end) + (object_pattern + (_) @_start + . + "," @_end) + (array_pattern + (_) @_start + . + "," @_end) +] + (#make-range! "parameter.outer" @_start @_end)) diff --git a/queries/enforce/textobjects.scm b/queries/enforce/textobjects.scm new file mode 100644 index 00000000..24d0a355 --- /dev/null +++ b/queries/enforce/textobjects.scm @@ -0,0 +1,58 @@ +[ + (comment_line) + (comment_block) + (doc_line) + (doc_block) +] @comment.outer + +[ + (literal_int) + (literal_float) +] @number.inner + +; TODO: capture inside braces +(decl_class + body: (_) @class.inner) @class.outer + +(decl_method + body: (_) @function.inner) @function.outer + +(for + body: (_) @loop.inner) @loop.outer + +(while + body: (_) @loop.inner) @loop.outer + +(return + (_)? @return.inner) @return.outer + +; blocks +(block) @block.outer + +(invokation) @call.outer + +(formal_parameters + "," @_start + . + (formal_parameter) @parameter.inner + (#make-range! "parameter.outer" @_start @parameter.inner)) + +(formal_parameters + . + (formal_parameter) @parameter.inner + . + ","? @_end + (#make-range! "parameter.outer" @parameter.inner @_end)) + +(actual_parameters + "," @_start + . + (actual_parameter) @parameter.inner + (#make-range! "parameter.outer" @_start @parameter.inner)) + +(actual_parameters + . + (actual_parameter) @parameter.inner + . + ","? @_end + (#make-range! "parameter.outer" @parameter.inner @_end)) diff --git a/queries/go/textobjects.scm b/queries/go/textobjects.scm index 719505bf..9b7ac620 100644 --- a/queries/go/textobjects.scm +++ b/queries/go/textobjects.scm @@ -46,25 +46,54 @@ body: (block)?) @function.outer ; struct and interface declaration as class textobject? +(type_declaration + (type_spec + (type_identifier) + (struct_type))) @class.outer + (type_declaration (type_spec (type_identifier) (struct_type (field_declaration_list - (_)?) @class.inner))) @class.outer + "{" + . + _ @_start @_end + _? @_end + . + "}" + (#make-range! "class.inner" @_start @_end))))) + +(type_declaration + (type_spec + (type_identifier) + (interface_type))) @class.outer (type_declaration (type_spec (type_identifier) - (interface_type) @class.inner)) @class.outer + (interface_type + "{" + . + _ @_start @_end + _? @_end + . + "}" + (#make-range! "class.inner" @_start @_end)))) ; struct literals as class textobject (composite_literal - (type_identifier)? - (struct_type - (_))? + (literal_value)) @class.outer + +(composite_literal (literal_value - (_)) @class.inner) @class.outer + "{" + . + _ @_start @_end + _? @_end + . + "}") + (#make-range! "class.inner" @_start @_end)) ; conditionals (if_statement @@ -72,14 +101,31 @@ (_) @conditional.inner)?) @conditional.outer (if_statement - consequence: (block)? @conditional.inner) + consequence: (block + "{" + . + _ @_start @_end + _? @_end + . + "}" + (#make-range! "conditional.inner" @_start @_end))) (if_statement condition: (_) @conditional.inner) ; loops +(for_statement) @loop.outer + (for_statement - body: (block)? @loop.inner) @loop.outer + body: (block + . + "{" + . + _ @_start @_end + _? @_end + . + "}" + (#make-range! "loop.inner" @_start @_end))) ; blocks (_ @@ -157,18 +203,22 @@ left: (_) @assignment.lhs right: (_) @assignment.rhs @assignment.inner) @assignment.outer -(var_spec - name: (_) @assignment.lhs - value: (_) @assignment.rhs @assignment.inner) @assignment.outer - -(var_spec - name: (_) @assignment.inner - type: (_)) @assignment.outer - -(const_spec - name: (_) @assignment.lhs - value: (_) @assignment.rhs @assignment.inner) @assignment.outer - -(const_spec - name: (_) @assignment.inner - type: (_)) @assignment.outer +(var_declaration + (var_spec + name: (_) @assignment.lhs + value: (_) @assignment.rhs @assignment.inner)) @assignment.outer + +(var_declaration + (var_spec + name: (_) @assignment.inner + type: (_))) @assignment.outer + +(const_declaration + (const_spec + name: (_) @assignment.lhs + value: (_) @assignment.rhs @assignment.inner)) @assignment.outer + +(const_declaration + (const_spec + name: (_) @assignment.inner + type: (_))) @assignment.outer diff --git a/queries/java/textobjects.scm b/queries/java/textobjects.scm index 5a16b35c..bc3e9811 100644 --- a/queries/java/textobjects.scm +++ b/queries/java/textobjects.scm @@ -27,6 +27,9 @@ "}" (#make-range! "function.inner" @_start @_end))) +(return_statement + (_)? @return.inner) @return.outer + (for_statement body: (_)? @loop.inner) @loop.outer @@ -105,3 +108,9 @@ (binary_integer_literal) (octal_integer_literal) ] @number.inner + +; scopename +; statement +(statement) @statement.outer + +(return_statement) @statement.outer diff --git a/queries/jsx/textobjects.scm b/queries/jsx/textobjects.scm index daa78a5c..a69f8246 100644 --- a/queries/jsx/textobjects.scm +++ b/queries/jsx/textobjects.scm @@ -1,5 +1,8 @@ ; inherits: ecma +(jsx_attribute) @attribute.outer + (jsx_attribute (property_identifier) - (_) @parameter.inner) @parameter.outer + (_ + (_) @attribute.inner)) diff --git a/queries/julia/textobjects.scm b/queries/julia/textobjects.scm index efcaa0df..bb713118 100644 --- a/queries/julia/textobjects.scm +++ b/queries/julia/textobjects.scm @@ -80,7 +80,7 @@ (struct_definition) @class.outer ((struct_definition - name: (_) + (type_head) . (_) @_start (_)? @_end .) @@ -101,7 +101,7 @@ (operator) (_) @function.inner) @function.outer -(function_expression +(arrow_function_expression [ (identifier) (argument_list) @@ -217,10 +217,23 @@ (#make-range! "parameter.outer" @parameter.inner @_end)) ; Assignment -(assignment - . - (_) @assignment.lhs - (_) @assignment.inner @assignment.rhs .) @assignment.outer +(local_statement + (assignment + . + (_) @assignment.lhs + (_) @assignment.inner @assignment.rhs .)) @assignment.outer + +(const_statement + (assignment + . + (_) @assignment.lhs + (_) @assignment.inner @assignment.rhs .)) @assignment.outer + +(global_statement + (assignment + . + (_) @assignment.lhs + (_) @assignment.inner @assignment.rhs .)) @assignment.outer (assignment . diff --git a/queries/kotlin/textobjects.scm b/queries/kotlin/textobjects.scm index c1e43f07..a6d7ed83 100644 --- a/queries/kotlin/textobjects.scm +++ b/queries/kotlin/textobjects.scm @@ -2,7 +2,7 @@ [ (class_body) (enum_class_body) - ] @class.inner) @class.outer + ]? @class.inner) @class.outer [ (function_declaration diff --git a/queries/lua/textobjects.scm b/queries/lua/textobjects.scm index fa1b77db..5719e85e 100644 --- a/queries/lua/textobjects.scm +++ b/queries/lua/textobjects.scm @@ -22,7 +22,8 @@ ; class ; comment -(comment) @comment.outer +(comment + (comment_content) @comment.inner) @comment.outer ; conditional (if_statement @@ -84,7 +85,9 @@ (#make-range! "parameter.outer" @parameter.inner @_end)) (table_constructor + . (field) @parameter.inner + . ","? @_end (#make-range! "parameter.outer" @parameter.inner @_end)) @@ -100,15 +103,25 @@ (_) @parameter.inner (#make-range! "parameter.outer" @_start @parameter.inner)) +(table_constructor + "," @_start + . + (field) @parameter.inner + (#make-range! "parameter.outer" @_start @parameter.inner)) + ; number (number) @number.inner -(assignment_statement - (variable_list) @assignment.lhs - (expression_list) @assignment.inner @assignment.rhs) @assignment.outer +(variable_declaration + (assignment_statement + (variable_list) @assignment.lhs + (expression_list) @assignment.inner @assignment.rhs)) @assignment.outer (assignment_statement (variable_list) @assignment.inner) ; scopename ; statement +(statement) @statement.outer + +(return_statement) @statement.outer diff --git a/queries/ocaml/textobjects.scm b/queries/ocaml/textobjects.scm new file mode 100644 index 00000000..1351d6c9 --- /dev/null +++ b/queries/ocaml/textobjects.scm @@ -0,0 +1,57 @@ +(value_definition + (let_binding + body: (_) @function.inner)) @function.outer + +(method_definition + body: (_) @function.inner) @function.outer + +(class_definition + (class_binding + body: (_) @class.inner)) @class.outer + +(for_expression + (do_clause + (_) @loop.inner)) @loop.outer + +(while_expression + (do_clause + (_) @loop.inner)) @loop.outer + +(if_expression + condition: (_) + (then_clause + (_) @conditional.inner) + (else_clause + (_) @conditional.inner)) @conditional.outer + +(if_expression + condition: (_) + (then_clause + (_) @conditional.inner)) @conditional.outer + +(function_expression + (match_case) @_start @_end + (match_case)* @_end + (#make-range! "conditional.inner" @_start @_end)) @conditional.outer + +(match_expression + (match_case) @_start @_end + (match_case)* @_end + (#make-range! "conditional.inner" @_start @_end)) @conditional.outer + +(comment) @comment.outer + +(parameter) @parameter.outer + +(application_expression + argument: (_) @parameter.outer) @call.outer + +(application_expression + argument: (_) @_start @_end + argument: (_)* @_end + (#make-range! "call.inner" @_start @_end)) + +(parenthesized_expression + (_) @_start @_end + (_)? @_end + (#make-range! "block.inner" @_start @_end)) @block.outer diff --git a/queries/rust/textobjects.scm b/queries/rust/textobjects.scm index 5d6a1550..592028c5 100644 --- a/queries/rust/textobjects.scm +++ b/queries/rust/textobjects.scm @@ -226,6 +226,13 @@ ","? @_end) (#make-range! "parameter.outer" @parameter.inner @_end)) +; last element, with trailing comma +((parameters + (self_parameter) @_start + . + "," @_end .) + (#make-range! "parameter.outer" @_start @_end)) + ((parameters "," @_start . @@ -239,6 +246,13 @@ ","? @_end) (#make-range! "parameter.outer" @parameter.inner @_end)) +; last element, with trailing comma +((parameters + (parameter) @_start + . + "," @_end .) + (#make-range! "parameter.outer" @_start @_end)) + ((parameters "," @_start . @@ -252,6 +266,13 @@ ","? @_end) (#make-range! "parameter.outer" @parameter.inner @_end)) +; last element, with trailing comma +((parameters + (type_identifier) @_start + . + "," @_end .) + (#make-range! "parameter.outer" @_start @_end)) + ((type_parameters "," @_start . @@ -265,6 +286,13 @@ ","? @_end) (#make-range! "parameter.outer" @parameter.inner @_end)) +; last element, with trailing comma +((type_parameters + (_) @_start + . + "," @_end .) + (#make-range! "parameter.outer" @_start @_end)) + ((tuple_pattern "," @_start . @@ -278,6 +306,13 @@ ","? @_end) (#make-range! "parameter.outer" @parameter.inner @_end)) +; last element, with trailing comma +((tuple_pattern + (_) @_start + . + "," @_end .) + (#make-range! "parameter.outer" @_start @_end)) + ((tuple_struct_pattern "," @_start . @@ -291,6 +326,13 @@ ","? @_end) (#make-range! "parameter.outer" @parameter.inner @_end)) +; last element, with trailing comma +((tuple_struct_pattern + (_) @_start + . + "," @_end .) + (#make-range! "parameter.outer" @_start @_end)) + (tuple_expression "," @_start . @@ -304,6 +346,13 @@ ","? @_end (#make-range! "parameter.outer" @parameter.inner @_end)) +; last element, with trailing comma +((tuple_expression + (_) @_start + . + "," @_end .) + (#make-range! "parameter.outer" @_start @_end)) + ((tuple_type "," @_start . @@ -317,6 +366,13 @@ ","? @_end) (#make-range! "parameter.outer" @parameter.inner @_end)) +; last element, with trailing comma +((tuple_type + (_) @_start + . + "," @_end .) + (#make-range! "parameter.outer" @_start @_end)) + (struct_item body: (field_declaration_list "," @_start @@ -332,6 +388,15 @@ ","? @_end (#make-range! "parameter.outer" @parameter.inner @_end))) +; last element, with trailing comma +(struct_item + body: (field_declaration_list + (_) @_start + . + "," @_end + . + (#make-range! "parameter.outer" @_start @_end))) + (struct_expression body: (field_initializer_list "," @_start @@ -347,6 +412,15 @@ ","? @_end (#make-range! "parameter.outer" @parameter.inner @_end))) +; last element, with trailing comma +(struct_expression + body: (field_initializer_list + (_) @_start + . + "," @_end + . + (#make-range! "parameter.outer" @_start @_end))) + ((closure_parameters "," @_start . @@ -360,6 +434,13 @@ ","? @_end) (#make-range! "parameter.outer" @parameter.inner @_end)) +; last element, with trailing comma +((closure_parameters + (_) @_start + . + "," @_end .) + (#make-range! "parameter.outer" @_start @_end)) + ((arguments "," @_start . @@ -373,6 +454,13 @@ ","? @_end) (#make-range! "parameter.outer" @parameter.inner @_end)) +; last element, with trailing comma +((arguments + (_) @_start + . + "," @_end .) + (#make-range! "parameter.outer" @_start @_end)) + ((type_arguments "," @_start . @@ -386,6 +474,13 @@ ","? @_end) (#make-range! "parameter.outer" @parameter.inner @_end)) +; last element, with trailing comma +((type_arguments + (_) @_start + . + "," @_end .) + (#make-range! "parameter.outer" @_start @_end)) + ((token_tree "," @_start . @@ -399,6 +494,13 @@ ","? @_end) (#make-range! "parameter.outer" @parameter.inner @_end)) +; last element, with trailing comma +((token_tree + (_) @_start + . + "," @_end .) + (#make-range! "parameter.outer" @_start @_end)) + (scoped_use_list list: (use_list "," @_start @@ -414,6 +516,40 @@ ","? @_end (#make-range! "parameter.outer" @parameter.inner @_end))) +; last element, with trailing comma +(scoped_use_list + list: (use_list + (_) @_start + . + "," @_end + . + (#make-range! "parameter.outer" @_start @_end))) + +(array_expression + (_) @parameter.inner) + +; first element, with or without comma +((array_expression + . + (_) @_start + . + ","? @_end) + (#make-range! "parameter.outer" @_start @_end)) + +; second to last element (with leading comma) +((array_expression + "," @_start + . + (_) @_end) + (#make-range! "parameter.outer" @_start @_end)) + +; last element, with trailing comma +((array_expression + (_) @_start + . + "," @_end .) + (#make-range! "parameter.outer" @_start @_end)) + [ (integer_literal) (float_literal) diff --git a/queries/svelte/textobjects.scm b/queries/svelte/textobjects.scm new file mode 100644 index 00000000..c1a9b530 --- /dev/null +++ b/queries/svelte/textobjects.scm @@ -0,0 +1,66 @@ +; inherits: html + +; Svelte-specific text objects +; based on grammar defined at +; https://github.com/tree-sitter-grammars/tree-sitter-svelte +; if block +(if_statement) @block.outer @conditional.outer + +(if_statement + (if_start) + . + (_) @_start + (_)? @_end + . + (if_end) + (#make-range! "block.inner" @_start @_end) + (#make-range! "conditional.inner" @_start @_end)) + +; each block +(each_statement) @block.outer @loop.outer + +(each_statement + (each_start) + . + (_) @_start + (_)? @_end + . + (each_end) + (#make-range! "block.inner" @_start @_end) + (#make-range! "loop.inner" @_start @_end)) + +; key block +(key_statement) @block.outer + +(key_statement + (key_start) + . + (_) @_start + (_)? @_end + . + (key_end) + (#make-range! "block.inner" @_start @_end)) + +; await block +(await_statement) @block.outer + +(await_statement + (await_start) + . + (_) @_start + (_)? @_end + . + (await_end) + (#make-range! "block.inner" @_start @_end)) + +; snippet block +(snippet_statement) @block.outer + +(snippet_statement + (snippet_start) + . + (_) @_start + (_)? @_end + . + (snippet_end) + (#make-range! "block.inner" @_start @_end)) diff --git a/queries/toml/textobjects.scm b/queries/toml/textobjects.scm index a7f1a2ce..09acb6dd 100644 --- a/queries/toml/textobjects.scm +++ b/queries/toml/textobjects.scm @@ -31,3 +31,5 @@ . ","? @_end) (#make-range! "parameter.outer" @parameter.inner @_end)) + +(comment) @comment.outer diff --git a/queries/typescript/textobjects.scm b/queries/typescript/textobjects.scm index 3fb8ce21..264ed216 100644 --- a/queries/typescript/textobjects.scm +++ b/queries/typescript/textobjects.scm @@ -38,3 +38,65 @@ . "}" (#make-range! "class.inner" @_start @_end))) + +; type, interface items as @parameter +; 1. parameter.inner +(property_signature) @parameter.inner + +; 2. parameter.outer: Only one element, no comma +(object_type + . + (property_signature) @parameter.outer .) + +(interface_body + . + (property_signature) @parameter.outer .) + +; 3. parameter.outer: Comma/semicolon before or after +([ + (object_type + "," @_start + . + (property_signature) @_end) + (interface_body + "," @_start + . + (property_signature) @_end) +] + (#make-range! "parameter.outer" @_start @_end)) + +([ + (object_type + (property_signature) @_start + . + "," @_end) + (interface_body + (property_signature) @_start + . + "," @_end) +] + (#make-range! "parameter.outer" @_start @_end)) + +([ + (object_type + ";" @_start + . + (property_signature) @_end) + (interface_body + ";" @_start + . + (property_signature) @_end) +] + (#make-range! "parameter.outer" @_start @_end)) + +([ + (object_type + (property_signature) @_start + . + ";" @_end) + (interface_body + (property_signature) @_start + . + ";" @_end) +] + (#make-range! "parameter.outer" @_start @_end)) diff --git a/queries/verilog/textobjects.scm b/queries/verilog/textobjects.scm index 600125a1..ff3d1ee2 100644 --- a/queries/verilog/textobjects.scm +++ b/queries/verilog/textobjects.scm @@ -1,17 +1,48 @@ -[ - (loop_generate_construct) - (loop_statement) -] @loop.outer +(function_declaration + (function_body_declaration + (tf_port_list) + . + (_) @_start @_end + (_)? @_end + . + "endfunction" + (#make-range! "function.inner" @_start @_end))) @function.outer -[ - (conditional_statement) - (case_item) -] @conditional.outer +(task_declaration + (task_body_declaration + (tf_port_list) + . + (_) @_start @_end + (_)? @_end + . + "endtask" + (#make-range! "function.inner" @_start @_end))) @function.outer -(comment) @comment.outer +[ + (seq_block) + (generate_block) +] @block.outer -(function_declaration) @function.outer +(seq_block + "begin" + (simple_identifier)? + . + (_) @_start @_end + (#not-kind-eq? @_start "simple_identifier") + (_)? @_end + . + "end" + (#make-range! "block.inner" @_start @_end)) -(always_construct) @block.outer +(generate_block + "begin" + (simple_identifier)? + . + (_) @_start @_end + (#not-kind-eq? @_start "simple_identifier") + (_)? @_end + . + "end" + (#make-range! "block.inner" @_start @_end)) -(module_declaration) @class.outer +(comment) @comment.outer diff --git a/scripts/ci-install-ubuntu-latest.sh b/scripts/ci-install-ubuntu-latest.sh index d658ea41..83e916ba 100755 --- a/scripts/ci-install-ubuntu-latest.sh +++ b/scripts/ci-install-ubuntu-latest.sh @@ -1,6 +1,6 @@ -wget "https://github.com/neovim/neovim/releases/download/${NVIM_TAG}/nvim-linux64.tar.gz" -tar -zxf nvim-linux64.tar.gz -sudo ln -s "$(pwd)/nvim-linux64/bin/nvim" /usr/local/bin -rm -rf "$(pwd)/nvim-linux64/lib/nvim/parser" +wget "https://github.com/neovim/neovim/releases/download/${NVIM_TAG}/nvim-linux-x86_64.tar.gz" +tar -zxf nvim-linux-x86_64.tar.gz +sudo ln -s "$(pwd)/nvim-linux-x86_64/bin/nvim" /usr/local/bin +rm -rf "$(pwd)/nvim-linux-x86_64/lib/nvim/parser" mkdir -p ~/.local/share/nvim/site/pack/ci/opt ln -s "$(pwd)" ~/.local/share/nvim/site/pack/ci/opt