tree-sitter-objectscript
Tree-sitter grammars for InterSystems ObjectScript.
Grammars
This repository publishes five related grammars:
objectscript: playground/snippet grammar.objectscript_udl: class-file grammar for.cls.objectscript_core: routine/statement grammar.objectscript_expr: expression grammar.objectscript_routine: routine-file grammar for.mac,.inc,.rtn, and.int.
Grammar extension graph:
objectscript_expr -> objectscript_core -> objectscript_udl -> objectscript
objectscript_expr -> objectscript_core -> objectscript_routine
Packages
- npm:
tree-sitter-objectscript - PyPI:
tree-sitter-objectscript(shipstree_sitter_objectscript,tree_sitter_objectscript_udl, andtree_sitter_objectscript_routine) - Rust crates:
tree-sitter-objectscript(UDL grammar)tree-sitter-objectscript-routine(routine grammar)tree-sitter-objectscript-playground(playground grammar)
Bindings
Language bindings are available under bindings/:
- C:
bindings/c - Go:
bindings/go - Node.js:
bindings/node - Python:
bindings/python - Rust:
bindings/rust,bindings/rust-routine, andbindings/rust-playground - Swift:
bindings/swift
Quick binding checks from repo root:
nvm use
npm ci
cargo test --lib --package tree-sitter-objectscript
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -U pip setuptools wheel pytest tree-sitter
python3 setup.py build_ext --inplace
PYTHONPATH=$PWD/bindings/python python3 -m pytest -q bindings/python/tests/test_binding.py
npm test
go test ./bindings/go/...
swift test
make test
The routine and playground Rust crates are staged from bindings/rust-routine and
bindings/rust-playground via helper scripts. See
CONTRIBUTING.md for the current local build workflow.
For Node bindings specifically, .nvmrc pins the expected Node version.
Quick Development
Install the tree-sitter CLI, then run commands from a grammar directory (objectscript, udl, core, expr, or objectscript_routine):
tree-sitter generate
tree-sitter test
tree-sitter build
For playground work:
tree-sitter build --wasm
tree-sitter playground
If you change an upstream grammar (expr or core), regenerate downstream grammars as needed (udl, objectscript, objectscript_routine).
Query Sync
scripts/sync_queries.py manages the canonical query trio for each grammar:
highlights.scmindents.scminjections.scm
It composes the layered query trees for core, udl, objectscript, and
objectscript_routine, then mirrors those composed files into the Python
binding query directories.
Corpus Sync
objectscript/test/corpus is treated as a synced corpus directory. On commit, the repository pre-commit hook:
- Replaces
objectscript/test/corpuscontents with files from:core/test/corpusudl/test/corpusobjectscript_routine/test/corpus
- Removes
objectscript/test/corpus/invalid.txt - Removes
objectscript/test/corpus/compiled-header.txt
Contributing
See CONTRIBUTING.md for setup, workflow, query sync, and binding test instructions.
References
Editor Integration
-
Zed On Zed, you can use
tree-sitter-objectscriptby downloading the InterSystems ObjectScript extension -
Neovim We currently have a PR open with
nvim-treesitter, and if that gets merged in, the setup process will be automated. However, this repo is currently archived, so for now do the following to setup the grammars in neovim:Step 1: Create
~/.config/nvim/lua/plugins/objectscript-treesitter.luaAdd the following content to that file: IMPORTANT: Make sure to replace the revision section with the commit that you want.
return { -- configure nvim-treesitter { "nvim-treesitter/nvim-treesitter", init = function() vim.filetype.add({ extension = { cls = "objectscript_udl", mac = "objectscript_routine", inc = "objectscript_routine", int = "objectscript_routine", rtn = "objectscript_routine" }, }) vim.api.nvim_create_autocmd("FileType", { pattern = { "objectscript_udl", "objectscript_routine" }, callback = function(args) vim.treesitter.start(args.buf) end, }) vim.api.nvim_create_autocmd('User', { pattern = 'TSUpdate', callback = function() local parsers = require("nvim-treesitter.parsers") parsers.objectscript_udl = { install_info = { url = "https://github.com/intersystems/tree-sitter-objectscript", revision = "58450fe03f6fa51de38ac689fbf0af63f455494a", location = "udl", queries = "udl/queries", } } parsers.objectscript = { install_info = { url = "https://github.com/intersystems/tree-sitter-objectscript", revision = "58450fe03f6fa51de38ac689fbf0af63f455494a", location = "objectscript", queries = "objectscript/queries", } } parsers.objectscript_routine = { install_info = { url = "https://github.com/intersystems/tree-sitter-objectscript", revision = "58450fe03f6fa51de38ac689fbf0af63f455494a", location = "objectscript_routine", queries = "objectscript_routine/queries", } } end}) end, opts = function(_, opts) opts.ensure_installed = opts.ensure_installed or {} for _, lang in ipairs({ "objectscript_udl", "objectscript_routine", "objectscript" }) do if not vim.tbl_contains(opts.ensure_installed, lang) then table.insert(opts.ensure_installed, lang) end end end, }, }
Step 2: Create
~/.config/nvim/after/queries/xml/injections.scmAdd the following content to that file:
;; extends ( element (STag (Name) @_start_tag) (content (CDSect (CData) @injection.content)) (ETag (Name) @_end_tag) (#eq? @_start_tag "Implementation") (#eq? @_end_tag "Implementation") (#set! injection.language "objectscript") ) ( element (STag (Name) @_start_tag) (content (CharData) @injection.content) (ETag (Name) @_end_tag) (#eq? @_start_tag "Implementation") (#eq? @_end_tag "Implementation") (#set! injection.language "objectscript") )
Step 3: Create
~/.config/nvim/queries/xml/highlights.scm;; XML declaration "xml" @keyword [ "version" "encoding" "standalone" ] @property (EncName) @string.special (VersionNum) @number [ "yes" "no" ] @boolean ;; Processing instructions (PI) @embedded (PI (PITarget) @keyword) ;; Element declaration (elementdecl "ELEMENT" @keyword (Name) @tag) (contentspec (_ (Name) @property)) "#PCDATA" @type.builtin [ "EMPTY" "ANY" ] @string.special.symbol [ "*" "?" "+" ] @operator ;; Entity declaration (GEDecl "ENTITY" @keyword (Name) @constant) (GEDecl (EntityValue) @string) (NDataDecl "NDATA" @keyword (Name) @label) ;; Parsed entity declaration (PEDecl "ENTITY" @keyword "%" @operator (Name) @constant) (PEDecl (EntityValue) @string) ;; Notation declaration (NotationDecl "NOTATION" @keyword (Name) @constant) (NotationDecl (ExternalID (SystemLiteral (URI) @string.special))) ;; Attlist declaration (AttlistDecl "ATTLIST" @keyword (Name) @tag) (AttDef (Name) @property) (AttDef (Enumeration (Nmtoken) @string)) (DefaultDecl (AttValue) @string) [ (StringType) (TokenizedType) ] @type.builtin (NotationType "NOTATION" @type.builtin) [ "#REQUIRED" "#IMPLIED" "#FIXED" ] @attribute ;; Entities (EntityRef) @constant ((EntityRef) @constant.builtin (#any-of? @constant.builtin "&" "<" ">" """ "'")) (CharRef) @constant (PEReference) @constant ;; External references [ "PUBLIC" "SYSTEM" ] @keyword (PubidLiteral) @string.special (SystemLiteral (URI) @markup.link) ;; Processing instructions (XmlModelPI "xml-model" @keyword) (StyleSheetPI "xml-stylesheet" @keyword) (PseudoAtt (Name) @property) (PseudoAtt (PseudoAttValue) @string) ;; Doctype declaration (doctypedecl "DOCTYPE" @keyword) (doctypedecl (Name) @type) ;; Tags (STag (Name) @tag) (ETag (Name) @tag) (EmptyElemTag (Name) @tag) ;; Attributes (Attribute (Name) @property) (Attribute (AttValue) @string) ;; Delimiters & punctuation [ "<?" "?>" "<!" "]]>" "<" ">" "</" "/>" ] @punctuation.delimiter [ "(" ")" "[" "]" ] @punctuation.bracket [ "\"" "'" ] @punctuation.delimiter [ "," "|" "=" ] @operator ;; Text (CharData) @markup ( element (STag (Name) @_start_tag) (content (CDSect (CData) @injection.content)) (ETag (Name) @_end_tag) (#eq? @_start_tag "Implementation") (#eq? @_end_tag "Implementation") (#set! priority 90) ) ( element (STag (Name) @_start_tag) (content (CharData) @injection.content) (ETag (Name) @_end_tag) (#eq? @_start_tag "Implementation") (#eq? @_end_tag "Implementation") (#set! priority 90) ) (CDSect (CDStart) @markup.heading (CData) @markup.raw "]]>" @markup.heading) ;; Misc (Comment) @comment (ERROR) @error
Step 4: Remove cached data from nvim if necessary (if previously installed)
rm -rf ~/.local/share/nvim/site/parser \ ~/.local/share/nvim/site/parser-info \ ~/.local/share/nvim/site/queries
Step 5: Open Neovim and Install
objectscript_udl,objectscript_routine, andobjectscript:TSInstall objectscript_udl objectscript_routine objectscript
Release files for tree-sitter-objectscript 1.9.19
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| tree_sitter_objectscript-1.9.19.tar.gz | 8.9 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| tree_sitter_objectscript-1.9.19-cp38-abi3-win_arm64.whl | CPython 3.8 | abi3 | Windows ARM64 | Details |
| tree_sitter_objectscript-1.9.19-cp38-abi3-win_amd64.whl | CPython 3.8 | abi3 | Windows x86-64 | Details |
| tree_sitter_objectscript-1.9.19-cp38-abi3-musllinux_1_2_x86_64.whl | CPython 3.8 | abi3 | Linux musl 1.2+ x86-64 | Details |
| tree_sitter_objectscript-1.9.19-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.8 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| tree_sitter_objectscript-1.9.19-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.8 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| tree_sitter_objectscript-1.9.19-cp38-abi3-macosx_11_0_arm64.whl | CPython 3.8 | abi3 | macOS 11.0+ ARM64 | Details |
| tree_sitter_objectscript-1.9.19-cp38-abi3-macosx_10_9_x86_64.whl | CPython 3.8 | abi3 | macOS 10.9+ x86-64 | Details |
Total release size: 27.0 MB
Release files / tree_sitter_objectscript-1.9.19.tar.gz
| Download URL | tree_sitter_objectscript-1.9.19.tar.gz |
|---|---|
| Size | 8.9 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fcf9f460a16044e362b43eef7c0bea4b36c0eb82bbfcaec5895d2a437839ab0b
|
|
BLAKE2b-256 checksum How to use checksums |
f0b590fee4cc968a99439c1287dcb63f46c4d6d25dff2eabd73827bcad0618fb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / tree_sitter_objectscript-1.9.19-cp38-abi3-win_arm64.whl
| Download URL | tree_sitter_objectscript-1.9.19-cp38-abi3-win_arm64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | CPython 3.8 Windows ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
9bed88ce513a35059a6d66c52d3bc0ca7834899bf87b28de8574ad4e4dd45545
|
|
BLAKE2b-256 checksum How to use checksums |
37a7a02e24672996f8d81e0d3e0d38a31fecf63b78fe37fe439fd95928473b3e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / tree_sitter_objectscript-1.9.19-cp38-abi3-win_amd64.whl
| Download URL | tree_sitter_objectscript-1.9.19-cp38-abi3-win_amd64.whl |
|---|---|
| Size | 2.5 MB |
| Tags | CPython 3.8 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
9003dc52009e5c2ac241d4a4fb9098b704e81d7fff66c7397dfaec8cf0bfe1d7
|
|
BLAKE2b-256 checksum How to use checksums |
236ac11e9c966d72c9c80bef38f591cba6a3bcb266bf8dbd419c6420900e1615
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / tree_sitter_objectscript-1.9.19-cp38-abi3-musllinux_1_2_x86_64.whl
| Download URL | tree_sitter_objectscript-1.9.19-cp38-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.8 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
3b97452b16ea2b1c3357f7d33ea43f745b43927de9324b51349f043375a1ec5b
|
|
BLAKE2b-256 checksum How to use checksums |
f31904e98e3954d947980bc0a128b9b9f66ecdcbbf6f0bbca6452fa2e9fc7b38
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / tree_sitter_objectscript-1.9.19-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | tree_sitter_objectscript-1.9.19-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 2.6 MB |
| Tags | CPython 3.8 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
e5b363023cc82eefa04183add7ba2eb64cae2d415bce4d3c2a228d84fd0bae8d
|
|
BLAKE2b-256 checksum How to use checksums |
f5cca7cddaeb7ec6d40afdc880f81bf09e911b1054ea364e8ea945b9025dc6b2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / tree_sitter_objectscript-1.9.19-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | tree_sitter_objectscript-1.9.19-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | CPython 3.8 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
61992e53b4b3990878e9a056bafe5622b18c0596abae6528384a685f2ef159f3
|
|
BLAKE2b-256 checksum How to use checksums |
0fa6e56be4c4483d55170e96f23d275df4812cabf5b30b3c9cd009e4bbc80964
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / tree_sitter_objectscript-1.9.19-cp38-abi3-macosx_11_0_arm64.whl
| Download URL | tree_sitter_objectscript-1.9.19-cp38-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | CPython 3.8 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
68460e2bb6b5c7cbfb1daf4255fcaa366c0790f28d3d00251134ab50fa0d8270
|
|
BLAKE2b-256 checksum How to use checksums |
08b3f03266686ef066c3e4f293136a801f26e654c6072c9688eb6ad0119acaa1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / tree_sitter_objectscript-1.9.19-cp38-abi3-macosx_10_9_x86_64.whl
| Download URL | tree_sitter_objectscript-1.9.19-cp38-abi3-macosx_10_9_x86_64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.8 abi3 macOS 10.9+ x86-64 |
|
SHA-256 checksum How to use checksums |
4ab09b20eeffb08b141b8379db9c932a7ff1b73eba6f849e9135310102bd8bfe
|
|
BLAKE2b-256 checksum How to use checksums |
837cca5be9cb24c0a08670d8632ba070e04f395c49ed4def347b44b658a5c1ef
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|