[
  {
    "path": ".github/workflows/test.yaml",
    "content": "name: Run tests\n\non:\n  workflow_dispatch:\n  pull_request:\n  push:\n\njobs:\n  check:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        emacs_version:\n          - 30.1\n          # - snapshot # causing issues with compat\n    steps:\n    - uses: actions/checkout@v4\n    - uses: purcell/setup-emacs@master\n      with:\n        version: ${{ matrix.emacs_version }}\n    - uses: emacs-eask/setup-eask@master\n      with:\n        version: 'snapshot'\n    - run: make install-deps\n    - run: make compile\n    - run: make lint\n    - run: make checkdoc\n    - run: make test\n    - run: make test-queries\n    - run: cd converter && go test -v\n"
  },
  {
    "path": ".github/workflows/update-queries.yaml",
    "content": "name: Update tree-siter queries\non:\n  schedule:\n    - cron:  '0 13 * * 5'\n  workflow_dispatch:\njobs:\n  update-queries:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n        with:\n          fetch-depth: 0\n      - name: Update repos\n        run: |\n          git clone --depth 1 https://github.com/nvim-treesitter/nvim-treesitter-textobjects /tmp/nts\n          rm -r queries && cp -r /tmp/nts/queries .\n          ./scripts/fix-queries\n      - name: Create Pull Request\n        uses: peter-evans/create-pull-request@v3\n        with:\n          commit-message: Update tree-sitter queries to latest\n          title: Update tree-sitter queries\n          body: Update tree-sitter queries to latest from nvim-treesitter/nvim-treesitter-textobjects\n          branch: auto-update-queries\n          base: master\n          token: ${{ secrets.REPO_SCOPED_PAT }} # need this to trigger CI"
  },
  {
    "path": ".gitignore",
    "content": "__debug_bin\n.cask/\n.eask/\n*.elc\n"
  },
  {
    "path": "AGENTS.md",
    "content": "## Project Overview\n\nAn Emacs package providing tree-sitter powered text objects for `evil-mode` and `thing-at-point`. Works with both `elisp-tree-sitter` and the builtin `treesit` library (Emacs 29+).\n\n## Build & Test Commands\n\nDependencies are managed via Cask (`Cask` file). Install with `cask install`.\n\n- **Compile:** `make compile`\n- **Lint:** `make lint` (package-lint on the main .el file)\n- **Checkdoc:** `make checkdoc`\n- **Run tests:** `make test` (core functionality tests using ert)\n- **Run query tests:** `make test-queries` (per-language query loading tests)\n- **Converter tests:** `cd converter && go test -v`\n\nAll make targets use `cask exec emacs` under the hood. The `elpa` target runs `cask install` automatically when needed.\n\n## Architecture\n\n### Elisp Modules\n\n- `evil-textobj-tree-sitter.el` — Entry point; requires core and thing-at-point modules\n- `evil-textobj-tree-sitter-core.el` — All core logic: query loading, node filtering, range computation, textobj/goto functions. Supports dual backends (`elisp-tree-sitter` vs builtin `treesit`) detected at runtime\n- `evil-textobj-tree-sitter-thing-at-point.el` — Registers tree-sitter things (function, loop, conditional, etc.) with Emacs `thing-at-point`\n\n### Query System (Two Separate Sets)\n\n- `queries/` — For `elisp-tree-sitter`, sourced from [nvim-treesitter-textobjects](https://github.com/nvim-treesitter/nvim-treesitter-textobjects). Uses `#make-range!` directives\n- `treesit-queries/` — For builtin `treesit`, sourced from [Helix editor](https://github.com/helix-editor/helix). Updated via `scripts/get-helix-queries`\n- `additional-queries/` — Extra queries appended to treesit-queries during the build step for cases helix doesn't cover\n- `fixtures/` — Test query files for unit tests\n\nThe correct query directory is selected at runtime based on whether the current buffer uses a `-ts-mode` (treesit) or regular mode (elisp-tree-sitter).\n\n### Converter (Go)\n\n`converter/` contains a Go program that transforms nvim-treesitter query format (with `#make-range!` directives) into the `_start`/`_end` capture format used by `elisp-tree-sitter`. Used by `scripts/get-neovim-queries`.\n\n### Scripts\n\n- `scripts/get-neovim-queries` — Pulls queries from nvim-treesitter-textobjects into `queries/`. See [docs/updating-neovim-queries.md](docs/updating-neovim-queries.md) for the manual fixup process required after pulling.\n- `scripts/get-helix-queries` — Pulls queries from Helix into `treesit-queries/`, appending `additional-queries/`\n- `scripts/fix-queries` — Post-processing fixups on query files\n\n### Key Design Details\n\n- `evil-textobj-tree-sitter-major-mode-language-alist` maps Emacs major modes to tree-sitter language names (including both regular and `-ts-mode` variants)\n- Query files support `;; inherits:` directives for language inheritance (e.g., typescript inherits javascript)\n- Node selection priority: nodes containing point (innermost first), then nodes after point\n- `evil-textobj-tree-sitter-use-next-if-not-within` controls whether to fall through to next match when not inside one\n- Tests run against both `elisp-tree-sitter` and `treesit` backends (e.g., `c-mode` and `c-ts-mode`)\n\n### Notes\n- This repo is maintained using jj and not git (do not try to run any jj commands).\n"
  },
  {
    "path": "Cask",
    "content": "(source gnu)\n(source melpa)\n\n(package-file \"evil-textobj-tree-sitter.el\")\n\n(development\n (depends-on \"ert\")\n (depends-on \"package-lint\")\n (depends-on \"evil\")\n (depends-on \"tree-sitter\")\n (depends-on \"go-mode\")\n (depends-on \"tree-sitter-langs\")\n (depends-on \"treesit-auto\"))"
  },
  {
    "path": "Eask",
    "content": ";; -*- mode: eask; lexical-binding: t -*-\n\n(package \"evil-textobj-tree-sitter\"\n         \"0.5\"\n         \"Provides evil textobjects using tree-sitter\")\n\n(website-url \"https://github.com/meain/evil-textobj-tree-sitter\")\n(keywords \"evil\" \"tree-sitter\" \"text-object\" \"convenience\")\n\n(package-file \"evil-textobj-tree-sitter.el\")\n\n(source \"gnu\")\n(source \"melpa\")\n\n(depends-on \"emacs\" \"25.1\")\n\n(development\n (depends-on \"ert\")\n (depends-on \"package-lint\")\n (depends-on \"evil\")\n (depends-on \"tree-sitter\")\n (depends-on \"go-mode\")\n (depends-on \"tree-sitter-langs\")\n (depends-on \"treesit-auto\"))\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2021 Abin Simon\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "Makefile",
    "content": "compile:\n\teask compile\n\nlint:\n\teask lint package evil-textobj-tree-sitter.el\n\ncheckdoc:\n\teask lint checkdoc\n\ntest: install-deps\n\teask test ert evil-textobj-tree-sitter-test.el\n\ntest-queries: install-deps\n\teask test ert evil-textobj-tree-sitter-query-test.el\n\ninstall-deps:\n\teask install-deps --dev\n\n.PHONY: compile lint checkdoc test test-queries install-deps\n"
  },
  {
    "path": "README.md",
    "content": "# evil-textobj-tree-sitter\n\n[![MELPA](https://melpa.org/packages/evil-textobj-tree-sitter-badge.svg)](https://melpa.org/#/evil-textobj-tree-sitter)\n[![test](https://github.com/meain/evil-textobj-tree-sitter/actions/workflows/test.yaml/badge.svg)](https://github.com/meain/evil-textobj-tree-sitter/actions/workflows/test.yaml)\n\nTree-sitter powered textobjects for Emacs. You can use them with `evil-mode` or with `thing-at-point`.\n\n![gif](https://meain.io/blog-videos/gifs/evil-textobj-treesitter.gif)\n\nThis package will let you create evil textobjects using tree-sitter\ngrammars. You can easily create function,class,comment etc textobjects\nin multiple languages. It also make additional `things` available in\n`thing-at-point` like `function`, `class`, `loop`, `comment` etc.\n\n> It can work with either elisp-tree-sitter or the builtin treesit library.\n\n# Installation\n\nYou can install `evil-textobj-tree-sitter` from melpa. Here is how you would do it using `use-package` and `package.el`:\n\n```emacs-lisp\n(use-package evil-textobj-tree-sitter :ensure t)\n```\n\nOr you can use `straight.el`:\n\n```emacs-lisp\n(use-package evil-textobj-tree-sitter :straight t)\n```\n\nOr using `straight.el` and `el-get` to pull from source:\n\n```emacs-lisp\n(use-package evil-textobj-tree-sitter\n  :straight (evil-textobj-tree-sitter :type git\n                      :host github\n                      :repo \"meain/evil-textobj-tree-sitter\"\n                      :files (:defaults \"queries\" \"treesit-queries\")))\n```\n\n> You will also have to setup [`tree-sitter`](https://github.com/emacs-tree-sitter/elisp-tree-sitter).\n\n# Usage\n\n## `thing-at-point` additions\n\nThe package adds more \"things\" to `thing-at-point`. You can find all\nthe things that it adds in the\n[source](https://github.com/meain/evil-textobj-tree-sitter/blob/master/evil-textobj-tree-sitter-thing-at-point.el).\n\nYou can use these like any other `thing-at-point` entries. For example\nin case of functions, we make the following available:\n\n- `(thing-at-point 'function)`\n- `(function-at-point)`\n\n## Mapping textobjects\n\nBy default, the library does not provide any keybindings, but it\nshould be relatively easy to add them.\n\n```emacs-lisp\n;; bind `function.outer`(entire function block) to `f` for use in things like `vaf`, `yaf`\n(define-key evil-outer-text-objects-map \"f\" (evil-textobj-tree-sitter-get-textobj \"function.outer\"))\n;; bind `function.inner`(function block without name and args) to `f` for use in things like `vif`, `yif`\n(define-key evil-inner-text-objects-map \"f\" (evil-textobj-tree-sitter-get-textobj \"function.inner\"))\n\n;; You can also bind multiple items and we will match the first one we can find\n(define-key evil-outer-text-objects-map \"a\" (evil-textobj-tree-sitter-get-textobj (\"conditional.outer\" \"loop.outer\")))\n```\n\n## Custom textobjects\n\nIf you are not able to find the text object that you are looking for\nin the builtin list, you can create custom text objects by passing the\na custom query with captures.\n\nFor example if you want to create text object to select `import`\nstatements, you can write something like below. _You will have to\nprovide the tree-sitter queries for all the languages that you want it\nto work for_\n\n```emacs-lisp\n;; The first arguemnt to `evil-textobj-tree-sitter-get-textobj' will be the capture group to use\n;; and the second arg will be an alist mapping major-mode to the corresponding query to use.\n(define-key evil-outer-text-objects-map \"m\" (evil-textobj-tree-sitter-get-textobj \"import\"\n                                              '((python-mode . ((import_statement) @import)) ;; default modes (using tree-sitter)\n                                                (python-ts-mode . ((import_statement) @import)) ;; treesit modes\n                                                (rust-mode . ((use_declaration) @import)))))\n```\n\n## Goto\n\nWe have also added support for for a fancier version of\n`goto-char`. You can use this to go to the next function, previous\nclass or do any motions like that.\n\nYou can use the `evil-textobj-tree-sitter-goto-textobj` function to\ninvoke goto. You can either use this in other function or just bound\nto a key. The first argument is the textobj that you want to use, the\nsecond one specifies if you want to search forward or backward and the\nlast one is for specifying weather to go to the start or end of the\ntextobj.\n\nBelow are some sample binding that you can do. You can use any textobj\nthat is available here.\n\n```emacs-lisp\n;; Goto start of next function\n(define-key evil-normal-state-map\n            (kbd \"]f\")\n            (lambda ()\n              (interactive)\n              (evil-textobj-tree-sitter-goto-textobj \"function.outer\")))\n\n;; Goto start of previous function\n(define-key evil-normal-state-map\n            (kbd \"[f\")\n            (lambda ()\n              (interactive)\n              (evil-textobj-tree-sitter-goto-textobj \"function.outer\" t)))\n\n;; Goto end of next function\n(define-key evil-normal-state-map\n            (kbd \"]F\")\n            (lambda ()\n              (interactive)\n              (evil-textobj-tree-sitter-goto-textobj \"function.outer\" nil t)))\n\n;; Goto end of previous function\n(define-key evil-normal-state-map\n            (kbd \"[F\")\n            (lambda ()\n              (interactive)\n              (evil-textobj-tree-sitter-goto-textobj \"function.outer\" t t)))\n```\n\n# Development\n\nA Nix flake is provided for development. Enter the dev shell with:\n\n```sh\nnix develop\n```\n\nThis gives you `emacs`, `eask`, `go`, and `gcc`. Then run:\n\n```sh\nmake install-deps  # install Emacs package dependencies\nmake test          # run core tests\nmake test-queries  # run per-language query loading tests\nmake compile       # byte-compile\nmake lint          # package-lint\nmake checkdoc      # checkdoc\ncd converter && go test -v  # converter tests\n```\n\n# Finding and contributing to textobjects\n\n`evil-textobj-tree-sitter` work with both builtin `treesit` and\n`elisp-tree-sitter`. The queries in use are a bit different in both\ncases with the `elisp-tree-sitter` version currently being more feature\ncomplete. In both cases we pull the queries from external sources. For\n`elisp-tree-sitter`, we source them from\n[nvim-treesitter/nvim-treesitter-textobjects](https://github.com/nvim-treesitter/nvim-treesitter-textobjects#built-in-textobjects)\nand is places into\n[queries](https://github.com/meain/evil-textobj-tree-sitter/tree/master/queries)\ndirectory. And for `treesit` queries, it is sourced from\n[helix](https://github.com/helix-editor/helix/tree/master/runtime/queries)\nand placed in\n[treesit-queries](https://github.com/meain/evil-textobj-tree-sitter/tree/master/treesit-queries).\nYou can check these files to see what all is available. If you are\ninteresting in contributing additional textobjects, you can do so by\nsubmitting to the respective projects. If there is enough interest, I\ndon't mind starting to manage queries ourselves.\n\nIf you are adding a completely new language, there is two other things\nthat you will have to do to make sure everything will work well.\n\n1. Make sure the lang is available in [emacs-tree-sitter/tree-sitter-langs](https://github.com/emacs-tree-sitter/tree-sitter-langs/tree/master/queries) or `treesit`.\n2. Make sure we have a `major-mode` mapping in [evil-textobj-tree-sitter-major-mode-language-alist](https://github.com/meain/evil-textobj-tree-sitter/blob/d416b3ab8610f179defadd58f5c20fdc65bf21e5/evil-textobj-tree-sitter.el#L40)\n\n*If you would like to test out new textobjects, I would suggest using\n[custom textobjects](#custom-textobjects). If you want to edit the\nquery files, you can edit them in\n`evil-textobj-tree-sitter--queries-dir` or by forking the repo, and\nusing the forked version with your edits.*\n\n> For cases where upstream does not consider the queries (only in case\n> of treesit queries, ie the ones from helix), you can add them to\n> `additional-queries` directory. They will get appended with the\n> treesit queries during the build step(`./scripts/get-helix-queries`).\n\n# License\n\nThe primary codebase is licensed under `Apache-2.0`. The queries have\nbe taken from\n[nvim-treesitter/nvim-treesitter-textobjects](https://github.com/nvim-treesitter/nvim-treesitter-textobjects)\nwhich is also licensed under the same license.\n"
  },
  {
    "path": "additional-queries/README.md",
    "content": "These folder contains queries that will not be accepted to upstream helix (not neovim as we are no longer maintaining it for now), for example ones like loop and conditional.\n\nExample: https://github.com/meain/evil-textobj-tree-sitter/pull/108"
  },
  {
    "path": "additional-queries/c/textobjects.scm",
    "content": "(for_statement\n body: (_) @loop.inner) @loop.outer\n\n(while_statement\n body: (_) @loop.inner) @loop.outer\n\n(do_statement\n body: (_) @loop.inner) @loop.outer\n\n(if_statement\n consequence: (_) @conditional.inner) @conditional.outer"
  },
  {
    "path": "additional-queries/go/textobjects.scm",
    "content": "(if_statement\n  consequence: (block) @conditional.inner) @conditional.outer\n\n(if_statement\n  alternative: (block) @conditional.inner)? @conditional.outer\n\n(expression_switch_statement\n  (expression_case) @conditional.inner) @conditional.outer\n\n(type_switch_statement\n  (type_case) @conditional.inner) @conditional.outer\n\n(select_statement\n  (communication_case) @conditional.inner) @conditional.outer\n\n(for_statement\n  body: (block) @loop.inner) @loop.outer"
  },
  {
    "path": "additional-queries/python/textobjects.scm",
    "content": "(for_statement\n body: (_) @loop.inner) @loop.outer\n\n(while_statement\n body: (_) @loop.inner) @loop.outer\n\n(if_statement\n consequence: (_) @conditional.inner) @conditional.outer"
  },
  {
    "path": "additional-queries/rust/textobjects.scm",
    "content": "(loop_expression\n  body: (_) @loop.inner) @loop.outer\n\n(while_expression\n  body: (_) @loop.inner) @loop.outer\n\n(for_expression\n  body: (_) @loop.inner) @loop.outer\n\n(if_expression\n  consequence: (_) @conditional.inner) @conditional.outer"
  },
  {
    "path": "converter/go.mod",
    "content": "module github.com/meain/evil-texobj-treesitter-converter\n\ngo 1.16\n\nrequire (\n\tgithub.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883\n\tgithub.com/sergi/go-diff v1.2.0 // indirect\n\tgithub.com/stretchr/testify v1.5.1 // indirect\n)\n"
  },
  {
    "path": "converter/go.sum",
    "content": "github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=\ngithub.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=\ngithub.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\n"
  },
  {
    "path": "converter/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"os\"\n\t\"regexp\"\n\t\"strings\"\n)\n\nfunc reprint(col []string, mr []string) []string {\n\tif mr != nil {\n\t\tibc := 0\n\t\ticol := []string{}\n\t\tfor _, ie := range col {\n\t\t\tswitch ie {\n\t\t\tcase \"(\":\n\t\t\t\tibc += 1\n\t\t\t\ticol = append(icol, ie)\n\t\t\tcase \")\":\n\t\t\t\ticol = append(icol, ie)\n\t\t\t\tibc -= 1\n\t\t\tcase mr[1]:\n\t\t\t\tif ie != \"@_start\" && ie != \"@_end\" {\n\t\t\t\t\ticol = append(icol, ie)\n\t\t\t\t}\n\t\t\t\ticol = append(icol, \" \", \"@\"+mr[0]+\"._start\")\n\t\t\tcase mr[2]:\n\t\t\t\tif ie != \"@_start\" && ie != \"@_end\" {\n\t\t\t\t\ticol = append(icol, ie)\n\t\t\t\t}\n\t\t\t\ticol = append(icol, \" \", \"@\"+mr[0]+\"._end\")\n\t\t\tdefault:\n\t\t\t\ticol = append(icol, ie)\n\t\t\t}\n\t\t}\n\t\treturn icol\n\t} else {\n\t\treturn col\n\t}\n}\n\nfunc tokenize(input string) []string {\n\t// I thought of writing a full tokenizer, but lets use a hacky one\n\treg := regexp.MustCompile(\"[^( )]+|[( )]\")\n\tlines := strings.Split(input, \"\\n\")\n\tsplit := []string{}\n\tfor _, l := range lines {\n\t\tsplit = append(split, reg.FindAllString(l, -1)...)\n\t\tsplit = append(split, \"\\n\")\n\t}\n\n\tmsplit := []string{}\n\tins := false\n\ts := []string{}\n\tfor _, e := range split {\n\t\tswitch e {\n\t\tcase \"\\\"\":\n\t\t\tif ins {\n\t\t\t\tmsplit = append(msplit, \"\\\"\"+strings.Join(s, \"\")+\"\\\"\")\n\t\t\t\ts = []string{}\n\t\t\t}\n\t\t\tins = !ins\n\t\tdefault:\n\t\t\tif ins {\n\t\t\t\ts = append(s, e)\n\t\t\t} else {\n\t\t\t\tmsplit = append(msplit, e)\n\t\t\t}\n\t\t}\n\t}\n\treturn msplit\n}\n\nfunc reformat(input string) string {\n\tsplit := tokenize(input)\n\tbc := 0\n\ti := 0\n\tvar mr []string\n\tvar col []string\n\tvar out []string\n\tfor {\n\t\te := split[i]\n\t\tswitch e {\n\t\tcase \"(\":\n\t\t\tbc += 1\n\t\t\tcol = append(col, e)\n\t\tcase \")\":\n\t\t\tbc -= 1\n\t\t\tcol = append(col, e)\n\t\t\tif bc == 0 {\n\t\t\t\tout = append(out, reprint(col, mr)...)\n\t\t\t\tmr = nil\n\t\t\t\tcol = []string{}\n\t\t\t}\n\t\tcase \"#make-range!\":\n\t\t\tcol = col[:len(col)-1]\n\t\t\tbc -= 1\n\t\t\tmr = []string{split[i+2][1 : len(split[i+2])-1], split[i+4], split[i+6]}\n\t\t\ti += 7\n\t\tdefault:\n\t\t\tif bc == 0 {\n\t\t\t\tout = append(out, e)\n\t\t\t} else {\n\t\t\t\tcol = append(col, e)\n\t\t\t}\n\t\t}\n\n\t\ti++\n\t\tif i >= len(split) {\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn strings.Join(out, \"\")\n}\n\nfunc main() {\n\t// TODO: see what is with function.outer.start in the source\n\tcontent, err := ioutil.ReadFile(os.Args[1]) // the file is inside the local directory\n\tif err != nil {\n\t\tlog.Fatalf(\"unable to read file %s\", os.Args[1])\n\t}\n\tfmt.Print(reformat(string(content)))\n}\n"
  },
  {
    "path": "converter/main_test.go",
    "content": "package main\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/andreyvit/diff\"\n)\n\nfunc TestReformatExact(t *testing.T) {\n\tinput := `(function_definition\n\tbody: (block)? @function.inner) @function.outer`\n\texpected := `(function_definition\n\tbody: (block)? @function.inner) @function.outer`\n\n\tactual := reformat(input)\n\tif a, e := strings.TrimSpace(actual), strings.TrimSpace(expected); a != e {\n\t\tt.Errorf(\"Result not as expected:\\n%v\", diff.LineDiff(e, a))\n\t}\n}\n\nfunc TestReformatSimple(t *testing.T) {\n\tinput := `((tuple\n\",\" @_start .\n(_) @parameter.inner\n)\n(#make-range! \"parameter.outer\" @_start @parameter.inner)\n)`\n\texpected := `((tuple\n\",\"  @parameter.outer._start .\n(_) @parameter.inner @parameter.outer._end\n)\n\n)`\n\n\tactual := reformat(input)\n\t// fmt.Println(strings.ReplaceAll(actual, \" \", \".\"))\n\t// fmt.Println(strings.ReplaceAll(expected, \" \", \".\"))\n\tif a, e := strings.TrimSpace(actual), strings.TrimSpace(expected); a != e {\n\t\tt.Errorf(\"Result not as expected:\\n%v\", diff.LineDiff(e, a))\n\t}\n}\n\nfunc TestReformatQuotedBracket(t *testing.T) {\n\tinput := `((tuple\n\"(\" .\n(_) @parameter.inner\n. \",\"? @_end\n)\n(#make-range! \"parameter.outer\" @parameter.inner @_end)\n)`\n\texpected := `((tuple\n\"(\" .\n(_) @parameter.inner @parameter.outer._start\n. \",\"?  @parameter.outer._end\n)\n\n)`\n\n\tactual := reformat(input)\n\tif a, e := strings.TrimSpace(actual), strings.TrimSpace(expected); a != e {\n\t\tt.Errorf(\"Result not as expected:\\n%v\", diff.LineDiff(e, a))\n\t}\n}\n\nfunc TestReformatRoot(t *testing.T) {\n\tinput := `(parameter_list\n\",\" @_start .\n(parameter_declaration) @parameter.inner\n(#make-range! \"parameter.outer\" @_start @parameter.inner))`\n\texpected := `(parameter_list\n\",\"  @parameter.outer._start .\n(parameter_declaration) @parameter.inner @parameter.outer._end\n)`\n\n\tactual := reformat(input)\n\tif a, e := strings.TrimSpace(actual), strings.TrimSpace(expected); a != e {\n\t\tt.Errorf(\"Result not as expected:\\n%v\", diff.LineDiff(e, a))\n\t}\n}\n"
  },
  {
    "path": "docs/updating-neovim-queries.md",
    "content": "# Doc for updating neovim queries\n\nWe need to manually edit the neovim queries after pulling it down as we currently do not support all query formats that are available within Neovim in Emacs.\n\n1. Run the `./scripts/get-neovim-queries` command to pull down the latest update of neovim queries.\n2. Fix things we don't support (see below). Use previous version of same query if they are available from the diff, but skip them otherwise.\n3. Grep for unsupported predicates and make sure none remain: `grep -rn '#offset!\\|#any-of?\\|#not-any-of?\\|#not-lua-match?\\|#lua-match?' queries/`\n4. Verify all parentheses are balanced (see \"Ensuring balanced brackets\" below).\n5. Run tests: `make test && make test-queries`\n\n\n## Things we do not support\n\nThese are Neovim-specific predicates/directives that `elisp-tree-sitter` does not handle.\nQueries using these need to be manually removed or rewritten using the previous\nversion of the same query from the diff.\n\n- `#offset!` — Neovim directive to adjust capture boundaries (e.g., trimming comment markers). Not a standard tree-sitter predicate.\n- `#not-lua-match?` — Neovim-specific Lua pattern negation. Note: `#lua-match?` is auto-converted to `#match?` by `fix-queries`, and `#not-lua-match?` becomes `#not-match?` via the same sed rule. However, verify the conversion happened; if not, manually replace `#not-lua-match?` with `#not-match?`.\n- `#any-of?` — Set membership check. May be silently ignored by older versions of the tree-sitter C library bundled in `elisp-tree-sitter`, leading to false-positive matches.\n- `#not-any-of?` — Negated set membership. Same concern as `#any-of?`.\n\n### How to fix each unsupported predicate\n\n**`#offset!`**: Do NOT blindly delete the `(#offset! ...)` line — it is\noften the last expression inside a surrounding `(...)` form, and removing\nit without also fixing the closing parenthesis will leave unbalanced\nbrackets. Instead, remove the entire `(#offset! ...)` expression and\nmake sure the enclosing pattern still has balanced parentheses. For\nexample:\n\n```scheme\n;; Before (with #offset!):\n(if_statement\n  condition: (_) @conditional.inner\n  (#offset! @conditional.inner 0 1 0 -1))\n\n;; After (remove #offset! line, keep closing paren):\n(if_statement\n  condition: (_) @conditional.inner)\n```\n\n**`#any-of?`**: Convert to `#match?` with regex alternation, or expand\ninto separate patterns each using `#eq?`.\n\n```scheme\n;; Before:\n(#any-of? @name \"foo\" \"bar\" \"baz\")\n\n;; Option 1 — #match? (preferred when there are many values):\n(#match? @name \"^(foo|bar|baz)$\")\n\n;; Option 2 — duplicate pattern with #eq? (preferred for few values):\n;; Copy the entire enclosing pattern once per value, each with:\n(#eq? @name \"foo\")\n```\n\n**`#not-any-of?`**: Convert to multiple `#not-eq?` predicates (AND\nsemantics — all must hold).\n\n```scheme\n;; Before:\n(#not-any-of? @name \"do\" \"while\" \"when\")\n\n;; After:\n(#not-eq? @name \"do\")\n(#not-eq? @name \"while\")\n(#not-eq? @name \"when\")\n```\n\n**`#not-lua-match?`**: Replace with `#not-match?` (adjusting the pattern\nfrom Lua pattern syntax to regex if needed).\n\n## Ensuring balanced brackets\n\nAfter making edits, verify that every query file has balanced\nparentheses and square brackets. A quick check:\n\n```sh\n# Note: must strip string literals first since queries contain \"(\" and\n# similar inside strings which would throw off a naive character count.\nfor f in queries/*/textobjects.scm; do\n  stripped=$(sed 's/\"[^\"]*\"//g' \"$f\")\n  opens=$(echo \"$stripped\" | tr -cd '(' | wc -c)\n  closes=$(echo \"$stripped\" | tr -cd ')' | wc -c)\n  if [ \"$opens\" -ne \"$closes\" ]; then\n    echo \"UNBALANCED parens in $f: (=$opens )=$closes\"\n  fi\n  opens=$(echo \"$stripped\" | tr -cd '[' | wc -c)\n  closes=$(echo \"$stripped\" | tr -cd ']' | wc -c)\n  if [ \"$opens\" -ne \"$closes\" ]; then\n    echo \"UNBALANCED brackets in $f: [=$opens ]=$closes\"\n  fi\ndone\n```\n\nIf any file is reported as unbalanced, open it and fix the issue before\nrunning tests.\n\n## Things that are supported\n- `#eq?` — Standard tree-sitter equality predicate, works as-is.\n- `#not-eq?` — Standard negated equality, works as-is.\n- `#match?` — Standard regex matching, works as-is.\n- `#not-match?` — Standard negated regex matching, works as-is.\n- `#make-range!` — Neovim-specific, but handled by the Go converter in `converter/` which transforms it to `_start`/`_end` captures.\n"
  },
  {
    "path": "evil-textobj-tree-sitter-core.el",
    "content": ";;; evil-textobj-tree-sitter-core.el --- Provides evil textobjects using tree-sitter -*- lexical-binding: t; -*-\n\n;; URL: https://github.com/meain/evil-textobj-tree-sitter\n;; Keywords: evil, tree-sitter, text-object, convenience\n;; SPDX-License-Identifier: Apache-2.0\n;; Package-Requires: ((emacs \"25.1\"))\n;; Version: 0.5\n\n;;; Commentary:\n;; This package is a port of nvim-treesitter/nvim-treesitter-textobjects.\n;; This package will let you create evil textobjects using the power\n;; of tree-sitter grammars.  You can easily create\n;; function,class,comment etc textobjects in multiple languages.\n;;\n;; You can do a sample map like below to create a function textobj.\n;; (define-key evil-outer-text-objects-map \"f\"\n;;             (evil-textobj-tree-sitter-get-textobj \"function.outer\"))\n;; `evil-textobj-tree-sitter-get-textobj' will return you a function\n;; that you can use in a define-key map.  You can pass in any of the\n;; supported queries as an arg of that function.  You can also pass in\n;; multiple queries as a list and we will match on all of them, ranked\n;; on which ones comes up first in the file.\n;; You can find more info in the  README.md file at\n;; https://github.com/meain/evil-textobj-tree-sitter\n\n;;; Code:\n\n(require 'cl-lib)\n(require 'map)\n\n(defvar evil-textobj-tree-sitter--can-use-elisp-treesitter\n  (require 'tree-sitter nil t)\n  \"If non-nil, we are can make use of elisp-tree-sitter instead of builtin.\")\n(defvar evil-textobj-tree-sitter--can-use-builtin-treesit\n  (require 'treesit nil t)\n  \"If non-nil, we are can make use of builtin treesit instead of elisp-tree-sitter.\")\n\n(defvar evil-textobj-tree-sitter--evil-available (require 'evil nil t)\n  \"Specifies if we have `evil-mode' available to use in package.\")\n\n(defgroup evil-textobj-tree-sitter nil \"Text objects based on tree-sitter for Evil.\"\n  :group 'tools)\n\n;; Ignore warnings from optionally requiring tree-sitter and treesit\n(defvar tree-sitter-language)\n(defvar tree-sitter-tree)\n(declare-function tsc-node-byte-range \"tsc\" t t)\n(declare-function tsc--buffer-substring-no-properties \"tsc\")\n(declare-function tsc-query-matches \"tsc\")\n(declare-function tsc-root-node \"tsc\" t t)\n(declare-function tsc-make-query \"tsc\")\n(declare-function treesit-node-end \"treesit.c\")\n(declare-function treesit-node-start \"treesit.c\")\n(declare-function treesit-query-capture \"treesit.c\")\n(declare-function treesit-buffer-root-node \"treesit\")\n\n(defconst evil-textobj-tree-sitter--dir (file-name-directory (locate-library \"evil-textobj-tree-sitter.el\"))\n  \"The directory where the library `tree-sitter-langs' is located.\")\n\n\n(defun evil-textobj-tree-sitter--use-builtin-treesitter ()\n  \"Return non-nil if we should use builtin treesitter.\"\n  (and evil-textobj-tree-sitter--can-use-builtin-treesit\n       (let ((major-mode-name (symbol-name major-mode)))\n         (or (string-suffix-p \"-ts-mode\" major-mode-name)\n             (and (bound-and-true-p rust-mode-treesitter-derive)\n                  (derived-mode-p 'rust-mode))))))\n\n(defun evil-textobj-tree-sitter--get-queries-dir ()\n  \"Get the queries directory.\nCurrently treesit queries are different from queries for elisp-tree-sitter.\"\n  (if (evil-textobj-tree-sitter--use-builtin-treesitter)\n      (file-name-as-directory (concat evil-textobj-tree-sitter--dir \"treesit-queries\"))\n    (file-name-as-directory (concat evil-textobj-tree-sitter--dir \"queries\"))))\n\n(defcustom evil-textobj-tree-sitter--get-queries-dir-func  #'evil-textobj-tree-sitter--get-queries-dir\n  \"Function to get location for the queries.\"\n  :group 'evil-textobj-tree-sitter\n  :type 'function)\n\n(defcustom evil-textobj-tree-sitter-major-mode-language-alist nil\n  \"Alist that maps major modes to tree-sitter language names.\"\n  :group 'evil-textobj-tree-sitter\n  :type '(alist :key-type symbol\n                :value-type string))\n(pcase-dolist (`(,major-mode . ,lang-symbol)\n               (reverse '((c++-mode . \"cpp\")\n                          (c++-ts-mode . \"cpp\")\n                          (c-mode . \"c\")\n                          (c-ts-mode . \"c\")\n                          (csharp-mode . \"c_sharp\")\n                          (csharp-ts-mode . \"c-sharp\")\n                          (elixir-mode . \"elixir\")\n                          (elixir-ts-mode . \"elixir\")\n                          (elm-mode . \"elm\")\n                          (elm-ts-mode . \"elm\")\n                          (ess-r-mode . \"r\")\n                          (go-mode . \"go\")\n                          (go-ts-mode . \"go\")\n                          (haskell-mode . \"haskell\")\n                          (haskell-ts-mode . \"haskell\")\n                          (html-mode . \"html\")\n                          (html-ts-mode . \"html\")\n                          (java-mode . \"java\")\n                          (java-ts-mode . \"java\")\n                          (javascript-mode . \"javascript\")\n                          (javascript-ts-mode . \"javascript\")\n                          (js-mode . \"javascript\")\n                          (js-ts-mode . \"javascript\")\n                          (js2-mode . \"javascript\")\n                          (js3-mode . \"javascript\")\n                          (julia-mode . \"julia\")\n                          (julia-ts-mode . \"julia\")\n                          (matlab-mode . \"matlab\")\n                          (tuareg-mode . \"ocaml\")\n                          (php-mode . \"php\")\n                          (php-ts-mode . \"php\")\n                          (prisma-mode . \"prisma\")\n                          (prisma-ts-mode . \"prisma\")\n                          (python-mode . \"python\")\n                          (python-ts-mode . \"python\")\n                          (rjsx-mode . \"javascript\")\n                          (ruby-mode . \"ruby\")\n                          (ruby-ts-mode . \"ruby\")\n                          (rust-mode . \"rust\")\n                          (rust-ts-mode . \"rust\")\n                          (rustic-mode . \"rust\")\n                          (sh-mode . \"bash\")\n                          (bash-ts-mode . \"sh\")\n                          (shell-script-mode . \"bash\")\n                          (tsx-mode . \"tsx\")\n                          (tsx-ts-mode . \"tsx\")\n                          (typescript-mode . \"typescript\")\n                          (typescript-ts-mode . \"typescript\")\n                          (verilog-mode . \"verilog\")\n                          (zig-mode . \"zig\"))))\n  (setf (map-elt evil-textobj-tree-sitter-major-mode-language-alist\n                 major-mode) lang-symbol))\n\n(defcustom evil-textobj-tree-sitter-use-next-if-not-within t\n  \"When non-nil, use the next match if we are not within one.\"\n  :group 'evil-textobj-tree-sitter\n  :type 'boolean)\n\n(defun evil-textobj-tree-sitter--nodes-filter-before (nodes)\n  \"NODES which contain the current after them.\"\n  (sort (cl-remove-if-not (lambda (x)\n                            (< (car (last x)) (point)))\n                          nodes)\n        (lambda (x y) (< (car (last x)) (car (last y))))))\n\n(defun evil-textobj-tree-sitter--nodes-filter-within (nodes)\n  \"NODES which contain the current point inside them ordered inside out.\"\n  (let ((byte-pos (point)))\n    (sort (cl-remove-if-not (lambda (x)\n                              (and (<= (nth 1 x) byte-pos)\n                                   (< byte-pos (car (last x)))))\n                            nodes)\n          (lambda (x y)\n            (< (+ (abs (- byte-pos (nth 1 x)))\n                  (abs (- byte-pos (car (last x)))))\n               (+ (abs (- byte-pos (nth 1 y)))\n                  (abs (- byte-pos (car (last y))))))))))\n\n(defun evil-textobj-tree-sitter--nodes-filter-after (nodes)\n  \"NODES which contain the current point before them ordered top to bottom.\"\n  (sort (cl-remove-if-not (lambda (x)\n                            (> (nth 1 x) (point)))\n                          nodes)\n        (lambda (x y) (< (nth 1 x) (nth 1 y)))))\n\n(defun evil-textobj-tree-sitter--get-inherits-line (filename)\n  \"Get the inherits line from `FILENAME'.\nIt might not be on the fist line and so we cannot just get the first line.\"\n  (with-temp-buffer\n    (if (file-exists-p filename)\n        (progn\n          (insert-file-contents filename)\n          (goto-char (point-min))\n          (search-forward \"; inherits: \" nil t)\n          (let ((line (thing-at-point 'line t)))\n            (if (string-match \"^; inherits: \\\\([a-z_,()]+\\\\)$\" line)\n                (match-string 1 line)))))))\n\n(defun evil-textobj-tree-sitter--get-query-from-dir (language queries-dir top-level)\n  \"Get tree sitter query for `LANGUAGE' from `QUERIES-DIR'.\n`TOP-LEVEL' is used to mention if we should load optional inherits.\nhttps://github.com/nvim-treesitter/nvim-treesitter/pull/564\"\n  (let ((filename (concat queries-dir language \"/textobjects.scm\")))\n    (with-temp-buffer\n      (if (file-exists-p filename)\n          (progn\n            (insert-file-contents filename)\n            (goto-char (point-min))\n            (let ((inherits-line (evil-textobj-tree-sitter--get-inherits-line filename)))\n              (if inherits-line\n                  (insert (string-join (mapcar (lambda (x)\n                                                 (if (string-prefix-p \"(\" x)\n                                                     (if top-level\n                                                         (evil-textobj-tree-sitter--get-query-from-dir (substring x 1 -1)\n                                                                                                       queries-dir nil))\n                                                   (evil-textobj-tree-sitter--get-query-from-dir x queries-dir nil)))\n                                               (split-string inherits-line \",\"))\n                                       \"\\n\"))))\n            (buffer-string))))))\n\n(defun evil-textobj-tree-sitter--get-query (language)\n  \"Get tree sitter query for `LANGUAGE'.\"\n  (evil-textobj-tree-sitter--get-query-from-dir language (funcall evil-textobj-tree-sitter--get-queries-dir-func) t))\n\n(defun evil-textobj-tree-sitter--treesit-get-nodes (query)\n  \"Get nodes for `QUERY' using builtin `treesit'.\"\n  (if (not (treesit-parser-list))\n      (progn\n        (message \"evil-textobj-tree-sitter: treesit parser is not available in %s\" major-mode)\n        nil)\n    (let* ((lang-name (alist-get major-mode evil-textobj-tree-sitter-major-mode-language-alist))\n           (user-query (alist-get major-mode query))\n           (f-query (if (eq user-query nil)\n                        (evil-textobj-tree-sitter--get-query lang-name)\n                      user-query))\n           (root-node (treesit-buffer-root-node))\n           (captures (treesit-query-capture root-node f-query)))\n      (seq-map (lambda (x)\n                 (list  (car x)\n                        (treesit-node-start (cdr x))\n                        (treesit-node-end (cdr x))))\n               captures))))\n\n(defun evil-textobj-tree-sitter--elisp-tree-sitter-get-nodes (query)\n  \"Get nodes for `QUERY' using `elisp-tree-sitter'.\"\n  (if (not (bound-and-true-p tree-sitter-tree))\n      (progn\n        (message \"evil-textobj-tree-sitter: tree-sitter is not available in %s\" major-mode)\n        nil)\n    (let* ((lang-name (alist-get major-mode evil-textobj-tree-sitter-major-mode-language-alist))\n           (user-query (alist-get major-mode query))\n           (f-query (if (eq user-query nil)\n                        (evil-textobj-tree-sitter--get-query lang-name)\n                      user-query))\n           (root-node (tsc-root-node tree-sitter-tree))\n           (query (tsc-make-query tree-sitter-language f-query))\n           (matches (tsc-query-matches query root-node #'tsc--buffer-substring-no-properties))\n           (all-captures '()))\n      (progn\n        (seq-map (lambda (x)\n                   (let* ((match-captures (cdr x))\n                          (capture-start nil)\n                          (capture-end nil))\n                     (seq-map (lambda (y)\n                                (let ((csplits (split-string (symbol-name (car y)) \"\\\\.\")))\n                                  (pcase (car (last csplits))\n                                    (\"_end\" (setq capture-end y))\n                                    (\"_start\" (setq capture-start y))\n                                    (_ (push (list (car y)\n                                                   (car (tsc-node-byte-range (cdr y)))\n                                                   (cdr (tsc-node-byte-range (cdr y))))\n                                             all-captures)))))\n                              match-captures)\n                     (if (and capture-start capture-end)\n                         (push (list (intern (string-join (butlast (split-string (symbol-name (car capture-start)) \"\\\\.\") 1) \".\"))\n                                     (car (tsc-node-byte-range (cdr capture-start)))\n                                     (cdr (tsc-node-byte-range (cdr capture-end))))\n                               all-captures))))\n                 matches)\n        (mapcar (lambda (c)\n                  (list (car c)\n                        (byte-to-position (cadr c))\n                        (byte-to-position (caddr c))))\n                all-captures)))))\n\n(defun evil-textobj-tree-sitter--get-nodes (group query)\n  \"Get a list of viable nodes based on `GROUP' value.\nThey will be order with captures with point inside them first then the\nones that follow.  If a `QUERY' alist is provided and\nit contains a current `major-mode',\nwe make use of that instead of the builtin query set.\"\n  (cl-remove-duplicates (cl-remove-if-not (lambda (x)\n                                            (member (car x) group))\n                                          (if (evil-textobj-tree-sitter--use-builtin-treesitter)\n                                              (evil-textobj-tree-sitter--treesit-get-nodes query)\n                                            (evil-textobj-tree-sitter--elisp-tree-sitter-get-nodes query)))\n                        :test (lambda (x y)\n                                (and (eq (car x) (car y)) ;; names are equal\n                                     (= (nth 1 x) (nth 1 y))\n                                     (= (car (last x)) (car (last y)))))))\n\n(defun evil-textobj-tree-sitter--get-within-and-after (group count query)\n  \"Given a `GROUP' `QUERY' find `COUNT' number of nodes within in and after point.\"\n  (let* ((nodes (evil-textobj-tree-sitter--get-nodes group query))\n         (nodes-within (evil-textobj-tree-sitter--nodes-filter-within nodes))\n         (nodes-after (evil-textobj-tree-sitter--nodes-filter-after nodes))\n         (filtered-nodes (if (and (equal 1 count)\n                                  (not evil-textobj-tree-sitter-use-next-if-not-within))\n                             nodes-within\n                           (append nodes-within nodes-after))))\n    (if (> (length filtered-nodes) 0)\n        (cl-subseq filtered-nodes 0 count))))\n\n(defun evil-textobj-tree-sitter--get-within (group count query)\n  \"Given a `GROUP' `QUERY' find `COUNT' number of nodes within point.\"\n  (let* ((nodes (evil-textobj-tree-sitter--get-nodes group query))\n         (nodes-within (evil-textobj-tree-sitter--nodes-filter-within nodes)))\n    (if (> (length nodes-within) 0)\n        (cl-subseq nodes-within 0 count))))\n\n(defun evil-textobj-tree-sitter--range (count ts-group &optional query)\n  \"Get the range of the closeset item of type `TS-GROUP'.\n`COUNT' is supported even thought it does not actually make sense in\nmost cases as if we do 3-in-func the selections will not be continues,\nbut we can only provide the start and end as of now which is what we\nare doing.  If a `QUERY' alist is provided, we make use of that\ninstead of the builtin query set.\"\n  (let ((nodes (evil-textobj-tree-sitter--get-within-and-after ts-group count query)))\n    (if (not (eq nodes nil))\n        (let ((range-min (apply #'min\n                                (seq-map (lambda (x)\n                                           (nth 1 x))\n                                         nodes)))\n              (range-max (apply #'max\n                                (seq-map (lambda (x)\n                                           (car (last x)))\n                                         nodes))))\n          ;; Have to compute min and max like this as we might have nested functions\n          (cons range-min range-max)))))\n\n(defun evil-textobj-tree-sitter--message-not-found (groups)\n  \"Log a message that `GROUPS' are not found.\"\n  (let ((not-found (mapconcat (lambda (g)\n                                (concat \"'\" g \"'\"))\n                              groups\n                              \" or \")))\n    (error (concat \"No \" not-found \" text object found\"))))\n\n;;;###autoload\n(defmacro evil-textobj-tree-sitter-get-textobj (group &optional query)\n  \"Macro to create a textobj function from `GROUP'.\nYou can pass in multiple groups as a list and in that case as long as\nany one of them is available, it will be picked.\n\nYou can optionally pass in a alist mapping `major-mode' to their\nrespective tree-sitter query in `QUERY' with named captures to use\nthat instead of the default query list.  If `QUERY' does not contain\ncurrent `major-mode', then the default queries are used.\nCheck the README file in the repo to see how to use it.\n\nCheck this url for builtin objects\nhttps://github.com/nvim-treesitter/nvim-treesitter-textobjects#built-in-textobjects\"\n  (declare (debug t) (indent defun))\n  (if evil-textobj-tree-sitter--evil-available\n      (let* ((groups (if (eq (type-of group) 'string)\n                         (list group)\n                       group))\n             (funsymbol (intern (concat \"evil-textobj-tree-sitter-function--\"\n                                        (mapconcat 'identity groups \"-\"))))\n             (interned-groups (mapcar #'intern groups)))\n        `(evil-define-text-object ,funsymbol\n           ;; rest argument is named because of compiler warning `argument _ not left unused`\n           (count &rest unused)\n           (let ((range (evil-textobj-tree-sitter--range count ',interned-groups ,query)))\n             (if (not (eq range nil))\n                 (evil-range (car range)\n                             (cdr range))\n               (evil-textobj-tree-sitter--message-not-found ',groups)))))\n    (error \"Cannot use `evil-textobj-tree-sitter-goto-textobj' without `evil-mode'\")))\n\n(defun evil-textobj-tree-sitter--get-goto-location (groups previous end query)\n  \"Get the start/end of the textobj of type `GROUPS'.\nBy default it goes to the start of the textobj, but pass in `END' if\nyou want to go to the end of the textobj instead.  You can pass in\n`PREVIOUS' if you want to search backwards.  `QUERY' for custom queries.\"\n  (let* ((nodes (evil-textobj-tree-sitter--get-nodes groups query))\n         (usable-nodes (if previous\n                           (if end\n                               (cl-remove-if-not (lambda (x)\n                                                   (< (car (last x)) (point)))\n                                                 nodes)\n                             (cl-remove-if-not (lambda (x)\n                                                 (< (nth 1 x) (point)))\n                                               nodes))\n                         (if end\n                             (cl-remove-if-not (lambda (x)\n                                                 ;; -1 is needed as evil cannot select till end\n                                                 (> (- (car (last x)) 1) (point)))\n                                               nodes)\n                           (cl-remove-if-not (lambda (x)\n                                               (> (nth 1 x) (point)))\n                                             nodes))))\n         (node (car (sort usable-nodes\n                          (lambda (x y)\n                            (if previous\n                                (if end\n                                    (> (car(last x)) (car (last y)))\n                                  (> (nth 1 x) (nth 1 y)))\n                              (if end\n                                  (< (car(last x)) (car (last y)))\n                                (< (nth 1 x) (nth 1 y)))))))))\n    (if node\n        (let ((actual-position (if end\n                                   (car (last node))\n                                 (nth 1 node))))\n          (if end\n              ;; tree sitter count + 1 kinda (probably have to look in other places as well)\n              ;; This is a mess that evil creates (not really an issue in Emacs mode)\n              (- actual-position 1)\n            actual-position)))))\n\n;;;###autoload\n(defun evil-textobj-tree-sitter-goto-textobj (group &optional previous end query)\n  \"Got to the start/end of the textobj of type `GROUP'.\nBy default it goes to the start of the textobj, but pass in `END' if\nyou want to go to the end of the textobj instead.  You can pass in\n`PREVIOUS' if you want to search backwards.  Optionally pass in\n`QUERY' if you want to define a custom query.\"\n  (let* ((groups (if (eq (type-of group) 'string)\n                     (list group)\n                   group))\n         (interned-groups (mapcar #'intern groups))\n         (goto-position (evil-textobj-tree-sitter--get-goto-location\n                         interned-groups previous end query)))\n    (if goto-position\n        (goto-char goto-position)\n      (evil-textobj-tree-sitter--message-not-found groups))))\n\n(provide 'evil-textobj-tree-sitter-core)\n;;; evil-textobj-tree-sitter-core.el ends here\n"
  },
  {
    "path": "evil-textobj-tree-sitter-query-test.el",
    "content": ";;; Code:\n\n(require 'tree-sitter-langs)\n(require 'evil-textobj-tree-sitter)\n(require 'ert)\n\n(defun evil-textobj-tree-sitter--test-loading-with-comment-prefix (lang comment-prefix)\n  \"Try loading grammar for `LANG' and test with comment using `COMMENT-PREFIX'.\"\n  (evil-textobj-tree-sitter--test-loading-with-comment\n   lang\n   (concat comment-prefix \" howdy!\")))\n\n(defun evil-textobj-tree-sitter--test-loading-with-comment (lang text &optional region)\n  \"Try loading grammar for `LANG'.\nAnd test with comment provided in `TEXT' optionally passing in `REGION'.\"\n  (let* ((bufname (make-temp-name \"evil-textobj-tree-sitter-test--\"))\n         (filename (concat \"/tmp/\" bufname)))\n\n    (find-file filename)\n    (fundamental-mode)\n    (with-current-buffer bufname\n      (when (null tree-sitter-major-mode-language-table)\n        (setq tree-sitter-major-mode-language-table (make-hash-table :test 'eq)))\n      (puthash 'fundamental-mode lang tree-sitter-major-mode-language-table)\n      (setq-local evil-textobj-tree-sitter-major-mode-language-alist `((fundamental-mode . ,(symbol-name lang))))\n      (insert text)\n      (tree-sitter-mode)\n      (goto-char 0)\n      (should (equal\n               (evil-textobj-tree-sitter--range\n                1\n                (list (intern \"comment.outer\")))\n               (if region region (cons 1 (+ 1 (length text)))))))\n\n    (set-buffer-modified-p nil)\n    (kill-buffer bufname)))\n\n\n;; TODO: Simplify code using macros and dolist\n\n;; bash\n(ert-deftest evil-textobj-tree-sitter-try-bash ()\n  (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'bash \"#\"))\n\n;; c\n(ert-deftest evil-textobj-tree-sitter-try-c ()\n  (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'c \"//\"))\n\n;; cpp\n(ert-deftest evil-textobj-tree-sitter-try-cpp ()\n  (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'cpp \"//\"))\n\n;; elixir\n(ert-deftest evil-textobj-tree-sitter-try-elixir ()\n  (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'elixir \"#\"))\n\n;; elm\n(ert-deftest evil-textobj-tree-sitter-try-elm ()\n  (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'elm \"--\"))\n\n;; go\n(ert-deftest evil-textobj-tree-sitter-try-go ()\n  (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'go \"//\"))\n\n;; haskell\n(ert-deftest evil-textobj-tree-sitter-try-haskell ()\n  (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'haskell \"--\"))\n\n;; hcl\n(ert-deftest evil-textobj-tree-sitter-try-hcl ()\n  (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'hcl \"#\"))\n\n;; html <!--\n(ert-deftest evil-textobj-tree-sitter-try-html ()\n  (evil-textobj-tree-sitter--test-loading-with-comment 'html \"<!-- howdy -->\"))\n\n;; java\n(ert-deftest evil-textobj-tree-sitter-try-java ()\n  (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'java \"//\"))\n\n;; javascript\n(ert-deftest evil-textobj-tree-sitter-try-javascript ()\n  (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'javascript \"//\"))\n\n;; julia TODO: Needs grammar update\n;; (ert-deftest evil-textobj-tree-sitter-try-julia ()\n;;   (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'julia \"#\"))\n\n;; php\n(ert-deftest evil-textobj-tree-sitter-try-php ()\n  (evil-textobj-tree-sitter--test-loading-with-comment 'php \"<?php\\n// howdy\\n?>\" (cons 7 15)))\n\n;; python\n(ert-deftest evil-textobj-tree-sitter-try-python ()\n  (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'python \"#\"))\n\n;; r\n(ert-deftest evil-textobj-tree-sitter-try-r ()\n  (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'r \"#\"))\n\n;; ruby\n(ert-deftest evil-textobj-tree-sitter-try-ruby ()\n  (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'ruby \"#\"))\n\n;; rust\n(ert-deftest evil-textobj-tree-sitter-try-rust ()\n  (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'rust \"//\"))\n\n;; typescript\n(ert-deftest evil-textobj-tree-sitter-try-typescript ()\n  (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'typescript \"//\"))\n\n;; verilog\n(ert-deftest evil-textobj-tree-sitter-try-verilog ()\n  (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'verilog \"//\"))\n\n;; zig\n(ert-deftest evil-textobj-tree-sitter-try-zig ()\n  (evil-textobj-tree-sitter--test-loading-with-comment-prefix 'zig \"//\"))\n\n;;; evil-textobj-tree-sitter-query-test.el ends here\n"
  },
  {
    "path": "evil-textobj-tree-sitter-test.el",
    "content": ";;; evil-textobj-tree-sitter-test.el --- Tests for evil-textobj-tree-sitter -*- lexical-binding: t -*-\n\n;;; Commentary:\n;; We can only use statically linked files here or libstdc++ screams at you.\n;; C is an ideal candidate for this as it is builtin and is statically linked.\n\n;;; Code:\n\n(require 'tree-sitter-langs)\n(require 'evil-textobj-tree-sitter)\n(require 'go-mode)\n\n(setq treesit-language-source-alist\n      '((c . (\"https://github.com/tree-sitter/tree-sitter-c\"))\n        (cpp . (\"https://github.com/tree-sitter/tree-sitter-cpp\"))\n        (python . (\"https://github.com/tree-sitter/tree-sitter-python\"))\n        (go . (\"https://github.com/tree-sitter/tree-sitter-go\"))\n        (gomod . (\"https://github.com/camdencheek/tree-sitter-go-mod.git\"))))\n\n;; Unset GIT_DIR/GIT_WORK_TREE so treesit-install-language-grammar can git\n;; clone into temp directories (these may be set for jj repo compatibility)\n(setenv \"GIT_DIR\" nil)\n(setenv \"GIT_WORK_TREE\" nil)\n\n(treesit-install-language-grammar 'c)\n(treesit-install-language-grammar 'cpp)\n(treesit-install-language-grammar 'python)\n(treesit-install-language-grammar 'go)\n(treesit-install-language-grammar 'gomod)\n\n(defvar evil-textobj-tree-sitter--test-file-content\n  '((c-simple . \"// Lukasz\nint main() {\n    printf(\\\"hello\\\")\n}\")\n    (c-multiple-funcs .  \"// mango\nint main() {\n    printf(\\\"hello\\\")\n}\n\nint main2() {\n    printf(\\\"hello2\\\")\n}\n\")\n    (c-unicode . \"// Łukasz\nint main() {\n    printf(\\\"hello\\\")\n}\")\n    (c-multibyte . \"// Комментарий\nint main(int temp, int temp2) {\n    printf(\\\"hello\\\");\n}\")\n    (go-multibyte-code . \"// Комментарий\nfunc main(int Комментарий, int temp2) {\n    printf(\\\"hello\\\");\n}\")\n    (go-nested . \"// comment\nfunc main() {\n\tfmt.Println(\\\"howdy bruh!\\\")\n\tfunc() {\n\t\tfmt.Println(\\\"yo!\\\")\n\t}\n}\")\n    (py-complex . \"def func ():\n    var1\n    def func2(): pass\n    def nested():\n        var2\n        def inner():\n            var3\n        var4\n    var5\n\")))\n\n\n(defun evil-textobj-tree-sitter--range-test (mode treesit start textobj range content)\n  \"Check ranges of tree-sitter targets.\n\n`MODE' is the `major-mode' to be used.\n`TREESIT' non nil will use `treesit'.\n`CONTENT' is the content to be used.\n`START' is the starting position.\n`TEXTOBJ' is the textobject to check.\n`RANGE' is the range that should be returned.\"\n  (let* ((bufname (make-temp-name \"evil-textobj-tree-sitter-test--\"))\n         (buffer (get-buffer-create bufname)))\n    (with-current-buffer buffer\n      (insert (alist-get content evil-textobj-tree-sitter--test-file-content))\n      (funcall mode)\n      (if (not treesit) (tree-sitter-mode))\n      (message \"%s\" major-mode)\n      (goto-char start)\n      (should (equal\n               (evil-textobj-tree-sitter--range 1 (list (intern textobj)))\n               range)))\n    (kill-buffer buffer)))\n\n(ert-deftest evil-textobj-tree-sitter-within-unicode-test ()\n  \"Check inner range queries within unicode buffers.\"\n  ;; function.inner selects brackets in treesit queries but not in tree-sitter ones\n  (evil-textobj-tree-sitter--range-test 'c-mode nil 31 \"function.inner\" (cons 28 43) 'c-unicode)\n  (evil-textobj-tree-sitter--range-test 'c-ts-mode t 31 \"function.inner\" (cons 22 45) 'c-unicode))\n\n(ert-deftest evil-textobj-tree-sitter-within-unicode-test-outer ()\n  \"Check outer range queries within unicode buffers.\"\n  (evil-textobj-tree-sitter--range-test 'c-mode nil 31 \"function.outer\" (cons 11 45) 'c-unicode)\n  (evil-textobj-tree-sitter--range-test 'c-ts-mode t 31 \"function.outer\" (cons 11 45) 'c-unicode))\n\n(ert-deftest evil-textobj-tree-sitter-within-multibyte-buffers ()\n  \"Check range in multibyte comment before.\"\n  (evil-textobj-tree-sitter--range-test 'c-mode nil 35 \"parameter.inner\" (cons 35 44) 'c-multibyte)\n  (evil-textobj-tree-sitter--range-test 'c-ts-mode t 35 \"parameter.inner\" (cons 35 44) 'c-multibyte))\n\n(ert-deftest evil-textobj-tree-sitter-within-unicode-test3 ()\n  \"Check range with multibyte code.\"\n  (evil-textobj-tree-sitter--range-test 'go-mode nil 31 \"parameter.inner\" (cons 26 41) 'go-multibyte-code)\n  (evil-textobj-tree-sitter--range-test 'go-ts-mode t 31 \"parameter.inner\" (cons 26 41) 'go-multibyte-code))\n\n(ert-deftest evil-textobj-tree-sitter-within-test ()\n  \"Check range when we are within the textobj with buffer having only ASCII chars.\"\n  (evil-textobj-tree-sitter--range-test 'c-mode nil 31 \"function.outer\" (cons 11 45) 'c-simple)\n  (evil-textobj-tree-sitter--range-test 'c-ts-mode t 31 \"function.outer\" (cons 11 45) 'c-simple))\n\n(ert-deftest evil-textobj-tree-sitter-lookahed-test ()\n  \"Check range when we are before the textobj with buffer having only ASCII chars.\"\n  (evil-textobj-tree-sitter--range-test 'c-mode nil 1 \"function.outer\" (cons 11 45) 'c-simple)\n  (evil-textobj-tree-sitter--range-test 'c-ts-mode t 1 \"function.outer\" (cons 11 45) 'c-simple))\n\n(ert-deftest evil-textobj-tree-sitter-right-at-start-test ()\n  \"Checking for off by one errors at start.\"\n  (evil-textobj-tree-sitter--range-test 'c-mode nil 11 \"function.outer\" (cons 11 45) 'c-simple)\n  (evil-textobj-tree-sitter--range-test 'c-ts-mode t 11 \"function.outer\" (cons 11 45) 'c-simple))\n\n\n;;; Reading query files\n\n(ert-deftest evil-textoj-tree-sitter-check-query-read-simple ()\n  \"Simple query read check.\"\n  (let ((evil-textobj-tree-sitter--get-queries-dir-func (lambda () \"fixtures/\")))\n    (should (string-prefix-p \";; \\\"Classes\\\"\" (evil-textobj-tree-sitter--get-query \"zig\")))))\n\n(ert-deftest evil-textoj-tree-sitter-check-query-read-nocomment ()\n  \"Check a query file with no comment.\"\n  (let ((evil-textobj-tree-sitter--get-queries-dir-func (lambda () \"fixtures/\")))\n    (should (string-prefix-p \"(function_definition\" (evil-textobj-tree-sitter--get-query \"bash\")))))\n\n(ert-deftest evil-textoj-tree-sitter-check-query-read-nested ()\n  \"Check a query with nested files to be loaded.\"\n  (let ((evil-textobj-tree-sitter--get-queries-dir-func (lambda () \"fixtures/\")))\n    (should (string-prefix-p \"; inherits: (jsx)\" (evil-textobj-tree-sitter--get-query \"typescript\")))))\n\n(ert-deftest evil-textoj-tree-sitter-check-query-read-nested-nofile ()\n  \"Check a file pointing to a non existent file.\"\n  (let ((evil-textobj-tree-sitter--get-queries-dir-func (lambda () \"fixtures/\")))\n    (should (string-prefix-p \"; inherits: (jsx)\" (evil-textobj-tree-sitter--get-query \"javascript\")))))\n\n(ert-deftest evil-textoj-tree-sitter-check-query-read-nested-multi ()\n  \"Check a query with multiple nesting items.\"\n  (let ((evil-textobj-tree-sitter--get-queries-dir-func (lambda () \"fixtures/\")))\n    (should (string-prefix-p \"; inherits: (javascript)\" (evil-textobj-tree-sitter--get-query \"tsx\")))))\n\n(ert-deftest evil-textoj-tree-sitter-check-query-read-non-top-level ()\n  \"Check a non top level direct query.\"\n    (should (string-prefix-p \"; inherits: (javascript)\" (evil-textobj-tree-sitter--get-query-from-dir \"typescript\" \"fixtures/\" nil))))\n\n(defun evil-textobj-tree-sitter--goto-test (mode treesit start textobj pos prev end content)\n  \"Check for location of goto actions.\n\n`MODE' is the `major-mode' to be used.\n`TREESIT' non nil will use `treesit'.\n`CONTENT' is the content to be used.\n`START' is the starting position.\n`TEXTOBJ' is the textobject to check.\n`PREV' goes to previous textobj.\n`END' goes to end of textobj.\n`POS' is the position that should be returned.\"\n  (let* ((bufname (make-temp-name \"evil-textobj-tree-sitter-test--\"))\n         (buffer (get-buffer-create bufname)))\n    (with-current-buffer buffer\n      (insert (alist-get content evil-textobj-tree-sitter--test-file-content))\n      (funcall mode)\n      (if (not treesit) (tree-sitter-mode))\n      (goto-char start)\n      (should (equal (evil-textobj-tree-sitter--get-goto-location\n                      (list (intern textobj)) prev end nil)\n                     pos)))\n    (kill-buffer bufname)))\n\n(ert-deftest evil-textobj-tree-sitter-goto-next-start-simple ()\n  \"Go to next start in ASCII buffers.\"\n  (evil-textobj-tree-sitter--goto-test 'c-mode nil 1 \"function.outer\" 11 nil nil 'c-simple)\n  (evil-textobj-tree-sitter--goto-test 'c-ts-mode t 1 \"function.outer\" 11 nil nil 'c-simple))\n\n(ert-deftest evil-textobj-tree-sitter-goto-next-start-multiple-textobjects ()\n  \"Check to see if we are able to find first one when we have multiple textobjects.\"\n  (evil-textobj-tree-sitter--goto-test 'c-mode nil 1 \"parameter.outer\" 25 nil nil 'c-multibyte)\n  (evil-textobj-tree-sitter--goto-test 'c-ts-mode t 1 \"parameter.outer\" 25 nil nil 'c-multibyte))\n\n(ert-deftest evil-textobj-tree-sitter-goto-next-end-simple ()\n  \"Check if we can navigate to end of a textobj.\"\n  (evil-textobj-tree-sitter--goto-test 'c-mode nil 1 \"function.outer\" 69 nil t 'c-multibyte)\n  (evil-textobj-tree-sitter--goto-test 'c-ts-mode t 1 \"function.outer\" 69 nil t 'c-multibyte))\n\n(ert-deftest evil-textobj-tree-sitter-goto-next-end-multi ()\n  \"Goto end when we have multiple functions.\"\n  (evil-textobj-tree-sitter--goto-test 'c-mode nil 1 \"function.outer\" 43 nil t 'c-multiple-funcs)\n  (evil-textobj-tree-sitter--goto-test 'c-ts-mode t 1 \"function.outer\" 43 nil t 'c-multiple-funcs))\n\n(ert-deftest evil-textobj-tree-sitter-goto-previous-end-multi ()\n  \"Goto end of previous textobj.\"\n  (evil-textobj-tree-sitter--goto-test 'c-mode nil 69 \"function.outer\" 43 t t 'c-multiple-funcs)\n  (evil-textobj-tree-sitter--goto-test 'c-ts-mode t 69 \"function.outer\" 43 t t 'c-multiple-funcs))\n\n(ert-deftest evil-textobj-tree-sitter-goto-previous-end-multi-on-end ()\n  \"Testing going to end of previous one while on end of current one.\"\n  (evil-textobj-tree-sitter--goto-test 'c-mode nil 82 \"function.outer\" 43 t t 'c-multiple-funcs)\n  (evil-textobj-tree-sitter--goto-test 'c-ts-mode t 82 \"function.outer\" 43 t t 'c-multiple-funcs))\n\n(ert-deftest evil-textobj-tree-sitter-goto-previous-start-nested ()\n  \"Goto the start of the previous textobj in a nested scenario.\"\n  (evil-textobj-tree-sitter--goto-test 'go-mode nil 66 \"function.outer\" 55 t nil 'go-nested)\n  (evil-textobj-tree-sitter--goto-test 'go-ts-mode t 66 \"function.outer\" 55 t nil 'go-nested))\n\n(ert-deftest evil-textobj-tree-sitter-goto-previous-start-nested-3 ()\n  \"Go to previous nested complex test.\"\n  (evil-textobj-tree-sitter--goto-test 'python-mode nil 71 \"function.outer\" 49 t nil 'py-complex)\n  (evil-textobj-tree-sitter--goto-test 'python-ts-mode t 71 \"function.outer\" 49 t nil 'py-complex))\n\n;;; `thing-at-point' tests\n\n(defun evil-textobj-tree-sitter--thing-at-point-test (mode treesit start thing content selection range)\n  \"Check ranges of tree-sitter targets.\n\n`MODE' is the `major-mode' to be used.\n`TREESIT' non nil will use `treesit'.\n`CONTENT' is the content to be used.\n`START' is the starting position.\n`THING' is the thing to select.\n`SELECTION' is the selection that `thing-at-point' will return.\"\n  (let* ((bufname (make-temp-name \"evil-textobj-tree-sitter-test--\"))\n         (buffer (get-buffer-create bufname)))\n    (with-current-buffer buffer\n      (insert (alist-get content evil-textobj-tree-sitter--test-file-content))\n      (funcall mode)\n      (if (not treesit) (tree-sitter-mode))\n      (goto-char start)\n      (should (equal (thing-at-point thing t) selection))\n      (should (equal (bounds-of-thing-at-point thing) range)))\n    (kill-buffer bufname)))\n\n(ert-deftest evil-textobj-tree-sitter-thing-at-point ()\n  \"Check if `thing-at-point' returns correct result.\"\n  (let ((selection \"int main() {\n    printf(\\\"hello\\\")\n}\"))\n    (evil-textobj-tree-sitter--thing-at-point-test 'c-mode nil 31 'function 'c-unicode selection (cons 11 45))\n    (evil-textobj-tree-sitter--thing-at-point-test 'c-ts-mode t 31 'function 'c-unicode selection (cons 11 45))))\n\n(ert-deftest evil-textobj-tree-sitter-no-error-without-parser ()\n  \"Check that operations gracefully return nil when tree-sitter is unavailable.\"\n  (let* ((bufname (make-temp-name \"evil-textobj-tree-sitter-test--\"))\n         (buffer (get-buffer-create bufname)))\n    (with-current-buffer buffer\n      (insert \"some text without a tree-sitter parser\")\n      (fundamental-mode)\n      ;; Should not error, just return nil\n      (goto-char 1)\n      (should (equal (evil-textobj-tree-sitter--range 1 '(function.outer)) nil))\n      (should (equal (evil-textobj-tree-sitter--get-goto-location\n                      '(function.outer) nil nil nil) nil)))\n    (kill-buffer buffer)))\n\n(ert-deftest evil-textobj-tree-sitter-within-leaf-selects-smallest ()\n  \"Check that leaf text object selects smallest node when multiple overlap.\nUses the treesit path where the bug manifests: treesit returns nodes\noutermost-first, so the buggy comparator (which ignored end positions)\npreserved the wrong order and selected the block (71,126) instead of\nthe identifier (71,75).\"\n  (let* ((bufname (make-temp-name \"evil-textobj-tree-sitter-test--\"))\n         (buffer (get-buffer-create bufname))\n         (leaf-query '((python-ts-mode . \"(_) @leaf\"))))\n    (with-current-buffer buffer\n      (insert (alist-get 'py-complex evil-textobj-tree-sitter--test-file-content))\n      (python-ts-mode)\n      ;; Position 71 is the start of `var2` inside `nested()`.  Both the\n      ;; identifier node (71,75) and the enclosing block node (71,126) share\n      ;; the same start position, which exercises the sort comparator bug\n      ;; where (car (last x)) was used for both operands.  The expected\n      ;; range (71 . 75) is the smallest node — the `var2` identifier.\n      (goto-char 71)\n      (should (equal (evil-textobj-tree-sitter--range 1 '(leaf) leaf-query)\n                     (cons 71 75))))\n    (kill-buffer buffer)))\n\n;;; evil-textobj-tree-sitter-test.el ends here\n"
  },
  {
    "path": "evil-textobj-tree-sitter-thing-at-point.el",
    "content": ";;; evil-textobj-tree-sitter-thing-at-point.el --- Provides thing-at-point integration for tree-sitter textobjects -*- lexical-binding: t; -*-\n\n;; URL: https://github.com/meain/evil-textobj-tree-sitter\n;; Keywords: evil, tree-sitter, text-object, convenience\n;; SPDX-License-Identifier: Apache-2.0\n;; Package-Requires: ((emacs \"25.1\"))\n;; Version: 0.5\n\n;;; Commentary:\n;; This adds `thing-at-point' things powered by tree-sitter.\n\n;; Suggestion for package which could help improve the use for this\n;; https://github.com/plandes/mark-thing-at\n\n;;; Code:\n(require 'thingatpt)\n(require 'evil-textobj-tree-sitter-core)\n\n(defun evil-textobj-tree-sitter--thing-at-point-bounds (group)\n  \"Return the bounds of the `GROUP' at point.\"\n  (when-let* ((entity (evil-textobj-tree-sitter--get-within (list (intern group)) 1 nil))\n              (pos (cdr (car entity))))\n    (cons (car pos) (cadr pos))))\n\n(put 'function 'bounds-of-thing-at-point (lambda () (evil-textobj-tree-sitter--thing-at-point-bounds \"function.outer\")))\n(put 'loop 'bounds-of-thing-at-point (lambda () (evil-textobj-tree-sitter--thing-at-point-bounds \"loop.outer\")))\n(put 'conditional 'bounds-of-thing-at-point (lambda () (evil-textobj-tree-sitter--thing-at-point-bounds \"conditional.outer\")))\n(put 'assignment 'bounds-of-thing-at-point (lambda () (evil-textobj-tree-sitter--thing-at-point-bounds \"assignment.outer\")))\n(put 'class 'bounds-of-thing-at-point (lambda () (evil-textobj-tree-sitter--thing-at-point-bounds \"class.outer\")))\n(put 'comment 'bounds-of-thing-at-point (lambda () (evil-textobj-tree-sitter--thing-at-point-bounds \"comment.outer\")))\n(put 'parameter 'bounds-of-thing-at-point (lambda () (evil-textobj-tree-sitter--thing-at-point-bounds \"parameter.outer\")))\n\n;;;###autoload\n(defun function-at-point ()\n  \"Return the function at point, or nil if none is found.\"\n  (thing-at-point 'function))\n\n;;;###autoload\n(defun loop-at-point ()\n  \"Return the loop at point, or nil if none is found.\"\n  (thing-at-point 'loop))\n\n;;;###autoload\n(defun conditional-at-point ()\n  \"Return the conditional at point, or nil if none is found.\"\n  (thing-at-point 'conditional))\n\n;;;###autoload\n(defun assignment-at-point ()\n  \"Return the assignment at point, or nil if none is found.\"\n  (thing-at-point 'assignment))\n\n;;;###autoload\n(defun class-at-point ()\n  \"Return the class at point, or nil if none is found.\"\n  (thing-at-point 'class))\n\n;;;###autoload\n(defun comment-at-point ()\n  \"Return the comment at point, or nil if none is found.\"\n  (thing-at-point 'comment))\n\n;;;###autoload\n(defun parameter-at-point ()\n  \"Return the parameter at point, or nil if none is found.\"\n  (thing-at-point 'parameter))\n\n(provide 'evil-textobj-tree-sitter-thing-at-point)\n;;; evil-textobj-tree-sitter-thing-at-point.el ends here\n"
  },
  {
    "path": "evil-textobj-tree-sitter.el",
    "content": ";;; evil-textobj-tree-sitter.el --- Provides evil textobjects using tree-sitter -*- lexical-binding: t; -*-\n\n;; URL: https://github.com/meain/evil-textobj-tree-sitter\n;; Keywords: evil, tree-sitter, text-object, convenience\n;; SPDX-License-Identifier: Apache-2.0\n;; Package-Requires: ((emacs \"25.1\"))\n;; Version: 0.5\n\n;;; Commentary:\n;; This package is a port of nvim-treesitter/nvim-treesitter-textobjects.\n;; This package will let you create evil textobjects using the power\n;; of tree-sitter grammars.  You can easily create\n;; function,class,comment etc textobjects in multiple languages.\n;;\n;; You can do a sample map like below to create a function textobj.\n;; (define-key evil-outer-text-objects-map \"f\"\n;;             (evil-textobj-tree-sitter-get-textobj \"function.outer\"))\n;; `evil-textobj-tree-sitter-get-textobj' will return you a function\n;; that you can use in a define-key map.  You can pass in any of the\n;; supported queries as an arg of that function.  You can also pass in\n;; multiple queries as a list and we will match on all of them, ranked\n;; on which ones comes up first in the file.\n;; You can find more info in the  README.md file at\n;; https://github.com/meain/evil-textobj-tree-sitter\n\n;; This package also provides with thing-at-point functions for common\n;; textobjects like functions, loops, conditionals etc.\n\n;; You need to either have elisp-tree-sitter installed or have Emacs\n;; version >=29 for this package to work.\n\n;;; Code:\n\n(require 'evil-textobj-tree-sitter-core)\n(require 'evil-textobj-tree-sitter-thing-at-point)\n\n(provide 'evil-textobj-tree-sitter)\n;;; evil-textobj-tree-sitter.el ends here"
  },
  {
    "path": "fixtures/bash/textobjects.scm",
    "content": "(function_definition\n  (_) @function.inner ) @function.outer\n\n(case_statement) @conditional.outer\n\n(if_statement\n  (_) @conditional.inner ) @conditional.outer\n\n(for_statement\n (_) @loop.inner ) @loop.outer\n(while_statement\n  (_) @loop.inner ) @loop.outer\n\n(comment) @comment.outer\n"
  },
  {
    "path": "fixtures/javascript/textobjects.scm",
    "content": "; inherits: (jsx)\n(function_declaration\n  body: (statement_block) @function.inner) @function.outer\n\n(export_statement\n  (function_declaration) @function.outer) @function.outer.start\n"
  },
  {
    "path": "fixtures/tsx/textobjects.scm",
    "content": "; inherits: typescript,jsx\n"
  },
  {
    "path": "fixtures/typescript/textobjects.scm",
    "content": "; inherits: (javascript)\n"
  },
  {
    "path": "fixtures/zig/textobjects.scm",
    "content": ";; \"Classes\"\n(VarDecl \n  (_ (_ (ContainerDecl (ContainerMembers)? @class.inner)))) @class.outer\n\n;; functions\n(_ \n  (FnProto)\n  (Block) @function.inner) @function.outer\n"
  },
  {
    "path": "flake.nix",
    "content": "{\n  description = \"evil-textobj-tree-sitter development environment\";\n\n  inputs = {\n    nixpkgs.url = \"github:NixOS/nixpkgs/nixpkgs-unstable\";\n  };\n\n  outputs = { self, nixpkgs }:\n    let\n      forAllSystems = nixpkgs.lib.genAttrs [ \"x86_64-linux\" \"aarch64-linux\" \"x86_64-darwin\" \"aarch64-darwin\" ];\n    in\n    {\n      devShells = forAllSystems (system:\n        let\n          pkgs = nixpkgs.legacyPackages.${system};\n\n          # Wrapper that sets GIT_DIR/GIT_WORK_TREE for jj repos so\n          # tree-sitter-langs can find the git repo during eask install-deps\n          eask-jj = pkgs.writeShellScriptBin \"eask\" ''\n            if [ -z \"''${GIT_DIR:-}\" ] && command -v jj >/dev/null 2>&1 && jj root >/dev/null 2>&1; then\n              export GIT_DIR=\"$(jj root)/.jj/repo/store/git\"\n              export GIT_WORK_TREE=\"$(jj root)\"\n            fi\n            exec ${pkgs.eask-cli}/bin/eask \"$@\"\n          '';\n        in\n        {\n          default = pkgs.mkShell {\n            buildInputs = [\n              pkgs.emacs\n              eask-jj\n              pkgs.go\n              pkgs.gcc\n            ];\n          };\n        });\n    };\n}\n"
  },
  {
    "path": "queries/apex/textobjects.scm",
    "content": "(class_declaration\n  body: (class_body) @class.inner) @class.outer\n\n(method_declaration) @function.outer\n\n(method_declaration\n  body: (block\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(constructor_declaration) @function.outer\n\n(constructor_declaration\n  body: (constructor_body\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(for_statement\n  body: (_)? @loop.inner) @loop.outer\n\n(enhanced_for_statement\n  body: (_)? @loop.inner) @loop.outer\n\n(while_statement\n  body: (_)? @loop.inner) @loop.outer\n\n(do_statement\n  body: (_)? @loop.inner) @loop.outer\n\n(if_statement\n  condition: (_\n    (parenthesized_expression) @conditional.inner) @conditional.outer)\n\n(if_statement\n  consequence: (_)? @conditional.inner\n  alternative: (_)? @conditional.inner) @conditional.outer\n\n(switch_expression\n  body: (_)? @conditional.inner) @conditional.outer\n\n; blocks\n(block) @block.outer\n\n(method_invocation) @call.outer\n\n(method_invocation\n  arguments: (argument_list\n    .\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n; parameters\n(formal_parameters\n  \",\" @parameter.outer\n  .\n  (formal_parameter) @parameter.inner @parameter.outer)\n\n(formal_parameters\n  .\n  (formal_parameter) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(argument_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(argument_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n[\n  (line_comment)\n  (block_comment)\n] @comment.outer\n\n; assignment\n(variable_declarator\n  name: (identifier) @assignment.lhs\n  value: (_) @assignment.rhs) @assignment.inner @assignment.outer\n\n"
  },
  {
    "path": "queries/astro/textobjects.scm",
    "content": "; inherits: html\n\n"
  },
  {
    "path": "queries/bash/textobjects.scm",
    "content": "(function_definition) @function.outer\n\n(function_definition\n  body: (compound_statement\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(case_statement) @conditional.outer\n\n(if_statement\n  (_) @conditional.inner) @conditional.outer\n\n(for_statement\n  (_) @loop.inner) @loop.outer\n\n(while_statement\n  (_) @loop.inner) @loop.outer\n\n(comment) @comment.outer\n\n(regex) @regex.inner\n\n((word) @number.inner\n  (#match? @number.inner \"^[0-9]+$\"))\n\n(variable_assignment) @assignment.outer\n\n(variable_assignment\n  name: (_) @assignment.inner @assignment.lhs)\n\n(variable_assignment\n  value: (_) @assignment.inner @assignment.rhs)\n\n(command\n  argument: (word) @parameter.inner)\n\n"
  },
  {
    "path": "queries/bibtex/textobjects.scm",
    "content": "(entry) @block.outer\n\n(field) @statement.outer\n\n"
  },
  {
    "path": "queries/c/textobjects.scm",
    "content": "(declaration\n  declarator: (function_declarator)) @function.outer\n\n(function_definition\n  body: (compound_statement)) @function.outer\n\n(function_definition\n  body: (compound_statement\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(struct_specifier\n  body: (_) @class.inner) @class.outer\n\n(enum_specifier\n  body: (_) @class.inner) @class.outer\n\n; conditionals\n(if_statement\n  consequence: (compound_statement\n    .\n    \"{\"\n    _+ @conditional.inner\n    \"}\")) @conditional.outer\n\n(if_statement\n  alternative: (else_clause\n    (compound_statement\n      .\n      \"{\"\n      _+ @conditional.inner\n      \"}\"))) @conditional.outer\n\n(if_statement) @conditional.outer\n\n(if_statement\n  condition: (_) @conditional.inner)\n\n(while_statement\n  condition: (_) @conditional.inner)\n\n(do_statement\n  condition: (_) @conditional.inner)\n\n(for_statement\n  condition: (_) @conditional.inner)\n\n; loops\n(while_statement) @loop.outer\n\n(while_statement\n  body: (compound_statement\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\")) @loop.outer\n\n(for_statement) @loop.outer\n\n(for_statement\n  body: (compound_statement\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\")) @loop.outer\n\n(do_statement) @loop.outer\n\n(do_statement\n  body: (compound_statement\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\")) @loop.outer\n\n(compound_statement) @block.outer\n\n(comment) @comment.outer\n\n(call_expression) @call.outer\n\n(call_expression\n  arguments: (argument_list\n    .\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n(return_statement\n  (_)? @return.inner) @return.outer\n\n; Statements\n;(expression_statement ;; this is what we actually want to capture in most cases (\";\" is missing) probably\n;(_) @statement.inner) ;; the other statement like node type is declaration but declaration has a \";\"\n(compound_statement\n  (_) @statement.outer)\n\n(field_declaration_list\n  (_) @statement.outer)\n\n(preproc_if\n  (_) @statement.outer)\n\n(preproc_elif\n  (_) @statement.outer)\n\n(preproc_else\n  (_) @statement.outer)\n\n(parameter_list\n  \",\" @parameter.outer\n  .\n  (parameter_declaration) @parameter.inner @parameter.outer)\n\n(parameter_list\n  .\n  (parameter_declaration) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(argument_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(argument_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(number_literal) @number.inner\n\n(declaration\n  declarator: (init_declarator\n    declarator: (_) @assignment.lhs\n    value: (_) @assignment.rhs) @assignment.inner) @assignment.outer\n\n(declaration\n  type: (primitive_type)\n  declarator: (_) @assignment.inner)\n\n(expression_statement\n  (assignment_expression\n    left: (_) @assignment.lhs\n    right: (_) @assignment.rhs) @assignment.inner) @assignment.outer\n\n"
  },
  {
    "path": "queries/c_sharp/textobjects.scm",
    "content": "(class_declaration\n  body: (declaration_list\n    .\n    \"{\"\n    _* @class.inner\n    \"}\")) @class.outer\n\n(struct_declaration\n  body: (declaration_list\n    .\n    \"{\"\n    _* @class.inner\n    \"}\")) @class.outer\n\n(record_declaration\n  body: (declaration_list\n    .\n    \"{\"\n    _* @class.inner\n    \"}\")) @class.outer\n\n(interface_declaration\n  body: (declaration_list\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\")) @class.outer\n\n(enum_declaration\n  body: (enum_member_declaration_list\n    .\n    \"{\"\n    _* @class.inner\n    \"}\")) @class.outer\n\n(method_declaration\n  body: (block\n    .\n    \"{\"\n    _* @function.inner\n    \"}\")) @function.outer\n\n(method_declaration\n  body: (arrow_expression_clause\n    \"=>\"\n    _+ @function.inner)) @function.outer\n\n; method without body(abstract method/decompiled metadata)\n(method_declaration\n  _+\n  \";\") @function.outer\n\n(property_declaration\n  accessors: (accessor_list\n    (accessor_declaration\n      body: (block\n        .\n        \"{\"\n        _* @function.inner\n        \"}\")) @function.outer))\n\n(property_declaration\n  accessors: (accessor_list\n    (accessor_declaration\n      body: (arrow_expression_clause\n        \"=>\"\n        _* @function.inner)) @function.outer))\n\n(indexer_declaration\n  accessors: (accessor_list\n    (accessor_declaration\n      body: (arrow_expression_clause\n        \"=>\"\n        _+ @function.inner)) @function.outer))\n\n(indexer_declaration\n  accessors: (accessor_list\n    (accessor_declaration\n      body: (block\n        .\n        \"{\"\n        _* @function.inner\n        \"}\")) @function.outer))\n\n(conversion_operator_declaration\n  body: (block\n    .\n    \"{\"\n    _* @function.inner\n    \"}\")) @function.outer\n\n(conversion_operator_declaration\n  body: (arrow_expression_clause\n    \"=>\"\n    _+ @function.inner)) @function.outer\n\n(operator_declaration\n  body: (block\n    .\n    \"{\"\n    _* @function.inner\n    \"}\")) @function.outer\n\n; operator without body(abstract/decompiled metadata)\n(operator_declaration\n  _+\n  \";\") @function.outer\n\n(operator_declaration\n  body: (arrow_expression_clause\n    \"=>\"\n    _+ @function.inner)) @function.outer\n\n(constructor_declaration\n  body: (block\n    .\n    \"{\"\n    _* @function.inner\n    \"}\")) @function.outer\n\n; constructor without body(metadata)\n(constructor_declaration\n  _+\n  \";\") @function.outer\n\n(local_function_statement\n  body: (block\n    .\n    \"{\"\n    _* @function.inner\n    \"}\")) @function.outer\n\n(local_function_statement\n  body: (arrow_expression_clause\n    \"=>\"\n    _+ @function.inner)) @function.outer\n\n(anonymous_method_expression\n  (block\n    .\n    \"{\"\n    _* @function.inner\n    \"}\")) @function.outer\n\n(lambda_expression\n  body: (block\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\")) @function.outer\n\n; loops\n(for_statement\n  body: (_) @loop.inner) @loop.outer\n\n(foreach_statement\n  body: (_) @loop.inner) @loop.outer\n\n(do_statement\n  (block) @loop.inner) @loop.outer\n\n(while_statement\n  (block) @loop.inner) @loop.outer\n\n; conditionals\n(if_statement\n  consequence: (_)? @conditional.inner\n  alternative: (_)? @conditional.inner) @conditional.outer\n\n(switch_statement\n  body: (switch_body) @conditional.inner) @conditional.outer\n\n; calls\n(invocation_expression) @call.outer\n\n(invocation_expression\n  arguments: (argument_list\n    .\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n; blocks\n(_\n  (block) @block.inner) @block.outer\n\n; parameters\n(parameter_list\n  \",\" @parameter.outer\n  .\n  (parameter) @parameter.inner @parameter.outer)\n\n(parameter_list\n  .\n  (parameter) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(argument_list\n  \",\" @parameter.outer\n  .\n  (argument) @parameter.inner @parameter.outer)\n\n(argument_list\n  .\n  (argument) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; comments\n(comment) @comment.outer\n\n"
  },
  {
    "path": "queries/cmake/textobjects.scm",
    "content": "(function_def) @function.outer\n\n(function_def\n  .\n  (function_command)\n  _+ @function.inner\n  (endfunction_command) .)\n\n(if_condition) @conditional.outer\n\n(if_condition\n  .\n  (if_command)\n  _+ @conditional.inner\n  (endif_command) .)\n\n(foreach_loop) @loop.outer\n\n(foreach_loop\n  .\n  (foreach_command)\n  _+ @loop.inner\n  (endforeach_command) .)\n\n(normal_command) @call.outer\n\n(normal_command\n  \"(\"\n  _+ @call.inner\n  \")\")\n\n(line_comment) @comment.outer\n\n"
  },
  {
    "path": "queries/cpp/textobjects.scm",
    "content": "; inherits: c\n\n(class_specifier\n  body: (_) @class.inner) @class.outer\n\n(field_declaration\n  type: (enum_specifier)\n  default_value: (initializer_list) @class.inner) @class.outer\n\n(for_range_loop) @loop.outer\n\n(for_range_loop\n  body: (compound_statement\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\"))\n\n(template_declaration\n  (function_definition)) @function.outer\n\n(template_declaration\n  (struct_specifier)) @class.outer\n\n(template_declaration\n  (class_specifier)) @class.outer\n\n(lambda_capture_specifier\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(lambda_capture_specifier\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(template_argument_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(template_argument_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(template_parameter_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(template_parameter_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(parameter_list\n  \",\" @parameter.outer\n  .\n  (optional_parameter_declaration) @parameter.inner @parameter.outer)\n\n(parameter_list\n  .\n  (optional_parameter_declaration) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(initializer_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(initializer_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(new_expression\n  (argument_list) @call.inner) @call.outer\n\n"
  },
  {
    "path": "queries/css/textobjects.scm",
    "content": "[\n  (integer_value)\n  (float_value)\n  (color_value)\n] @number.inner\n\n(declaration\n  (property_name) @assignment.lhs\n  .\n  \":\"\n  _+ @assignment.inner @assignment.rhs\n  \";\") @assignment.outer\n\n(declaration\n  (property_name) @assignment.inner)\n\n(comment) @comment.outer\n\n"
  },
  {
    "path": "queries/cuda/textobjects.scm",
    "content": "; inherits: cpp\n\n"
  },
  {
    "path": "queries/dart/textobjects.scm",
    "content": "; class\n((annotation)? @class.outer\n  .\n  (class_definition\n    body: (class_body) @class.inner) @class.outer)\n\n(mixin_declaration\n  (class_body) @class.inner) @class.outer\n\n(enum_declaration\n  body: (enum_body) @class.inner) @class.outer\n\n(extension_declaration\n  body: (extension_body) @class.inner) @class.outer\n\n; function/method\n((annotation)? @function.outer\n  .\n  [\n    (method_signature)\n    (function_signature)\n  ] @function.outer\n  .\n  (function_body) @function.outer)\n\n(function_body\n  (block\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(type_alias\n  (function_type)? @function.inner) @function.outer\n\n; parameter\n[\n  (formal_parameter)\n  (normal_parameter_type)\n  (type_parameter)\n] @parameter.inner\n\n(\",\" @parameter.outer\n  .\n  [\n    (formal_parameter)\n    (normal_parameter_type)\n    (type_parameter)\n  ] @parameter.outer)\n\n([\n  (formal_parameter)\n  (normal_parameter_type)\n  (type_parameter)\n] @parameter.outer\n  .\n  \",\" @parameter.outer)\n\n; TODO: (_)* not supported yet -> for now this works correctly only with simple arguments\n(arguments\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(arguments\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n; call\n((identifier) @call.outer\n  .\n  (selector\n    (argument_part) @call.outer))\n\n((identifier)\n  .\n  (selector\n    (argument_part\n      (arguments\n        .\n        \"(\"\n        _+ @call.inner\n        \")\"))))\n\n; block\n(block) @block.outer\n\n; conditional\n(if_statement\n  [\n    condition: (_)\n    consequence: (_)\n    alternative: (_)?\n  ] @conditional.inner) @conditional.outer\n\n(switch_statement\n  body: (switch_block) @conditional.inner) @conditional.outer\n\n(conditional_expression\n  [\n    consequence: (_)\n    alternative: (_)\n  ] @conditional.inner) @conditional.outer\n\n; loop\n(for_statement\n  body: (block) @loop.inner) @loop.outer\n\n(while_statement\n  body: (block) @loop.inner) @loop.outer\n\n(do_statement\n  body: (block) @loop.inner) @loop.outer\n\n; comment\n[\n  (comment)\n  (documentation_comment)\n] @comment.outer\n\n; statement\n[\n  (break_statement)\n  (do_statement)\n  (expression_statement)\n  (for_statement)\n  (if_statement)\n  (return_statement)\n  (switch_statement)\n  (while_statement)\n  (assert_statement)\n  ;(labeled_statement)\n  (yield_statement)\n  (yield_each_statement)\n  (continue_statement)\n  (try_statement)\n] @statement.outer\n\n"
  },
  {
    "path": "queries/dockerfile/textobjects.scm",
    "content": "(expose_instruction\n  (expose_port) @number.inner)\n\n"
  },
  {
    "path": "queries/ecma/textobjects.scm",
    "content": "(function_declaration\n  body: (statement_block)) @function.outer\n\n(generator_function_declaration\n  body: (statement_block)) @function.outer\n\n(function_expression\n  body: (statement_block)) @function.outer\n\n(function_declaration\n  body: (statement_block\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(generator_function_declaration\n  body: (statement_block\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(function_expression\n  body: (statement_block\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(export_statement\n  (function_declaration)) @function.outer\n\n(arrow_function\n  body: (_) @function.inner) @function.outer\n\n(arrow_function\n  body: (statement_block\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(method_definition\n  body: (statement_block)) @function.outer\n\n(method_definition\n  body: (statement_block\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(class_declaration\n  body: (class_body)) @class.outer\n\n(class_declaration\n  body: (class_body\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n(export_statement\n  (class_declaration)) @class.outer\n\n(for_in_statement\n  body: (statement_block\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\")) @loop.outer\n\n(for_statement\n  body: (statement_block\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\")) @loop.outer\n\n(while_statement\n  body: (statement_block\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\")) @loop.outer\n\n(do_statement\n  body: (statement_block\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\")) @loop.outer\n\n(if_statement\n  consequence: (statement_block\n    .\n    \"{\"\n    _+ @conditional.inner\n    \"}\")) @conditional.outer\n\n(if_statement\n  alternative: (else_clause\n    (statement_block\n      .\n      \"{\"\n      _+ @conditional.inner\n      \"}\"))) @conditional.outer\n\n(if_statement) @conditional.outer\n\n(switch_statement\n  body: (_)? @conditional.inner) @conditional.outer\n\n(call_expression) @call.outer\n\n(call_expression\n  arguments: (arguments\n    .\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n(new_expression\n  constructor: (identifier) @call.outer\n  arguments: (arguments\n    .\n    \"(\"\n    _+ @call.inner\n    \")\") @call.outer)\n\n; blocks\n(statement_block\n  (_)* @block.inner) @block.outer\n\n; parameters\n; function ({ x }) ...\n; function ([ x ]) ...\n; function (v = default_value)\n(formal_parameters\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(formal_parameters\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; last element with trailing comma\n(formal_parameters\n  (_) @parameter.outer\n  .\n  \",\" @parameter.outer .)\n\n; If the array/object pattern is the first parameter, treat its elements as the argument list\n(formal_parameters\n  .\n  (_\n    [\n      (object_pattern\n        \",\" @parameter.outer\n        .\n        (_) @parameter.inner @parameter.outer)\n      (array_pattern\n        \",\" @parameter.outer\n        .\n        (_) @parameter.inner @parameter.outer)\n    ]))\n\n(formal_parameters\n  .\n  (_\n    [\n      (object_pattern\n        .\n        (_) @parameter.inner @parameter.outer\n        .\n        \",\"? @parameter.outer)\n      (array_pattern\n        .\n        (_) @parameter.inner @parameter.outer\n        .\n        \",\"? @parameter.outer)\n    ]))\n\n; last element with trailing comma\n(formal_parameters\n  .\n  (_\n    [\n      (object_pattern\n        (_) @parameter.outer\n        .\n        \",\" @parameter.outer .)\n      (array_pattern\n        (_) @parameter.outer\n        .\n        \",\" @parameter.outer .)\n    ]))\n\n; arguments\n(arguments\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(arguments\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; last element with trailing comma\n(arguments\n  (_) @parameter.outer\n  .\n  \",\" @parameter.outer .)\n\n; comment\n(comment) @comment.outer\n\n; regex\n(regex\n  (regex_pattern) @regex.inner) @regex.outer\n\n; number\n(number) @number.inner\n\n(lexical_declaration\n  (variable_declarator\n    name: (_) @assignment.lhs\n    value: (_) @assignment.inner @assignment.rhs)) @assignment.outer\n\n(variable_declarator\n  name: (_) @assignment.inner)\n\n(object\n  (pair\n    key: (_) @assignment.lhs\n    value: (_) @assignment.inner @assignment.rhs) @assignment.outer)\n\n(return_statement\n  (_) @return.inner) @return.outer\n\n(return_statement) @statement.outer\n\n[\n  (if_statement)\n  (expression_statement)\n  (for_statement)\n  (while_statement)\n  (do_statement)\n  (for_in_statement)\n  (export_statement)\n  (lexical_declaration)\n] @statement.outer\n\n; 1.  default import\n(import_statement\n  (import_clause\n    (identifier) @parameter.inner @parameter.outer))\n\n; 2.  namespace import  e.g. `* as React`\n(import_statement\n  (import_clause\n    (namespace_import\n      (identifier) @parameter.inner) @parameter.outer))\n\n; 3.  named import  e.g. `import { Bar, Baz } from ...`\n(import_statement\n  (import_clause\n    (named_imports\n      (import_specifier) @parameter.inner)))\n\n; 3‑A.  named import followed by a comma\n(import_statement\n  (import_clause\n    (named_imports\n      (import_specifier) @parameter.outer\n      .\n      \",\" @parameter.outer)))\n\n; 3‑B.  comma followed by named import\n(import_statement\n  (import_clause\n    (named_imports\n      \",\" @parameter.outer\n      .\n      (import_specifier) @parameter.outer)))\n\n; 3-C.  only one named import without a comma\n(import_statement\n  (import_clause\n    (named_imports\n      .\n      (import_specifier) @parameter.outer .)))\n\n; Treat list or object elements as @parameter\n; 1. parameter.inner\n(object\n  (_) @parameter.inner)\n\n(array\n  (_) @parameter.inner)\n\n(object_pattern\n  (_) @parameter.inner)\n\n(array_pattern\n  (_) @parameter.inner)\n\n; 2. parameter.outer: Only one element, no comma\n(object\n  .\n  (_) @parameter.outer .)\n\n(array\n  .\n  (_) @parameter.outer .)\n\n(object_pattern\n  .\n  (_) @parameter.outer .)\n\n(array_pattern\n  .\n  (_) @parameter.outer .)\n\n; 3. parameter.outer: Comma before or after\n[\n  (object\n    \",\" @parameter.outer\n    .\n    (_) @parameter.outer)\n  (array\n    \",\" @parameter.outer\n    .\n    (_) @parameter.outer)\n  (object_pattern\n    \",\" @parameter.outer\n    .\n    (_) @parameter.outer)\n  (array_pattern\n    \",\" @parameter.outer\n    .\n    (_) @parameter.outer)\n]\n\n[\n  (object\n    .\n    (_) @parameter.outer\n    .\n    \",\" @parameter.outer)\n  (array\n    .\n    (_) @parameter.outer\n    .\n    \",\" @parameter.outer)\n  (object_pattern\n    .\n    (_) @parameter.outer\n    .\n    \",\" @parameter.outer)\n  (array_pattern\n    .\n    (_) @parameter.outer\n    .\n    \",\" @parameter.outer)\n]\n\n"
  },
  {
    "path": "queries/elixir/textobjects.scm",
    "content": "; Block Objects\n([\n  (do_block\n    \"do\"\n    _+ @block.inner\n    \"end\")\n  (do_block\n    \"do\"\n    .\n    ((_) @block.inner) @block.inner\n    .\n    \"end\")\n]) @block.outer\n\n; Class Objects (Modules, Protocols)\n; multiple children\n(call\n  target: ((identifier) @_identifier\n    (#match? @_identifier \"^(defmodule|defprotocol|defimpl)$\"))\n  (arguments\n    (alias))\n  (do_block\n    \"do\"\n    _+ @class.inner\n    \"end\")) @class.outer\n\n; single child match\n(call\n  target: ((identifier) @_identifier\n    (#match? @_identifier \"^(defmodule|defprotocol|defimpl)$\"))\n  (arguments\n    (alias))\n  (do_block\n    \"do\"\n    .\n    (_) @class.inner\n    .\n    \"end\")) @class.outer\n\n; Function, Parameter, and Call Objects\n(anonymous_function\n  (stab_clause\n    right: (body) @function.inner)) @function.outer\n\n(call\n  target: ((identifier) @_identifier\n    (#match? @_identifier \"^(def|defmacro|defmacrop|defn|defnp|defp)$\"))\n  (arguments\n    [\n      (call\n        [\n          (arguments\n            (_) @parameter.inner @parameter.outer\n            .\n            \",\" @parameter.outer)\n          (arguments\n            ((_) @parameter.inner @parameter.outer) @parameter.outer .)\n        ])\n      (binary_operator\n        left: (call\n          [\n            (arguments\n              (_) @parameter.inner @parameter.outer\n              .\n              \",\" @parameter.outer)\n            (arguments\n              ((_) @parameter.inner @parameter.outer) @parameter.outer .)\n          ]))\n    ])\n  [\n    (do_block\n      \"do\"\n      _+ @function.inner\n      \"end\")\n    (do_block\n      \"do\"\n      .\n      ((_) @function.inner) @function.inner\n      .\n      \"end\")\n  ]) @function.outer\n\n(call\n  target: ((identifier) @_identifier\n    (#match? @_identifier \"^(def|defmacro|defmacrop|defn|defnp|defp)$\"))\n  (arguments\n    [\n      (identifier)\n      (binary_operator\n        (identifier))\n    ])\n  [\n    (do_block\n      \"do\"\n      _+ @function.inner\n      \"end\")\n    (do_block\n      \"do\"\n      .\n      ((_) @function.inner) @function.inner\n      .\n      \"end\")\n  ]) @function.outer\n\n(call\n  target: ((identifier) @_identifier\n    (#match? @_identifier \"^(def|defmacro|defmacrop|defn|defnp|defp)$\"))\n  (arguments\n    [\n      (call\n        [\n          (arguments\n            (_) @parameter.inner @parameter.outer\n            .\n            \",\" @parameter.outer)\n          (arguments\n            ((_) @parameter.inner @parameter.outer) @parameter.outer .)\n        ])\n      (binary_operator\n        left: (call\n          [\n            (arguments\n              (_) @parameter.inner @parameter.outer\n              .\n              \",\" @parameter.outer)\n            (arguments\n              ((_) @parameter.inner @parameter.outer) @parameter.outer .)\n          ]))\n    ]\n    (keywords\n      (pair\n        value: (_) @function.inner)))) @function.outer\n\n(call\n  target: ((identifier) @_identifier\n    (#match? @_identifier \"^(def|defmacro|defmacrop|defn|defnp|defp)$\"))\n  (arguments\n    [\n      (identifier)\n      (binary_operator\n        (identifier))\n    ]\n    (keywords\n      (pair\n        value: (_) @function.inner)))) @function.outer\n\n; Comment Objects\n(comment) @comment.outer\n\n; Documentation Objects\n(unary_operator\n  operator: \"@\"\n  operand: (call\n    target: ((identifier) @_identifier\n      (#match? @_identifier \"^(moduledoc|typedoc|shortdoc|doc)$\"))\n    (arguments\n      [\n        ; attributes style documentation\n        ; @doc deprecated: \"....\"\n        (keywords) @comment.inner\n        ; heredoc style documentation\n        ; @moduledoc \"\"\"\"\"\"\n        (string\n          (quoted_content) @comment.inner)\n      ]))) @comment.outer\n\n; Regex Objects\n(sigil\n  (quoted_content) @regex.inner) @regex.outer\n\n"
  },
  {
    "path": "queries/elm/textobjects.scm",
    "content": "; Functions\n; top level function with type annotation and doc comment\n((module_declaration)\n  (block_comment) @function.outer\n  .\n  (type_annotation)\n  .\n  (value_declaration\n    body: (_)? @function.inner) @function.outer)\n\n; top level function with type annotation\n((module_declaration)\n  (type_annotation) @function.outer\n  .\n  (value_declaration\n    body: (_)? @function.inner) @function.outer)\n\n; top level function without type annotation\n((module_declaration)\n  (value_declaration\n    body: (_)? @function.inner) @function.outer)\n\n; Comments\n[\n  (block_comment)\n  (line_comment)\n] @comment.outer\n\n; Conditionals\n(if_else_expr\n  exprList: (_)\n  exprList: (_) @conditional.inner) @conditional.outer\n\n(case_of_expr\n  branch: (case_of_branch) @conditional.inner) @conditional.outer\n\n; Parameters\n; type annotations\n(type_expression\n  (arrow) @parameter.outer\n  .\n  (type_ref) @parameter.inner @parameter.outer)\n\n(type_expression\n  .\n  (type_ref) @parameter.inner @parameter.outer\n  .\n  (arrow)? @parameter.outer)\n\n; list items\n(list_expr\n  \",\" @parameter.outer\n  .\n  exprList: (_) @parameter.inner @parameter.outer)\n\n(list_expr\n  .\n  exprList: (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; tuple items\n(tuple_expr\n  \",\" @parameter.outer\n  .\n  expr: (_) @parameter.inner @parameter.outer)\n\n(tuple_expr\n  .\n  expr: (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n"
  },
  {
    "path": "queries/enforce/textobjects.scm",
    "content": "[\n  (comment_line)\n  (comment_block)\n  (doc_line)\n  (doc_block)\n] @comment.outer\n\n[\n  (literal_int)\n  (literal_float)\n] @number.inner\n\n; TODO: capture inside braces\n(decl_class\n  body: (_) @class.inner) @class.outer\n\n(decl_method\n  body: (_) @function.inner) @function.outer\n\n(for\n  body: (_) @loop.inner) @loop.outer\n\n(while\n  body: (_) @loop.inner) @loop.outer\n\n(return\n  (_)? @return.inner) @return.outer\n\n; blocks\n(block) @block.outer\n\n(invokation) @call.outer\n\n(formal_parameters\n  \",\" @parameter.outer\n  .\n  (formal_parameter) @parameter.inner @parameter.outer)\n\n(formal_parameters\n  .\n  (formal_parameter) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(actual_parameters\n  \",\" @parameter.outer\n  .\n  (actual_parameter) @parameter.inner @parameter.outer)\n\n(actual_parameters\n  .\n  (actual_parameter) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n"
  },
  {
    "path": "queries/fennel/textobjects.scm",
    "content": "; https://fennel-lang.org/reference\n(comment\n  body: (comment_body) @comment.inner) @comment.outer\n\n(_\n  .\n  \"(\"\n  \")\" .) @statement.outer\n\n; functions\n; NOTE: Doesn't capture the comments before the first `item` field\n(fn_form\n  [\n    (table_metadata)\n    (docstring)\n  ]\n  .\n  item: (_) @function.inner\n  (_)? @function.inner\n  .\n  close: _ .)\n\n(fn_form\n  args: (_)\n  .\n  item: (_) @function.inner\n  (_)? @function.inner\n  .\n  close: _ .)\n\n(lambda_form\n  [\n    (table_metadata)\n    (docstring)\n  ]\n  .\n  item: (_) @function.inner\n  (_)? @function.inner\n  .\n  close: _ .)\n\n(lambda_form\n  args: (_)\n  .\n  item: (_) @function.inner\n  (_)? @function.inner\n  .\n  close: _ .)\n\n(macro_form\n  [\n    (table_metadata)\n    (docstring)\n  ]\n  .\n  item: (_) @function.inner\n  (_)? @function.inner\n  .\n  close: _ .)\n\n(macro_form\n  args: (_)\n  .\n  item: (_) @function.inner\n  (_)? @function.inner\n  .\n  close: _ .)\n\n[\n  (fn_form)\n  (lambda_form)\n  (macro_form)\n] @function.outer\n\n; function arguments\n(sequence_arguments\n  item: (_) @parameter.inner) @parameter.outer\n\n; call\n(list\n  call: (symbol) @_fn_name\n  item: (_) @call.inner\n  (_) @call.inner\n  .\n  close: _\n  (#not-eq? @_fn_name \"do\")\n  (#not-eq? @_fn_name \"while\")\n  (#not-eq? @_fn_name \"when\")) @call.outer\n\n; assignment\n(local_form\n  (binding_pair\n    lhs: (_) @assignment.lhs\n    rhs: (_) @assignment.rhs) @assignment.inner) @assignment.outer\n\n(var_form\n  (binding_pair\n    lhs: (_) @assignment.lhs\n    rhs: (_) @assignment.rhs) @assignment.inner) @assignment.outer\n\n(global_form\n  (binding_pair\n    lhs: (_) @assignment.lhs\n    rhs: (_) @assignment.rhs) @assignment.inner) @assignment.outer\n\n(set_form\n  lhs: (_) @assignment.lhs @assignment.inner\n  rhs: (_) @assignment.rhs @assignment.inner) @assignment.outer\n\n(let_vars\n  (binding_pair\n    lhs: (_) @assignment.lhs\n    rhs: (_) @assignment.rhs) @assignment.inner) @assignment.outer\n\n; conditionals\n(if_form\n  (if_pair\n    expression: (_) @conditional.inner)) @conditional.outer\n\n(if_form\n  else: (_) @conditional.inner) @conditional.outer\n\n(list\n  call: (symbol) @_cond\n  .\n  item: (_)\n  item: (_)* @conditional.inner\n  (#eq? @_cond \"when\")) @conditional.outer\n\n; loops\n(each_form\n  iter_body: (_)\n  _+ @loop.inner\n  close: _)\n\n(each_form) @loop.outer\n\n(collect_form\n  iter_body: (_)\n  _+ @loop.inner\n  close: _)\n\n(collect_form) @loop.outer\n\n(icollect_form\n  iter_body: (_)\n  _+ @loop.inner\n  close: _)\n\n(icollect_form) @loop.outer\n\n(accumulate_form\n  iter_body: (_)\n  _+ @loop.inner\n  close: _)\n\n(accumulate_form) @loop.outer\n\n(for_form\n  iter_body: (_)\n  _+ @loop.inner\n  close: _)\n\n(for_form) @loop.outer\n\n(fcollect_form\n  iter_body: (_)\n  _+ @loop.inner\n  close: _)\n\n(fcollect_form) @loop.outer\n\n(faccumulate_form\n  iter_body: (_)\n  _+ @loop.inner\n  close: _)\n\n(faccumulate_form) @loop.outer\n\n(list\n  call: (symbol) @_sym\n  .\n  item: (_)\n  item: (_)* @loop.inner\n  (#eq? @_sym \"while\"))\n\n(list\n  call: (symbol) @_sym\n  (#eq? @_sym \"while\")) @loop.outer\n\n"
  },
  {
    "path": "queries/fish/textobjects.scm",
    "content": "; assignment\n(command\n  name: (word) @_command\n  argument: (word) @_varname @assignment.lhs @assignment.inner\n  argument: (_)* @assignment.rhs\n  (#not-match? @_varname \"^[-].*\")\n  (#eq? @_command \"set\")) @assignment.outer\n\n(command\n  name: (word) @_name\n  argument: (_)* @assignment.inner\n  (#eq? @_name \"set\"))\n\n; block\n([\n  (case_clause)\n  (if_statement)\n  (switch_statement)\n  (else_clause)\n  (for_statement)\n  (while_statement)\n]) @block.outer\n\n; call\n; call.inner doesn't work because it can't select *all* arguments\n(command) @call.outer\n\n; comment\n; leave space after comment marker if there is one\n((comment) @comment.inner @comment.outer\n  (#match? @comment.outer \"# .*\"))\n\n; else remove everything accept comment marker\n((comment) @comment.inner @comment.outer)\n\n; conditional\n(if_statement\n  (command) @conditional.inner) @conditional.outer\n\n(switch_statement\n  (_) @conditional.inner) @conditional.outer\n\n; function\n((function_definition) @function.inner @function.outer)\n\n; loop\n(for_statement\n  (_) @loop.inner) @loop.outer\n\n(while_statement\n  condition: (command)\n  (command) @loop.inner) @loop.outer\n\n; number\n[\n  (integer)\n  (float)\n] @number.inner\n\n; parameter\n(command\n  argument: (_) @parameter.outer)\n\n; return\n(return\n  (_) @return.inner) @return.outer\n\n; statement\n(command) @statement.outer\n\n"
  },
  {
    "path": "queries/foam/textobjects.scm",
    "content": "(dict) @class.outer\n\n(dict_core) @class.inner\n\n(key_value\n  value: _? @function.inner\n  (_)* @function.inner\n  _? @parameter.inner @function.inner) @function.outer\n\n(code\n  (_)* @class.inner) @class.outer\n\n(comment)+ @comment.outer\n\n(comment) @comment.inner\n\n"
  },
  {
    "path": "queries/gdscript/textobjects.scm",
    "content": "(function_definition\n  body: (_) @function.inner) @function.outer\n\n(constructor_definition\n  body: (_) @function.inner) @function.outer\n\n(class_definition\n  body: (_) @class.inner) @class.outer\n\n(if_statement\n  body: (_) @conditional.inner) @conditional.outer\n\n(if_statement\n  alternative: (_\n    (_) @conditional.inner)?) @conditional.outer\n\n(if_statement\n  condition: (_) @conditional.inner)\n\n[\n  (for_statement)\n  (while_statement)\n] @loop.outer\n\n(while_statement\n  body: (_) @loop.inner)\n\n(for_statement\n  body: (_) @loop.inner)\n\n(comment) @comment.outer\n\n(parameters\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(parameters\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(arguments\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(arguments\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(array\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(array\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n"
  },
  {
    "path": "queries/git_config/textobjects.scm",
    "content": "; assignments\n(variable\n  (_) @assignment.lhs @assignment.inner\n  value: (_) @assignment.rhs) @assignment.outer\n\n(variable\n  value: (_) @assignment.inner)\n\n; blocks\n(section\n  (section_header)\n  (_)+ @block.inner) @block.outer\n\n; comments\n(comment) @comment.outer\n\n; statements\n(section\n  (section_header)\n  (_) @statement.outer)\n\n"
  },
  {
    "path": "queries/gleam/textobjects.scm",
    "content": "; assignments\n(let\n  pattern: (_) @assignment.lhs @assignment.inner\n  value: (_) @assignment.rhs) @assignment.outer\n\n(let\n  value: (_) @assignment.inner)\n\n(let_assert\n  pattern: (_) @assignment.lhs @assignment.inner\n  value: (_) @assignment.rhs) @assignment.outer\n\n(let_assert\n  value: (_) @assignment.inner)\n\n(use\n  assignments: (use_assignments) @assignment.lhs @assignment.inner\n  value: (_) @assignment.rhs) @assignment.outer\n\n(use\n  value: (_) @assignment.inner)\n\n; block\n(block\n  \"{\"\n  .\n  _+ @block.inner\n  .\n  \"}\") @block.outer\n\n; calls\n(function_call\n  arguments: (arguments\n    .\n    \"(\"\n    _+ @call.inner\n    \")\")) @call.outer\n\n(record\n  arguments: (arguments\n    .\n    \"(\"\n    _+ @call.inner\n    \")\")) @call.outer\n\n(record_update\n  \"..\" @call.inner\n  .\n  spread: (_) @call.inner\n  .\n  \",\" @call.inner\n  arguments: (record_update_arguments) @call.inner) @call.outer\n\n; class\n(type_definition\n  (data_constructors) @class.inner) @class.outer\n\n; comment\n(comment) @comment.outer\n\n; conditionals\n(case\n  clauses: (case_clauses\n    (case_clause) @conditional.inner)) @conditional.outer\n\n; numbers\n[\n  (integer)\n  (float)\n] @number.inner\n\n; parameters in functions declarations\n(function_parameters\n  \",\" @parameter.outer\n  .\n  (function_parameter) @parameter.inner @parameter.outer)\n\n(function_parameters\n  .\n  ; first parameter\n  (function_parameter) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(function_parameters\n  (function_parameter) @parameter.inner @parameter.outer\n  .\n  ; trailing comma\n  \",\" @parameter.outer .)\n\n; parameters in calls\n(arguments\n  \",\" @parameter.outer\n  .\n  (argument) @parameter.inner @parameter.outer)\n\n(arguments\n  .\n  ; first parameter\n  (argument) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(arguments\n  (argument) @parameter.inner @parameter.outer\n  .\n  ; trailing comma\n  \",\" @parameter.outer .)\n\n; parameters for types and records\n(data_constructor_arguments\n  \",\" @parameter.outer\n  .\n  (data_constructor_argument) @parameter.inner @parameter.outer)\n\n(data_constructor_arguments\n  .\n  ; first parameter\n  (data_constructor_argument) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(data_constructor_arguments\n  (data_constructor_argument) @parameter.inner @parameter.outer\n  .\n  ; trailing comma\n  \",\" @parameter.outer .)\n\n(type_parameters\n  \",\" @parameter.outer\n  .\n  (type_parameter) @parameter.inner @parameter.outer)\n\n(type_parameters\n  .\n  ; first parameter\n  (type_parameter) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(type_parameters\n  (type_parameter) @parameter.inner @parameter.outer\n  .\n  ; trailing comma\n  \",\" @parameter.outer .)\n\n(type_arguments\n  \",\" @parameter.outer\n  .\n  (type_argument) @parameter.inner @parameter.outer)\n\n(type_arguments\n  .\n  ; first parameter\n  (type_argument) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(type_arguments\n  (type_argument) @parameter.inner @parameter.outer\n  .\n  ; trailing comma\n  \",\" @parameter.outer .)\n\n(record_pattern_arguments\n  \",\" @parameter.outer\n  .\n  (record_pattern_argument) @parameter.inner @parameter.outer)\n\n(record_pattern_arguments\n  .\n  ; first parameter\n  (record_pattern_argument) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(record_pattern_arguments\n  (record_pattern_argument) @parameter.inner @parameter.outer\n  .\n  ; trailing comma\n  \",\" @parameter.outer .)\n\n(record_update\n  \"..\" @parameter.inner @parameter.outer\n  .\n  spread: (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(record_update\n  \",\" @parameter.outer\n  arguments: (record_update_arguments\n    .\n    ; first parameter after spread\n    (record_update_argument) @parameter.inner @parameter.outer))\n\n(record_update\n  arguments: (record_update_arguments\n    \",\" @parameter.outer\n    .\n    (record_update_argument) @parameter.inner @parameter.outer))\n\n(record_update\n  arguments: (record_update_arguments\n    (record_update_argument) @parameter.inner @parameter.outer\n    . ; trailing comma\n    \",\" @parameter.outer .))\n\n; parameters in lists\n(list\n  \",\" @parameter.outer\n  (_) @parameter.inner @parameter.outer)\n\n(list\n  .\n  ; first parameter\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(list\n  (_) @parameter.inner @parameter.outer\n  .\n  ;trailing comma\n  \",\" @parameter.outer .)\n\n(list_pattern\n  \",\" @parameter.outer\n  (_) @parameter.inner @parameter.outer)\n\n(list_pattern\n  .\n  ; first parameter\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(list_pattern\n  (_) @parameter.inner @parameter.outer\n  .\n  ;trailing comma\n  \",\" @parameter.outer .)\n\n; parameters in tuples\n(tuple\n  \",\" @parameter.outer\n  (_) @parameter.inner @parameter.outer)\n\n(tuple\n  .\n  ; first parameter\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(tuple\n  (_) @parameter.inner @parameter.outer\n  .\n  ;trailing comma\n  \",\" @parameter.outer .)\n\n; parameters in bit arrays\n(bit_array\n  \",\" @parameter.outer\n  (_) @parameter.inner @parameter.outer)\n\n(bit_array\n  .\n  ; first parameter\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(bit_array\n  (_) @parameter.inner @parameter.outer\n  .\n  ;trailing comma\n  \",\" @parameter.outer .)\n\n; functions\n(function\n  body: (block\n    \"{\"\n    .\n    _+ @function.inner\n    .\n    \"}\")) @function.outer\n\n(anonymous_function\n  body: (block\n    \"{\"\n    .\n    _+ @function.inner\n    .\n    \"}\")) @function.outer\n\n; returns\n(function\n  body: (block\n    (_) @return.inner @return.outer .))\n\n(anonymous_function\n  body: (block\n    (_) @return.inner @return.outer .))\n\n; statements\n(block\n  (_) @statement.outer)\n\n"
  },
  {
    "path": "queries/glimmer/textobjects.scm",
    "content": "[\n  (element_node)\n  (block_statement)\n] @function.outer\n\n[\n  (mustache_statement)\n  (block_statement_start)\n] @block.outer\n\n(attribute_node) @attribute.outer\n\n(attribute_node\n  [\n    (concat_statement)\n    (mustache_statement)\n  ] @attribute.inner)\n\n(element_node\n  (element_node_start)\n  .\n  (_) @function.inner\n  .\n  (element_node_end))\n\n(block_statement\n  (block_statement_start)\n  .\n  (_) @function.inner\n  .\n  (block_statement_end))\n\n(element_node\n  (element_node_start)\n  _+ @function.inner\n  (element_node_end))\n\n(block_statement\n  (block_statement_start)\n  _+ @function.inner\n  (block_statement_end))\n\n(mustache_statement\n  .\n  \"{{\"\n  (_) @block.inner\n  .\n  \"}}\")\n\n(block_statement_start\n  .\n  \"{{#\"\n  (_) @block.inner\n  .\n  \"}}\")\n\n(comment_statement) @comment.outer\n\n"
  },
  {
    "path": "queries/glsl/textobjects.scm",
    "content": "; inherits: c\n\n"
  },
  {
    "path": "queries/go/textobjects.scm",
    "content": "; inner function textobject\n(function_declaration\n  body: (block\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n; inner function literals\n(func_literal\n  body: (block\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n; method as inner function textobject\n(method_declaration\n  body: (block\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n; outer function textobject\n(function_declaration) @function.outer\n\n; outer function literals\n(func_literal\n  (_)?) @function.outer\n\n; method as outer function textobject\n(method_declaration\n  body: (block)?) @function.outer\n\n; struct and interface declaration as class textobject?\n(type_declaration\n  (type_spec\n    (type_identifier)\n    (struct_type\n      (field_declaration_list\n        (_)?) @class.inner))) @class.outer\n\n(type_declaration\n  (type_spec\n    (type_identifier)\n    (interface_type) @class.inner)) @class.outer\n\n; struct literals as class textobject\n(composite_literal\n  (type_identifier)?\n  (struct_type\n    (_))?\n  (literal_value\n    (_)) @class.inner) @class.outer\n\n; conditionals\n(if_statement\n  alternative: (_\n    (_) @conditional.inner)?) @conditional.outer\n\n(if_statement\n  consequence: (block)? @conditional.inner)\n\n(if_statement\n  condition: (_) @conditional.inner)\n\n; loops\n(for_statement\n  body: (block)? @loop.inner) @loop.outer\n\n; blocks\n(_\n  (block) @block.inner) @block.outer\n\n; statements\n(block\n  (_) @statement.outer)\n\n; comments\n(comment) @comment.outer\n\n; calls\n(call_expression) @call.outer\n\n(call_expression\n  arguments: (argument_list\n    .\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n; parameters\n(parameter_list\n  \",\" @parameter.outer\n  .\n  (parameter_declaration) @parameter.inner @parameter.outer)\n\n(parameter_list\n  .\n  (parameter_declaration) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(parameter_declaration\n  name: (identifier)\n  type: (_)) @parameter.inner\n\n(parameter_declaration\n  name: (identifier)\n  type: (_)) @parameter.inner\n\n(parameter_list\n  \",\" @parameter.outer\n  .\n  (variadic_parameter_declaration) @parameter.inner @parameter.outer)\n\n; arguments\n(argument_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(argument_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; assignments\n(short_var_declaration\n  left: (_) @assignment.lhs\n  right: (_) @assignment.rhs @assignment.inner) @assignment.outer\n\n(assignment_statement\n  left: (_) @assignment.lhs\n  right: (_) @assignment.rhs @assignment.inner) @assignment.outer\n\n(var_spec\n  name: (_) @assignment.lhs\n  value: (_) @assignment.rhs @assignment.inner) @assignment.outer\n\n(var_spec\n  name: (_) @assignment.inner\n  type: (_)) @assignment.outer\n\n(const_spec\n  name: (_) @assignment.lhs\n  value: (_) @assignment.rhs @assignment.inner) @assignment.outer\n\n(const_spec\n  name: (_) @assignment.inner\n  type: (_)) @assignment.outer\n\n"
  },
  {
    "path": "queries/hack/textobjects.scm",
    "content": "(method_declaration) @function.outer\n\n"
  },
  {
    "path": "queries/haskell/textobjects.scm",
    "content": "(apply\n  .\n  function: (_)\n  _+ @call.inner) @call.outer\n\n(infix\n  (_)\n  [\n    (infix_id\n      (variable)) ; x `plus` y\n    (operator) ; x + y\n  ]\n  (_)) @call.outer\n\n(decl/function) @function.outer\n\n(decl/function\n  patterns: (_)\n  match: _+ @function.inner)\n\n; also treat function signature as @function.outer\n(signature) @function.outer\n\n; treat signature with function as @function.outer\n(((decl/signature\n  name: (_) @_sig_name) @function.outer\n  .\n  (decl/function\n    name: (_) @_func_name) @function.outer)\n  (#eq? @_sig_name @_func_name))\n\n(class) @class.outer\n\n(class\n  \"where\"\n  _ @class.inner)\n\n(instance\n  \"where\"?\n  .\n  _ @class.inner) @class.outer\n\n(comment) @comment.outer\n\n(haddock) @comment.outer\n\n(expression/conditional) @conditional.outer\n\n(expression/conditional\n  (_) @conditional.inner)\n\n; e.g. forM [1..10] $ \\i -> do...\n(infix\n  (apply\n    (name) @_name\n    (#eq? @_name \"for\"))\n  (operator) @_op\n  (#eq? @_op \"$\")\n  (lambda\n    (_)\n    (_) @loop.inner)) @loop.outer\n\n(infix\n  (apply\n    (name) @_name\n    (#eq? @_name \"for_\"))\n  (operator) @_op\n  (#eq? @_op \"$\")\n  (lambda\n    (_)\n    (_) @loop.inner)) @loop.outer\n\n(infix\n  (apply\n    (name) @_name\n    (#eq? @_name \"forM\"))\n  (operator) @_op\n  (#eq? @_op \"$\")\n  (lambda\n    (_)\n    (_) @loop.inner)) @loop.outer\n\n(infix\n  (apply\n    (name) @_name\n    (#eq? @_name \"forM_\"))\n  (operator) @_op\n  (#eq? @_op \"$\")\n  (lambda\n    (_)\n    (_) @loop.inner)) @loop.outer\n\n; e.g. forM [1..10] print\n(apply\n  (name) @_name\n  (#eq? @_name \"for\")\n  (_)\n  (_) @loop.inner) @loop.outer\n\n(apply\n  (name) @_name\n  (#eq? @_name \"for_\")\n  (_)\n  (_) @loop.inner) @loop.outer\n\n(apply\n  (name) @_name\n  (#eq? @_name \"forM\")\n  (_)\n  (_) @loop.inner) @loop.outer\n\n(apply\n  (name) @_name\n  (#eq? @_name \"forM_\")\n  (_)\n  (_) @loop.inner) @loop.outer\n\n; e.g. func x\n(function\n  (patterns\n    (_) @parameter.outer))\n\n; e.g. func mb@(Just x)\n(function\n  (patterns\n    (parens\n      (_) @parameter.inner)))\n\n(function\n  (patterns\n    (as\n      (parens\n        (_) @parameter.inner))))\n\n(signature\n  (context\n    (function\n      (type/apply) @parameter.inner)))\n\n(signature\n  (context\n    (function\n      (type/name) @parameter.inner)))\n\n(signature\n  (function\n    (type/apply) @parameter.inner))\n\n(signature\n  (function\n    (type/name) @parameter.inner))\n\n(signature\n  (type/apply) @parameter.inner)\n\n(signature\n  (type/name) @parameter.inner)\n\n"
  },
  {
    "path": "queries/hcl/textobjects.scm",
    "content": "(attribute\n  (identifier) @assignment.lhs\n  (expression) @assignment.inner @assignment.rhs) @assignment.outer\n\n(attribute\n  (identifier) @assignment.inner)\n\n(block\n  (body)? @block.inner) @block.outer\n\n(block\n  (body\n    (_) @statement.outer))\n\n(function_call\n  (function_arguments) @call.inner) @call.outer\n\n(comment) @comment.outer\n\n(conditional\n  (expression) @conditional.inner) @conditional.outer\n\n(for_cond\n  (expression) @conditional.inner) @conditional.outer\n\n(for_expr\n  (for_object_expr\n    (for_intro) @loop.inner\n    (expression) @loop.inner\n    (expression) @loop.inner\n    (for_cond)? @loop.inner)) @loop.outer\n\n(for_expr\n  (for_object_expr\n    (for_intro) @loop.inner))\n\n(for_expr\n  (for_object_expr\n    (expression) @loop.inner))\n\n(for_expr\n  (for_tuple_expr\n    (for_intro) @loop.inner\n    (expression) @loop.inner\n    (for_cond)? @loop.inner)) @loop.outer\n\n(for_expr\n  (for_tuple_expr\n    (for_intro) @loop.inner))\n\n(for_expr\n  (for_tuple_expr\n    (expression) @loop.inner))\n\n(numeric_lit) @number.inner\n\n(function_arguments\n  \",\" @parameter.outer\n  .\n  (expression) @parameter.inner @parameter.outer)\n\n(function_arguments\n  .\n  (expression) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n"
  },
  {
    "path": "queries/heex/textobjects.scm",
    "content": "(tag) @function.outer\n\n(tag\n  (start_tag)\n  .\n  (_) @function.inner\n  .\n  (end_tag))\n\n(attribute_value) @attribute.inner\n\n(attribute) @attribute.outer\n\n(tag\n  (start_tag)\n  _+ @function.inner\n  (end_tag))\n\n"
  },
  {
    "path": "queries/hlsl/textobjects.scm",
    "content": "; inherits: cpp\n\n"
  },
  {
    "path": "queries/html/textobjects.scm",
    "content": "(element) @function.outer\n\n(element\n  (start_tag)\n  .\n  (_) @function.inner\n  .\n  (end_tag))\n\n(attribute_value) @attribute.inner\n\n(attribute) @attribute.outer\n\n(element\n  (start_tag)\n  _+ @function.inner\n  (end_tag))\n\n(script_element) @function.outer\n\n(script_element\n  (start_tag)\n  .\n  (_) @function.inner\n  .\n  (end_tag))\n\n(style_element) @function.outer\n\n(style_element\n  (start_tag)\n  .\n  (_) @function.inner\n  .\n  (end_tag))\n\n((element\n  (start_tag\n    (tag_name) @_tag)) @class.outer\n  (#match? @_tag \"^(html|section|h[0-9]|header|title|head|body)$\"))\n\n((element\n  (start_tag\n    (tag_name) @_tag)\n  .\n  (_) @class.inner\n  .\n  (end_tag))\n  (#match? @_tag \"^(html|section|h[0-9]|header|title|head|body)$\"))\n\n((element\n  (start_tag\n    (tag_name) @_tag)\n  _+ @class.inner\n  (end_tag))\n  (#match? @_tag \"^(html|section|h[0-9]|header|title|head|body)$\"))\n\n(comment) @comment.outer\n\n"
  },
  {
    "path": "queries/inko/textobjects.scm",
    "content": "; Classes\n(class) @class.outer\n\n(class\n  body: (class_body\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n; Traits\n(trait) @class.outer\n\n(trait\n  body: (trait_body\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n; Implementations\n(implement_trait) @class.outer\n\n(implement_trait\n  body: (implement_trait_body\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n(reopen_class) @class.outer\n\n(reopen_class\n  body: (reopen_class_body\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n; Methods and closures\n(method) @function.outer\n\n(method\n  body: (block\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(closure) @function.outer\n\n(closure\n  body: (block\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n; Loops\n(while\n  body: (block\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\")) @loop.outer\n\n(while\n  condition: (_) @conditional.inner)\n\n(loop\n  body: (block\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\")) @loop.outer\n\n; Conditionals\n(if\n  alternative: (_\n    (_) @conditional.inner)?) @conditional.outer\n\n(if\n  consequence: (block) @conditional.inner)\n\n(if\n  condition: (_) @conditional.inner)\n\n(case) @conditional.inner\n\n(match) @conditional.outer\n\n; Method calls\n(call) @call.outer\n\n(call\n  arguments: (arguments\n    .\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n(return\n  (_)? @return.inner) @return.outer\n\n; Call and type arguments\n(arguments\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(arguments\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(type_arguments\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(type_arguments\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; Patterns\n(class_pattern\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(class_pattern\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(tuple_pattern\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(tuple_pattern\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; Sequence types\n(tuple\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(tuple\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(array\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(array\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; Blocks\n(block\n  (_)? @block.inner) @block.outer\n\n; Comments\n(line_comment) @comment.outer\n\n; Numbers\n[\n  (integer)\n  (float)\n] @number.inner\n\n; Variable definitions and assignments\n(identifier_pattern\n  name: (_) @assignment.lhs\n  type: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(define_constant\n  name: (_) @assignment.lhs\n  value: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(assign_local\n  name: (_) @assignment.lhs\n  value: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(assign_field\n  name: (_) @assignment.lhs\n  value: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(assign_receiver_field\n  name: (_) @assignment.lhs\n  value: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(replace_local\n  name: (_) @assignment.lhs\n  value: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(replace_field\n  name: (_) @assignment.lhs\n  value: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(compound_assign_local\n  name: (_) @assignment.lhs\n  value: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(compound_assign_field\n  name: (_) @assignment.lhs\n  value: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(compound_assign_receiver_field\n  name: (_) @assignment.lhs\n  value: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n"
  },
  {
    "path": "queries/java/textobjects.scm",
    "content": "(class_declaration\n  body: (class_body) @class.inner) @class.outer\n\n(method_declaration) @function.outer\n\n(method_declaration\n  body: (block\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(constructor_declaration) @function.outer\n\n(constructor_declaration\n  body: (constructor_body\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(return_statement\n  (_)? @return.inner) @return.outer\n\n(for_statement\n  body: (_)? @loop.inner) @loop.outer\n\n(enhanced_for_statement\n  body: (_)? @loop.inner) @loop.outer\n\n(while_statement\n  body: (_)? @loop.inner) @loop.outer\n\n(do_statement\n  body: (_)? @loop.inner) @loop.outer\n\n(if_statement\n  condition: (_\n    (parenthesized_expression) @conditional.inner) @conditional.outer)\n\n(if_statement\n  consequence: (_)? @conditional.inner\n  alternative: (_)? @conditional.inner) @conditional.outer\n\n(switch_expression\n  body: (_)? @conditional.inner) @conditional.outer\n\n; blocks\n(block) @block.outer\n\n(method_invocation) @call.outer\n\n(method_invocation\n  arguments: (argument_list\n    .\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n; parameters\n(formal_parameters\n  \",\" @parameter.outer\n  .\n  (formal_parameter) @parameter.inner @parameter.outer)\n\n(formal_parameters\n  .\n  (formal_parameter) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(argument_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(argument_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n[\n  (line_comment)\n  (block_comment)\n] @comment.outer\n\n[\n  (decimal_integer_literal)\n  (decimal_floating_point_literal)\n  (hex_integer_literal)\n  (binary_integer_literal)\n  (octal_integer_literal)\n] @number.inner\n\n; scopename\n; statement\n(statement) @statement.outer\n\n(return_statement) @statement.outer\n\n"
  },
  {
    "path": "queries/javascript/textobjects.scm",
    "content": "; inherits: ecma,jsx\n\n"
  },
  {
    "path": "queries/json/textobjects.scm",
    "content": "(comment) @comment.outer\n\n"
  },
  {
    "path": "queries/jsx/textobjects.scm",
    "content": "; inherits: ecma\n\n(jsx_attribute) @attribute.outer\n\n(jsx_attribute\n  (property_identifier)\n  (_\n    (_) @attribute.inner))\n\n"
  },
  {
    "path": "queries/julia/textobjects.scm",
    "content": "; Blocks\n(compound_statement) @block.outer\n\n(compound_statement\n  .\n  (_) @block.inner\n  (_)? @block.inner .)\n\n(quote_statement) @block.outer\n\n(quote_statement\n  .\n  (_) @block.inner\n  (_)? @block.inner .)\n\n(let_statement) @block.outer\n\n(let_statement\n  .\n  (_) @block.inner\n  (_)? @block.inner .)\n\n; Conditionals\n(if_statement\n  condition: (_) @conditional.inner) @conditional.outer\n\n(if_statement\n  alternative: (elseif_clause\n    condition: (_) @conditional.inner))\n\n((if_statement\n  condition: (_)\n  .\n  (_) @conditional.inner\n  (_)? @conditional.inner\n  .\n  [\n    \"end\"\n    (elseif_clause)\n    (else_clause)\n  ]) @conditional.outer\n  (elseif_clause\n    condition: (_)\n    .\n    (_) @conditional.inner\n    (_)? @conditional.inner .))\n\n(else_clause\n  .\n  (_) @conditional.inner\n  (_)? @conditional.inner .)\n\n; Loops\n(for_statement) @loop.outer\n\n(for_statement\n  .\n  (_) @loop.inner\n  (_)? @loop.inner .)\n\n(while_statement\n  condition: (_) @loop.inner) @loop.outer\n\n(while_statement\n  condition: (_)\n  .\n  (_) @loop.inner\n  (_)? @loop.inner .)\n\n; Type definitions\n(struct_definition) @class.outer\n\n(struct_definition\n  (type_head)\n  .\n  (_) @class.inner\n  (_)? @class.inner .)\n\n; Function definitions\n(function_definition) @function.outer\n\n(function_definition\n  (signature)\n  .\n  (_) @function.inner\n  (_)? @function.inner .)\n\n(assignment\n  (call_expression)\n  (operator)\n  (_) @function.inner) @function.outer\n\n(arrow_function_expression\n  [\n    (identifier)\n    (argument_list)\n  ]\n  \"->\"\n  (_) @function.inner) @function.outer\n\n(macro_definition) @function.outer\n\n(macro_definition\n  (signature)\n  .\n  (_) @function.inner\n  (_)? @function.inner .)\n\n; Calls\n(call_expression) @call.outer\n\n(call_expression\n  (argument_list\n    .\n    \"(\"\n    .\n    (_) @call.inner\n    (_)? @call.inner\n    .\n    \")\"))\n\n(macrocall_expression) @call.outer\n\n(macrocall_expression\n  (argument_list\n    .\n    \"(\"\n    .\n    (_) @call.inner\n    (_)? @call.inner\n    .\n    \")\"))\n\n(broadcast_call_expression) @call.outer\n\n(broadcast_call_expression\n  (argument_list\n    .\n    \"(\"\n    .\n    (_) @call.inner\n    (_)? @call.inner\n    .\n    \")\"))\n\n; Parameters\n((argument_list\n  [\n    \",\"\n    \";\"\n  ] @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n  (argument_list\n    (_) @parameter.inner @parameter.outer\n    .\n    [\n      \",\"\n      \";\"\n    ] @parameter.outer))\n\n(tuple_expression\n  [\n    \",\"\n    \";\"\n  ] @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(tuple_expression\n  \"(\"\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  [\n    \",\"\n    \";\"\n  ]? @parameter.outer)\n\n(vector_expression\n  [\n    \",\"\n    \";\"\n  ] @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(vector_expression\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  [\n    \",\"\n    \";\"\n  ]? @parameter.outer)\n\n; Assignment\n(assignment\n  .\n  (_) @assignment.lhs\n  (_) @assignment.inner @assignment.rhs .) @assignment.outer\n\n(assignment\n  .\n  (_) @assignment.inner)\n\n(compound_assignment_expression\n  .\n  (_) @assignment.lhs\n  (_) @assignment.inner @assignment.rhs .) @assignment.outer\n\n(compound_assignment_expression\n  .\n  (_) @assignment.inner)\n\n; Comments\n[\n  (line_comment)\n  (block_comment)\n] @comment.outer\n\n; Regex\n((prefixed_string_literal\n  prefix: (identifier) @_prefix) @regex.inner @regex.outer\n  (#eq? @_prefix \"r\"))\n\n"
  },
  {
    "path": "queries/kotlin/textobjects.scm",
    "content": "(class_declaration\n  [\n    (class_body)\n    (enum_class_body)\n  ]? @class.inner) @class.outer\n\n[\n  (function_declaration\n    (function_body) @function.inner)\n  (getter\n    (function_body) @function.inner)\n  (setter\n    (function_body) @function.inner)\n  (primary_constructor)\n] @function.outer\n\n(primary_constructor) @function.inner\n\n[\n  (parameter\n    (simple_identifier) @parameter.inner)\n  (class_parameter\n    (simple_identifier) @parameter.inner)\n] @parameter.outer\n\n(value_arguments\n  \",\" @parameter.outer\n  .\n  (value_argument) @parameter.inner @parameter.outer)\n\n(value_arguments\n  .\n  (value_argument) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; last element, with trailing comma\n(value_arguments\n  (value_argument) @parameter.outer\n  .\n  \",\" @parameter.outer .)\n\n[\n  (line_comment)\n  (multiline_comment)\n] @comment.outer\n\n(if_expression\n  (control_structure_body) @conditional.inner) @conditional.outer\n\n(when_expression\n  (when_entry) @conditional.inner) @conditional.outer\n\n[\n  (for_statement\n    (control_structure_body) @loop.inner)\n  (while_statement\n    (control_structure_body) @loop.inner)\n] @loop.outer\n\n[\n  (integer_literal)\n  (real_literal)\n] @number.inner\n\n"
  },
  {
    "path": "queries/latex/textobjects.scm",
    "content": "(generic_environment\n  .\n  (_)\n  _+ @block.inner\n  (_) .) @block.outer\n\n((generic_environment\n  (begin\n    name: (curly_group_text\n      (text) @_frame))\n  _+ @frame.inner\n  (_) .) @frame.outer\n  (#eq? @_frame \"frame\"))\n\n[\n  (generic_command)\n  (text_mode)\n] @call.outer\n\n(text_mode\n  (curly_group\n    \"{\"\n    _+ @call.inner\n    \"}\"))\n\n(generic_command\n  (curly_group\n    \"{\"\n    _+ @call.inner\n    \"}\"))\n\n(part\n  text: (_)\n  _+ @class.inner)\n\n(part\n  text: (_)) @class.outer\n\n(chapter\n  text: (_)\n  _+ @class.inner)\n\n(chapter\n  text: (_)) @class.outer\n\n(section\n  text: (_)\n  _+ @class.inner)\n\n(section\n  text: (_)) @class.outer\n\n(subsection\n  text: (_)\n  _+ @class.inner)\n\n(subsection\n  text: (_)) @class.outer\n\n(subsubsection\n  text: (_)\n  _+ @class.inner)\n\n(subsubsection\n  text: (_)) @class.outer\n\n(paragraph\n  text: (_)\n  _+ @class.inner)\n\n(paragraph\n  text: (_)) @class.outer\n\n(subparagraph\n  text: (_)\n  _+ @class.inner)\n\n(subparagraph\n  text: (_)) @class.outer\n\n"
  },
  {
    "path": "queries/lua/textobjects.scm",
    "content": "; block\n(_\n  (block) @block.inner) @block.outer\n\n; call\n(function_call) @call.outer\n\n"
  },
  {
    "path": "queries/markdown/textobjects.scm",
    "content": "(atx_heading\n  heading_content: (_) @class.inner) @class.outer\n\n(setext_heading\n  heading_content: (_) @class.inner) @class.outer\n\n(thematic_break) @class.outer\n\n(fenced_code_block\n  (code_fence_content) @block.inner) @block.outer\n\n[\n  (paragraph)\n  (list)\n] @block.outer\n\n"
  },
  {
    "path": "queries/matlab/textobjects.scm",
    "content": "(_\n  (block) @block.inner) @block.outer\n\n(block\n  (_) @statement.outer)\n\n(source_file\n  (_) @statement.outer)\n\n(function_call\n  (arguments)? @call.inner) @call.outer\n\n(arguments\n  \",\"? @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer .)\n\n(arguments\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\" @parameter.outer)\n\n(command) @call.outer\n\n(command\n  (command_argument) @parameter.inner @parameter.outer)\n\n(command\n  (command_argument)+ @call.inner)\n\n(if_statement\n  (block) @conditional.inner) @conditional.outer\n\n(if_statement\n  (elseif_clause\n    (block) @conditional.inner))\n\n(if_statement\n  (else_clause\n    (block) @conditional.inner))\n\n(switch_statement\n  (case_clause\n    (block) @conditional.inner)) @conditional.outer\n\n(switch_statement\n  (otherwise_clause\n    (block) @conditional.inner))\n\n(for_statement\n  (block) @loop.inner) @loop.outer\n\n(while_statement\n  (block) @loop.inner) @loop.outer\n\n(lambda\n  expression: (_) @function.inner) @function.outer\n\n(global_operator\n  (identifier) @parameter.inner)\n\n(persistent_operator\n  (identifier) @parameter.inner)\n\n(function_definition\n  (block) @function.inner) @function.outer\n\n(function_output\n  (identifier) @parameter.inner @parameter.outer)\n\n(function_arguments\n  \",\"? @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer .)\n\n(function_arguments\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\" @parameter.outer)\n\n(multioutput_variable\n  \",\"? @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer .)\n\n(multioutput_variable\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\" @parameter.outer)\n\n(try_statement\n  (block) @conditional.inner) @conditional.outer\n\n(catch_clause\n  (identifier) @parameter.inner @parameter.outer)\n\n(catch_clause\n  (block) @conditional.inner)\n\n(class_definition) @class.outer\n\n(number) @number.inner\n\n(_\n  (return_statement) @return.inner @return.outer)\n\n(comment) @comment.outer\n\n(matrix\n  (row) @parameter.outer)\n\n(cell\n  (row) @parameter.outer)\n\n(row\n  (_) @parameter.inner)\n\n(assignment\n  left: (_) @assignment.lhs\n  (_) @assignment.rhs) @assignment.outer\n\n(superclasses\n  \"&\"? @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer .)\n\n(superclasses\n  (_) @parameter.inner @parameter.outer\n  .\n  \"&\" @parameter.outer)\n\n(enum\n  (identifier) @parameter.inner @parameter.outer)\n\n(property\n  name: (_) @parameter.outer @parameter.inner)\n\n(enum\n  \",\"? @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer .)\n\n(enum\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\" @parameter.outer)\n\n(validation_functions\n  \",\"? @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer .)\n\n(validation_functions\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\" @parameter.outer)\n\n(dimensions\n  \",\"? @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer .)\n\n(dimensions\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\" @parameter.outer)\n\n(attributes\n  \",\"? @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer .)\n\n(attributes\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\" @parameter.outer)\n\n"
  },
  {
    "path": "queries/nasm/textobjects.scm",
    "content": "; adapted from https://github.com/naclsn/tree-sitter-nasm/blob/main/queries/textobjects.scm\n(preproc_multiline_macro\n  body: (body) @function.inner) @function.outer\n\n(struc_declaration\n  body: (struc_declaration_body) @class.inner) @class.outer\n\n(struc_instance\n  body: (struc_instance_body) @class.inner) @class.outer\n\n(preproc_function_def_parameters\n  (word) @parameter.inner)\n\n(call_syntax_arguments\n  (_) @parameter.inner)\n\n(operand) @parameter.inner\n\n(comment) @comment.outer\n\n"
  },
  {
    "path": "queries/nim/textobjects.scm",
    "content": "; ==============================================================================\n; @attribute.inner\n; @attribute.outer\n; ==============================================================================\n; @function.inner\n; @function.outer\n(proc_declaration\n  body: (statement_list) @function.inner) @function.outer\n\n(func_declaration\n  body: (statement_list) @function.inner) @function.outer\n\n(method_declaration\n  body: (statement_list) @function.inner) @function.outer\n\n(iterator_declaration\n  body: (statement_list) @function.inner) @function.outer\n\n(converter_declaration\n  body: (statement_list) @function.inner) @function.outer\n\n(template_declaration\n  body: (statement_list) @function.inner) @function.outer\n\n(macro_declaration\n  body: (statement_list) @function.inner) @function.outer\n\n(proc_expression\n  body: (statement_list) @function.inner) @function.outer\n\n(func_expression\n  body: (statement_list) @function.inner) @function.outer\n\n(iterator_expression\n  body: (statement_list) @function.inner) @function.outer\n\n; ==============================================================================\n; @class.inner\n; @class.outer\n; NOTE: seems pointless to handle just object declarations differently\n; ==============================================================================\n; @conditional.inner\n; @conditional.outer\n[\n  (if)\n  (when)\n  (conditional_declaration)\n  (case)\n  (variant_declaration)\n  (elif_branch)\n  (else_branch)\n  (of_branch)\n] @conditional.outer\n\n(if\n  condition: (_) @conditional.inner)\n\n(if\n  consequence: (statement_list) @conditional.inner)\n\n(when\n  condition: (_) @conditional.inner)\n\n(when\n  consequence: (statement_list) @conditional.inner)\n\n(conditional_declaration\n  condition: (_) @conditional.inner)\n\n(conditional_declaration\n  consequence: (field_declaration_list) @conditional.inner)\n\n(elif_branch\n  condition: (_) @conditional.inner)\n\n(elif_branch\n  consequence: [\n    (statement_list)\n    (field_declaration_list)\n  ] @conditional.inner)\n\n(else_branch\n  consequence: [\n    (statement_list)\n    (field_declaration_list)\n  ] @conditional.inner)\n\n(case\n  value: (_) @conditional.inner)\n\n(variant_declaration\n  (variant_discriminator_declaration) @conditional.inner)\n\n(of_branch\n  values: (expression_list) @conditional.inner)\n\n(of_branch\n  consequence: [\n    (statement_list)\n    (field_declaration_list)\n  ] @conditional.inner)\n\n; ==============================================================================\n; @loop.inner\n; @loop.outer\n[\n  (for)\n  (while)\n] @loop.outer\n\n(for\n  left: (_) @loop.inner\n  right: (_) @loop.inner)\n\n(for\n  body: (statement_list) @loop.inner)\n\n(while\n  condition: (_) @loop.inner)\n\n(while\n  body: (statement_list) @loop.inner)\n\n; ==============================================================================\n; @call.inner\n; @call.outer\n(call\n  (argument_list) @call.inner) @call.outer\n\n; NOTE: parenthesis are included in @call.inner\n; ==============================================================================\n; @block.inner\n; @block.outer\n(case\n  \":\"\n  _+ @block.inner) @block.outer\n\n(object_declaration\n  (field_declaration_list) @block.inner) @block.outer\n\n(tuple_type\n  (field_declaration_list\n    .\n    \"[\"\n    _+ @block.inner\n    \"]\" .)) @block.outer\n\n(enum_declaration\n  .\n  \"enum\"\n  _+ @block.inner) @block.outer\n\n(using_section\n  .\n  \"using\"\n  _+ @block.inner) @block.outer\n\n(const_section\n  .\n  \"const\"\n  _+ @block.inner) @block.outer\n\n(let_section\n  .\n  \"let\"\n  _+ @block.inner) @block.outer\n\n(var_section\n  .\n  \"var\"\n  _+ @block.inner) @block.outer\n\n(type_section\n  .\n  \"type\"\n  _+ @block.inner)\n\n(_\n  (statement_list) @block.inner) @block.outer\n\n; ==============================================================================\n; @parameter.inner\n; @parameter.outer\n; parameters when declaring\n(parameter_declaration_list\n  [\n    \",\"\n    \";\"\n  ] @parameter.outer\n  .\n  (parameter_declaration) @parameter.inner @parameter.outer)\n\n(parameter_declaration_list\n  .\n  (parameter_declaration) @parameter.inner @parameter.outer\n  .\n  [\n    \",\"\n    \";\"\n  ]? @parameter.outer)\n\n; generic parameters when declaring\n(generic_parameter_list\n  \",\" @parameter.outer\n  .\n  (parameter_declaration) @parameter.inner @parameter.outer)\n\n(generic_parameter_list\n  .\n  (parameter_declaration) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; arguments when calling\n(argument_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(argument_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; containers\n(array_construction\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(array_construction\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(tuple_construction\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(tuple_construction\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(curly_construction\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(curly_construction\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; generic arguments when calling\n; subscript operator\n; generic types\n(bracket_expression\n  right: (argument_list\n    \",\" @parameter.outer\n    .\n    (_) @parameter.inner @parameter.outer))\n\n(bracket_expression\n  right: (argument_list\n    .\n    (_) @parameter.inner @parameter.outer\n    .\n    \",\"? @parameter.outer))\n\n; import x,x\n; import except x,x\n; include x,x\n; from import x,x\n; bind x,x\n; mixin x,x\n; case of x,x\n; try except x,x\n(expression_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(expression_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; pragmas\n(pragma_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(pragma_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; variable_declaration\n; for\n; identifier_declaration `x,y: type = value`\n(symbol_declaration_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(symbol_declaration_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; infix_expression\n(infix_expression\n  operator: (_) @parameter.outer\n  right: (_) @parameter.inner @parameter.outer)\n\n(infix_expression\n  left: (_) @parameter.inner @parameter.outer\n  operator: (_) @parameter.outer)\n\n; tuple_type inline\n(field_declaration_list\n  [\n    \",\"\n    \";\"\n  ] @parameter.outer\n  .\n  (field_declaration) @parameter.inner @parameter.outer)\n\n(field_declaration_list\n  .\n  (field_declaration) @parameter.inner @parameter.outer\n  .\n  [\n    \",\"\n    \";\"\n  ]? @parameter.outer)\n\n; enum\n(enum_declaration\n  \",\" @parameter.outer\n  .\n  (enum_field_declaration) @parameter.inner @parameter.outer)\n\n(enum_declaration\n  .\n  (enum_field_declaration) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; tuple_deconstruct_declaration\n(tuple_deconstruct_declaration\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(tuple_deconstruct_declaration\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; concept parameter list\n; concept refinement list\n(parameter_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(parameter_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(refinement_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(refinement_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; dot_generic_call `v.call[:type, type]()\n(generic_argument_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(generic_argument_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; ==============================================================================\n; @regex.inner\n; @regex.outer\n; ==============================================================================\n; @comment.inner\n; @comment.outer\n(comment\n  (comment_content) @comment.inner) @comment.outer\n\n(block_comment\n  (comment_content) @comment.inner) @comment.outer\n\n(documentation_comment\n  (comment_content) @comment.inner) @comment.outer\n\n(block_documentation_comment\n  (comment_content) @comment.inner) @comment.outer\n\n; ==============================================================================\n; @assignment.inner\n; @assignment.outer\n; @assignment.lhs\n; @assignment.rhs\n(variable_declaration\n  (symbol_declaration_list) @assignment.lhs\n  type: (type_expression)? @assignment.lhs\n  value: (_) @assignment.rhs @assignment.inner) @assignment.outer\n\n(type_declaration\n  (type_symbol_declaration) @assignment.lhs\n  .\n  \"=\"\n  .\n  (_) @assignment.rhs @assignment.inner) @assignment.outer\n\n(assignment\n  left: (_) @assignment.lhs\n  right: (_) @assignment.rhs @assignment.inner) @assignment.outer\n\n; default parameter in proc decl\n; keyword argument in call\n; array construction\n(colon_expression\n  left: (_) @assignment.lhs\n  right: (_) @assignment.rhs @assignment.inner) @assignment.outer\n\n; object construction\n; tuple construction\n; table construction\n(equal_expression\n  left: (_) @assignment.lhs\n  right: (_) @assignment.rhs @assignment.inner) @assignment.outer\n\n; object declaration fields\n; tuple declaration fields\n(field_declaration\n  (symbol_declaration_list) @assignment.lhs\n  type: (type_expression)? @assignment.lhs\n  value: (_)? @assignment.rhs @assignment.inner) @assignment.outer\n\n; enum types\n(enum_field_declaration\n  (symbol_declaration) @assignment.lhs\n  \"=\"?\n  value: (_)? @assignment.rhs @assignment.inner) @assignment.outer\n\n; ==============================================================================\n; @return.inner\n; @return.outer\n(return_statement\n  (_) @return.inner) @return.outer\n\n; ==============================================================================\n; @statement.outer\n[\n  ; simple\n  (import_statement)\n  (import_from_statement)\n  (export_statement)\n  (include_statement)\n  (discard_statement)\n  (return_statement)\n  (raise_statement)\n  (yield_statement)\n  (break_statement)\n  (continue_statement)\n  (assembly_statement)\n  (bind_statement)\n  (mixin_statement)\n  (pragma_statement)\n  ; complex\n  (while)\n  (static_statement)\n  (defer)\n  ; declarations\n  (proc_declaration)\n  (func_declaration)\n  (method_declaration)\n  (iterator_declaration)\n  (macro_declaration)\n  (template_declaration)\n  (converter_declaration)\n  (using_section)\n  (const_section)\n  (let_section)\n  (var_section)\n  (type_section)\n  ; expression statements\n  (block)\n  (if)\n  (when)\n  (case)\n  (try)\n  (for)\n  (assignment)\n  ; NOTE: not including\n  ; simple_expression, call, infix_expression, prefix_expression\n  ; because it would confusing\n] @statement.outer\n\n; ==============================================================================\n; @scopename.inner\n; ==============================================================================\n; @number.inner\n[\n  (integer_literal)\n  (float_literal)\n] @number.inner\n\n"
  },
  {
    "path": "queries/nix/textobjects.scm",
    "content": "; named function\n(binding\n  (function_expression)) @function.outer\n\n; anonymous function\n(function_expression\n  (_) ; argument\n  (_) @function.inner) @function.outer\n\n(function_expression\n  (formals\n    (formal) @parameter.inner))\n\n(function_expression\n  (_) @parameter.outer\n  (_))\n\n(comment) @comment.outer\n\n(if_expression\n  (_) @conditional.inner) @conditional.outer\n\n[\n  (integer_expression)\n  (float_expression)\n] @number.inner\n\n"
  },
  {
    "path": "queries/ocaml/textobjects.scm",
    "content": "(value_definition\n  (let_binding\n    ; let f x = 1 but not let x = 1\n    (parameter)+\n    body: (_) @function.inner)) @function.outer\n\n(value_definition\n  (let_binding\n    ; let f = function | A | B -> body\n    body: (function_expression) @function.inner)) @function.outer\n\n(value_definition\n  (let_binding\n    ; let f = fun x -> body\n    body: (fun_expression) @function.inner)) @function.outer\n\n; standalone function expression, e.g. List.iter ~f:(function | A | B -> body)\n(parenthesized_expression\n  (function_expression) @function.inner) @function.outer\n\n; standalone function expression, e.g. List.iter ~f:(fun x -> body)\n(parenthesized_expression\n  (fun_expression) @function.inner) @function.outer\n\n(method_definition\n  body: (_) @function.inner) @function.outer\n\n; let pattern = body (also matches let f x = expr due to grammar limits)\n; Since we want @assignment.inner to match both pattern and body we have to split it into two:\n(value_definition\n  (let_binding\n    pattern: (_) @assignment.lhs @assignment.inner)) @assignment.outer\n\n(value_definition\n  (let_binding\n    body: (_) @assignment.rhs @assignment.inner))\n\n; module M = struct ... end\n(module_definition\n  (module_binding\n    body: (structure) @class.inner)) @class.outer\n\n; struct ... end\n(structure\n  (_structure_item)+ @block.inner) @block.outer\n\n(class_definition\n  (class_binding\n    body: (_) @class.inner)) @class.outer\n\n(for_expression\n  (do_clause\n    (_) @loop.inner)) @loop.outer\n\n(while_expression\n  (do_clause\n    (_) @loop.inner)) @loop.outer\n\n(if_expression\n  condition: (_)\n  (then_clause\n    (_) @conditional.inner)\n  (else_clause\n    (_) @conditional.inner)) @conditional.outer\n\n(if_expression\n  condition: (_)\n  (then_clause\n    (_) @conditional.inner)) @conditional.outer\n\n(function_expression\n  (match_case)+ @conditional.inner) @conditional.outer\n\n(match_expression\n  (match_case)+ @conditional.inner) @conditional.outer\n\n(comment) @comment.outer\n\n(parameter) @parameter.outer\n\n(application_expression\n  argument: (_) @parameter.outer) @call.outer\n\n(application_expression\n  argument: (_)+ @call.inner)\n\n; parenthesized selections are handled well by vi"
  },
  {
    "path": "queries/odin/textobjects.scm",
    "content": "; procedures\n(procedure_declaration\n  (_\n    (block\n      .\n      \"{\"\n      _+ @function.inner\n      \"}\"))) @function.outer\n\n; returns\n(return_statement\n  (_)? @return.inner) @return.outer\n\n; call function in module\n(member_expression\n  (call_expression)) @call.outer\n\n; call arguments\n(call_expression\n  function: (_)\n  .\n  argument: (_) @call.inner\n  argument: (_) @call.inner .)\n\n; block\n(block\n  .\n  \"{\"\n  _+ @block.inner\n  \"}\") @block.outer\n\n; classes\n(struct_declaration\n  \"{\"\n  _+ @class.inner\n  \"}\") @class.outer\n\n(union_declaration\n  \"{\"\n  _+ @class.inner\n  \"}\") @class.outer\n\n(enum_declaration\n  \"{\"\n  _+ @class.inner\n  \"}\") @class.outer\n\n; comments\n(comment) @comment.outer\n\n(block_comment) @comment.outer\n\n; assignment\n; works also for multiple targets in lhs. ex. 'res, ok := get_res()'\n(assignment_statement\n  .\n  (_) @assignment.lhs\n  (_) @assignment.lhs\n  .\n  (_) @assignment.rhs @assignment.inner .) @assignment.outer\n\n; attribute\n(attribute\n  (_) @attribute.inner) @attribute.outer\n\n; number\n(number) @number.inner\n\n; parameters\n(parameters\n  \",\" @parameter.outer\n  .\n  (parameter) @parameter.inner @parameter.outer)\n\n(parameters\n  .\n  (parameter) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(call_expression\n  function: (_)\n  \",\" @parameter.outer\n  .\n  argument: (_) @parameter.inner @parameter.outer)\n\n(call_expression\n  function: (_)\n  .\n  argument: (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n"
  },
  {
    "path": "queries/perl/textobjects.scm",
    "content": "(comment) @comment.outer\n\n(quoted_regexp) @regex.outer\n\n(match_regexp) @regex.outer\n\n"
  },
  {
    "path": "queries/php/textobjects.scm",
    "content": "; functions\n(function_definition\n  body: (compound_statement\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(function_definition) @function.outer\n\n(anonymous_function\n  body: (compound_statement\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(anonymous_function) @function.outer\n\n; methods\n(method_declaration\n  body: (compound_statement\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(method_declaration) @function.outer\n\n; traits\n(trait_declaration\n  body: (declaration_list\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n(trait_declaration) @class.outer\n\n; interfaces\n(interface_declaration\n  body: (declaration_list\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n(interface_declaration) @class.outer\n\n; enums\n(enum_declaration\n  body: (enum_declaration_list\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n(enum_declaration) @class.outer\n\n; classes\n(class_declaration\n  body: (declaration_list\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n(class_declaration) @class.outer\n\n; loops\n(for_statement\n  (compound_statement\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\"))\n\n(for_statement) @loop.outer\n\n(foreach_statement\n  body: (compound_statement\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\"))\n\n(foreach_statement) @loop.outer\n\n(while_statement\n  body: (compound_statement\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\"))\n\n(while_statement) @loop.outer\n\n(do_statement\n  body: (compound_statement\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\"))\n\n(do_statement) @loop.outer\n\n; conditionals\n(switch_statement\n  body: (switch_block\n    .\n    \"{\"\n    _+ @conditional.inner\n    \"}\"))\n\n(switch_statement) @conditional.outer\n\n(if_statement\n  body: (compound_statement\n    .\n    \"{\"\n    _+ @conditional.inner\n    \"}\"))\n\n(if_statement) @conditional.outer\n\n(else_clause\n  body: (compound_statement\n    .\n    \"{\"\n    _+ @conditional.inner\n    \"}\"))\n\n(else_if_clause\n  body: (compound_statement\n    .\n    \"{\"\n    _+ @conditional.inner\n    \"}\"))\n\n; blocks\n(_\n  (switch_block) @block.inner) @block.outer\n\n; parameters\n(arguments\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(arguments\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(formal_parameters\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(formal_parameters\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; comments\n(comment) @comment.outer\n\n; call\n(function_call_expression) @call.outer\n\n(member_call_expression) @call.outer\n\n(nullsafe_member_call_expression) @call.outer\n\n(scoped_call_expression) @call.outer\n\n(function_call_expression\n  arguments: (arguments\n    .\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n(member_call_expression\n  arguments: (arguments\n    .\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n(nullsafe_member_call_expression\n  arguments: (arguments\n    .\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n(scoped_call_expression\n  arguments: (arguments\n    .\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n; statement\n[\n  (expression_statement)\n  (declare_statement)\n  (return_statement)\n  (namespace_use_declaration)\n  (namespace_definition)\n  (if_statement)\n  (empty_statement)\n  (switch_statement)\n  (while_statement)\n  (do_statement)\n  (for_statement)\n  (foreach_statement)\n  (goto_statement)\n  (continue_statement)\n  (break_statement)\n  (try_statement)\n  (echo_statement)\n  (unset_statement)\n  (const_declaration)\n  (function_definition)\n  (class_declaration)\n  (interface_declaration)\n  (trait_declaration)\n  (enum_declaration)\n  (global_declaration)\n  (function_static_declaration)\n] @statement.outer\n\n"
  },
  {
    "path": "queries/php_only/textobjects.scm",
    "content": "; inherits php\n\n"
  },
  {
    "path": "queries/python/textobjects.scm",
    "content": "(decorated_definition\n  (function_definition)) @function.outer\n\n(function_definition\n  body: (block)? @function.inner) @function.outer\n\n(decorated_definition\n  (class_definition)) @class.outer\n\n(class_definition\n  body: (block)? @class.inner) @class.outer\n\n(while_statement\n  body: (block)? @loop.inner) @loop.outer\n\n(for_statement\n  body: (block)? @loop.inner) @loop.outer\n\n(if_statement\n  alternative: (_\n    (_) @conditional.inner)?) @conditional.outer\n\n(if_statement\n  consequence: (block)? @conditional.inner)\n\n(if_statement\n  condition: (_) @conditional.inner)\n\n(_\n  (block) @block.inner) @block.outer\n\n; leave space after comment marker if there is one\n((comment) @comment.inner @comment.outer\n  (#match? @comment.outer \"# .*\"))\n\n; else remove everything accept comment marker\n((comment) @comment.inner @comment.outer)\n\n(block\n  (_) @statement.outer)\n\n(module\n  (_) @statement.outer)\n\n(call) @call.outer\n\n(call\n  arguments: (argument_list\n    .\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n(return_statement\n  (_)? @return.inner) @return.outer\n\n; Parameters\n(parameters\n  \",\" @parameter.outer\n  .\n  [\n    (identifier)\n    (tuple)\n    (typed_parameter)\n    (default_parameter)\n    (typed_default_parameter)\n    (dictionary_splat_pattern)\n    (list_splat_pattern)\n  ] @parameter.inner @parameter.outer)\n\n(parameters\n  .\n  [\n    (identifier)\n    (tuple)\n    (typed_parameter)\n    (default_parameter)\n    (typed_default_parameter)\n    (dictionary_splat_pattern)\n    (list_splat_pattern)\n  ] @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(lambda_parameters\n  \",\" @parameter.outer\n  .\n  [\n    (identifier)\n    (tuple)\n    (typed_parameter)\n    (default_parameter)\n    (typed_default_parameter)\n    (dictionary_splat_pattern)\n    (list_splat_pattern)\n  ] @parameter.inner @parameter.outer)\n\n(lambda_parameters\n  .\n  [\n    (identifier)\n    (tuple)\n    (typed_parameter)\n    (default_parameter)\n    (typed_default_parameter)\n    (dictionary_splat_pattern)\n    (list_splat_pattern)\n  ] @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(tuple\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(tuple\n  \"(\"\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(dictionary\n  .\n  (pair) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(dictionary\n  \",\" @parameter.outer\n  .\n  (pair) @parameter.inner @parameter.outer)\n\n(argument_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(argument_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(subscript\n  \"[\"\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(subscript\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(import_statement\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(import_statement\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(import_from_statement\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(import_from_statement\n  \"import\"\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n[\n  (integer)\n  (float)\n] @number.inner\n\n(assignment\n  left: (_) @assignment.lhs\n  right: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(assignment\n  left: (_) @assignment.inner)\n\n(augmented_assignment\n  left: (_) @assignment.lhs\n  right: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(augmented_assignment\n  left: (_) @assignment.inner)\n\n; TODO: exclude comments using the future negate syntax from tree-sitter\n\n"
  },
  {
    "path": "queries/ql/textobjects.scm",
    "content": "; class textobject\n(dataclass\n  (typeExpr)\n  (_) @class.inner) @class.outer\n\n; function textobject\n(charpred\n  (className)\n  (_) @function.inner) @function.outer\n\n(memberPredicate\n  (body) @function.inner) @function.outer\n\n(classlessPredicate\n  (body) @function.inner) @function.outer\n\n; scope name textobject\n(dataclass\n  name: (className) @scopename.inner)\n\n(classlessPredicate\n  name: (predicateName) @scopename.inner)\n\n(memberPredicate\n  name: (predicateName) @scopename.inner)\n\n(charpred\n  (className) @scopename.inner)\n\n"
  },
  {
    "path": "queries/query/textobjects.scm",
    "content": "(comment) @comment.outer\n\n[\n  (named_node)\n  (grouping)\n  (list)\n] @block.outer\n\n(program\n  [\n    (named_node)\n    (grouping)\n    (list)\n  ] @statement.outer)\n\n(parameters\n  (_) @parameter.inner)\n\n"
  },
  {
    "path": "queries/r/textobjects.scm",
    "content": "; block\n; call\n(call) @call.outer\n\n(arguments) @call.inner\n\n; class\n; comment\n(comment) @comment.outer\n\n; conditional\n(if_statement\n  condition: (_)? @conditional.inner) @conditional.outer\n\n; function\n(function_definition\n  [\n    (call)\n    (binary_operator)\n    (braced_expression)\n  ] @function.inner) @function.outer\n\n; loop\n[\n  (while_statement)\n  (repeat_statement)\n  (for_statement)\n] @loop.outer\n\n(while_statement\n  body: (_) @loop.inner)\n\n(repeat_statement\n  body: (_) @loop.inner)\n\n(for_statement\n  body: (_) @loop.inner)\n\n; statement\n(braced_expression\n  (_) @statement.outer)\n\n(program\n  (_) @statement.outer)\n\n; parameter\n(parameters\n  (comma) @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(parameters\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  (comma)? @parameter.outer)\n\n(arguments\n  (comma)? @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(arguments\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  (comma)? @parameter.outer)\n\n; number\n(float) @number.inner\n\n; assignment\n(binary_operator\n  lhs: (_) @assignment.inner @assignment.lhs\n  rhs: (_) @assignment.rhs) @assignment.outer\n\n"
  },
  {
    "path": "queries/readline/textobjects.scm",
    "content": "(variable_setting) @statement.outer\n\n(comment) @comment.outer\n\n((comment) @comment.inner)\n\n[\n  (alternative)\n  (consequence)\n  (test)\n] @conditional.inner\n\n(conditional_construct) @conditional.outer\n\n[\n  (number_value)\n  (version_number)\n] @number.inner\n\n"
  },
  {
    "path": "queries/rst/textobjects.scm",
    "content": "(directive\n  body: (body) @function.inner) @function.outer\n\n(section\n  (title) @class.inner) @class.outer\n\n(transition) @class.outer\n\n[\n  (bullet_list)\n  (enumerated_list)\n  (definition_list)\n  (field_list)\n  (literal_block)\n  (line_block)\n  (block_quote)\n  (doctest_block)\n] @block.outer\n\n(footnote\n  body: (body) @block.inner) @block.outer\n\n(citation\n  body: (body) @block.inner) @block.outer\n\n(target\n  link: (link) @block.inner) @block.outer\n\n(substitution_definition\n  body: (directive) @block.inner) @block.outer\n\n(comment) @comment.outer\n\n"
  },
  {
    "path": "queries/ruby/textobjects.scm",
    "content": "; @functions\n(method\n  body: (body_statement) @function.inner)\n\n(method) @function.outer\n\n(singleton_method\n  body: (body_statement) @function.inner)\n\n(singleton_method) @function.outer\n\n; @blocks\n(block\n  body: (block_body) @block.inner)\n\n(block) @block.outer\n\n(do_block\n  body: (body_statement) @block.inner)\n\n(do_block) @block.outer\n\n; @classes\n(class\n  body: (body_statement) @class.inner)\n\n(class) @class.outer\n\n(module\n  body: (body_statement) @class.inner)\n\n(module) @class.outer\n\n(singleton_class\n  body: (body_statement) @class.inner)\n\n(singleton_class) @class.outer\n\n; @parameters\n(block_parameters\n  (_) @parameter.inner)\n\n(method_parameters\n  (_) @parameter.inner)\n\n(lambda_parameters\n  (_) @parameter.inner)\n\n(argument_list\n  (_) @parameter.inner)\n\n[\n  (block_parameters)\n  (method_parameters)\n  (lambda_parameters)\n  (argument_list)\n] @parameter.outer\n\n; @comment\n(comment) @comment.outer\n\n; @regex\n(regex\n  (string_content) @regex.inner) @regex.outer\n\n"
  },
  {
    "path": "queries/rust/textobjects.scm",
    "content": "; functions\n(function_signature_item) @function.outer\n\n(function_item) @function.outer\n\n(function_item\n  body: (block\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n; quantifies as class(es)\n(struct_item) @class.outer\n\n(struct_item\n  body: (field_declaration_list\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n(enum_item) @class.outer\n\n(enum_item\n  body: (enum_variant_list\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n(union_item) @class.outer\n\n(union_item\n  body: (field_declaration_list\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n(trait_item) @class.outer\n\n(trait_item\n  body: (declaration_list\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n(impl_item) @class.outer\n\n(impl_item\n  body: (declaration_list\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n(mod_item) @class.outer\n\n(mod_item\n  body: (declaration_list\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n; conditionals\n(if_expression\n  alternative: (_\n    (_) @conditional.inner)?) @conditional.outer\n\n(if_expression\n  alternative: (else_clause\n    (block) @conditional.inner))\n\n(if_expression\n  condition: (_) @conditional.inner)\n\n(if_expression\n  consequence: (block) @conditional.inner)\n\n(match_arm\n  (_)) @conditional.inner\n\n(match_expression) @conditional.outer\n\n; loops\n(loop_expression\n  body: (block\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\")) @loop.outer\n\n(while_expression\n  body: (block\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\")) @loop.outer\n\n(for_expression\n  body: (block\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\")) @loop.outer\n\n; blocks\n(block\n  (_)* @block.inner) @block.outer\n\n(unsafe_block\n  (_)* @block.inner) @block.outer\n\n; calls\n(macro_invocation) @call.outer\n\n(macro_invocation\n  (token_tree\n    .\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n(call_expression) @call.outer\n\n(call_expression\n  arguments: (arguments\n    .\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n; returns\n(return_expression\n  (_)? @return.inner) @return.outer\n\n; statements\n(block\n  (_) @statement.outer)\n\n; comments\n(line_comment) @comment.outer\n\n(block_comment) @comment.outer\n\n; parameter\n(parameters\n  \",\" @parameter.outer\n  .\n  [\n    (self_parameter)\n    (parameter)\n    (type_identifier)\n  ] @parameter.inner @parameter.outer)\n\n(parameters\n  .\n  [\n    (self_parameter)\n    (parameter)\n    (type_identifier)\n  ] @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; last element, with trailing comma\n(parameters\n  [\n    (self_parameter)\n    (parameter)\n    (type_identifier)\n  ] @parameter.outer\n  .\n  \",\" @parameter.outer .)\n\n(type_parameters\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(type_parameters\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; last element, with trailing comma\n(type_parameters\n  (_) @parameter.outer\n  .\n  \",\" @parameter.outer .)\n\n(tuple_pattern\n  \",\" @parameter.outer\n  .\n  (identifier) @parameter.inner @parameter.outer)\n\n(tuple_pattern\n  .\n  (identifier) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; last element, with trailing comma\n(tuple_pattern\n  (identifier) @parameter.outer\n  .\n  \",\" @parameter.outer .)\n\n(tuple_struct_pattern\n  \",\" @parameter.outer\n  .\n  (identifier) @parameter.inner @parameter.outer)\n\n(tuple_struct_pattern\n  .\n  (identifier) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; last element, with trailing comma\n(tuple_struct_pattern\n  (identifier) @parameter.outer\n  .\n  \",\" @parameter.outer .)\n\n(tuple_expression\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(tuple_expression\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; last element, with trailing comma\n(tuple_expression\n  (_) @parameter.outer\n  .\n  \",\" @parameter.outer .)\n\n(tuple_type\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(tuple_type\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; last element, with trailing comma\n(tuple_type\n  (_) @parameter.outer\n  .\n  \",\" @parameter.outer .)\n\n(struct_item\n  body: (field_declaration_list\n    \",\" @parameter.outer\n    .\n    (_) @parameter.inner @parameter.outer))\n\n(struct_item\n  body: (field_declaration_list\n    .\n    (_) @parameter.inner @parameter.outer\n    .\n    \",\"? @parameter.outer))\n\n; last element, with trailing comma\n(struct_item\n  body: (field_declaration_list\n    (_) @parameter.outer\n    .\n    \",\" @parameter.outer .))\n\n(struct_expression\n  body: (field_initializer_list\n    \",\" @parameter.outer\n    .\n    (_) @parameter.inner @parameter.outer))\n\n(struct_expression\n  body: (field_initializer_list\n    .\n    (_) @parameter.inner @parameter.outer\n    .\n    \",\"? @parameter.outer))\n\n; last element, with trailing comma\n(struct_expression\n  body: (field_initializer_list\n    (_) @parameter.outer\n    .\n    \",\" @parameter.outer .))\n\n(closure_parameters\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(closure_parameters\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; last element, with trailing comma\n(closure_parameters\n  (_) @parameter.outer\n  .\n  \",\" @parameter.outer .)\n\n(arguments\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(arguments\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; last element, with trailing comma\n(arguments\n  (_) @parameter.outer\n  .\n  \",\" @parameter.outer .)\n\n(type_arguments\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(type_arguments\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; last element, with trailing comma\n(type_arguments\n  (_) @parameter.outer\n  .\n  \",\" @parameter.outer .)\n\n(token_tree\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(token_tree\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; last element, with trailing comma\n(token_tree\n  (_) @parameter.outer\n  .\n  \",\" @parameter.outer .)\n\n(scoped_use_list\n  list: (use_list\n    \",\" @parameter.outer\n    .\n    (_) @parameter.inner @parameter.outer))\n\n(scoped_use_list\n  list: (use_list\n    .\n    (_) @parameter.inner @parameter.outer\n    .\n    \",\"? @parameter.outer))\n\n; last element, with trailing comma\n(scoped_use_list\n  list: (use_list\n    (_) @parameter.outer\n    .\n    \",\" @parameter.outer .))\n\n[\n  (integer_literal)\n  (float_literal)\n] @number.inner\n\n(let_declaration\n  pattern: (_) @assignment.lhs\n  value: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(let_declaration\n  pattern: (_) @assignment.inner)\n\n(assignment_expression\n  left: (_) @assignment.lhs\n  right: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(assignment_expression\n  left: (_) @assignment.inner)\n\n"
  },
  {
    "path": "queries/scala/textobjects.scm",
    "content": "(class_definition\n  body: (template_body)? @class.inner) @class.outer\n\n(object_definition\n  body: (template_body)? @class.inner) @class.outer\n\n(function_definition\n  body: [\n    (indented_block)\n    (expression)\n    (indented_cases)\n    (block)\n  ] @function.inner) @function.outer\n\n(parameter\n  name: (identifier) @parameter.inner) @parameter.outer\n\n(class_parameter\n  name: (identifier) @parameter.inner) @parameter.outer\n\n(case_clause\n  body: (_) @conditional.inner) @conditional.outer\n\n(comment) @comment.outer\n\n"
  },
  {
    "path": "queries/scss/textobjects.scm",
    "content": "; inherits: css\n\n"
  },
  {
    "path": "queries/slang/textobjects.scm",
    "content": "; inherits: hlsl\n\n(template_declaration\n  (interface_specifier)) @class.outer\n\n(template_declaration\n  (extension_specifier)) @class.outer\n\n(extension_specifier\n  body: (_) @class.inner) @class.outer\n\n(interface_specifier\n  body: (_) @class.inner) @class.outer\n\n"
  },
  {
    "path": "queries/supercollider/textobjects.scm",
    "content": "; assignment\n(variable_definition\n  name: (_) @assignment.lhs\n  value: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(function_definition\n  name: (_) @assignment.lhs\n  value: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n; block\n(code_block\n  (_)* @block.inner) @block.outer\n\n; class\n(class_def\n  (class_def_body) @class.inner) @class.outer\n\n; call\n(function_call\n  arguments: (_\n    .\n    \"(\"\n    _+ @call.inner\n    \")\")?) @call.outer\n\n; comment\n(line_comment) @comment.outer\n\n(block_comment) @comment.outer\n\n; conditional:\n(function_call\n  name: (_) @_name\n  (#eq? @_name \"if\")\n  arguments: (parameter_call_list\n    (_) @conditional.inner)?) @conditional.outer\n\n; function\n((function_block) @function.inner @function.outer)\n\n; loop\n(function_call\n  name: (identifier) @_fname\n  (#eq? @_fname \"while\")\n  arguments: (parameter_call_list\n    (_) @loop.inner)?) @loop.outer\n\n(function_call\n  name: (identifier) @_fname\n  (#eq? @_fname \"for\")\n  arguments: (parameter_call_list\n    (_) @loop.inner .)?) @loop.outer\n\n(function_call\n  name: (identifier) @_fname\n  (#eq? @_fname \"forBy\")\n  arguments: (parameter_call_list\n    (_) @loop.inner .)?) @loop.outer\n\n; number\n(number) @number.inner\n\n;parameters\n(parameter_call_list\n  (_) @parameter.inner @parameter.outer\n  .\n  (\",\")? @parameter.outer)\n\n(parameter_call_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer .)\n\n(parameter_list\n  (_) @parameter.inner @parameter.outer\n  .\n  (\",\")? @parameter.outer)\n\n(parameter_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer .)\n\n(collection\n  (_) @parameter.inner @parameter.outer\n  .\n  (\",\")? @parameter.outer)\n\n(collection\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer .)\n\n; return\n(return_statement\n  (_) @return.inner) @return.outer\n\n"
  },
  {
    "path": "queries/svelte/textobjects.scm",
    "content": "; inherits: html\n\n; Svelte-specific text objects\n; based on grammar defined at\n; https://github.com/tree-sitter-grammars/tree-sitter-svelte\n; if block\n(if_statement) @block.outer @conditional.outer\n\n(if_statement\n  (if_start)\n  .\n  _+ @block.inner @conditional.inner\n  .\n  (if_end))\n\n; each block\n(each_statement) @block.outer @loop.outer\n\n(each_statement\n  (each_start)\n  .\n  _+ @block.inner @loop.inner\n  .\n  (each_end))\n\n; key block\n(key_statement) @block.outer\n\n(key_statement\n  (key_start)\n  .\n  _+ @block.inner\n  .\n  (key_end))\n\n; await block\n(await_statement) @block.outer\n\n(await_statement\n  (await_start)\n  .\n  _+ @block.inner\n  .\n  (await_end))\n\n; snippet block\n(snippet_statement) @block.outer\n\n(snippet_statement\n  (snippet_start)\n  .\n  _+ @block.inner\n  .\n  (snippet_end))\n\n"
  },
  {
    "path": "queries/swift/textobjects.scm",
    "content": "(class_declaration\n  body: (class_body\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\")) @class.outer\n\n(class_declaration\n  body: (enum_class_body\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\")) @class.outer\n\n(function_declaration\n  body: (function_body\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\")) @function.outer\n\n(lambda_literal\n  (\"{\"\n    _+ @function.inner\n    \"}\")) @function.outer\n\n(call_suffix\n  (value_arguments\n    .\n    \"(\"\n    _+ @call.inner\n    \")\")) @call.outer\n\n(value_argument\n  value: (_) @parameter.inner) @parameter.outer\n\n(comment) @comment.outer\n\n(multiline_comment) @comment.outer\n\n"
  },
  {
    "path": "queries/systemverilog/textobjects.scm",
    "content": "(function_declaration\n  (function_body_declaration\n    (tf_port_list)\n    .\n    _+ @function.inner\n    .\n    \"endfunction\")) @function.outer\n\n(task_declaration\n  (task_body_declaration\n    (tf_port_list)\n    .\n    _+ @function.inner\n    .\n    \"endtask\")) @function.outer\n\n[\n  (seq_block)\n  (generate_block)\n] @block.outer\n\n(seq_block\n  \"begin\"\n  (simple_identifier)?\n  .\n  _+ @block.inner\n  .\n  \"end\")\n\n(generate_block\n  \"begin\"\n  (simple_identifier)?\n  .\n  _+ @block.inner\n  .\n  \"end\")\n\n[\n  (one_line_comment)\n  (block_comment)\n] @comment.outer\n\n"
  },
  {
    "path": "queries/tact/textobjects.scm",
    "content": "; See: https://github.com/nvim-treesitter/nvim-treesitter-textobjects#built-in-textobjects\n; function.inner & outer\n; ----------------------\n; global\n(global_function\n  body: (_)) @function.outer\n\n(global_function\n  body: (function_body\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n; init\n(init_function\n  body: (_)) @function.outer\n\n(init_function\n  body: (function_body\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n; bounced\n(bounced_function\n  body: (_)) @function.outer\n\n(bounced_function\n  body: (function_body\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n; receive\n(receive_function\n  body: (_)) @function.outer\n\n(receive_function\n  body: (function_body\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n; external\n(external_function\n  body: (_)) @function.outer\n\n(external_function\n  body: (function_body\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n; contract/trait function\n(storage_function\n  body: (_)) @function.outer\n\n(storage_function\n  body: (function_body\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n; class.inner & outer\n; -------------------\n(struct) @class.outer\n\n(struct\n  body: (struct_body\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n(message) @class.outer\n\n(message\n  body: (message_body\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n(contract) @class.outer\n\n(contract\n  body: (contract_body\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n(trait) @class.outer\n\n(trait\n  body: (trait_body\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n; attribute.inner & outer\n; -----------------------\n(\"@name\"\n  \"(\"\n  func_name: (func_identifier) @attribute.inner\n  \")\") @attribute.outer\n\n(contract_attributes\n  (\"@interface\"\n    \"(\"\n    (string) @attribute.inner\n    \")\") @attribute.outer)\n\n(trait_attributes\n  (\"@interface\"\n    \"(\"\n    (string) @attribute.inner\n    \")\") @attribute.outer)\n\n(trait_attributes\n  (\"@interface\"\n    \"(\"\n    (string) @attribute.inner\n    \")\") @attribute.outer)\n\n; loop.inner & outer\n; ------------------\n(while_statement) @loop.outer\n\n(while_statement\n  body: (block_statement\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\"))\n\n(repeat_statement) @loop.outer\n\n(repeat_statement\n  body: (block_statement\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\"))\n\n(do_until_statement) @loop.outer\n\n(do_until_statement\n  body: (block_statement\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\"))\n\n(foreach_statement) @loop.outer\n\n(foreach_statement\n  body: (block_statement\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\"))\n\n; conditional.inner & outer\n; -------------------------\n(if_statement) @conditional.outer\n\n(if_statement\n  consequence: (block_statement\n    .\n    \"{\"\n    _+ @conditional.inner\n    \"}\"))\n\n(if_statement\n  alternative: (else_clause\n    (block_statement\n      .\n      \"{\"\n      _+ @conditional.inner\n      \"}\")))\n\n; block.inner & outer\n; -------------------\n(_\n  (block_statement) @block.inner) @block.outer\n\n; call.inner & outer\n; ------------------\n(method_call_expression) @call.outer\n\n(method_call_expression\n  arguments: (argument_list\n    .\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n(static_call_expression) @call.outer\n\n(static_call_expression\n  arguments: (argument_list\n    .\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n(instance_expression) @call.outer\n\n(instance_expression\n  arguments: (instance_argument_list\n    .\n    \"{\"\n    _+ @call.inner\n    \"}\"))\n\n(initOf\n  name: (identifier) @call.outer\n  arguments: (argument_list\n    .\n    \"(\"\n    _+ @call.inner\n    \")\") @call.outer)\n\n; return.inner & outer\n; --------------------\n(return_statement\n  (_) @return.inner) @return.outer\n\n; number.inner\n; ------------\n(integer) @number.inner\n\n; parameter.inner & outer\n; -----------------------\n; second and following\n(parameter_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n; first\n(parameter_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; second and following\n(argument_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n; first\n(argument_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; second and following\n(instance_argument_list\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n; first\n(instance_argument_list\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; single parameter\n(receive_function\n  parameter: (_) @parameter.inner @parameter.outer)\n\n(bounced_function\n  parameter: (_) @parameter.inner @parameter.outer)\n\n(external_function\n  parameter: (_) @parameter.inner @parameter.outer)\n\n; assignment.inner & outer w/ lhs & rhs\n; -------------------------------------\n(let_statement\n  name: (_) @assignment.lhs\n  value: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(storage_variable\n  name: (_) @assignment.lhs\n  value: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(global_constant\n  name: (_) @assignment.lhs\n  value: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(storage_constant\n  name: (_) @assignment.lhs\n  value: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n(field\n  name: (_) @assignment.lhs\n  value: (_) @assignment.inner @assignment.rhs) @assignment.outer\n\n; comment.inner & outer\n; ---------------------\n(comment) @comment.inner @comment.outer\n\n; quantified captures aren't supported yet:\n; (comment)+ @comment.outer\n\n"
  },
  {
    "path": "queries/terraform/textobjects.scm",
    "content": "; inherits: hcl\n\n"
  },
  {
    "path": "queries/toml/textobjects.scm",
    "content": "[\n  (integer)\n  (float)\n] @number.inner\n\n(table\n  (pair) @parameter.inner @parameter.outer)\n\n(inline_table\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(inline_table\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(array\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(array\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(comment) @comment.outer\n\n"
  },
  {
    "path": "queries/tsx/textobjects.scm",
    "content": "; inherits: typescript,jsx\n\n"
  },
  {
    "path": "queries/twig/textobjects.scm",
    "content": "; comments\n(comment) @comment.outer\n\n; statement\n(statement_directive) @statement.outer\n\n; @parameter\n(arguments\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(arguments\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(parameters\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(parameters\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n"
  },
  {
    "path": "queries/typescript/textobjects.scm",
    "content": "; inherits: ecma\n\n(interface_declaration) @class.outer\n\n(interface_declaration\n  body: (interface_body\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n(type_alias_declaration) @class.outer\n\n(type_alias_declaration\n  value: (object_type\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n(enum_declaration) @class.outer\n\n(enum_declaration\n  body: (enum_body\n    .\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n; type, interface items as @parameter\n; 1. parameter.inner\n(property_signature) @parameter.inner\n\n; 2. parameter.outer: Only one element, no comma\n(object_type\n  .\n  (property_signature) @parameter.outer .)\n\n(interface_body\n  .\n  (property_signature) @parameter.outer .)\n\n; 3. parameter.outer: Comma/semicolon before or after\n[\n  (object_type\n    [\n      \",\"\n      \";\"\n    ] @parameter.outer\n    .\n    (property_signature) @parameter.outer)\n  (interface_body\n    [\n      \",\"\n      \";\"\n    ] @parameter.outer\n    .\n    (property_signature) @parameter.outer)\n]\n\n[\n  (object_type\n    .\n    (property_signature) @parameter.outer\n    .\n    [\n      \",\"\n      \";\"\n    ] @parameter.outer)\n  (interface_body\n    .\n    (property_signature) @parameter.outer\n    .\n    [\n      \",\"\n      \";\"\n    ] @parameter.outer)\n]\n\n; last element with trailing comma/semicolon\n[\n  (object_type\n    (property_signature) @parameter.outer\n    .\n    [\n      \",\"\n      \";\"\n    ] @parameter.outer .)\n  (interface_body\n    (property_signature) @parameter.outer\n    .\n    [\n      \",\"\n      \";\"\n    ] @parameter.outer .)\n]\n\n"
  },
  {
    "path": "queries/v/textobjects.scm",
    "content": "; assignment\n[\n  (var_declaration\n    var_list: (_) @assignment.lhs\n    expression_list: (_)* @assignment.rhs)\n  (assignment_statement\n    left: (_) @assignment.lhs\n    right: (_)* @assignment.rhs)\n]\n\n[\n  (var_declaration\n    var_list: (_) @assignment.inner)\n  (assignment_statement\n    left: (_) @assignment.inner)\n]\n\n[\n  (var_declaration\n    expression_list: (_) @assignment.inner)\n  (assignment_statement\n    right: (_) @assignment.inner)\n]\n\n; block\n(_\n  (block\n    .\n    \"{\"\n    _+ @block.inner\n    \"}\")) @block.outer\n\n; call\n(call_expression) @call.outer\n\n(call_expression\n  arguments: (argument_list\n    .\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n; class: structs\n(struct_declaration\n  (\"{\"\n    _+ @class.inner\n    \"}\"))\n\n(struct_declaration) @class.outer\n\n; comment\n; leave space after comment marker if there is one\n((line_comment) @comment.inner @comment.outer\n  (#match? @comment.outer \"// .*\"))\n\n; else remove everything accept comment marker\n((line_comment) @comment.inner @comment.outer)\n\n(block_comment) @comment.inner @comment.outer\n\n; conditional\n(if_expression\n  block: (block\n    .\n    \"{\"\n    _+ @conditional.inner\n    \"}\")?) @conditional.outer\n\n; function\n(function_declaration\n  body: (block\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(function_declaration) @function.outer\n\n; loop\n(for_statement\n  body: (block\n    .\n    \"{\"\n    _+ @loop.inner\n    \"}\")?) @loop.outer\n\n[\n  (int_literal)\n  (float_literal)\n] @number.inner\n\n; parameter\n(parameter_list\n  \",\" @parameter.outer\n  .\n  (parameter_declaration) @parameter.inner @parameter.outer)\n\n(parameter_list\n  .\n  (parameter_declaration) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; return\n(return_statement\n  (_)* @return.inner) @return.outer\n\n; statements\n(block\n  (_) @statement.outer)\n\n"
  },
  {
    "path": "queries/verilog/textobjects.scm",
    "content": "(comment) @comment.outer\n\n"
  },
  {
    "path": "queries/vim/textobjects.scm",
    "content": "(comment) @comment.outer\n\n(function_definition\n  (body) @function.inner) @function.outer\n\n(parameters\n  (identifier) @parameter.inner)\n\n(parameters\n  \",\" @parameter.outer\n  .\n  (identifier) @parameter.outer)\n\n(parameters\n  .\n  (identifier) @parameter.outer\n  .\n  \",\" @parameter.outer)\n\n(if_statement\n  (body) @conditional.inner) @conditional.outer\n\n(for_loop\n  (body) @loop.inner) @loop.outer\n\n(while_loop\n  (body) @loop.inner) @loop.outer\n\n(call_expression) @call.outer\n\n(return_statement\n  (_)? @return.inner) @return.outer\n\n(_\n  (body) @block.inner) @block.outer\n\n(body\n  (_) @statement.outer)\n\n((syntax_statement\n  (pattern) @regex.inner @regex.outer))\n\n[\n  (integer_literal)\n  (float_literal)\n] @number.inner\n\n(let_statement\n  (_) @assignment.lhs\n  (_) @assignment.rhs @assignment.inner) @assignment.outer\n\n(let_statement\n  (_) @assignment.inner)\n\n"
  },
  {
    "path": "queries/vue/textobjects.scm",
    "content": "(element) @function.outer\n\n[\n  (attribute)\n  (directive_attribute)\n] @call.outer\n\n(attribute_value) @parameter.outer\n\n"
  },
  {
    "path": "queries/wgsl/textobjects.scm",
    "content": "(function_declaration) @function.outer\n\n(function_declaration\n  body: (compound_statement\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(parameter_list\n  \",\" @parameter.outer\n  .\n  (parameter) @parameter.inner @parameter.outer)\n\n(parameter_list\n  .\n  (parameter) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n(compound_statement) @block.outer\n\n; loops\n(loop_statement\n  (_)? @loop.inner) @loop.outer\n\n(for_statement\n  (_)? @loop.inner) @loop.outer\n\n(while_statement\n  (_)? @loop.inner) @loop.outer\n\n(struct_declaration\n  \"{\"\n  _+ @class.inner\n  \"}\") @class.outer\n\n; conditional\n(if_statement\n  consequence: (_)? @conditional.inner\n  alternative: (_)? @conditional.inner) @conditional.outer\n\n(if_statement\n  condition: (_) @conditional.inner)\n\n(argument_list_expression\n  \",\" @parameter.outer\n  .\n  (_) @parameter.inner @parameter.outer)\n\n(argument_list_expression\n  .\n  (_) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n"
  },
  {
    "path": "queries/wgsl_bevy/textobjects.scm",
    "content": "; inherits wgsl\n\n"
  },
  {
    "path": "queries/yaml/textobjects.scm",
    "content": "; assignment, statement\n(block_mapping_pair\n  key: (_) @assignment.lhs\n  value: (_) @assignment.rhs) @assignment.outer @statement.outer\n\n(block_mapping_pair\n  key: (_) @assignment.inner)\n\n(block_mapping_pair\n  value: (_) @assignment.inner)\n\n; comment\n; leave space after comment marker if there is one\n((comment) @comment.inner @comment.outer\n  (#match? @comment.outer \"# .*\"))\n\n; else remove everything accept comment marker\n((comment) @comment.inner @comment.outer)\n\n; number\n[\n  (integer_scalar)\n  (float_scalar)\n] @number.inner\n\n"
  },
  {
    "path": "queries/zig/textobjects.scm",
    "content": "; \"Classes\"\n(variable_declaration\n  (struct_declaration)) @class.outer\n\n(variable_declaration\n  (struct_declaration\n    \"struct\"\n    \"{\"\n    _+ @class.inner\n    \"}\"))\n\n; functions\n(function_declaration) @function.outer\n\n(function_declaration\n  body: (block\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n; loops\n(for_statement) @loop.outer\n\n(for_statement\n  body: (_) @loop.inner)\n\n(while_statement) @loop.outer\n\n(while_statement\n  body: (_) @loop.inner)\n\n; blocks\n(block) @block.outer\n\n(block\n  \"{\"\n  _+ @block.inner\n  \"}\")\n\n; statements\n(statement) @statement.outer\n\n; parameters\n(parameters\n  \",\" @parameter.outer\n  .\n  (parameter) @parameter.inner @parameter.outer)\n\n(parameters\n  .\n  (parameter) @parameter.inner @parameter.outer\n  .\n  \",\"? @parameter.outer)\n\n; arguments\n(call_expression\n  function: (_)\n  arguments: (arguments\n    \"(\"\n    \",\" @parameter.outer\n    .\n    (_) @parameter.inner @parameter.outer\n    \")\"))\n\n(call_expression\n  function: (_)\n  arguments: (arguments\n    \"(\"\n    .\n    (_) @parameter.inner @parameter.outer\n    .\n    \",\"? @parameter.outer\n    \")\"))\n\n; comments\n(comment) @comment.outer\n\n; conditionals\n(if_statement) @conditional.outer\n\n(if_statement\n  condition: (_) @conditional.inner)\n\n(if_statement\n  body: (_) @conditional.inner)\n\n(switch_expression) @conditional.outer\n\n(switch_expression\n  \"(\"\n  (_) @conditional.inner\n  \")\")\n\n(switch_expression\n  \"{\"\n  _+ @conditional.inner\n  \"}\")\n\n(while_statement\n  condition: (_) @conditional.inner)\n\n; calls\n(call_expression) @call.outer\n\n(call_expression\n  arguments: (arguments\n    \"(\"\n    _+ @call.inner\n    \")\"))\n\n"
  },
  {
    "path": "queries/zsh/textobjects.scm",
    "content": "(function_definition) @function.outer\n\n(function_definition\n  body: (compound_statement\n    .\n    \"{\"\n    _+ @function.inner\n    \"}\"))\n\n(case_statement) @conditional.outer\n\n(if_statement\n  (_) @conditional.inner) @conditional.outer\n\n(for_statement\n  (_) @loop.inner) @loop.outer\n\n(while_statement\n  (_) @loop.inner) @loop.outer\n\n(comment) @comment.outer\n\n(regex) @regex.inner\n\n((word) @number.inner\n  (#match? @number.inner \"^[0-9]+$\"))\n\n(variable_assignment) @assignment.outer\n\n(variable_assignment\n  name: (_) @assignment.inner @assignment.lhs)\n\n(variable_assignment\n  value: (_) @assignment.inner @assignment.rhs)\n\n(command\n  argument: (word) @parameter.inner)\n\n"
  },
  {
    "path": "scripts/append-additional-helix-queries",
    "content": "#!/bin/sh\n\nset -e\n\nls additional-queries/**/*.scm |\n    while read -r file; do\n        language=\"$(dirname \"$file\" | xargs basename)\"\n        echo \"Processing $language\"\n        printf \"\\n;; Additional queries\\n\\n\" >>\"treesit-queries/$language/textobjects.scm\"\n        cat \"$file\" >>\"treesit-queries/$language/textobjects.scm\"\n    done\n"
  },
  {
    "path": "scripts/check-available",
    "content": "#!/bin/sh\n# Get a list of languages currently supportable and supported\n\ntmpdir=$(mktemp -d)\ngit clone --depth 1 https://github.com/emacs-tree-sitter/tree-sitter-langs $tmpdir/tslangs\ngit clone --depth 1 https://github.com/nvim-treesitter/nvim-treesitter-textobjects $tmpdir/ntsto\n\nls $tmpdir/tslangs/repos >$tmpdir/available-emacs-langs\nls $tmpdir/ntsto/queries | tr '\\n' '|' | sed 's/.$/$/' |\n\txargs -I{} grep -E {} $tmpdir/available-emacs-langs >$tmpdir/supportable-languages\n\necho \"\" # Just some spacing\n\nprintf \"Supportable languages: \"\ncat $tmpdir/supportable-languages | xargs echo\n\nprintf \"Supportable but not supported languages: \"\ngrep -Eo '\\([a-z+]+-mode . \"[^\"]+\"' evil-textobj-tree-sitter.el |\n\tcut -d'\"' -f2 | sort | uniq |\n\ttr '\\n' '|' | sed 's/.$/$/' |\n\txargs -I{} grep -Ev {} $tmpdir/supportable-languages | xargs echo\n"
  },
  {
    "path": "scripts/fix-queries",
    "content": "#!/bin/sh\n\nset -e\n\nfind queries -type f |\n\twhile read -r file; do\n        echo \"Processing $file\"\n\t\tgo run converter/main.go \"$file\" | sed 's|#lua-match|#match|' > \"$file.new\"\n        mv \"$file.new\" \"$file\"\n\tdone\n"
  },
  {
    "path": "scripts/get-helix-queries",
    "content": "#!/bin/sh\n\nset -e\n\ntmpdir=\"$(mktemp -d)\"\ngit clone --depth 1 https://github.com/helix-editor/helix \"$tmpdir\"\n\nHELIX_DIR=\"$tmpdir\"\n\nfind $HELIX_DIR/runtime/queries -name 'textobjects.scm' |\n    sed \"s|$HELIX_DIR/runtime/queries/||\" |\n    while read -r file; do\n        dir=\"$(dirname \"$file\")\"\n        filename=\"$(basename \"$file\")\"\n\n        mkdir -p \"treesit-queries/$dir\"\n        # match? to match mapping is kinda hacky\n        sed 's|\\(@[^\\.]*\\)\\.inside|\\1.inner|g;s|\\(@[^\\.]*\\)\\.around|\\1.outer|g;s|#match? @\\([^ ]*\\) \"\\([^\"]*\\)\"|#match \"\\2\" @\\1|g;s/#eq?/#equal/g' \\\n            \"$HELIX_DIR/runtime/queries/$file\" > \"treesit-queries/$dir/$filename\"\n    done\n\n./scripts/append-additional-helix-queries\n\n# method_spec was removed from upstream go grammar, but helix still uses it\nsed -ibk 's|method_spec|method_elem|g' treesit-queries/go/textobjects.scm\nrm treesit-queries/go/textobjects.scmbk\n\n# function was removed from javascript/typescript grammar\nsed -ibk '/^(function$/,+1d' treesit-queries/ecma/textobjects.scm\nrm treesit-queries/ecma/textobjects.scmbk"
  },
  {
    "path": "scripts/get-neovim-queries",
    "content": "#!/bin/sh\n\nset -e\n\nrm -rf /tmp/nts\ngit clone --depth 1 --branch main \\\n    https://github.com/nvim-treesitter/nvim-treesitter-textobjects /tmp/nts\nrm -r queries && cp -r /tmp/nts/queries .\n./scripts/fix-queries"
  },
  {
    "path": "treesit-queries/_jsx/textobjects.scm",
    "content": "; See runtime/queries/ecma/README.md for more info.\n\n(jsx_self_closing_element) @xml-element.outer @xml-element.inner\n\n(jsx_element (jsx_opening_element) (_)* @xml-element.inner (jsx_closing_element))\n\n(jsx_element) @xml-element.outer\n"
  },
  {
    "path": "treesit-queries/_typescript/textobjects.scm",
    "content": "[\n  (interface_declaration \n    body:(_) @class.inner)\n  (type_alias_declaration \n    value: (_) @class.inner)\n] @class.outer\n\n(enum_body\n  (_) @entry.outer)\n\n(enum_assignment (_) @entry.inner)\n\n"
  },
  {
    "path": "treesit-queries/ada/textobjects.scm",
    "content": ";; Support for high-level text objects selections.\n;; For instance:\n;;    maf     (v)isually select (a) (f)unction or subprogram\n;;    mif     (v)isually select (i)nside a (f)unction or subprogram\n;;    mai     (v)isually select (a) (i)f statement (or loop)\n;;    mii     (v)isually select (i)nside an (i)f statement (or loop)\n;;\n;; For navigations using textobjects, check link below:\n;; https://docs.helix-editor.com/master/usage.html#navigating-using-tree-sitter-textobjects\n;;\n;; For Textobject queries explanation, check out link below:\n;; https://docs.helix-editor.com/master/guides/textobject.html\n\n(subprogram_body) @function.outer\n(subprogram_body (non_empty_declarative_part) @function.inner)\n(subprogram_body (handled_sequence_of_statements) @function.inner)\n(function_specification) @function.outer\n(procedure_specification) @function.outer\n(package_declaration) @function.outer\n(generic_package_declaration) @function.outer\n(package_body) @function.outer\n"
  },
  {
    "path": "treesit-queries/adl/textobjects.scm",
    "content": "(struct (_) @function.inner) @function.outer\n"
  },
  {
    "path": "treesit-queries/amber/textobjects.scm",
    "content": "; Functions - capture both definition and body\n(function_definition\n  body: (_) @function.inner) @function.outer\n\n; Function parameters in definitions\n(function_parameter_list\n  (function_parameter_list_item) @parameter.inner)\n\n; Function call arguments\n(parameter_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n; Comments\n(comment) @comment.inner\n(comment)+ @comment.outer\n\n; Arrays\n(array\n  (_) @entry.outer)\n\n; Main Block looks like a function\n(main_block\n  (block) @function.inner) @function.outer\n"
  },
  {
    "path": "treesit-queries/awk/textobjects.scm",
    "content": "\n(func_def name: (identifier) (block) @function.inner) @function.outer\n\n(param_list (_) @parameter.inner) @parameter.outer\n\n(args (_) @parameter.inner) @parameter.outer\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/bash/textobjects.scm",
    "content": "(function_definition\n  body: (_) @function.inner) @function.outer\n\n(command\n  argument: (_) @parameter.inner)\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n(array\n  (_) @entry.outer)\n"
  },
  {
    "path": "treesit-queries/basic/textobjects.scm",
    "content": "(for_statement) @function.outer\n\n(comment) @comment.inner\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/blade/textobjects.scm",
    "content": "; inherits: html\n"
  },
  {
    "path": "treesit-queries/c/textobjects.scm",
    "content": "(function_definition\n  body: (_) @function.inner) @function.outer\n\n(struct_specifier\n  body: (_) @class.inner) @class.outer\n\n(enum_specifier\n  body: (_) @class.inner) @class.outer\n\n(union_specifier\n  body: (_) @class.inner) @class.outer\n\n(parameter_list \n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(argument_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n(enumerator\n  (_) @entry.inner) @entry.outer\n\n(initializer_list\n  (_) @entry.outer)\n\n;; Additional queries\n\n(for_statement\n body: (_) @loop.inner) @loop.outer\n\n(while_statement\n body: (_) @loop.inner) @loop.outer\n\n(do_statement\n body: (_) @loop.inner) @loop.outer\n\n(if_statement\n consequence: (_) @conditional.inner) @conditional.outer"
  },
  {
    "path": "treesit-queries/c-sharp/textobjects.scm",
    "content": "[\n  (class_declaration body: (_) @class.inner)\n  (struct_declaration body: (_) @class.inner)\n  (interface_declaration body: (_) @class.inner)\n  (enum_declaration body: (_) @class.inner)\n  (delegate_declaration)\n  (record_declaration body: (_) @class.inner)\n] @class.outer\n\n(constructor_declaration body: (_) @function.inner) @function.outer\n\n(destructor_declaration body: (_) @function.inner) @function.outer\n\n(method_declaration body: (_) @function.inner) @function.outer\n\n(property_declaration (_) @function.inner) @function.outer\n\n(parameter (_) @parameter.inner) @parameter.outer\n\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/caddyfile/textobjects.scm",
    "content": "(comment) @comment.inner\n(comment)+ @comment.outer\n\n(directive\n  name: (directive_name) @parameter.inner) @parameter.outer\n\n(global_options\n  \"{\" (_)* @class.inner \"}\") @class.outer\n\n(snippet_definition\n  (block) @class.inner) @class.outer\n\n(named_route\n  (block) @class.inner) @class.outer\n\n(site_definition (block) @class.inner) @class.outer\n"
  },
  {
    "path": "treesit-queries/cairo/textobjects.scm",
    "content": "(function_item\n  body: (_) @function.inner) @function.outer\n\n(closure_expression\n  body: (_) @function.inner) @function.outer\n\n(struct_item\n  body: (_) @class.inner) @class.outer\n\n(enum_item\n  body: (_) @class.inner) @class.outer\n\n(trait_item\n  body: (_) @class.inner) @class.outer\n\n(impl_item\n  body: (_) @class.inner) @class.outer\n\n(parameters \n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(closure_parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(type_parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(type_arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(field_initializer_list  \n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n[\n  (line_comment)\n] @comment.inner\n\n(line_comment)+ @comment.outer\n\n(; #[test]\n (attribute_item\n   (attribute\n     (identifier) @_test_attribute))\n ; allow other attributes like #[should_panic] and comments\n [\n   (attribute_item)\n   (line_comment)\n ]*\n ; the test function\n (function_item\n   body: (_) @test.inner) @test.outer\n (#equal @_test_attribute \"test\"))\n\n(array_expression\n  (_) @entry.outer)\n\n(tuple_expression\n  (_) @entry.outer)\n\n(tuple_pattern\n  (_) @entry.outer)\n\n; Commonly used vec macro initializer is special cased\n(macro_invocation\n  (identifier) @_id (token_tree (_) @entry.outer)\n  (#equal @_id \"array\"))\n\n(enum_variant) @entry.outer\n\n(field_declaration\n  (_) @entry.inner) @entry.outer\n\n(field_initializer\n  (_) @entry.inner) @entry.outer\n\n(shorthand_field_initializer) @entry.outer\n"
  },
  {
    "path": "treesit-queries/clojure/textobjects.scm",
    "content": "; Function definitions (defn, defn-, defmacro, defmethod, etc.)\n(list_lit\n  .\n  (sym_lit) @_keyword\n  .\n  (sym_lit)\n  (_)* @function.inner\n  (#match \"^(defn|defn-|defmacro|defmethod|defmulti|definline)$\" @_keyword)) @function.outer\n\n; Anonymous functions (fn)\n(list_lit\n  .\n  (sym_lit) @_fn\n  (_)* @function.inner\n  (#match \"^fn$\" @_fn)) @function.outer\n\n; Anonymous function shorthand #()\n(anon_fn_lit\n  (_)* @function.inner) @function.outer\n\n; deftype, defrecord, defprotocol\n(list_lit\n  .\n  (sym_lit) @_keyword\n  .\n  (sym_lit)\n  (_)* @class.inner\n  (#match \"^(deftype|defrecord|defprotocol|definterface|defstruct)$\" @_keyword)) @class.outer\n\n; Test definitions (deftest)\n(list_lit\n  .\n  (sym_lit) @_keyword\n  .\n  (sym_lit)\n  (_)* @test.inner\n  (#match \"^deftest$\" @_keyword)) @test.outer\n\n; Function parameters in vectors\n(vec_lit\n  (_)* @parameter.inner) @parameter.outer\n\n; List entries\n(list_lit\n  (_) @entry.inner @entry.outer)\n\n; Vector entries\n(vec_lit\n  (_) @entry.inner @entry.outer)\n\n; Map entries\n(map_lit\n  (_) @entry.inner @entry.outer)\n\n; Set entries\n(set_lit\n  (_) @entry.inner @entry.outer)\n\n; Comments\n(comment) @comment.inner\n(comment)+ @comment.outer\n\n; Discard expressions (also treated as comments)\n(dis_expr) @comment.inner\n\n; Comment special form (comment ...)\n(list_lit\n  .\n  (sym_lit) @_comment\n  (_)* @comment.inner\n  (#match \"^comment$\" @_comment)) @comment.outer\n"
  },
  {
    "path": "treesit-queries/cmake/textobjects.scm",
    "content": "[\n  (macro_def)\n  (function_def)\n] @function.outer\n\n(argument) @parameter.inner\n\n[\n  (bracket_comment)\n  (line_comment)\n] @comment.inner\n\n(line_comment)+ @comment.outer\n\n(bracket_comment) @comment.outer"
  },
  {
    "path": "treesit-queries/codeql/textobjects.scm",
    "content": "(qldoc) @comment.outer\n(block_comment) @comment.outer\n(line_comment) @comment.inner\n(line_comment)+ @comment.outer\n\n(classlessPredicate\n  ((varDecl) @parameter.inner . \",\"?) @parameter.outer\n  (body \"{\" (_)* @function.inner \"}\")) @function.outer\n(memberPredicate\n  ((varDecl) @parameter.inner . \",\"?) @parameter.outer\n  (body \"{\" (_)* @function.inner \"}\")) @function.outer\n\n(dataclass\n  (\"{\" (_)* @class.inner \"}\")?) @class.outer\n(datatype) @class.outer\n(datatypeBranch) @class.outer\n"
  },
  {
    "path": "treesit-queries/cpp/textobjects.scm",
    "content": "; inherits: c\n\n(lambda_expression\n  body: (_) @function.inner) @function.outer\n\n(class_specifier\n  body: (_) @class.inner) @class.outer\n"
  },
  {
    "path": "treesit-queries/cross-config/textobjects.scm",
    "content": "; inherits: toml\n"
  },
  {
    "path": "treesit-queries/crystal/textobjects.scm",
    "content": "(class_def\n  name: (_)\n  (_) @class.inner) @class.outer\n\n(struct_def\n  name: (_)\n  (_) @class.inner) @class.outer\n\n(module_def\n  name: (_)\n  (_) @class.inner) @class.outer\n\n(lib_def\n  name: (_)\n  (_) @class.inner) @class.outer\n\n(enum_def\n  name: (_)\n  (_) @class.inner) @class.outer\n\n(block\n  params: (_) @parameter.inner) @parameter.outer\n\n(method_def\n  params: (_) @parameter.inner) @parameter.outer\n\n(method_def\n  name: (_)\n  (_) @function.inner) @function.outer\n\n(block\n  (_) @function.inner) @function.outer\n\n(comment) @comment.inner\n(comment)+ @comment.outer\n\n(array\n  (_) @entry.outer)\n"
  },
  {
    "path": "treesit-queries/cylc/textobjects.scm",
    "content": "(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n(_\n  brackets_open: _\n  name: _?\n  brackets_close: _\n  _* @class.inner) @class.outer\n\n(setting\n  value: _? @function.inner) @function.outer\n\n(graph_setting\n  value: _? @function.inner) @function.outer\n\n(graph_string_content\n  (graph_task) @entry.inner)\n\n(task_parameter\n  ((_) @parameter.inner\n    .\n    \",\"? @parameter.outer) @parameter.outer)\n"
  },
  {
    "path": "treesit-queries/d/textobjects.scm",
    "content": "(function_declaration (function_body) @function.inner) @function.outer\n(comment) @comment.inner\n(comment)+ @comment.outer\n(class_declaration (aggregate_body) @class.inner) @class.outer\n(interface_declaration (aggregate_body) @class.inner) @class.outer\n(struct_declaration (aggregate_body) @class.inner) @class.outer\n(unittest_declaration (block_statement) @test.inner) @test.outer\n(parameter) @parameter.inner\n(template_parameter) @parameter.inner\n"
  },
  {
    "path": "treesit-queries/dart/textobjects.scm",
    "content": "(class_definition\n  body: (_) @class.inner) @class.outer\n\n(mixin_declaration\n  (class_body) @class.inner) @class.outer\n\n(extension_declaration\n  (extension_body) @class.inner) @class.outer\n\n(enum_declaration\n  body: (_) @class.inner) @class.outer\n\n(type_alias) @class.outer\n\n(_\n  (\n    [\n      (getter_signature)\n      (setter_signature)\n      (function_signature)\n      (method_signature)\n      (constructor_signature)\n    ]\n    .\n    (function_body) @function.inner @function.outer\n  )  @function.outer\n)\n\n(declaration\n  [\n    (constant_constructor_signature)\n    (constructor_signature)\n    (factory_constructor_signature)\n    (redirecting_factory_constructor_signature)\n    (getter_signature)\n    (setter_signature)\n    (operator_signature)\n    (function_signature)\n  ]\n) @function.outer\n\n(lambda_expression\n    body: (_) @function.inner\n) @function.outer\n\n(function_expression\n    body: (_) @function.inner\n) @function.outer\n\n[\n  (comment)\n  (documentation_comment)\n] @comment.inner\n\n(comment)+ @comment.outer\n\n(documentation_comment)+ @comment.outer\n\n(formal_parameter_list\n  (\n    (formal_parameter) @parameter.inner . \",\"? @parameter.outer\n  ) @parameter.outer\n)\n\n(optional_formal_parameters\n  (\n    (formal_parameter) @parameter.inner . \",\"? @parameter.outer\n  ) @parameter.outer\n)\n\n(arguments\n  (\n    [\n      (argument) @parameter.inner\n      (named_argument (label) . (_)* @parameter.inner)\n    ]\n    . \",\"? @parameter.outer\n  ) @parameter.outer\n)\n\n(type_arguments\n  (\n    ((_) . (\".\" . (_) @parameter.inner @parameter.outer)?) @parameter.inner\n    . \",\"? @parameter.outer\n  ) @parameter.outer\n)\n\n(expression_statement\n  ((identifier) @_name (#any-of? @_name \"test\" \"testWidgets\"))\n  .\n  (selector (argument_part (arguments . (_) . (argument) @test.inner)))\n) @test.outer\n\n"
  },
  {
    "path": "treesit-queries/dhall/textobjects.scm",
    "content": "(lambda_expression\n  (label) @parameter.inner\n  (expression) @function.inner\n) @function.outer\n\n(forall_expression\n  (label) @parameter.inner\n  (expression) @function.inner\n) @function.outer\n\n(assert_expression\n  (expression) @test.inner\n) @test.outer\n\n[\n  (block_comment_content)\n  (line_comment_content)\n] @comment.inner\n\n[\n  (block_comment)\n  (line_comment)\n] @comment.outer\n"
  },
  {
    "path": "treesit-queries/docker-bake/textobjects.scm",
    "content": "; inherits: hcl\n"
  },
  {
    "path": "treesit-queries/docker-compose/textobjects.scm",
    "content": "; inherits: yaml\n"
  },
  {
    "path": "treesit-queries/dockerfile/textobjects.scm",
    "content": "(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n"
  },
  {
    "path": "treesit-queries/doxyfile/textobjects.scm",
    "content": "(option\n  value: (_) @entry.inner) @entry.outer\n\n(comment) @comment.inner\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/earthfile/textobjects.scm",
    "content": "(target (block) @function.inner) @function.outer\n"
  },
  {
    "path": "treesit-queries/ecma/textobjects.scm",
    "content": "(function_declaration\n  body: (_) @function.inner) @function.outer\n\n(function_expression\n  body: (_) @function.inner) @function.outer\n\n(arrow_function\n  body: (_) @function.inner) @function.outer\n\n(method_definition\n  body: (_) @function.inner) @function.outer\n\n(generator_function_declaration\n  body: (_) @function.inner) @function.outer\n\n(class_declaration\n  body: (class_body) @class.inner) @class.outer\n\n(class\n  (class_body) @class.inner) @class.outer\n\n(export_statement\n  declaration: [\n    (function_declaration) @function.outer\n    (class_declaration) @class.outer \n  ])\n\n(formal_parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n(array \n  (_) @entry.outer)\n\n(pair\n  (_) @entry.inner) @entry.outer\n\n(pair_pattern\n  (_) @entry.inner) @entry.outer\n"
  },
  {
    "path": "treesit-queries/eiffel/textobjects.scm",
    "content": "[\n  (comment)+\n  (header_comment)+\n] @comment.outer\n[\n  (comment)\n  (header_comment)\n] @comment.inner\n(formal_arguments) @parameter.outer\n(entity_declaration_group) @parameter.inner\n(attribute_or_routine) @function.outer\n(feature_body) @function.inner\n(class_declaration) @class.outer\n(feature_clause) @class.inner\n\n"
  },
  {
    "path": "treesit-queries/elixir/textobjects.scm",
    "content": "; Function heads and guards have no body at all, so `keywords` and `do_block` nodes are both optional\n((call\n   target: (identifier) @_keyword\n   (arguments\n     [\n       (call\n         (arguments (_)? @parameter.inner))\n       ; function has a guard\n       (binary_operator\n         left:\n           (call\n             (arguments (_)? @parameter.inner)))\n     ]\n     ; body is \"do: body\" instead of a do-block\n     (keywords\n       (pair\n         value: (_) @function.inner))?)?\n   (do_block (_)* @function.inner)?)\n (#match \"^(def|defdelegate|defguard|defguardp|defmacro|defmacrop|defn|defnp|defp)$\" @_keyword)) @function.outer\n\n(anonymous_function\n  (stab_clause right: (body) @function.inner)) @function.outer\n\n((call\n   target: (identifier) @_keyword\n   (do_block (_)* @class.inner))\n (#match \"^(defmodule|defprotocol|defimpl)$\" @_keyword)) @class.outer\n\n((call\n  target: (identifier) @_keyword\n  (arguments ((string) . (_)?))\n  (do_block (_)* @test.inner)?)\n (#match \"^(test|describe)$\" @_keyword)) @test.outer\n\n(comment)+ @comment.outer @comment.inner\n"
  },
  {
    "path": "treesit-queries/elm/textobjects.scm",
    "content": "(line_comment) @comment.inner\n(line_comment)+ @comment.outer\n(block_comment) @comment.inner\n(block_comment)+ @comment.outer\n\n((type_annotation)?\n  (value_declaration\n    (function_declaration_left (lower_case_identifier))\n    (eq)\n    (_) @function.inner\n  )\n) @function.outer\n\n(parenthesized_expr\n  (anonymous_function_expr\n    (\n      (arrow)\n      (_) @function.inner\n    )\n  )\n) @function.outer\n\n(value_declaration\n  (function_declaration_left\n    (lower_pattern\n      (lower_case_identifier) @parameter.inner @parameter.outer\n    )\n  )\n)\n\n(value_declaration\n  (function_declaration_left\n    (pattern) @parameter.inner @parameter.outer\n  )\n)\n\n(value_declaration\n  (function_declaration_left\n    (tuple_pattern\n      (pattern) @parameter.inner\n    ) @parameter.outer\n  )\n)\n\n(value_declaration\n  (function_declaration_left\n    (record_pattern\n      (lower_pattern\n        (lower_case_identifier) @parameter.inner\n      )\n    ) @parameter.outer\n  )\n)\n\n(parenthesized_expr\n  (anonymous_function_expr\n    (\n      (backslash)\n      (pattern) @parameter.inner\n      (arrow)\n    )\n  )\n)\n"
  },
  {
    "path": "treesit-queries/env/textobjects.scm",
    "content": "(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n(variable_assignment\n  (_) @entry.inner) @entry.outer\n"
  },
  {
    "path": "treesit-queries/erlang/textobjects.scm",
    "content": "(function_clause\n  pattern: (arguments (_)? @parameter.inner)\n  body: (_) @function.inner) @function.outer\n\n(anonymous_function\n  (stab_clause body: (_) @function.inner)) @function.outer\n\n(comment (comment_content) @comment.inner) @comment.outer\n\n; EUnit test names.\n; (CommonTest cases are not recognizable by syntax alone.)\n((function_clause\n   name: (atom) @_name\n   pattern: (arguments (_)? @parameter.inner)\n   body: (_) @test.inner) @test.outer\n (#match \"_test$\" @_name))\n"
  },
  {
    "path": "treesit-queries/fga/textobjects.scm",
    "content": "(condition_declaration\n  body: (_) @function.inner) @function.outer\n\n(param \n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/fish/textobjects.scm",
    "content": "(function_definition) @function.outer\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/freebasic/textobjects.scm",
    "content": "(function_declaration) @function.outer\n\n(sub_declaration) @function.outer\n\n(for_statement) @function.outer\n\n(comment) @comment.inner\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/gas/textobjects.scm",
    "content": "(comment) @comment.inner\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/gdscript/textobjects.scm",
    "content": "\n(class_definition\n  (body) @class.inner) @class.outer\n\n(function_definition\n  (body) @function.inner) @function.outer\n\n(lambda (body) @function.inner) @function.outer\n\n(parameters \n  [\n    (identifier)\n    (typed_parameter)\n    (default_parameter)    \n    (typed_default_parameter)  \n  ] @parameter.inner @parameter.outer)\n\n(arguments (_expression) @parameter.inner @parameter.outer)\n\n[\n  (const_statement)\n  (variable_statement)\n  (pair)\n  (enumerator)\n] @entry.outer\n\n(comment) @comment.inner\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/git-cliff-config/textobjects.scm",
    "content": "; inherits: toml\n"
  },
  {
    "path": "treesit-queries/git-commit/textobjects.scm",
    "content": "(comment) @comment.inner\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/git-config/textobjects.scm",
    "content": "(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n(variable\n  (_) @entry.inner) @entry.outer\n"
  },
  {
    "path": "treesit-queries/github-action/textobjects.scm",
    "content": "; inherits: yaml\n"
  },
  {
    "path": "treesit-queries/gitlab-ci/textobjects.scm",
    "content": "; inherits: yaml\n"
  },
  {
    "path": "treesit-queries/gjs/textobjects.scm",
    "content": "; inherits: _gjs,_javascript,ecma\n"
  },
  {
    "path": "treesit-queries/gleam/textobjects.scm",
    "content": "(function\n  parameters: (function_parameters (function_parameter)? @parameter.inner)\n  body: (block) @function.inner) @function.outer\n\n(anonymous_function\n  body: (block) @function.inner) @function.outer\n\n((function\n   name: (identifier) @_name\n   body: (block) @test.inner) @test.outer\n (#match \"_test$\" @_name))\n"
  },
  {
    "path": "treesit-queries/glsl/textobjects.scm",
    "content": "; inherits: c\n"
  },
  {
    "path": "treesit-queries/go/textobjects.scm",
    "content": "(function_declaration\n  body: (block)? @function.inner) @function.outer\n\n(func_literal\n  (_)? @function.inner) @function.outer\n\n(method_declaration\n  body: (block)? @function.inner) @function.outer\n\n;; struct and interface declaration as class textobject?\n(type_declaration\n  (type_spec (type_identifier) (struct_type (field_declaration_list (_)?) @class.inner))) @class.outer\n\n(type_declaration\n  (type_spec (type_identifier) (interface_type (method_elem)+ @class.inner))) @class.outer\n\n(type_parameter_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(parameter_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(argument_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n((function_declaration\n   name: (identifier) @_name\n   body: (block)? @test.inner) @test.outer\n (#match \"^Test\" @_name))\n\n;; Additional queries\n\n(if_statement\n  consequence: (block) @conditional.inner) @conditional.outer\n\n(if_statement\n  alternative: (block) @conditional.inner)? @conditional.outer\n\n(expression_switch_statement\n  (expression_case) @conditional.inner) @conditional.outer\n\n(type_switch_statement\n  (type_case) @conditional.inner) @conditional.outer\n\n(select_statement\n  (communication_case) @conditional.inner) @conditional.outer\n\n(for_statement\n  body: (block) @loop.inner) @loop.outer"
  },
  {
    "path": "treesit-queries/godot-resource/textobjects.scm",
    "content": "(section \n  (identifier) \n  (_)\n  (property) @class.inner\n) @class.outer\n\n(attribute \n  (identifier)\n  (_) @parameter.inner) @parameter.outer\n\n(property \n  (path)\n  (_) @entry.inner) @entry.outer\n\n(pair \n  (_) @entry.inner) @entry.outer\n\n(array\n  (_) @entry.outer)\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/graphql/textobjects.scm",
    "content": "(type_definition) @class.outer\n\n(executable_definition) @function.outer\n\n(arguments_definition\n  (input_value_definition) @parameter.inner @parameter.movement)\n\n(arguments\n  (argument) @parameter.inner @parameter.movement)\n\n(selection\n  [(field) (fragment_spread)] @entry.outer)\n\n(selection\n  (field (selection_set) @entry.inner))\n\n(field_definition\n  (_) @entry.inner) @entry.outer\n\n(input_fields_definition\n  (input_value_definition ) @entry.outer)\n\n(enum_value) @entry.outer\n"
  },
  {
    "path": "treesit-queries/gren/textobjects.scm",
    "content": "\n(line_comment) @comment.inner\n(line_comment)+ @comment.outer\n(block_comment) @comment.inner\n(block_comment)+ @comment.outer\n\n((type_annotation)?\n  (value_declaration\n    (function_declaration_left (lower_case_identifier))\n    (eq)\n    (_) @function.inner\n  )\n) @function.outer\n\n(parenthesized_expr\n  (anonymous_function_expr\n    (\n      (arrow)\n      (_) @function.inner\n    )\n  )\n) @function.outer\n\n(value_declaration\n  (function_declaration_left\n    (lower_pattern\n      (lower_case_identifier) @parameter.inner @parameter.outer\n    )\n  )\n)\n\n(value_declaration\n  (function_declaration_left\n    (pattern) @parameter.inner @parameter.outer\n  )\n)\n\n(value_declaration\n  (function_declaration_left\n    (record_pattern\n      (lower_pattern\n        (lower_case_identifier) @parameter.inner\n      )\n    ) @parameter.outer\n  )\n)\n\n(parenthesized_expr\n  (anonymous_function_expr\n    (\n      (backslash)\n      (pattern) @parameter.inner\n      (arrow)\n    )\n  )\n)\n"
  },
  {
    "path": "treesit-queries/gts/textobjects.scm",
    "content": "; inherits: _gjs,_typescript,ecma\n"
  },
  {
    "path": "treesit-queries/haskell/textobjects.scm",
    "content": "(comment) @comment.inner\n(comment)+ @comment.outer\n\n(newtype\n\t(newtype_constructor\n\t\t(_) @class.inner)) @class.outer\n(data_type\n\tconstructors: (_) @class.inner) @class.outer\n(decl/function\n\t(match expression:(_) @function.inner)) @function.outer\n(lambda\n\texpression:(_) @function.inner) @function.outer\n\n(decl/function\n\tpatterns: (patterns\n\t\t(_) @parameter.inner))\n\n(expression/lambda\n\tpatterns: (patterns\n\t(_) @parameter.inner))\n\n(decl/function\n\t(infix\n\t\t(pattern) @parameter.inner))\n"
  },
  {
    "path": "treesit-queries/hcl/textobjects.scm",
    "content": "(comment) @comment.inner\n(comment)+ @comment.outer\n\n(function_arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(attribute\n  (_) @entry.inner) @entry.outer\n\n(tuple\n  (_) @entry.outer)\n"
  },
  {
    "path": "treesit-queries/heex/textobjects.scm",
    "content": "(comment) @comment.outer @comment.inner\n"
  },
  {
    "path": "treesit-queries/hocon/textobjects.scm",
    "content": "(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n(pair \n  (_) @entry.inner) @entry.outer\n\n(array\n  (_) @entry.outer)\n\n"
  },
  {
    "path": "treesit-queries/html/textobjects.scm",
    "content": "(script_element (start_tag) (_) @xml-element.inner (end_tag))  @xml-element.outer\n\n(style_element (start_tag) (_) @xml-element.inner (end_tag)) @xml-element.outer\n\n(element (start_tag) (_)* @xml-element.inner (end_tag))\n\n(element) @xml-element.outer\n\n(comment) @comment.outer\n"
  },
  {
    "path": "treesit-queries/hurl/textobjects.scm",
    "content": "(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n(entry (_) @function.inner) @function.outer\n"
  },
  {
    "path": "treesit-queries/inko/textobjects.scm",
    "content": "(class\n  body: (_) @class.inner) @class.outer\n\n(trait\n  body: (_) @class.inner) @class.outer\n\n(method\n  body: (_) @function.inner) @function.outer\n\n(reopen_class\n  body: (_) @class.inner) @class.outer\n\n(implement_trait\n  body: (_) @class.inner) @class.outer\n\n(external_function\n  body: (_) @function.inner) @function.outer\n\n(closure\n  body: (_) @function.inner) @function.outer\n\n(arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(type_arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(line_comment) @comment.inner\n\n(line_comment)+ @comment.outer\n\n(array (_) @entry.outer)\n\n(tuple (_) @entry.outer)\n\n(tuple_pattern (_) @entry.outer)\n\n(define_field (_) @entry.inner) @entry.outer\n"
  },
  {
    "path": "treesit-queries/java/textobjects.scm",
    "content": "(method_declaration\n  body: (_)? @function.inner) @function.outer\n\n(constructor_declaration\n  body: (_) @function.inner) @function.outer\n\n(interface_declaration\n  body: (_) @class.inner) @class.outer\n\n(class_declaration\n  body: (_) @class.inner) @class.outer\n\n(record_declaration\n  body: (_) @class.inner) @class.outer\n\n(enum_declaration\n  body: (_) @class.inner) @class.outer\n\n(formal_parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(type_parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(type_arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(argument_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n[\n  (line_comment)\n  (block_comment)\n] @comment.inner\n\n(line_comment)+ @comment.outer\n\n(block_comment) @comment.outer\n\n(array_initializer\n  (_) @entry.outer)\n\n(enum_body\n  (enum_constant) @entry.outer)\n"
  },
  {
    "path": "treesit-queries/javascript/textobjects.scm",
    "content": "; See runtime/queries/ecma/README.md for more info.\n\n; inherits: _javascript,ecma\n"
  },
  {
    "path": "treesit-queries/jjconfig/textobjects.scm",
    "content": "; inherits: toml\n"
  },
  {
    "path": "treesit-queries/jq/textobjects.scm",
    "content": "(comment) @comment.inner\n(comment)+ @comment.outer\n\n(funcdef\n  (query) @function.inner) @function.outer\n\n(objectkeyval\n  (_) @entry.inner) @entry.outer\n"
  },
  {
    "path": "treesit-queries/json/textobjects.scm",
    "content": "(pair \n  (_) @entry.inner) @entry.outer\n\n(array\n  (_) @entry.outer)\n\n(comment) @comment.inner\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/json-ld/textobjects.scm",
    "content": "; inherits: json\n"
  },
  {
    "path": "treesit-queries/json5/textobjects.scm",
    "content": "(member\n  (_) @entry.inner) @entry.outer\n\n(array\n  (_) @entry.outer)\n\n(comment) @comment.inner\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/jsonc/textobjects.scm",
    "content": "; inherits: json\n"
  },
  {
    "path": "treesit-queries/jsx/textobjects.scm",
    "content": "; See runtime/queries/ecma/README.md for more info.\n\n; inherits: _jsx,_javascript,ecma\n"
  },
  {
    "path": "treesit-queries/julia/textobjects.scm",
    "content": "(function_definition (_)? @function.inner) @function.outer\n\n(short_function_definition (_)? @function.inner) @function.outer\n\n(macro_definition (_)? @function.inner) @function.outer\n\n(struct_definition (_)? @class.inner) @class.outer\n\n(abstract_definition (_)? @class.inner) @class.outer\n\n(primitive_definition (_)? @class.inner) @class.outer\n\n(parameter_list\n  ; Match all children of parameter_list *except* keyword_parameters\n  ([(identifier)\n    (slurp_parameter)\n    (optional_parameter)\n    (typed_parameter)\n    (tuple_expression)\n    (interpolation_expression)\n    (call_expression)]\n  @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(keyword_parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(argument_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(type_parameter_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(line_comment) @comment.inner\n\n(line_comment)+ @comment.outer\n\n(block_comment) @comment.inner\n\n(block_comment)+ @comment.outer\n\n(_expression (macro_identifier\n    (identifier) @_name\n    (#match \"^(test|test_throws|test_logs|inferred|test_deprecated|test_warn|test_nowarn|test_broken|test_skip)$\" @_name)\n  )\n  .\n  (macro_argument_list) @test.inner) @test.outer\n"
  },
  {
    "path": "treesit-queries/just/textobjects.scm",
    "content": "; Specify how to navigate around logical blocks in code\n\n(assert_parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer)) @parameter.outer\n\n(recipe\n  (recipe_body) @function.inner) @function.outer\n\n(recipe_parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer)) @parameter.outer\n\n(recipe_dependency\n  (_) @parameter.inner) @parameter.outer\n\n(function_call\n  (function_parameters\n    ((_) @parameter.inner . \",\"? @parameter.outer)) @parameter.outer) @function.outer\n\n(comment) @comment.outer\n"
  },
  {
    "path": "treesit-queries/kdl/textobjects.scm",
    "content": "(type (_) @test.inner) @test.outer\n\n(node\n\tchildren: (node_children)? @class.inner) @class.outer\n\n(node\n\tchildren: (node_children)? @function.inner) @function.outer\n\n(node (identifier) @function.movement)\n\n[\n\t(single_line_comment)\n\t(multi_line_comment)\n] @comment.inner\n\n[\n\t(single_line_comment)+\n\t(multi_line_comment)+\n] @comment.outer\n\n[\n\t(prop)\n\t(value)\n] @parameter.inner\n\n(value (type) ? (_) @parameter.inner @parameter.movement . ) @parameter.outer\n\n"
  },
  {
    "path": "treesit-queries/kotlin/textobjects.scm",
    "content": "(function_declaration\n  (function_body)? @function.inner) @function.outer\n\n; Unlike function_body above, the constructor body is does not have its own\n; symbol in the current grammar.\n(secondary_constructor) @function.outer\n\n(class_declaration\n  (class_body)? @class.inner) @class.outer\n\n(class_declaration\n  (enum_class_body) @class.inner) @class.outer\n\n[\n  (line_comment)\n  (multiline_comment)\n] @comment.inner\n\n(line_comment)+ @comment.outer\n\n(multiline_comment) @comment.outer\n\n(enum_entry) @entry.outer\n(lambda_literal) @entry.outer\n(property_declaration) @entry.outer\n(object_declaration) @entry.outer\n(assignment) @entry.outer\n\n; TODO: This doesn't work with annotations yet, but fixing it without breaking\n; the case of multiple parameters is non-trivial.\n(function_value_parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n; secondary constructor uses function_value_parameters above\n(primary_constructor\n  ((_)@parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(function_type_parameters\n  ((_)@parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(value_arguments\n  ((_)@parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(lambda_parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n"
  },
  {
    "path": "treesit-queries/koto/textobjects.scm",
    "content": "(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n(function\n  body: (_) @function.inner) @function.outer\n\n(args\n  ((arg) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(call_args\n  ((call_arg) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(map\n  ((entry_inline) @entry.inner . \",\"? @entry.outer) @entry.outer)\n\n(map_block\n  ((entry_block) @entry.inner) @entry.outer)\n\n(list\n  ((element) @entry.inner . \",\"? @entry.outer) @entry.outer)\n\n(tuple\n  (_) @entry.outer)\n\n(assign\n  (meta (test))\n  (function body: (_) @test.inner)\n) @test.outer\n\n(entry_block\n  key: (meta (test))\n  value: (function body: (_) @test.inner)\n) @test.outer\n"
  },
  {
    "path": "treesit-queries/latex/textobjects.scm",
    "content": "[\n  (generic_command)\n] @function.outer\n\n[\n  (chapter)\n  (part)\n  (section)\n  (subsection)\n  (subsubsection)\n  (paragraph)\n  (subparagraph)\n] @class.outer\n"
  },
  {
    "path": "treesit-queries/llvm/textobjects.scm",
    "content": "(define\n  body: (_) @function.inner) @function.outer\n\n(struct_type\n  (struct_body) @class.inner) @class.outer\n\n(packed_struct_type\n  (struct_body) @class.inner) @class.outer\n\n(array_type\n  (array_vector_body) @class.inner) @class.outer\n\n(vector_type\n  (array_vector_body) @class.inner) @class.outer\n\n(argument) @parameter.inner\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/llvm-mir/textobjects.scm",
    "content": "(basic_block) @function.outer\n\n(argument) @parameter.inner\n\n[\n  (comment)\n  (multiline_comment)\n] @comment.inner\n\n(comment)+ @comment.outer\n\n(multiline_comment) @comment.outer\n"
  },
  {
    "path": "treesit-queries/lua/textobjects.scm",
    "content": "(function_definition\n  body: (_) @function.inner) @function.outer\n\n(function_declaration\n  body: (_) @function.inner) @function.outer\n\n(parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n(table_constructor\n  (field (_) @entry.inner) @entry.outer)\n"
  },
  {
    "path": "treesit-queries/luau/textobjects.scm",
    "content": "(fn_stmt\n  body: (_)? @function.inner) @function.outer\n\n(local_fn_stmt\n  body: (_)? @function.inner) @function.outer\n\n(anon_fn\n  body: (_)? @function.inner) @function.outer\n\n(param\n  ((name) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(arglist\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/mail/textobjects.scm",
    "content": "(atom_block\n  (atom) @entry.inner) @entry.outer\n\n(email_address) @entry.outer\n(header_other\n  (header_unstructured) @entry.outer)\n\n(quoted_block)+ @comment.outer\n\n(body_block)+ @function.outer\n\n(header_subject\n  (subject) @function.outer)\n"
  },
  {
    "path": "treesit-queries/matlab/textobjects.scm",
    "content": "(arguments ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n(function_arguments ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(lambda expression: (_) @function.inner) @function.outer\n(function_definition (block) @function.inner) @function.outer\n\n(class_definition) @class.inner @class.outer\n\n(comment) @comment.inner @comment.outer\n"
  },
  {
    "path": "treesit-queries/miseconfig/textobjects.scm",
    "content": "; inherits: toml\n"
  },
  {
    "path": "treesit-queries/mojo/textobjects.scm",
    "content": "; inherits: python\n"
  },
  {
    "path": "treesit-queries/nasm/textobjects.scm",
    "content": "(preproc_multiline_macro\n  body: (body) @function.inner) @function.outer\n(struc_declaration\n  body: (struc_declaration_body) @class.inner) @class.outer\n(struc_instance\n  body: (struc_instance_body) @class.inner) @class.outer\n\n(preproc_function_def_parameters\n  (word) @parameter.inner)\n(call_syntax_arguments\n  (_) @parameter.inner)\n(operand) @parameter.inner\n\n(comment) @comment.inner\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/nestedtext/textobjects.scm",
    "content": "; inherits: yaml\n"
  },
  {
    "path": "treesit-queries/nim/textobjects.scm",
    "content": "(proc_declaration\n  body: (_) @function.inner) @function.outer\n(func_declaration\n  body: (_) @function.inner) @function.outer\n(iterator_declaration\n  body: (_) @function.inner) @function.outer\n(converter_declaration\n  body: (_) @function.inner) @function.outer\n(method_declaration\n  body: (_) @function.inner) @function.outer\n(template_declaration\n  body: (_) @function.inner) @function.outer\n(macro_declaration\n  body: (_) @function.inner) @function.outer\n\n(type_declaration (_) @class.inner) @class.outer\n\n(parameter_declaration\n  (symbol_declaration_list) @parameter.inner) @parameter.outer\n\n[\n  (comment)\n  (block_comment)\n  (documentation_comment)\n  (block_documentation_comment)\n] @comment.inner\n\n[\n  (comment)+\n  (block_comment)\n  (documentation_comment)+\n  (block_documentation_comment)+\n] @comment.outer\n"
  },
  {
    "path": "treesit-queries/nix/textobjects.scm",
    "content": "(comment) @comment.inner\n(comment)+ @comment.outer\n\n(formals\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(function_expression\n  body: (_) @function.inner) @function.outer\n\n(binding\n  (_) @entry.inner) @entry.outer\n\n"
  },
  {
    "path": "treesit-queries/nu/textobjects.scm",
    "content": "; (stmt_let) @assignment.outer\n\n; (stmt_mut) @assignment.outer\n\n; (stmt_const) @assignment.outer\n\n; (stmt_let\n;   value: (_) @assignment.inner)\n\n; (stmt_mut\n;   value: (_) @assignment.inner)\n\n; (stmt_const\n;   value: (_) @assignment.inner)\n\n; (block) @block.outer\n\n(comment) @comment.outer\n\n; (pipeline) @pipeline.outer\n\n; (pipe_element) @pipeline.inner\n\n(decl_def) @function.outer\n\n(decl_def\n  body: (_) @function.inner)\n\n; (ctrl_for) @loop.outer\n\n; (ctrl_loop) @loop.outer\n\n; (ctrl_while) @loop.outer\n\n; (ctrl_for\n;   body: (_) @loop.inner)\n\n; (ctrl_loop\n;   body: (_) @loop.inner)\n\n; (ctrl_while\n;   body: (_) @loop.inner)\n\n; Conditional inner counts the last one, rather than the current one.\n; (ctrl_if\n;   then_branch: (_) @conditional.inner\n;   else_block: (_)? @conditional.inner) @conditional.outer\n\n(parameter) @parameter.outer\n\n; (command\n;   head: (_) @call.inner) @call.outer\n\n; (where_command\n;   predicate: (_) @call.inner) @call.outer\n\n; define pipeline first, because it should only match as a fallback\n; e.g., `let a = date now` should match the whole assignment.\n; But a standalone `date now` should also match a statement\n; (pipeline) @statement.outer\n\n; (stmt_let) @statement.outer\n\n; (stmt_mut) @statement.outer\n\n; (stmt_const) @statement.outer\n\n; (ctrl_if) @statement.outer\n\n; (ctrl_try) @statement.outer\n\n; (ctrl_match) @statement.outer\n\n; (ctrl_while) @statement.outer\n\n; (ctrl_loop) @statement.outer\n\n; (val_number) @number.inner\n"
  },
  {
    "path": "treesit-queries/odin/textobjects.scm",
    "content": "(procedure_declaration (identifier) (procedure (block) @function.inner)) @function.outer\n(procedure_declaration (identifier) (procedure (uninitialized) @function.inner)) @function.outer\n(overloaded_procedure_declaration (identifier) @function.inner) @function.outer\n\n(procedure_type (parameters (parameter (identifier) @parameter.inner) @parameter.outer))\n(procedure (parameters (parameter (identifier) @parameter.inner) @parameter.outer))\n\n((procedure_declaration\n  (attributes (attribute \"@\" \"(\" (identifier) @attr_name \")\"))\n  (identifier) (procedure (block) @test.inner)) @test.outer\n (#match \"test\" @attr_name))\n\n(comment) @comment.inner\n(comment)+ @comment.outer\n(block_comment) @comment.inner\n(block_comment)+ @comment.outer\n\n(struct_declaration (identifier) \"::\") @class.outer\n(enum_declaration (identifier) \"::\") @class.outer\n(union_declaration (identifier) \"::\") @class.outer\n(bit_field_declaration (identifier) \"::\") @class.outer\n(const_declaration (identifier) \"::\" [(array_type) (distinct_type) (bit_set_type) (pointer_type)]) @class.outer\n"
  },
  {
    "path": "treesit-queries/ohm/textobjects.scm",
    "content": "; See: https://docs.helix-editor.com/guides/textobject.html\n\n; function.inside & around\n; ------------------------\n\n(rule\n  body: (_) @function.inner) @function.outer\n\n; class.inside & around\n; ---------------------\n\n(grammar\n  body: (_) @class.inner) @class.outer\n\n; parameter.inside & around\n; -------------------------\n\n(formals\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(rule_body\n  ((_) @parameter.inner . \"|\"? @parameter.outer) @parameter.outer)\n\n(params\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(alt\n  ((_) @parameter.inner . \"|\"? @parameter.outer) @parameter.outer)\n\n; comment.inside\n; --------------\n\n(multiline_comment)+ @comment.inner\n(singleline_comment)+ @comment.inner\n\n; comment.around\n; --------------\n\n(multiline_comment)+ @comment.outer\n(singleline_comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/opencl/textobjects.scm",
    "content": "; inherits: c\n"
  },
  {
    "path": "treesit-queries/pascal/textobjects.scm",
    "content": "\n(declType (declClass (declSection) @class.inner)) @class.outer\n\n(defProc body: (_) @function.inner) @function.outer\n\n(declArgs (_) @parameter.inner) @parameter.outer\n(exprArgs (_) @parameter.inner) @parameter.outer\n\n(comment) @comment.inner\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/penrose/textobjects.scm",
    "content": "; Functions/constructors/predicates in Domain\n(constructor_decl) @function.outer\n\n(function_decl) @function.outer\n\n(predicate_decl) @function.outer\n\n; Parameters\n(parameter_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n; Arguments\n(argument_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n; Comments\n(comment) @comment.inner\n(comment) @comment.outer\n"
  },
  {
    "path": "treesit-queries/perl/textobjects.scm",
    "content": "(subroutine_declaration_statement\n  body: (_) @function.inner) @function.outer\n(anonymous_subroutine_expression\n  body: (_) @function.inner) @function.outer\n\n(package_statement) @class.outer\n(package_statement\n  (block) @class.inner)\n\n(list_expression\n  (_) @parameter.inner)\n\n(comment) @comment.outer\n(pod) @comment.outer\n"
  },
  {
    "path": "treesit-queries/pest/textobjects.scm",
    "content": "(grammar_rule (_) @class.inner) @class.outer\n(term (_) @entry.inner) @entry.outer\n\n(line_comment) @comment.inner\n(line_comment)+ @comment.outer\n\n(block_comment) @comment.inner\n(block_comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/php/textobjects.scm",
    "content": "(class_declaration\n  body: (_) @class.inner) @class.outer\n\n(interface_declaration\n  body: (_) @class.inner) @class.outer\n\n(trait_declaration\n  body: (_) @class.inner) @class.outer\n\n(enum_declaration\n  body: (_) @class.inner) @class.outer\n\n(function_definition\n  body: (_) @function.inner) @function.outer\n\n(method_declaration\n  body: (_) @function.inner) @function.outer\n\n(arrow_function \n  body: (_) @function.inner) @function.outer\n  \n(anonymous_function_creation_expression\n  body: (_) @function.inner) @function.outer\n\n(anonymous_function_use_clause\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(formal_parameters\n  ([\n    (simple_parameter)\n    (variadic_parameter)\n    (property_promotion_parameter)\n  ] @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n(array_creation_expression\n  (array_element_initializer\n    (_) @entry.inner\n  ) @entry.outer @entry.movement)\n\n(list_literal\n  (_) @entry.inner @entry.outer @entry.movement)\n\n[\n  (enum_case)\n] @entry.outer @entry.movement\n"
  },
  {
    "path": "treesit-queries/picat/textobjects.scm",
    "content": "[\n  (function_definition\n    [(function_rule) (function_fact)] @function.inner)\n  (predicate_definition\n    [(predicate_rule) (predicate_fact)] @function.inner)\n  (actor_definition\n    [(action_rule) (nonbacktrackable_predicate_rule)] @function.inner)\n] @function.outer\n\n(import_declaration\n  (atom) @function.outer)\n\n(parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(comment) @comment.inner\n(comment)+ @comment.outer\n\n(array_expression\n  (_) @entry.outer)\n\n(list_expression\n  (_) @entry.outer)\n"
  },
  {
    "path": "treesit-queries/pkgbuild/textobjects.scm",
    "content": "; inherits: bash\n"
  },
  {
    "path": "treesit-queries/po/textobjects.scm",
    "content": "(msgid) @parameter.inner\n\n(comment) @comment.inner\n(comment)+ @comment.outer\n\n\n"
  },
  {
    "path": "treesit-queries/ponylang/textobjects.scm",
    "content": ";; Queries for helix to select textobjects: https://docs.helix-editor.com/usage.html#textobjects\n;;  function.inside\n;; function.around\n;; class.inside\n;; class.around\n;; test.inside\n;; test.around\n;; parameter.inside\n;; comment.inside\n;; comment.around\n\n;; Queries for navigating using textobjects\n\n[\n  (line_comment)\n  (block_comment)\n] @comment.inner\n\n(line_comment)+ @comment.outer\n(block_comment) @comment.outer\n\n(entity members: (members)? @class.inner) @class.outer\n(object members: (members)? @class.inner) @class.outer\n\n(method\n  body: (block)? @function.inner\n) @function.outer\n(behavior\n  body: (block)? @function.inner\n) @function.outer\n(constructor\n  body: (block)? @function.inner\n) @function.outer\n(lambda\n  body: (block)? @function.inner\n) @function.outside\n\n(params\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer\n)\n(lambda\n  params: ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer\n)\n(typeargs\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer\n)\n(typeparams\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer\n)\n(arguments\n  positional: (positional_args\n                ((_) @parameter.inner . \",\"? @parameter.outer)? @parameter.outer)\n  ; TODO: get named args right\n  named: (named_args ((_) @parameter.inner . \",\"? @parameter.outer)? @parameter.outer)\n)\n\n(\n  (entity\n    provides: (type (nominal_type name: (identifier) @_provides))\n    members: (members) @test.inner\n  ) @test.outside\n  (#equal @_provides \"UnitTest\")\n)\n\n"
  },
  {
    "path": "treesit-queries/prisma/textobjects.scm",
    "content": "(model_declaration\n  ((statement_block) @class.inner)) @class.outer\n\n(call_expression\n  (arguments (_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(column_declaration) @entry.outer\n\n(array (_) @entry.outer)\n\n(assignment_expression\n  (_) @entry.inner) @entry.outer\n\n(developer_comment) @comment.inner\n\n(developer_comment)+ @comment.outer\n\n"
  },
  {
    "path": "treesit-queries/properties/textobjects.scm",
    "content": "(comment) @comment.inner\n(comment)+ @comment.outer\n\n(property (key) @parameter.inner) @parameter.outer\n"
  },
  {
    "path": "treesit-queries/protobuf/textobjects.scm",
    "content": "(message (message_body) @class.inner) @class.outer\n(enum (enum_body) @class.inner) @class.outer\n(service (service_body) @class.inner) @class.outer\n\n(rpc (message_or_enum_type) @parameter.inner) @function.inner\n(rpc (message_or_enum_type) @parameter.outer) @function.outer\n\n(comment) @comment.inner\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/purescript/textobjects.scm",
    "content": "(comment) @comment.inner\n\n[\n  (data)\n  (type)\n  (newtype)\n] @class.outer\n\n((signature)? (function rhs:(_) @function.inner)) @function.outer \n(exp_lambda) @function.outer\n\n(data (type_variable) @parameter.inner)\n(patterns (_) @parameter.inner)\n"
  },
  {
    "path": "treesit-queries/python/textobjects.scm",
    "content": "(function_definition\n  body: (block)? @function.inner) @function.outer\n\n(class_definition\n  body: (block)? @class.inner) @class.outer\n\n(parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n  \n(lambda_parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(argument_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n((function_definition\n   name: (identifier) @_name\n   body: (block)? @test.inner) @test.outer\n (#match \"^test_\" @_name))\n\n(list\n  (_) @entry.outer)\n\n(tuple\n  (_) @entry.outer)\n\n(set\n  (_) @entry.outer)\n\n(pair\n  (_) @entry.inner) @entry.outer\n\n;; Additional queries\n\n(for_statement\n body: (_) @loop.inner) @loop.outer\n\n(while_statement\n body: (_) @loop.inner) @loop.outer\n\n(if_statement\n consequence: (_) @conditional.inner) @conditional.outer"
  },
  {
    "path": "treesit-queries/qml/textobjects.scm",
    "content": "; (comment) is used for both // and /* ... */ comment syntax\n(comment) @comment.inner\n(comment)+ @comment.outer\n\n(ui_object_definition\n  initializer: (_) @class.inner) @class.outer\n\n(ui_binding\n  name: (identifier) @parameter.inner) @parameter.outer\n\n(ui_property\n  (_)+ @parameter.inner \":\") @parameter.outer\n\n(function_declaration\n  body: (_) @function.inner) @function.outer\n\n(arrow_function\n  body: (_) @function.inner) @function.outer\n\n; e.g. `onClicked: console.log(\"Button clicked!\")`\n((ui_binding\n  name: (identifier) @_name\n  value: (_) @function.outer @function.inner)\n  (#match \"^on[A-Z].*\" @_name))\n\n; e.g.\n; Component.onCompleted: {\n;    console.log(\"completed\")\n; }\n(statement_block (expression_statement)* @function.inner) @function.outer\n\n; e.g.\n; states: [\n;        State { name: \"activated\" },\n;        State { name: \"deactivated\" }\n; ]\n(ui_object_array\n  ((_) @entry.inner . \",\"? @entry.outer) @entry.outer)\n\n; e.g. [1, 2, 3, 4]\n(array\n  ((_) @entry.inner . \",\"? @entry.outer) @entry.outer)\n\n; Tests in QML are written using \"Qt Quick Test\" and it's `TestCase` type\n; ref: https://doc.qt.io/qt-6/qtquicktest-index.html\n((ui_object_definition\n  type_name: (identifier) @_name\n  initializer: (_) @test.inner) @test.outer\n  (#equal @_name \"TestCase\"))\n"
  },
  {
    "path": "treesit-queries/rescript/textobjects.scm",
    "content": "; Classes (modules)\n;------------------\n\n(module_binding definition: ((_) @class.inner)) @class.outer\n\n; Blocks\n;-------\n\n(block (_) @function.inner) @function.outer\n\n; Functions\n;----------\n\n(function body: (_) @function.inner) @function.outer\n\n; Calls\n;------\n\n(call_expression arguments: ((_) @parameter.inner)) @parameter.outer\n\n; Comments\n;---------\n\n(comment) @comment.inner\n(comment)+ @comment.outer\n\n; Parameters\n;-----------\n\n(function parameter: (_) @parameter.inner @parameter.outer)\n\n(formal_parameters\n  \",\"\n  . (_) @parameter.inner\n  @parameter.outer)\n(formal_parameters\n  . (_) @parameter.inner\n  . \",\"?\n  @parameter.outer)\n\n(arguments\n  \",\" @_arguments_start\n  . (_) @parameter.inner\n  @parameter.outer)\n(arguments\n  . (_) @parameter.inner\n  . \",\"?\n  @parameter.outer)\n\n(function_type_parameters\n  \",\"\n  . (_) @parameter.inner\n  @parameter.outer)\n(function_type_parameters\n  . (_) @parameter.inner\n  . \",\"?\n  @parameter.outer)\n\n(functor_parameters\n  \",\"\n  . (_) @parameter.inner\n  @parameter.outer)\n(functor_parameters\n  . (_) @parameter.inner\n  . \",\"?\n  @parameter.outer)\n\n(type_parameters\n  \",\"\n  . (_) @parameter.inner\n  @parameter.outer)\n(type_parameters\n  . (_) @parameter.inner\n  . \",\"?\n  @parameter.outer)\n\n(type_arguments\n  \",\"\n  . (_) @parameter.inner\n  @parameter.outer)\n(type_arguments\n  . (_) @parameter.inner\n  . \",\"?\n  @parameter.outer)\n\n(decorator_arguments\n  \",\"\n  . (_) @parameter.inner\n  @parameter.outer)\n(decorator_arguments\n  . (_) @parameter.inner\n  . \",\"?\n  @parameter.outer)\n\n(variant_parameters\n  \",\"\n  . (_) @parameter.inner\n  @parameter.outer)\n(variant_parameters\n  . (_) @parameter.inner\n  . \",\"?\n  @parameter.outer)\n\n(polyvar_parameters\n  \",\"\n  . (_) @parameter.inner\n  @parameter.outer)\n(polyvar_parameters\n  . (_) @parameter.inner\n  . \",\"?\n  @parameter.outer)\n\n"
  },
  {
    "path": "treesit-queries/robots.txt/textobjects.scm",
    "content": "(comment) @comment.inner\n(comment)+ @comment.outer\n\n(rule (_) @entry.inner) @entry.outer\n"
  },
  {
    "path": "treesit-queries/rshtml/textobjects.scm",
    "content": "(raw_block (html_text)? @entry.inner) @entry.outer\n\n(section_block body: (_)? @entry.inner) @entry.outer\n\n(rust_block content: (rust_text)? @entry.inner) @entry.outer\n\n\n(if_stmt body: (_)? @entry.inner) @entry.outer\n\n(while_stmt body: (_)? @entry.inner) @entry.outer\n\n(for_stmt body: (_)? @entry.inner) @entry.outer\n\n(match_stmt (match_stmt_arm) @entry.inner) \n(match_stmt (match_stmt_arm)+ @entry.inner) @entry.outer\n\n(component_tag (component_tag_parameter (rust_identifier) @parameter.inner) @parameter.outer)\n(component_tag body: (component_tag_body)? @entry.inner) @entry.outer\n\n(comment_block (comment_content) @comment.inner) @comment.outer\n"
  },
  {
    "path": "treesit-queries/ruby/textobjects.scm",
    "content": "; Class and Modules\n(class\n  body: (_)? @class.inner) @class.outer\n\n(singleton_class\n  value: (_)\n  (_)+ @class.inner) @class.outer\n\n(call\n  receiver: (constant) @class_const\n  method: (identifier) @class_method\n  (#match \"Class\" @class_const)\n  (#match \"new\" @class_method)\n  (do_block (_)+ @class.inner)) @class.outer\n  \n(module\n  body: (_)? @class.inner) @class.outer\n\n; Functions and Blocks\n(singleton_method\n  body: (_)? @function.inner) @function.outer\n\n(method\n  body: (_)? @function.inner) @function.outer\n\n(do_block\n  body: (_)? @function.inner) @function.outer\n\n(block\n  body: (_)? @function.inner) @function.outer\n\n; Parameters      \n(method_parameters\n  (_) @parameter.inner) @parameter.outer\n        \n(block_parameters \n  (_) @parameter.inner) @parameter.outer\n        \n(lambda_parameters \n  (_) @parameter.inner) @parameter.outer\n\n; Comments\n(comment) @comment.inner \n(comment)+ @comment.outer\n\n(pair\n  (_) @entry.inner) @entry.outer\n\n(array\n  (_) @entry.outer)\n\n(string_array\n  (_) @entry.outer)\n\n(symbol_array\n  (_) @entry.outer)\n"
  },
  {
    "path": "treesit-queries/rust/textobjects.scm",
    "content": "(function_item\n  body: (_) @function.inner) @function.outer\n\n(closure_expression\n  body: (_) @function.inner) @function.outer\n\n(struct_item\n  body: (_) @class.inner) @class.outer\n\n(enum_item\n  body: (_) @class.inner) @class.outer\n\n(union_item\n  body: (_) @class.inner) @class.outer\n\n(trait_item\n  body: (_) @class.inner) @class.outer\n\n(impl_item\n  body: (_) @class.inner) @class.outer\n\n(parameters \n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(type_parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(type_arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(closure_parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(field_initializer_list  \n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n[\n  (line_comment)\n  (block_comment)\n] @comment.inner\n\n(line_comment)+ @comment.outer\n\n(block_comment) @comment.outer\n\n(; #[test]\n (attribute_item\n   (attribute\n     (identifier) @_test_attribute))\n ; allow other attributes like #[should_panic] and comments\n [\n   (attribute_item)\n   (line_comment)\n ]*\n ; the test function\n (function_item\n   body: (_) @test.inner) @test.outer\n (#equal @_test_attribute \"test\"))\n\n(array_expression\n  (_) @entry.outer)\n\n(tuple_expression\n  (_) @entry.outer)\n\n(tuple_pattern\n  (_) @entry.outer)\n\n; Commonly used vec macro initializer is special cased\n(macro_invocation\n  (identifier) @_id (token_tree (_) @entry.outer)\n  (#equal @_id \"vec\"))\n\n(enum_variant) @entry.outer\n\n(field_declaration\n  (_) @entry.inner) @entry.outer\n\n(field_initializer\n  (_) @entry.inner) @entry.outer\n\n(shorthand_field_initializer) @entry.outer\n\n;; Additional queries\n\n(loop_expression\n  body: (_) @loop.inner) @loop.outer\n\n(while_expression\n  body: (_) @loop.inner) @loop.outer\n\n(for_expression\n  body: (_) @loop.inner) @loop.outer\n\n(if_expression\n  consequence: (_) @conditional.inner) @conditional.outer"
  },
  {
    "path": "treesit-queries/rust-format-args-macro/textobjects.scm",
    "content": "; inherits: rust\n"
  },
  {
    "path": "treesit-queries/sage/textobjects.scm",
    "content": "; inherits: python\n"
  },
  {
    "path": "treesit-queries/scala/textobjects.scm",
    "content": "; Function queries\n\n(function_definition\n  body: (_) @function.inner) @function.outer ; Does not include end marker\n\n(lambda_expression\n  (_) @function.inner) @function.outer\n\n; Scala 3 braceless lambda\n(colon_argument\n  (_) @function.inner) @function.outer\n\n\n; Class queries\n\n(object_definition\n  body: (_)? @class.inner) @class.outer\n\n(class_definition\n  body: (_)? @class.inner) @class.outer\n\n(trait_definition\n  body: (_)? @class.inner) @class.outer\n\n(type_definition) @class.outer\n\n(enum_case_definitions) @class.outer\n\n(enum_definition\n  body: (_)? @class.inner) @class.outer\n\n\n; Parameter queries\n\n(parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(class_parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(parameter_types\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(bindings\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n; Does not match context bounds or higher-kinded types\n(type_parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(type_arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n\n; Comment queries\n\n[(comment) (block_comment)] @comment.inner\n[(comment) (block_comment)] @comment.outer ; Does not match consecutive block comments\n\n\n; Test queries\n; Not supported\n"
  },
  {
    "path": "treesit-queries/scheme/textobjects.scm",
    "content": "[\n  (comment)\n  (block_comment)\n] @comment.inner\n\n(comment)+ @comment.outer\n(block_comment) @comment.outer\n"
  },
  {
    "path": "treesit-queries/shellcheckrc/textobjects.scm",
    "content": "(comment) @comment.inner\n(comment)+ @comment.outer\n\n\n[\n  (disable_directive)\n  (enable_directive)\n  (extended_analysis_directive)\n  (external_sources_directive)\n  (source_directive)\n  (source_path_directive)\n  (shell_directive)\n] @entry.outer\n"
  },
  {
    "path": "treesit-queries/slang/textobjects.scm",
    "content": "(function_definition\n  body: (_) @function.inner) @function.outer\n\n(struct_specifier\n  body: (_) @class.inner) @class.outer\n\n(interface_specifier\n  body: (_) @class.inner) @class.outer\n\n(enum_specifier\n  body: (_) @class.inner) @class.outer\n\n(union_specifier\n  body: (_) @class.inner) @class.outer\n\n(parameter_list \n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(argument_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n(enumerator\n  (_) @entry.inner) @entry.outer\n\n(initializer_list\n  (_) @entry.outer)\n"
  },
  {
    "path": "treesit-queries/slint/textobjects.scm",
    "content": "(function_definition\n  (imperative_block) @function.inner) @function.outer\n\n(callback_event\n  (imperative_block) @function.inner) @function.outer\n\n(property\n  (imperative_block) @function.inner) @function.outer\n\n(struct_definition\n  (struct_block) @class.inner) @class.outer\n\n(enum_definition\n  (enum_block) @class.inner) @class.outer\n\n(global_definition\n  (global_block) @class.inner) @class.outer\n\n(component_definition\n  (block) @class.inner) @class.outer\n\n(component_definition\n  (block) @class.inner) @class.outer\n\n(comment) @comment.outer\n\n(typed_identifier\n  name: (_) @parameter.inner) @parameter.outer\n\n(callback\n  arguments: (_) @parameter.inner)\n\n(string_value\n  \"\\\"\" . (_) @text.inner . \"\\\"\") @text.outer\n\n"
  },
  {
    "path": "treesit-queries/solidity/textobjects.scm",
    "content": "(function_definition\n  body: (_) @function.inner) @function.outer\n\n(constructor_definition\n  body: (_) @function.inner) @function.outer\n\n(fallback_receive_definition\n  body: (_) @function.inner) @function.outer\n\n(yul_function_definition\n  (yul_block) @function.inner) @function.outer\n\n(function_definition \n  ((parameter) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(constructor_definition \n  ((parameter) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(return_type_definition \n  ((parameter) @entry.inner . \",\"? @entry.outer) @entry.outer)\n\n(modifier_definition \n  ((parameter) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(event_definition \n  ((event_parameter) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(error_declaration \n  ((error_parameter) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(call_argument\n  ((call_struct_argument) @entry.inner . \",\"? @entry.outer) @entry.outer)\n\n(call_expression\n  ((call_argument) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(variable_declaration_tuple\n  ((variable_declaration) @entry.inner . \",\"? @entry.outer) @entry.outer)\n\n(emit_statement\n  ((call_argument) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(revert_arguments\n  ((call_argument) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(struct_declaration\n  body: (_) @class.inner) @class.outer\n\n(enum_declaration\n  body: (_) @class.inner) @class.outer\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n"
  },
  {
    "path": "treesit-queries/sourcepawn/textobjects.scm",
    "content": "(function_definition\n  body: (_) @function.inner) @function.outer\n\n(alias_declaration\n  body: (_) @function.inner) @function.outer\n\n(enum_struct_method\n  body: (_) @function.inner) @function.outer\n\n(methodmap_method\n  body: (_) @function.inner) @function.outer\n\n(methodmap_method_constructor\n  body: (_) @function.inner) @function.outer\n\n(methodmap_method_destructor\n  body: (_) @function.inner) @function.outer\n\n(methodmap_property_method\n  body: (_) @function.inner) @function.outer\n\n(enum_struct) @class.outer\n\n(methodmap) @class.outer\n\n(parameter_declarations \n  ((parameter_declaration) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(comment) @comment.outer\n"
  },
  {
    "path": "treesit-queries/sql/textobjects.scm",
    "content": "(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n"
  },
  {
    "path": "treesit-queries/starlark/textobjects.scm",
    "content": "; inherits: python\n"
  },
  {
    "path": "treesit-queries/sway/textobjects.scm",
    "content": "(function_item\n  body: (_) @function.inner) @function.outer(closure_expression body: (_) @function.inner) @function.outer\n\n(struct_item\n  body: (_) @class.inner) @class.outer\n\n(enum_item\n  body: (_) @class.inner) @class.outer\n\n(trait_item\n  body: (_) @class.inner) @class.outer\n\n(impl_item\n  body: (_) @class.inner) @class.outer\n\n(parameters \n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(type_parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(type_arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(closure_parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n[\n  (line_comment)\n  (block_comment)\n] @comment.inner\n\n(line_comment)+ @comment.outer\n\n(block_comment) @comment.outer\n\n(; #[test]\n (attribute_item\n   (attribute\n     (identifier) @_test_attribute))\n ; allow other attributes like #[should_panic] and comments\n [\n   (attribute_item)\n   (line_comment)\n ]*\n ; the test function\n (function_item\n   body: (_) @test.inner) @test.outer\n (#equal @_test_attribute \"test\"))\n"
  },
  {
    "path": "treesit-queries/swift/textobjects.scm",
    "content": "(class_declaration\n  body: (_) @class.inner) @class.outer\n\n(protocol_declaration\n  body: (_) @class.inner) @class.outer\n\n(function_declaration\n  body: (_) @function.inner) @function.outer\n\n(parameter\n  (_) @parameter.inner) @parameter.outer\n\n(lambda_parameter\n  (_) @parameter.inner) @parameter.outer\n\n[\n  (comment)\n  (multiline_comment)\n] @comment.inner\n\n(comment)+ @comment.outer\n\n(multiline_comment) @comment.outer\n"
  },
  {
    "path": "treesit-queries/tablegen/textobjects.scm",
    "content": "(class\n  body: (_) @class.inner) @class.outer\n\n(multiclass\n  body: (_) @class.inner) @class.outer\n\n(_ argument: _ @parameter.inner)\n\n[\n  (comment)\n  (multiline_comment)\n] @comment.inner\n\n(comment)+ @comment.outer\n\n(multiline_comment) @comment.outer\n"
  },
  {
    "path": "treesit-queries/tact/textobjects.scm",
    "content": "; function.inside & around\n; ------------------------\n\n(static_function\n  body: (_) @function.inner) @function.outer\n\n(init_function\n  body: (_) @function.inner) @function.outer\n\n(bounced_function\n  body: (_) @function.inner) @function.outer\n\n(receive_function\n  body: (_) @function.inner) @function.outer\n\n(external_function\n  body: (_) @function.inner) @function.outer\n\n(function\n  body: (_) @function.inner) @function.outer\n\n; class.inside & around\n; ---------------------\n\n(struct\n  body: (_) @class.inner) @class.outer\n\n(message\n  body: (_) @class.inner) @class.outer\n\n(contract\n  body: (_) @class.inner) @class.outer\n\n; NOTE: Marked as @definition.interface in tags, as it's semantically correct\n(trait\n  body: (_) @class.inner) @class.outer\n\n; parameter.inside & around\n; -------------------------\n\n(parameter_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(argument_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(instance_argument_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n; comment.inside\n; --------------\n\n(comment) @comment.inner\n\n; comment.around\n; --------------\n\n(comment)+ @comment.outer"
  },
  {
    "path": "treesit-queries/textproto/textobjects.scm",
    "content": "(message_field \n  (_) @entry.inner) @entry.outer\n\n(scalar_field \n  (_) @entry.inner) @entry.outer\n\n(message_list\n  (_) @entry.outer)\n\n(scalar_list\n  (_) @entry.outer)\n\n"
  },
  {
    "path": "treesit-queries/tilt/textobjects.scm",
    "content": "; inherits: python\n"
  },
  {
    "path": "treesit-queries/toml/textobjects.scm",
    "content": "(pair \n  (_) @entry.inner) @entry.outer\n\n(array\n  (_) @entry.outer)\n\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/tsx/textobjects.scm",
    "content": "; See runtime/queries/ecma/README.md for more info.\n\n; inherits: _jsx,_typescript,ecma\n"
  },
  {
    "path": "treesit-queries/typescript/textobjects.scm",
    "content": "; See runtime/queries/ecma/README.md for more info.\n\n; inherits: _typescript,ecma\n"
  },
  {
    "path": "treesit-queries/typespec/textobjects.scm",
    "content": "; Classes\n\n(enum_statement\n  (enum_body) @class.inner) @class.outer\n\n(model_statement\n  (model_expression) @class.inner) @class.outer\n\n(union_statement\n  (union_body) @class.inner) @class.outer\n\n; Interfaces\n\n(interface_statement\n  (interface_body\n    (interface_member) @function.outer) @class.inner) @class.outer\n\n; Comments\n\n[\n  (single_line_comment)\n  (multi_line_comment)\n] @comment.inner\n\n[\n  (single_line_comment)\n  (multi_line_comment)\n]+ @comment.outer\n\n; Functions\n\n[\n  (decorator)\n  (decorator_declaration_statement)\n  (function_declaration_statement)\n  (operation_statement)\n] @function.outer\n\n(function_parameter_list\n  (function_parameter)? @parameter.inner)* @function.inner\n\n(decorator_arguments\n  (expression_list\n    (_) @parameter.inner)*) @function.inner\n\n(operation_arguments\n  (model_property)? @parameter.inner)* @function.inner\n\n(template_parameters\n  (template_parameter_list\n    (template_parameter) @parameter.inner)) @function.inner\n"
  },
  {
    "path": "treesit-queries/unison/textobjects.scm",
    "content": "(term_declaration) @function.outer\n\n(type_declaration) @class.inner\n(record) @class.inner\n\n(comment) @comment.inner\n(comment)+ @comment.outer\n\n(doc_block) @comment.outer\n\n(literal_list) @entry.outer\n\n(parenthesized_or_tuple_pattern) @entry.outer\n\n(pattern) @entry.outer\n"
  },
  {
    "path": "treesit-queries/v/textobjects.scm",
    "content": "(function_declaration\n  body: (block)? @function.inner) @function.outer\n\n((function_declaration\n   name: (identifier) @_name\n   body: (block)? @test.inner) @test.outer\n (#match \"^test\" @_name))\n\n(function_literal\n  body: (block)? @function.inner) @function.outer\n\n(parameter_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(call_expression\n  (argument_list\n    ((_) @parameter.inner) @parameter.outer))\n\n(struct_declaration\n    (struct_field_declaration) @class.inner) @class.outer\n\n(struct_field_declaration\n  ((_) @parameter.inner) @parameter.outer)\n\n[(line_comment) (block_comment)] @comment.inner\n[(line_comment)+ (block_comment)+] @comment.outer\n\n"
  },
  {
    "path": "treesit-queries/vala/textobjects.scm",
    "content": "(method_declaration\n  (block) @function.inner) @function.outer\n\n(creation_method_declaration\n  (block) @function.inner) @function.outer\n\n(method_declaration\n  ((parameter) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n[\n  (class_declaration)\n  (struct_declaration)\n  (interface_declaration)\n] @class.outer\n\n(type_arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(creation_method_declaration\n  ((parameter) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(method_call_expression\n  ((argument) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/verilog/textobjects.scm",
    "content": "\n(function_declaration\n (function_body_declaration\n  (function_identifier\n     (function_identifier\n        (simple_identifier) @function.inner)))) @function.outer\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/wesl/textobjects.scm",
    "content": "(function_decl\n  body: (_) @function.inner) @function.outer\n\n(struct_decl\n  body: (_) @class.inner) @class.outer\n\n(param_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(argument_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(template_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n[\n  (line_comment)\n  (block_comment)\n] @comment.inner\n  \n(line_comment)+ @comment.outer\n\n(block_comment) @comment.outer\n"
  },
  {
    "path": "treesit-queries/wgsl/textobjects.scm",
    "content": "(function_declaration\n  body: (_) @function.inner) @function.outer\n\n(struct_declaration) @class.outer\n\n[\n  (struct_member)\n  (parameter)\n  (variable_declaration)\n] @parameter.outer\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/woodpecker-ci/textobjects.scm",
    "content": "; inherits: yaml\n"
  },
  {
    "path": "treesit-queries/wren/textobjects.scm",
    "content": "(class_definition\n  (class_body) @class.inner) @class.outer\n\n(call_expression\n  (call_body\n    (_) @function.inner) @function.outer)\n\n(method_definition\n  body: (_) @function.inner) @function.outer\n\n(parameter_list\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(comment) @comment.inner\n\n(comment)+ @comment.outer\n"
  },
  {
    "path": "treesit-queries/xml/textobjects.scm",
    "content": "(element (start_tag) (_)* @xml-element.inner (end_tag))\n\n(element) @xml-element.outer\n\n(comment) @comment.outer\n"
  },
  {
    "path": "treesit-queries/yaml/textobjects.scm",
    "content": "(comment) @comment.inner\n\n(comment)+ @comment.outer\n\n(block_mapping_pair\n  (_) @entry.inner) @entry.outer\n\n"
  },
  {
    "path": "treesit-queries/zig/textobjects.scm",
    "content": "(function_declaration\n  body: (_) @function.inner) @function.outer\n\n(test_declaration (_) (block) @test.inner) @test.outer\n\n; matches all of: struct, enum, union\n; this unfortunately cannot be split up because\n; of the way struct \"container\" types are defined\n(variable_declaration (identifier) (struct_declaration\n    (_) @class.inner)) @class.outer\n\n(variable_declaration (identifier) (enum_declaration\n    (_) @class.inner)) @class.outer\n\n(variable_declaration (identifier) (enum_declaration\n    (_) @class.inner)) @class.outer\n\n(parameters\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(arguments\n  ((_) @parameter.inner . \",\"? @parameter.outer) @parameter.outer)\n\n(comment) @comment.inner\n(comment)+ @comment.outer\n"
  }
]