diff options
| author | Ruben Beltran del Rio <jj@r.bdr.sh> | 2025-12-14 19:59:18 +0100 |
|---|---|---|
| committer | Ruben Beltran del Rio <jj@r.bdr.sh> | 2025-12-14 19:59:33 +0100 |
| commit | 9b7bda28db0200b628e5f6eb7021a5a717db2e73 (patch) | |
| tree | 2f477b0fe308da3554fbd0ab807c4c4725715311 /bindings/python/tree_sitter_wmap | |
Initial grammar
Diffstat (limited to 'bindings/python/tree_sitter_wmap')
| -rw-r--r-- | bindings/python/tree_sitter_wmap/__init__.py | 43 | ||||
| -rw-r--r-- | bindings/python/tree_sitter_wmap/__init__.pyi | 17 | ||||
| -rw-r--r-- | bindings/python/tree_sitter_wmap/binding.c | 35 | ||||
| -rw-r--r-- | bindings/python/tree_sitter_wmap/py.typed | 0 |
4 files changed, 95 insertions, 0 deletions
diff --git a/bindings/python/tree_sitter_wmap/__init__.py b/bindings/python/tree_sitter_wmap/__init__.py new file mode 100644 index 0000000..fa35926 --- /dev/null +++ b/bindings/python/tree_sitter_wmap/__init__.py @@ -0,0 +1,43 @@ +"""Parser for wmap Formatted Wardley Maps""" + +from importlib.resources import files as _files + +from ._binding import language + + +def _get_query(name, file): + try: + query = _files(f"{__package__}") / file + globals()[name] = query.read_text() + except FileNotFoundError: + globals()[name] = None + return globals()[name] + + +def __getattr__(name): + if name == "HIGHLIGHTS_QUERY": + return _get_query("HIGHLIGHTS_QUERY", "queries/highlights.scm") + if name == "INJECTIONS_QUERY": + return _get_query("INJECTIONS_QUERY", "queries/injections.scm") + if name == "LOCALS_QUERY": + return _get_query("LOCALS_QUERY", "queries/locals.scm") + if name == "TAGS_QUERY": + return _get_query("TAGS_QUERY", "queries/tags.scm") + + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + + +__all__ = [ + "language", + "HIGHLIGHTS_QUERY", + "INJECTIONS_QUERY", + "LOCALS_QUERY", + "TAGS_QUERY", +] + + +def __dir__(): + return sorted(__all__ + [ + "__all__", "__builtins__", "__cached__", "__doc__", "__file__", + "__loader__", "__name__", "__package__", "__path__", "__spec__", + ]) diff --git a/bindings/python/tree_sitter_wmap/__init__.pyi b/bindings/python/tree_sitter_wmap/__init__.pyi new file mode 100644 index 0000000..5c88ff6 --- /dev/null +++ b/bindings/python/tree_sitter_wmap/__init__.pyi @@ -0,0 +1,17 @@ +from typing import Final +from typing_extensions import CapsuleType + +HIGHLIGHTS_QUERY: Final[str] | None +"""The syntax highlighting query for this grammar.""" + +INJECTIONS_QUERY: Final[str] | None +"""The language injection query for this grammar.""" + +LOCALS_QUERY: Final[str] | None +"""The local variable query for this grammar.""" + +TAGS_QUERY: Final[str] | None +"""The symbol tagging query for this grammar.""" + +def language() -> CapsuleType: + """The tree-sitter language function for this grammar.""" diff --git a/bindings/python/tree_sitter_wmap/binding.c b/bindings/python/tree_sitter_wmap/binding.c new file mode 100644 index 0000000..bbc4012 --- /dev/null +++ b/bindings/python/tree_sitter_wmap/binding.c @@ -0,0 +1,35 @@ +#include <Python.h> + +typedef struct TSLanguage TSLanguage; + +TSLanguage *tree_sitter_wmap(void); + +static PyObject* _binding_language(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(args)) { + return PyCapsule_New(tree_sitter_wmap(), "tree_sitter.Language", NULL); +} + +static struct PyModuleDef_Slot slots[] = { +#ifdef Py_GIL_DISABLED + {Py_mod_gil, Py_MOD_GIL_NOT_USED}, +#endif + {0, NULL} +}; + +static PyMethodDef methods[] = { + {"language", _binding_language, METH_NOARGS, + "Get the tree-sitter language for this grammar."}, + {NULL, NULL, 0, NULL} +}; + +static struct PyModuleDef module = { + .m_base = PyModuleDef_HEAD_INIT, + .m_name = "_binding", + .m_doc = NULL, + .m_size = 0, + .m_methods = methods, + .m_slots = slots, +}; + +PyMODINIT_FUNC PyInit__binding(void) { + return PyModuleDef_Init(&module); +} diff --git a/bindings/python/tree_sitter_wmap/py.typed b/bindings/python/tree_sitter_wmap/py.typed new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/bindings/python/tree_sitter_wmap/py.typed |