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.16
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.16.tar.gz | 7.5 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| tree_sitter_objectscript-1.9.16-cp38-abi3-win_arm64.whl | CPython 3.8 | abi3 | Windows ARM64 | Details |
| tree_sitter_objectscript-1.9.16-cp38-abi3-win_amd64.whl | CPython 3.8 | abi3 | Windows x86-64 | Details |
| tree_sitter_objectscript-1.9.16-cp38-abi3-musllinux_1_2_x86_64.whl | CPython 3.8 | abi3 | Linux musl 1.2+ x86-64 | Details |
| tree_sitter_objectscript-1.9.16-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.16-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.8 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| tree_sitter_objectscript-1.9.16-cp38-abi3-macosx_11_0_arm64.whl | CPython 3.8 | abi3 | macOS 11.0+ ARM64 | Details |
| tree_sitter_objectscript-1.9.16-cp38-abi3-macosx_10_9_x86_64.whl | CPython 3.8 | abi3 | macOS 10.9+ x86-64 | Details |
Total release size: 23.1 MB
Release files / tree_sitter_objectscript-1.9.16.tar.gz
| Download URL | tree_sitter_objectscript-1.9.16.tar.gz |
|---|---|
| Size | 7.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cc83f7419c87c714ade609f8b561f0171c92df9b15b344603374315bff0d0e7b
|
|
BLAKE2b-256 checksum How to use checksums |
90177de565a0ab9943cc65ac6b7d0ee473802a10a799d8829e31dee6a1a4193e
|
| 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.16-cp38-abi3-win_arm64.whl
| Download URL | tree_sitter_objectscript-1.9.16-cp38-abi3-win_arm64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.8 Windows ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
e84521f2eed7caa47a3e9e77c2aa29bd878c9c07d9c7db00699d48a329e0fc73
|
|
BLAKE2b-256 checksum How to use checksums |
bb2a4ac6fe0ecb97f273767cb47301cb005f7cb199de4acf75e60c4b6383c306
|
| 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.16-cp38-abi3-win_amd64.whl
| Download URL | tree_sitter_objectscript-1.9.16-cp38-abi3-win_amd64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.8 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
cc04180f4aef7a953852aac6d92e3cdac14e6dc4e38eaf1d69ba30640368f3ba
|
|
BLAKE2b-256 checksum How to use checksums |
67a59a7b95226dc0b0db7083c810ea5b1bb99de432408fcffe60159f1417bb13
|
| 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.16-cp38-abi3-musllinux_1_2_x86_64.whl
| Download URL | tree_sitter_objectscript-1.9.16-cp38-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 2.2 MB |
| Tags | CPython 3.8 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
c8dfb776ce9377757d3322c25984076a3c2a4299cb4a4e688917f254642a2b6a
|
|
BLAKE2b-256 checksum How to use checksums |
dad93ca652a8f065d520e528f4cfe9dd4863abf720398972256c5d8cb4d18a1f
|
| 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.16-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | tree_sitter_objectscript-1.9.16-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 2.3 MB |
| Tags | CPython 3.8 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
740f6c39627db2520f79803f75e63776c39e2a0f9c7679f3c1464495875dfa65
|
|
BLAKE2b-256 checksum How to use checksums |
682ba15798e3d8cbe83319a2c2e566cec7d3392cc9721faf76fc61ad398946a6
|
| 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.16-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | tree_sitter_objectscript-1.9.16-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.8 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
4afada75a9b1620f3b31fa21b15ee04b12bba99e11e667216179539a5420aa08
|
|
BLAKE2b-256 checksum How to use checksums |
8edcdf3e2b6fe967003d487850ea08a3ff4a50a848ea26c1c07d9e141edbbcd4
|
| 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.16-cp38-abi3-macosx_11_0_arm64.whl
| Download URL | tree_sitter_objectscript-1.9.16-cp38-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.8 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
117b454d7d20b52366226ec6d9352d5524cec08ca27024868036e4d0c1705d17
|
|
BLAKE2b-256 checksum How to use checksums |
28c403d0f99356f346ec6c73a4bb93de8680f30172656a35f3d91127a6f8fffb
|
| 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.16-cp38-abi3-macosx_10_9_x86_64.whl
| Download URL | tree_sitter_objectscript-1.9.16-cp38-abi3-macosx_10_9_x86_64.whl |
|---|---|
| Size | 2.1 MB |
| Tags | CPython 3.8 abi3 macOS 10.9+ x86-64 |
|
SHA-256 checksum How to use checksums |
be4b33925de349ebf822a2ecd77812facea6894ba7a6b401052422b9f61fbe6a
|
|
BLAKE2b-256 checksum How to use checksums |
821776ce6c2e5cedce44c85c0158cdb874e58fe0ad78482c9ba1f9256703a6e1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|