Skip to main content

Apache Groovy grammar for tree-sitter (dekobon fork)

Project description

tree-sitter-groovy

CI CodeQL npm crates.io PyPI

Tree-sitter grammar for Apache Groovy — the JVM scripting language used in Jenkins pipelines, Gradle build files, and Spock test specifications.

Published as: @dekobon/tree-sitter-groovy on npm, dekobon-tree-sitter-groovy on crates.io and PyPI, github.com/dekobon/tree-sitter-groovy as a Go module / Swift package. The unscoped name belongs to the upstream comparison grammar linked below; the C library (no naming conflict) still ships as libtree-sitter-groovy.

This grammar is purpose-built for Groovy (it does not extend the tree-sitter-java grammar). It synthesises the best ideas from the two existing community grammars while closing every operator and statement gap they left open:

  • amaanq/tree-sitter-groovy — clean precedence table and shebang handling, but mis-shapes Groovy-specific syntax (Elvis ?:, safe navigation ?., spread operators, regex =~ / ==~, traits, exclusive ranges, identity === / !==, spaceship <=>, etc.) as Java-shaped parse trees.
  • murtaza64/tree-sitter-groovy — purpose-built for Groovy, broad operator coverage and slashy strings, but has open bugs around empty block comments, multi-catch, multi-assignment, enums, switch-arrow, and a pipeline-at-EOF constraint.

The full design is in SPECIFICATION.md.

Status

Fully functional Groovy 2.x--4.x parser with complete operator coverage, GString interpolation, generics, closures, command chains, and six language bindings. See Known limitations for deferred items.

Operator coverage

Every Groovy operator emits a distinct named node so downstream tooling can identify each by node kind alone — no MISSING-child inspection, no tree-shape heuristics. This is the contract that closes dekobon/big-code-analysis#246 (Elvis short-circuit counting) and dekobon/big-code-analysis#247 (all Groovy-specific operator gaps).

Category Operators
Arithmetic + - * / % ** ++ --
Relational < <= > >= == != <=> (spaceship)
Identity === !==
Regex =~ (find) ==~ (match)
Logical && || ! ==> (implication)
Bitwise & | ^ ~ << >> >>>
Conditional ? : (ternary) ?: (Elvis)
Assignment = += -= *= /= %= **= <<= >>= >>>= &= ^= |= ?= (Elvis assign)
Range .. ..< <.. <..<
Member access . ?. ??. (safe chain dot) *. (spread-dot) .& (method pointer) .@ (direct field) :: (method reference)
Subscript [] ?[] (safe index)
Spread *args *: (spread-map)
Membership in !in instanceof !instanceof
Coercion as

Editor support

Tree-sitter queries (queries/groovy/highlights.scm, folds.scm, indents.scm, injections.scm) are provided for editor integration. Slashy and dollar-slashy string bodies inject as regex for nested regex highlighting.

Recognized file extensions: .groovy, .gradle, .gvy, .gy, and Jenkinsfile.

Filetype detection

The repo ships ftdetect/groovy.lua and ftplugin/groovy.lua for Neovim. Neovim's built-in filetype detection already maps *.groovy, *.gradle, and the bare filename Jenkinsfile to filetype groovy; the shipped ftdetect/groovy.lua fills the gaps by mapping:

  • *.gvy and *.gy — declared in tree-sitter.json but not in Neovim's defaults.
  • *.jenkinsfile — uncommon (the canonical name is Jenkinsfile) but declared in tree-sitter.json and used by some teams as an editor-detection hook.
  • Jenkinsfile.* variants (Jenkinsfile.ci, Jenkinsfile.release, …) — common in repos with multiple pipelines, not handled by Neovim's built-in detection.

The existing ftplugin/groovy.lua then calls vim.treesitter.start(). Highlighting only renders once the parser binary and queries/groovy/highlights.scm are registered with nvim-treesitter (or equivalent) — without that, the start() call is a no-op and the buffer falls back to non-treesitter highlighting.

For files that don't match any of those (e.g. a hand-named build-pipeline with no extension), opt in with one of:

  • Modeline at the top of the file: // vim: set filetype=groovy :

  • Per-project autocmd in .nvim.lua (sourced after :cd into the project via Neovim's 'exrc'). Note vim.fn.getcwd() is evaluated when the autocmd is defined, so this snippet belongs in a per-project config, not a global init.lua:

    vim.api.nvim_create_autocmd({ "BufRead", "BufNewFile" }, {
      pattern = vim.fn.getcwd() .. "/jenkins/*",
      callback = function() vim.bo.filetype = "groovy" end,
    })
    

Other editors follow the same pattern: rely on built-in detection for the common extensions and override per-directory or via a header comment for the rest.

Building

npm install
make build
make test

Bindings

Available bindings: C, Go, Node.js, Python, Rust, Swift. See bindings/ for binding-specific READMEs and tests.

For Rust consumers:

[dependencies]
dekobon-tree-sitter-groovy = "0.1"
tree-sitter = "0.25"
let mut parser = tree_sitter::Parser::new();
let language = dekobon_tree_sitter_groovy::LANGUAGE;
parser.set_language(&language.into()).expect("Error loading Groovy parser");
let tree = parser.parse(source, None).unwrap();

Known limitations

These are documented in detail in docs/divergences-from-spec.md.

  • Groovy 5 contextual keywords (val, async, await, defer) are not yet exposed as keyword tokens. They parse as plain identifiers, matching Groovy 2.x--4.x compiler behavior.
  • Typed local declarations require an initializer -- String x is ambiguous with String(x) (method call). Use String x = ... or def x instead.
  • Leading-operator line continuation -- a\n+ b greedily joins as a + b rather than splitting into two statements. Idiomatic Groovy places continuation operators at the end of the previous line.

Contributing

See CONTRIBUTING.md for how to build, test, and submit changes. AGENTS.md covers project conventions (commit messages, versioning, validation gates) and SPECIFICATION.md is the authoritative grammar design document.

Acknowledgements

We are grateful for the work done in the murtaza64/tree-sitter-groovy and amaanq/tree-sitter-groovy. These projects served as inspiration for some of the approaches in this project

License

Dual-licensed under Apache License 2.0 or MIT.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dekobon_tree_sitter_groovy-0.2.1.tar.gz (350.4 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-win_amd64.whl (113.8 kB view details)

Uploaded CPython 3.8+Windows x86-64

dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-win32.whl (113.1 kB view details)

Uploaded CPython 3.8+Windows x86

dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-musllinux_1_2_x86_64.whl (139.5 kB view details)

Uploaded CPython 3.8+musllinux: musl 1.2+ x86-64

dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (140.8 kB view details)

Uploaded CPython 3.8+manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-macosx_11_0_arm64.whl (119.9 kB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

File details

Details for the file dekobon_tree_sitter_groovy-0.2.1.tar.gz.

File metadata

File hashes

Hashes for dekobon_tree_sitter_groovy-0.2.1.tar.gz
Algorithm Hash digest
SHA256 9ab61088e423409e214225fd212c1abf8de45138fbf379c6d48754c3291a2af8
MD5 8f799d3b2502f335e2ab1dd4f02c7b7b
BLAKE2b-256 0ae89eb1eb57202c405efb2130c276e24367e6102ae8ff1a577c3b4bad283baa

See more details on using hashes here.

Provenance

The following attestation bundles were made for dekobon_tree_sitter_groovy-0.2.1.tar.gz:

Publisher: release.yml on dekobon/tree-sitter-groovy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 423f00f6deb84cc9684f2a2dacb5f68dd102340d48fe5a20cc32c05a51082e4d
MD5 12085eb6f6b9800ab85bad37254a10b4
BLAKE2b-256 ea7f6174b45c1aa121986da4dbddd45d9e5fecf105377e07cc7b162065d8e8f5

See more details on using hashes here.

Provenance

The following attestation bundles were made for dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-win_amd64.whl:

Publisher: release.yml on dekobon/tree-sitter-groovy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-win32.whl.

File metadata

File hashes

Hashes for dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-win32.whl
Algorithm Hash digest
SHA256 4a5c6a031a56490a89e6ec5cbd722aac571e2576c4213918c73f5cecd9190da0
MD5 ce9bea666001d9a47d657f6555e7cd84
BLAKE2b-256 a02f018d4aaaa276baf02a4bb67ddac17a8871c10c24befe438292c7759fa02b

See more details on using hashes here.

Provenance

The following attestation bundles were made for dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-win32.whl:

Publisher: release.yml on dekobon/tree-sitter-groovy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d55e56434298960a9843a8c74877dd1751ef0f34bb15181be99f39dab6c69190
MD5 ded0240eeaad261d8e701bf99fa07259
BLAKE2b-256 0dffd27edd88ff27e6f8cf5aee3b3a402464739009c5b53dc970106add962d75

See more details on using hashes here.

Provenance

The following attestation bundles were made for dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-musllinux_1_2_x86_64.whl:

Publisher: release.yml on dekobon/tree-sitter-groovy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 e29d49095282dad2dcfa52d1dda5c4b39a00e3d8447d83a5043d0aa53aa5bc16
MD5 656b9f2c3f297cadc0139ff998cb7ce3
BLAKE2b-256 7480ff8c87b2caf173b7f8e47c98721d4f4100dfb8bb81fc1bf75cf2c8e9e408

See more details on using hashes here.

Provenance

The following attestation bundles were made for dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl:

Publisher: release.yml on dekobon/tree-sitter-groovy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e0fcdc6d3f77654cbf15e6e6917c65060b720e6b39d6a5091c7671f9530279e2
MD5 273c36551649151cfc5d3da56f01db3b
BLAKE2b-256 8c45551fcfe5277dbd63826e492053d83b0884ab39130de570d098edf184da05

See more details on using hashes here.

Provenance

The following attestation bundles were made for dekobon_tree_sitter_groovy-0.2.1-cp38-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on dekobon/tree-sitter-groovy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page