From c84da13fe109a073df36b977ca2cd4675e1d4eda Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Mon, 29 Apr 2024 14:24:06 +0300 Subject: [PATCH] docs: improve docstrings And use Sphinx to generate HTML docs --- .editorconfig | 17 ++ .github/workflows/docs.yml | 45 ++++ .gitignore | 1 + README.md | 42 +--- docs/_static/favicon.png | Bin 0 -> 2364 bytes docs/_static/logo.png | Bin 0 -> 115131 bytes docs/classes/tree_sitter.Language.rst | 53 +++++ .../classes/tree_sitter.LookaheadIterator.rst | 24 ++ docs/classes/tree_sitter.Node.rst | 65 ++++++ docs/classes/tree_sitter.Parser.rst | 31 +++ docs/classes/tree_sitter.Point.rst | 10 + docs/classes/tree_sitter.Query.rst | 14 ++ docs/classes/tree_sitter.Range.rst | 22 ++ docs/classes/tree_sitter.Tree.rst | 19 ++ docs/classes/tree_sitter.TreeCursor.rst | 33 +++ docs/conf.py | 83 +++++++ docs/index.rst | 44 ++++ pyproject.toml | 6 +- tree_sitter/__init__.py | 6 +- tree_sitter/__init__.pyi | 38 +++- tree_sitter/binding/docs.h | 13 ++ tree_sitter/binding/language.c | 146 +++++++----- tree_sitter/binding/lookahead_iterator.c | 73 +++--- tree_sitter/binding/lookahead_iterator.h | 2 +- .../binding/lookahead_names_iterator.c | 2 +- tree_sitter/binding/node.c | 215 ++++++++++++------ tree_sitter/binding/parser.c | 66 ++++-- tree_sitter/binding/query.c | 28 ++- tree_sitter/binding/range.c | 11 +- tree_sitter/binding/tree.c | 53 +++-- tree_sitter/binding/tree_cursor.c | 180 ++++++++------- tree_sitter/binding/tree_cursor.h | 8 +- tree_sitter/binding/types.h | 1 + 33 files changed, 1014 insertions(+), 337 deletions(-) create mode 100644 .editorconfig create mode 100644 .github/workflows/docs.yml create mode 100644 docs/_static/favicon.png create mode 100644 docs/_static/logo.png create mode 100644 docs/classes/tree_sitter.Language.rst create mode 100644 docs/classes/tree_sitter.LookaheadIterator.rst create mode 100644 docs/classes/tree_sitter.Node.rst create mode 100644 docs/classes/tree_sitter.Parser.rst create mode 100644 docs/classes/tree_sitter.Point.rst create mode 100644 docs/classes/tree_sitter.Query.rst create mode 100644 docs/classes/tree_sitter.Range.rst create mode 100644 docs/classes/tree_sitter.Tree.rst create mode 100644 docs/classes/tree_sitter.TreeCursor.rst create mode 100644 docs/conf.py create mode 100644 docs/index.rst create mode 100644 tree_sitter/binding/docs.h diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..1da747aa --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +indent_size = 2 + +[*.rst] +indent_size = 3 + +[*.{c,h,py}] +indent_size = 4 +max_line_length = 100 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..a2cb7d15 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,45 @@ +name: Docs + +on: + push: + branches: [master] + paths: + - tree_sitter/** + - docs/** + +concurrency: + group: ${{github.workflow}}-${{github.ref}} + cancel-in-progress: true + +permissions: + pages: write + id-token: write + +jobs: + docs: + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{steps.deploy.outputs.page_url}} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: true + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + - name: Install + run: pip install -e .[docs] + env: + CFLAGS: "-O0 -g" + - name: Build docs + run: sphinx-build -M html docs docs/_build + - name: Upload docs artifact + uses: actions/deploy-pages@v3 + with: + path: docs/_build/html + - name: Deploy to GitHub Pages + id: deploy + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 788b80af..22451bfd 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ dist *.so __pycache__ wheelhouse +docs/_build diff --git a/README.md b/README.md index 4683c33c..a8e80624 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [![CI][ci]](https://github.com/tree-sitter/py-tree-sitter/actions/workflows/ci.yml) [![pypi][pypi]](https://pypi.org/project/tree-sitter/) +[![docs][docs]](https://tree-sitter.github.io/py-tree-sitter/) This module provides Python bindings to the [tree-sitter] parsing library. @@ -35,45 +36,7 @@ Then, you can load it as a `Language` object: import tree_sitter_python as tspython from tree_sitter import Language, Parser -PY_LANGUAGE = Language(tspython.language(), "python") -``` - -#### Build from source - -> [!WARNING] -> This method of loading languages is deprecated and will be removed in `v0.22.0`. -> You should only use it if you need languages that have not updated their bindings. -> Keep in mind that you will need a C compiler in this case. - -First you'll need a Tree-sitter language implementation for each language that you want to parse. - -```sh -git clone https://github.com/tree-sitter/tree-sitter-go -git clone https://github.com/tree-sitter/tree-sitter-javascript -git clone https://github.com/tree-sitter/tree-sitter-python -``` - -Use the `Language.build_library` method to compile these into a library that's -usable from Python. This function will return immediately if the library has -already been compiled since the last time its source code was modified: - -```python -from tree_sitter import Language, Parser - -Language.build_library( - # Store the library in the `build` directory - "build/my-languages.so", - # Include one or more languages - ["vendor/tree-sitter-go", "vendor/tree-sitter-javascript", "vendor/tree-sitter-python"], -) -``` - -Load the languages into your app as `Language` objects: - -```python -GO_LANGUAGE = Language("build/my-languages.so", "go") -JS_LANGUAGE = Language("build/my-languages.so", "javascript") -PY_LANGUAGE = Language("build/my-languages.so", "python") +PY_LANGUAGE = Language(tspython.language()) ``` ### Basic parsing @@ -324,5 +287,6 @@ To try out and explore the code referenced in this README, check out [examples/u [tree query]: https://tree-sitter.github.io/tree-sitter/using-parsers#query-syntax [ci]: https://img.shields.io/github/actions/workflow/status/tree-sitter/py-tree-sitter/ci.yml?logo=github&label=CI [pypi]: https://img.shields.io/pypi/v/tree-sitter?logo=pypi&logoColor=ffd242&label=PyPI +[docs]: https://img.shields.io/github/deployments/tree-sitter/py-tree-sitter/github-pages?logo=sphinx&label=Docs [examples/walk_tree.py]: https://github.com/tree-sitter/py-tree-sitter/blob/master/examples/walk_tree.py [examples/usage.py]: https://github.com/tree-sitter/py-tree-sitter/blob/master/examples/usage.py diff --git a/docs/_static/favicon.png b/docs/_static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..945fa841d081ece224a37d1be8777030102e5de0 GIT binary patch literal 2364 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%0A{^ebu>!hTphrZ(gJTkr`637s$j~ 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 c#^&P-)Ql(^r$;Yf2;}>b7FQ6f5itz Node | None: ... - # NOTE: deprecated + @deprecated("Use `str()` instead") def sexp(self) -> str: ... def __repr__(self) -> str: ... @@ -225,7 +226,7 @@ class Node: @final -class Tree: +class Tree(): @property def root_node(self) -> Node: ... @@ -233,6 +234,7 @@ class Tree: def included_ranges(self) -> list[Range]: ... @property + @deprecated("Use `root_node.text` instead") def text(self) -> bytes | None: ... def root_node_with_offset( @@ -254,7 +256,7 @@ class Tree: def walk(self) -> TreeCursor: ... - def changed_ranges(self, old_tree: Tree) -> list[Range]: ... + def changed_ranges(self, new_tree: Tree) -> list[Range]: ... @final @@ -297,8 +299,8 @@ class TreeCursor: @overload def goto_first_child_for_point(self, point: Point, /) -> bool: ... - # NOTE: deprecated @overload + @deprecated("Use `goto_first_child_for_point(point)` instead") def goto_first_child_for_point(self, row: int, column: int, /) -> bool: ... def __copy__(self) -> TreeCursor: ... @@ -320,38 +322,56 @@ class Parser: @language.setter def language(self, language: Language) -> None: ... + @language.deleter + def language(self) -> None: ... + @property def included_ranges(self) -> list[Range]: ... @included_ranges.setter def included_ranges(self, ranges: Sequence[Range]) -> None: ... + @included_ranges.deleter + def included_ranges(self) -> None: ... + @property def timeout_micros(self) -> int: ... @timeout_micros.setter def timeout_micros(self, timeout: int) -> None: ... + @timeout_micros.deleter + def timeout_micros(self) -> None: ... + # TODO(0.24): implement logger + @overload + def parse( + self, + source: ByteString | _ParseCB | None, + /, + old_tree: Tree | None = None, + ) -> Tree: ... + + @overload + @deprecated("`keep_text` will be removed") def parse( self, source: ByteString | _ParseCB | None, /, old_tree: Tree | None = None, - # NOTE: deprecated keep_text: bool = True, ) -> Tree: ... def reset(self) -> None: ... - # NOTE: deprecated + @deprecated("Use the `language` setter instead") def set_language(self, language: Language, /) -> None: ... - # NOTE: deprecated + @deprecated("Use the `included_ranges` setter instead") def set_included_ranges(self, ranges: Sequence[Range], /) -> None: ... - # NOTE: deprecated + @deprecated("Use the `timeout_micros` setter instead") def set_timeout_micros(self, timeout: int, /) -> None: ... @@ -394,7 +414,7 @@ class LookaheadIterator(Iterator[int]): @property def current_symbol_name(self) -> str: ... - # NOTE: deprecated + @deprecated("Use `reset_state()` instead") def reset(self, language: _Ptr, state: int, /) -> None: ... # TODO(0.24): rename to reset diff --git a/tree_sitter/binding/docs.h b/tree_sitter/binding/docs.h new file mode 100644 index 00000000..24dd267e --- /dev/null +++ b/tree_sitter/binding/docs.h @@ -0,0 +1,13 @@ +#pragma once + +#define DOC_ATTENTION "\n\nAttention\n---------\n\n" +#define DOC_CAUTION "\n\nCaution\n-------\n\n" +#define DOC_EXAMPLES "\n\nExamples\n--------\n\n" +#define DOC_IMPORTANT "\n\nImportant\n---------\n\n" +#define DOC_NOTE "\n\nNote\n----\n\n" +#define DOC_PARAMETERS "\n\nParameters\n----------\n\n" +#define DOC_RAISES "\n\Raises\n------\n\n" +#define DOC_RETURNS "\n\nReturns\n-------\n\n" +#define DOC_SEE_ALSO "\n\nSee Also\n--------\n\n" +#define DOC_HINT "\n\nHint\n----\n\n" +#define DOC_TIP "\n\nTip\n---\n\n" diff --git a/tree_sitter/binding/language.c b/tree_sitter/binding/language.c index ae61742d..e74af1a7 100644 --- a/tree_sitter/binding/language.c +++ b/tree_sitter/binding/language.c @@ -32,7 +32,7 @@ TSLanguage *language_check_pointer(void *ptr) { (void)ts_language_version(ptr); } __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { - PyErr_SetString(PyExc_RuntimeError, "Invalid TSLanguage pointer."); + PyErr_SetString(PyExc_RuntimeError, "Invalid TSLanguage pointer"); } return PyErr_Occurred() ? NULL : (TSLanguage *)ptr; } @@ -220,76 +220,112 @@ PyObject *language_query(Language *self, PyObject *args) { return PyObject_CallFunction((PyObject *)state->query_type, "Os#", self, source, length); } +PyDoc_STRVAR(language_node_kind_for_id_doc, + "node_kind_for_id(self, id, /)\n--\n\n" + "Get the name of the node kind for the given numerical id."); +PyDoc_STRVAR(language_id_for_node_kind_doc, "id_for_node_kind(self, kind, named, /)\n--\n\n" + "Get the numerical id for the given node kind."); +PyDoc_STRVAR(language_node_kind_is_named_doc, "node_kind_is_named(self, id, /)\n--\n\n" + "Check if the node type for the given numerical id " + "is named (as opposed to an anonymous node type)."); +PyDoc_STRVAR(language_node_kind_is_visible_doc, + "node_kind_is_visible(self, id, /)\n--\n\n" + "Check if the node type for the given numerical id " + "is visible (as opposed to an auxiliary node type)."); +PyDoc_STRVAR(language_field_name_for_id_doc, "field_name_for_id(self, field_id, /)\n--\n\n" + "Get the field name for the given numerical id."); +PyDoc_STRVAR(language_field_id_for_name_doc, "field_id_for_name(self, name, /)\n--\n\n" + "Get the numerical id for the given field name."); +PyDoc_STRVAR(language_next_state_doc, + "next_state(self, state, id, /)\n--\n\n" + "Get the next parse state." DOC_TIP "Combine this with ``lookahead_iterator`` to " + "generate completion suggestions or valid symbols in error nodes." DOC_EXAMPLES + ">>> state = language.next_state(node.parse_state, node.grammar_id)"); +PyDoc_STRVAR(language_lookahead_iterator_doc, + "lookahead_iterator(self, state, /)\n--\n\n" + "Create a new :class:`LookaheadIterator` for this language and parse state."); +PyDoc_STRVAR( + language_query_doc, + "query(self, source, /)\n--\n\n" + "Create a new :class:`Query` from a string containing one or more S-expression patterns."); + static PyMethodDef language_methods[] = { - {.ml_name = "node_kind_for_id", - .ml_meth = (PyCFunction)language_node_kind_for_id, - .ml_flags = METH_VARARGS, - .ml_doc = "Get the name of the node kind for the given numerical id."}, - {.ml_name = "id_for_node_kind", - .ml_meth = (PyCFunction)language_id_for_node_kind, - .ml_flags = METH_VARARGS, - .ml_doc = "Get the numerical id for the given node kind."}, - {.ml_name = "node_kind_is_named", - .ml_meth = (PyCFunction)language_node_kind_is_named, - .ml_flags = METH_VARARGS, - .ml_doc = "Check if the node type for the given numerical id is named" - " (as opposed to an anonymous node type)."}, - {.ml_name = "node_kind_is_visible", - .ml_meth = (PyCFunction)language_node_kind_is_visible, - .ml_flags = METH_VARARGS, - .ml_doc = "Check if the node type for the given numerical id is visible" - " (as opposed to an auxiliary node type)."}, - {.ml_name = "field_name_for_id", - .ml_meth = (PyCFunction)language_field_name_for_id, - .ml_flags = METH_VARARGS, - .ml_doc = "Get the name of the field for the given numerical id."}, - {.ml_name = "field_id_for_name", - .ml_meth = (PyCFunction)language_field_id_for_name, - .ml_flags = METH_VARARGS, - .ml_doc = "Return the field id for a field name."}, - {.ml_name = "next_state", - .ml_meth = (PyCFunction)language_next_state, - .ml_flags = METH_VARARGS, - .ml_doc = "Get the next parse state. Combine this with `lookahead_iterator` " - "to generate completion suggestions or valid symbols in error nodes."}, - {.ml_name = "lookahead_iterator", - .ml_meth = (PyCFunction)language_lookahead_iterator, - .ml_flags = METH_VARARGS, - .ml_doc = "Create a new lookahead iterator for this language and parse state. " - "Returns `None` if state is invalid for this language.\n\n" - "Iterating `LookaheadIterator` will yield valid symbols in the " - "given parse state. Newly created lookahead iterators will return " - "the `ERROR` symbol from `LookaheadIterator.current_symbol`.\n\n" - "Lookahead iterators can be useful to generate suggestions and improve syntax " - "error diagnostics. To get symbols valid in an `ERROR` node, use the lookahead " - "iterator on its first leaf node state. For `MISSING` nodes, a lookahead " - "iterator created on the previous non-extra leaf node may be appropriate."}, - {.ml_name = "query", - .ml_meth = (PyCFunction)language_query, - .ml_flags = METH_VARARGS, - .ml_doc = "Create a Query with the given source code."}, + { + .ml_name = "node_kind_for_id", + .ml_meth = (PyCFunction)language_node_kind_for_id, + .ml_flags = METH_VARARGS, + .ml_doc = language_node_kind_for_id_doc, + }, + { + .ml_name = "id_for_node_kind", + .ml_meth = (PyCFunction)language_id_for_node_kind, + .ml_flags = METH_VARARGS, + .ml_doc = language_id_for_node_kind_doc, + }, + { + .ml_name = "node_kind_is_named", + .ml_meth = (PyCFunction)language_node_kind_is_named, + .ml_flags = METH_VARARGS, + .ml_doc = language_node_kind_is_named_doc, + }, + { + .ml_name = "node_kind_is_visible", + .ml_meth = (PyCFunction)language_node_kind_is_visible, + .ml_flags = METH_VARARGS, + .ml_doc = language_node_kind_is_visible_doc, + }, + { + .ml_name = "field_name_for_id", + .ml_meth = (PyCFunction)language_field_name_for_id, + .ml_flags = METH_VARARGS, + .ml_doc = language_field_name_for_id_doc, + }, + { + .ml_name = "field_id_for_name", + .ml_meth = (PyCFunction)language_field_id_for_name, + .ml_flags = METH_VARARGS, + .ml_doc = language_field_id_for_name_doc, + }, + { + .ml_name = "next_state", + .ml_meth = (PyCFunction)language_next_state, + .ml_flags = METH_VARARGS, + .ml_doc = language_next_state_doc, + }, + { + .ml_name = "lookahead_iterator", + .ml_meth = (PyCFunction)language_lookahead_iterator, + .ml_flags = METH_VARARGS, + .ml_doc = language_lookahead_iterator_doc, + }, + { + .ml_name = "query", + .ml_meth = (PyCFunction)language_query, + .ml_flags = METH_VARARGS, + .ml_doc = language_query_doc, + }, {NULL}, }; static PyGetSetDef language_accessors[] = { #if HAS_LANGUAGE_NAMES - {"name", (getter)language_get_name, NULL, "The name of the language.", NULL}, + {"name", (getter)language_get_name, NULL, PyDoc_STR("The name of the language."), NULL}, #endif {"version", (getter)language_get_version, NULL, - "Get the ABI version number that indicates which version of " - "the Tree-sitter CLI was used to generate this Language.", + PyDoc_STR("The ABI version number that indicates which version of " + "the Tree-sitter CLI was used to generate this Language."), NULL}, {"node_kind_count", (getter)language_get_node_kind_count, NULL, - "Get the number of distinct node types in this language.", NULL}, + PyDoc_STR("The number of distinct node types in this language."), NULL}, {"parse_state_count", (getter)language_get_parse_state_count, NULL, - "Get the number of valid states in this language.", NULL}, + PyDoc_STR("The number of valid states in this language."), NULL}, {"field_count", (getter)language_get_field_count, NULL, - "Get the number of fields in this language.", NULL}, + PyDoc_STR("The number of distinct field names in this language."), NULL}, {NULL}, }; static PyType_Slot language_type_slots[] = { - {Py_tp_doc, "A tree-sitter language."}, + {Py_tp_doc, PyDoc_STR("A class that defines how to parse a particular language.")}, {Py_tp_init, language_init}, {Py_tp_repr, language_repr}, {Py_tp_hash, language_hash}, diff --git a/tree_sitter/binding/lookahead_iterator.c b/tree_sitter/binding/lookahead_iterator.c index faeae8f1..84fcc2ac 100644 --- a/tree_sitter/binding/lookahead_iterator.c +++ b/tree_sitter/binding/lookahead_iterator.c @@ -97,7 +97,7 @@ PyObject *lookahead_iterator_next(LookaheadIterator *self) { return PyLong_FromUnsignedLong(symbol); } -PyObject *lookahead_iterator_names_iterator(LookaheadIterator *self) { +PyObject *lookahead_iterator_iter_names(LookaheadIterator *self) { ModuleState *state = GET_MODULE_STATE(self); LookaheadNamesIterator *iter = PyObject_New(LookaheadNamesIterator, state->lookahead_names_iterator_type); @@ -108,47 +108,66 @@ PyObject *lookahead_iterator_names_iterator(LookaheadIterator *self) { return PyObject_Init((PyObject *)iter, state->lookahead_names_iterator_type); } -static PyGetSetDef lookahead_iterator_accessors[] = { - {"language", (getter)lookahead_iterator_get_language, NULL, "Get the language.", NULL}, - {"current_symbol", (getter)lookahead_iterator_get_current_symbol, NULL, - "Get the current symbol.", NULL}, - {"current_symbol_name", (getter)lookahead_iterator_get_current_symbol_name, NULL, - "Get the current symbol name.", NULL}, - {NULL}, -}; +PyDoc_STRVAR(lookahead_iterator_reset_doc, + "reset(self, language, state, /)\n--\n\n" + "Reset the lookahead iterator.\n\n" + ".. deprecated:: 0.22.0\n\n Use :meth:`reset_state` instead." DOC_RETURNS + "``True`` if it was reset successfully or ``False`` if it failed."); +PyDoc_STRVAR(lookahead_iterator_reset_state_doc, + "reset_state(self, state, language=None)\n--\n\n" + "Reset the lookahead iterator." DOC_RETURNS + "``True`` if it was reset successfully or ``False`` if it failed."); +PyDoc_STRVAR(lookahead_iterator_iter_names_doc, "iter_names(self, /)\n--\n\n" + "Iterate symbol names."); static PyMethodDef lookahead_iterator_methods[] = { - {.ml_name = "reset", - .ml_meth = (PyCFunction)lookahead_iterator_reset, - .ml_flags = METH_VARARGS, - .ml_doc = "reset(language, state)\n--\n\n\ - Reset the lookahead iterator to a new language and parse state.\n\ - This returns `True` if the language was set successfully, and `False` otherwise."}, - {.ml_name = "reset_state", - .ml_meth = (PyCFunction)lookahead_iterator_reset_state, - .ml_flags = METH_VARARGS | METH_KEYWORDS, - .ml_doc = "reset_state(state, language=None)\n--\n\n\ - Reset the lookahead iterator to a new parse state and optional language.\n\ - This returns `True` if the state was set successfully, and `False` otherwise."}, + { + .ml_name = "reset", + .ml_meth = (PyCFunction)lookahead_iterator_reset, + .ml_flags = METH_VARARGS, + .ml_doc = lookahead_iterator_reset_doc, + }, + { + .ml_name = "reset_state", + .ml_meth = (PyCFunction)lookahead_iterator_reset_state, + .ml_flags = METH_VARARGS | METH_KEYWORDS, + .ml_doc = lookahead_iterator_reset_state_doc, + }, { .ml_name = "iter_names", - .ml_meth = (PyCFunction)lookahead_iterator_names_iterator, + .ml_meth = (PyCFunction)lookahead_iterator_iter_names, .ml_flags = METH_NOARGS, - .ml_doc = "iter_names()\n--\n\n\ - Get an iterator of the names of possible syntax nodes that could come next.", + .ml_doc = lookahead_iterator_iter_names_doc, }, {NULL}, }; +static PyGetSetDef lookahead_iterator_accessors[] = { + {"language", (getter)lookahead_iterator_get_language, NULL, PyDoc_STR("The current language."), + NULL}, + {"current_symbol", (getter)lookahead_iterator_get_current_symbol, NULL, + PyDoc_STR("The current symbol.\n\nNewly created iterators will return the ``ERROR`` symbol."), + NULL}, + {"current_symbol_name", (getter)lookahead_iterator_get_current_symbol_name, NULL, + PyDoc_STR("The current symbol name."), NULL}, + {NULL}, +}; + static PyType_Slot lookahead_iterator_type_slots[] = { - {Py_tp_doc, "An iterator over the possible syntax nodes that could come next."}, + {Py_tp_doc, + PyDoc_STR( + "A class that is used to look up symbols valid in a specific parse state." DOC_TIP + "Lookahead iterators can be useful to generate suggestions and improve syntax error " + "diagnostics.\n\nTo get symbols valid in an ``ERROR`` node, use the lookahead iterator " + "on its first leaf node state.\nFor ``MISSING`` nodes, a lookahead iterator created " + "on the previous non-extra leaf node may be appropriate.")}, {Py_tp_new, NULL}, {Py_tp_dealloc, lookahead_iterator_dealloc}, {Py_tp_repr, lookahead_iterator_repr}, - {Py_tp_getset, lookahead_iterator_accessors}, - {Py_tp_methods, lookahead_iterator_methods}, {Py_tp_iter, lookahead_iterator_iter}, {Py_tp_iternext, lookahead_iterator_next}, + {Py_tp_methods, lookahead_iterator_methods}, + {Py_tp_getset, lookahead_iterator_accessors}, {0, NULL}, }; diff --git a/tree_sitter/binding/lookahead_iterator.h b/tree_sitter/binding/lookahead_iterator.h index e2670f9f..b7509fb9 100644 --- a/tree_sitter/binding/lookahead_iterator.h +++ b/tree_sitter/binding/lookahead_iterator.h @@ -20,4 +20,4 @@ PyObject *lookahead_iterator_iter(LookaheadIterator *self); PyObject *lookahead_iterator_next(LookaheadIterator *self); -PyObject *lookahead_iterator_names_iterator(LookaheadIterator *self); +PyObject *lookahead_iterator_iter_names(LookaheadIterator *self); diff --git a/tree_sitter/binding/lookahead_names_iterator.c b/tree_sitter/binding/lookahead_names_iterator.c index d83d3683..8d3b95df 100644 --- a/tree_sitter/binding/lookahead_names_iterator.c +++ b/tree_sitter/binding/lookahead_names_iterator.c @@ -23,7 +23,7 @@ PyObject *lookahead_names_iterator_next(LookaheadNamesIterator *self) { } static PyType_Slot lookahead_names_iterator_type_slots[] = { - {Py_tp_doc, "An iterator over the possible syntax nodes that could come next."}, + {Py_tp_doc, PyDoc_STR("An iterator over the names of syntax nodes that could come next.")}, {Py_tp_new, NULL}, {Py_tp_dealloc, lookahead_names_iterator_dealloc}, {Py_tp_repr, lookahead_names_iterator_repr}, diff --git a/tree_sitter/binding/node.c b/tree_sitter/binding/node.c index bc2e1c75..0e5d5328 100644 --- a/tree_sitter/binding/node.c +++ b/tree_sitter/binding/node.c @@ -553,156 +553,237 @@ Py_hash_t node_hash(Node *self) { return id == tree ? id : id ^ tree; } +PyDoc_STRVAR(node_walk_doc, "walk(self, /)\n--\n\n" + "Create a new :class:`TreeCursor` starting from this node."); +PyDoc_STRVAR(node_edit_doc, + "edit(self, /, start_byte, old_end_byte, new_end_byte, start_point, " + "old_end_point, new_end_point)\n--\n\n" + "Edit this node to keep it in-sync with source code that has been edited." DOC_NOTE + "This method is only rarely needed. When you edit a syntax tree via " + ":meth:`Tree.edit`, all of the nodes that you retrieve from the tree afterwards " + "will already reflect the edit. You only need to use this when you have a specific " + ":class:`Node` instance that you want to keep and continue to use after an edit."); +PyDoc_STRVAR(node_sexp_doc, "sexp(self, /)\n--\n\n" + "Get an S-expression representing the node.\n\n" + ".. deprecated:: 0.22.0\n\n Use :obj:`str` instead."); +PyDoc_STRVAR(node_child_doc, + "child(self, index, /)\n--\n\n" + "Get this node's child at the given index, where ``0`` represents the first " + "child." DOC_CAUTION "This method is fairly fast, but its cost is technically " + "``log(i)``, so if you might be iterating over a long list of children, " + "you should use :attr:`children` or :meth:`walk` instead."); +PyDoc_STRVAR(node_named_child_doc, + "named_child(self, index, /)\n--\n\n" + "Get this node's *named* child at the given index, where ``0`` represents the first " + "child." DOC_CAUTION "This method is fairly fast, but its cost is technically " + "``log(i)``, so if you might be iterating over a long list of children, " + "you should use :attr:`children` or :meth:`walk` instead."); +PyDoc_STRVAR(node_child_by_field_id_doc, + "child_by_field_id(self, id, /)\n--\n\n" + "Get the first child with the given numerical field id." DOC_HINT + "You can convert a field name to an id using :meth:`Language.field_id_for_name`." + DOC_SEE_ALSO ":meth:`child_by_field_name`"); +PyDoc_STRVAR(node_children_by_field_id_doc, + "children_by_field_id(self, id, /)\n--\n\n" + "Get a list of children with the given numerical field id." + DOC_SEE_ALSO ":meth:`children_by_field_name`" ); +PyDoc_STRVAR(node_child_by_field_name_doc, "child_by_field_name(self, name, /)\n--\n\n" + "Get the first child with the given field name."); +PyDoc_STRVAR(node_children_by_field_name_doc, "children_by_field_name(self, name, /)\n--\n\n" + "Get a list of children with the given field name."); +PyDoc_STRVAR(node_field_name_for_child_doc, + "field_name_for_child(self, child_index, /)\n--\n\n" + "Get the field name of this node's child at the given index."); +PyDoc_STRVAR(node_descendant_for_byte_range_doc, + "descendant_for_byte_range(self, start_byte, end_byte, /)\n--\n\n" + "Get the smallest node within this node that spans the given byte range."); +PyDoc_STRVAR(node_named_descendant_for_byte_range_doc, + "named_descendant_for_byte_range(self, start_byte, end_byte, /)\n--\n\n" + "Get the smallest *named* node within this node that spans the given byte range."); +PyDoc_STRVAR(node_descendant_for_point_range_doc, + "descendant_for_point_range(self, start_point, end_point, /)\n--\n\n" + "Get the smallest node within this node that spans the given point range."); +PyDoc_STRVAR(node_named_descendant_for_point_range_doc, + "named_descendant_for_point_range(self, start_point, end_point, /)\n--\n\n" + "Get the smallest *named* node within this node that spans the given point range."); + static PyMethodDef node_methods[] = { { .ml_name = "walk", .ml_meth = (PyCFunction)node_walk, .ml_flags = METH_NOARGS, - .ml_doc = "walk()\n--\n\n\ - Get a tree cursor for walking the tree starting at this node.", + .ml_doc = node_walk_doc, }, { .ml_name = "edit", .ml_meth = (PyCFunction)node_edit, .ml_flags = METH_VARARGS | METH_KEYWORDS, - .ml_doc = - "edit(start_byte, old_end_byte, new_end_byte, start_point, old_end_point, new_end_point)\n--\n\n\ - Edit this node to keep it in-sync with source code that has been edited.", + .ml_doc = node_edit_doc, }, { .ml_name = "sexp", .ml_meth = (PyCFunction)node_sexp, .ml_flags = METH_NOARGS, - .ml_doc = "sexp()\n--\n\n\ - Get an S-expression representing the node.", + .ml_doc = node_sexp_doc, }, { .ml_name = "child", .ml_meth = (PyCFunction)node_child, .ml_flags = METH_VARARGS, - .ml_doc = "child(index)\n--\n\n\ - Get child at the given index.", + .ml_doc = node_child_doc, }, { .ml_name = "named_child", .ml_meth = (PyCFunction)node_named_child, .ml_flags = METH_VARARGS, - .ml_doc = "named_child(index)\n--\n\n\ - Get named child by index.", + .ml_doc = node_named_child_doc, }, { .ml_name = "child_by_field_id", .ml_meth = (PyCFunction)node_child_by_field_id, .ml_flags = METH_VARARGS, - .ml_doc = "child_by_field_id(id)\n--\n\n\ - Get child for the given field id.", + .ml_doc = node_child_by_field_id_doc, }, { .ml_name = "child_by_field_name", .ml_meth = (PyCFunction)node_child_by_field_name, .ml_flags = METH_VARARGS, - .ml_doc = "child_by_field_name(name)\n--\n\n\ - Get child for the given field name.", + .ml_doc = node_child_by_field_name_doc, }, { .ml_name = "children_by_field_id", .ml_meth = (PyCFunction)node_children_by_field_id, .ml_flags = METH_VARARGS, - .ml_doc = "children_by_field_id(id)\n--\n\n\ - Get a list of child nodes for the given field id.", + .ml_doc = node_children_by_field_id_doc, }, { .ml_name = "children_by_field_name", .ml_meth = (PyCFunction)node_children_by_field_name, .ml_flags = METH_VARARGS, - .ml_doc = "children_by_field_name(name)\n--\n\n\ - Get a list of child nodes for the given field name.", + .ml_doc = node_children_by_field_name_doc, + }, + { + .ml_name = "field_name_for_child", + .ml_meth = (PyCFunction)node_field_name_for_child, + .ml_flags = METH_VARARGS, + .ml_doc = node_field_name_for_child_doc, }, - {.ml_name = "field_name_for_child", - .ml_meth = (PyCFunction)node_field_name_for_child, - .ml_flags = METH_VARARGS, - .ml_doc = "field_name_for_child(index)\n-\n\n\ - Get the field name of a child node by the index of child."}, { .ml_name = "descendant_for_byte_range", .ml_meth = (PyCFunction)node_descendant_for_byte_range, .ml_flags = METH_VARARGS, - .ml_doc = "descendant_for_byte_range(start_byte, end_byte)\n--\n\n\ - Get the smallest node within this node that spans the given byte range.", + .ml_doc = node_descendant_for_byte_range_doc, }, { .ml_name = "named_descendant_for_byte_range", .ml_meth = (PyCFunction)node_named_descendant_for_byte_range, .ml_flags = METH_VARARGS, - .ml_doc = "named_descendant_for_byte_range(start_byte, end_byte)\n--\n\n\ - Get the smallest named node within this node that spans the given byte range.", + .ml_doc = node_named_descendant_for_byte_range_doc, }, { .ml_name = "descendant_for_point_range", .ml_meth = (PyCFunction)node_descendant_for_point_range, .ml_flags = METH_VARARGS, - .ml_doc = "descendant_for_point_range(start_point, end_point)\n--\n\n\ - Get the smallest node within this node that spans the given point range.", + .ml_doc = node_descendant_for_point_range_doc, }, { .ml_name = "named_descendant_for_point_range", .ml_meth = (PyCFunction)node_named_descendant_for_point_range, .ml_flags = METH_VARARGS, - .ml_doc = "named_descendant_for_point_range(start_point, end_point)\n--\n\n\ - Get the smallest named node within this node that spans the given point range.", + .ml_doc = node_named_descendant_for_point_range_doc, }, {NULL}, }; static PyGetSetDef node_accessors[] = { - {"id", (getter)node_get_id, NULL, "The node's numeric id", NULL}, - {"kind_id", (getter)node_get_kind_id, NULL, "The node's type as a numerical id", NULL}, - {"grammar_id", (getter)node_get_grammar_id, NULL, "The node's grammar type as a numerical id", + {"id", (getter)node_get_id, NULL, + PyDoc_STR("This node's numerical id." DOC_NOTE + "Within a given syntax tree, no two nodes have the same id. However, if a new tree " + "is created based on an older tree, and a node from the old tree is reused in the " + "process, then that node will have the same id in both trees."), + NULL}, + {"kind_id", (getter)node_get_kind_id, NULL, PyDoc_STR("This node's type as a numerical id."), + NULL}, + {"grammar_id", (getter)node_get_grammar_id, NULL, + PyDoc_STR("This node's type as a numerical id as it appears in the grammar ignoring aliases."), + NULL}, + {"grammar_name", (getter)node_get_grammar_name, NULL, + PyDoc_STR("This node's symbol name as it appears in the grammar ignoring aliases."), NULL}, + {"type", (getter)node_get_type, NULL, PyDoc_STR("This node's type as a string."), NULL}, + {"is_named", (getter)node_get_is_named, NULL, + PyDoc_STR("Check if this node is _named_.\n\nNamed nodes correspond to named rules in the " + "grammar, whereas *anonymous* nodes correspond to string literals in the grammar."), NULL}, - {"grammar_name", (getter)node_get_grammar_name, NULL, "The node's grammar name as a string", + {"is_extra", (getter)node_get_is_extra, NULL, + PyDoc_STR("Check if this node is _extra_.\n\nExtra nodes represent things which are not " + "required the grammar but can appear anywhere (e.g. whitespace)."), NULL}, - {"type", (getter)node_get_type, NULL, "The node's type", NULL}, - {"is_named", (getter)node_get_is_named, NULL, "Is this a named node", NULL}, - {"is_extra", (getter)node_get_is_extra, NULL, "Is this an extra node", NULL}, {"has_changes", (getter)node_get_has_changes, NULL, - "Does this node have text changes since it was parsed", NULL}, - {"has_error", (getter)node_get_has_error, NULL, "Does this node contain any errors", NULL}, - {"is_error", (getter)node_get_is_error, NULL, "Is this node an error", NULL}, - {"parse_state", (getter)node_get_parse_state, NULL, "The node's parse state", NULL}, + PyDoc_STR("Check if this node has been edited."), NULL}, + {"has_error", (getter)node_get_has_error, NULL, + PyDoc_STR("Check if this node represents a syntax error or contains any syntax errors " + "anywhere within it."), + NULL}, + {"is_error", (getter)node_get_is_error, NULL, + PyDoc_STR("Check if this node represents a syntax error.\n\nSyntax errors represent parts of " + "the code that could not be incorporated into a valid syntax tree."), + NULL}, + {"parse_state", (getter)node_get_parse_state, NULL, PyDoc_STR("This node's parse state."), + NULL}, {"next_parse_state", (getter)node_get_next_parse_state, NULL, - "The parse state after this node's", NULL}, - {"is_missing", (getter)node_get_is_missing, NULL, "Is this a node inserted by the parser", + PyDoc_STR("The parse state after this node."), NULL}, + {"is_missing", (getter)node_get_is_missing, NULL, + PyDoc_STR("Check if this node is _missing_.\n\nMissing nodes are inserted by the parser in " + "order to recover from certain kinds of syntax errors."), NULL}, - {"start_byte", (getter)node_get_start_byte, NULL, "The node's start byte", NULL}, - {"end_byte", (getter)node_get_end_byte, NULL, "The node's end byte", NULL}, - {"byte_range", (getter)node_get_byte_range, NULL, "The node's byte range", NULL}, - {"range", (getter)node_get_range, NULL, "The node's range", NULL}, - {"start_point", (getter)node_get_start_point, NULL, "The node's start point", NULL}, - {"end_point", (getter)node_get_end_point, NULL, "The node's end point", NULL}, - {"children", (getter)node_get_children, NULL, "The node's children", NULL}, - {"child_count", (getter)node_get_child_count, NULL, "The number of children for a node", NULL}, - {"named_children", (getter)node_get_named_children, NULL, "The node's named children", NULL}, + {"start_byte", (getter)node_get_start_byte, NULL, + PyDoc_STR("The byte offset where this node starts."), NULL}, + {"end_byte", (getter)node_get_end_byte, NULL, + PyDoc_STR("The byte offset where this node ends."), NULL}, + {"byte_range", (getter)node_get_byte_range, NULL, + PyDoc_STR("The byte range of source code that this node represents, in terms of bytes."), + NULL}, + {"range", (getter)node_get_range, NULL, + PyDoc_STR("The range of source code that this node represents."), NULL}, + {"start_point", (getter)node_get_start_point, NULL, PyDoc_STR("This node's start point"), NULL}, + {"end_point", (getter)node_get_end_point, NULL, PyDoc_STR("This node's end point."), NULL}, + {"children", (getter)node_get_children, NULL, + PyDoc_STR("This node's children." DOC_NOTE + "If you're walking the tree recursively, you may want to use :meth:`walk` instead."), + NULL}, + {"child_count", (getter)node_get_child_count, NULL, + PyDoc_STR("This node's number of children."), NULL}, + {"named_children", (getter)node_get_named_children, NULL, + PyDoc_STR("This node's _named_ children."), NULL}, {"named_child_count", (getter)node_get_named_child_count, NULL, - "The number of named children for a node", NULL}, - {"parent", (getter)node_get_parent, NULL, "The node's parent", NULL}, - {"next_sibling", (getter)node_get_next_sibling, NULL, "The node's next sibling", NULL}, - {"prev_sibling", (getter)node_get_prev_sibling, NULL, "The node's previous sibling", NULL}, + PyDoc_STR("This node's number of _named_ children."), NULL}, + {"parent", (getter)node_get_parent, NULL, PyDoc_STR("This node's immediate parent."), NULL}, + {"next_sibling", (getter)node_get_next_sibling, NULL, PyDoc_STR("This node's next sibling."), + NULL}, + {"prev_sibling", (getter)node_get_prev_sibling, NULL, + PyDoc_STR("This node's previous sibling."), NULL}, {"next_named_sibling", (getter)node_get_next_named_sibling, NULL, - "The node's next named sibling", NULL}, + PyDoc_STR("This node's next named sibling."), NULL}, {"prev_named_sibling", (getter)node_get_prev_named_sibling, NULL, - "The node's previous named sibling", NULL}, + PyDoc_STR("This node's previous named sibling."), NULL}, {"descendant_count", (getter)node_get_descendant_count, NULL, - "The number of descendants for a node, including itself", NULL}, - {"text", (getter)node_get_text, NULL, "The node's text, if tree has not been edited", NULL}, + PyDoc_STR("This node's number of descendants, including the node itself."), NULL}, + {"text", (getter)node_get_text, NULL, + PyDoc_STR("The text of the node, if the tree has not been edited"), NULL}, {NULL}, }; static PyType_Slot node_type_slots[] = { - {Py_tp_doc, "A syntax node"}, {Py_tp_new, NULL}, - {Py_tp_dealloc, node_dealloc}, {Py_tp_repr, node_repr}, - {Py_tp_str, node_str}, {Py_tp_richcompare, node_compare}, - {Py_tp_hash, node_hash}, {Py_tp_methods, node_methods}, - {Py_tp_getset, node_accessors}, {0, NULL}, + {Py_tp_doc, PyDoc_STR("A single node within a syntax ``Tree``.")}, + {Py_tp_new, NULL}, + {Py_tp_dealloc, node_dealloc}, + {Py_tp_repr, node_repr}, + {Py_tp_str, node_str}, + {Py_tp_richcompare, node_compare}, + {Py_tp_hash, node_hash}, + {Py_tp_methods, node_methods}, + {Py_tp_getset, node_accessors}, + {0, NULL}, }; PyType_Spec node_type_spec = { diff --git a/tree_sitter/binding/parser.c b/tree_sitter/binding/parser.c index 6966dd86..ce47f280 100644 --- a/tree_sitter/binding/parser.c +++ b/tree_sitter/binding/parser.c @@ -335,58 +335,82 @@ PyObject *parser_set_language_old(Parser *self, PyObject *arg) { Py_RETURN_NONE; } -static PyGetSetDef parser_accessors[] = { - {"language", (getter)parser_get_language, (setter)parser_set_language, - "The parser's current language.", NULL}, - {"included_ranges", (getter)parser_get_included_ranges, (setter)parser_set_included_ranges, - "The ranges of text that the parser should include when parsing.", NULL}, - {"timeout_micros", (getter)parser_get_timeout_micros, (setter)parser_set_timeout_micros, - "The duration in microseconds that parsing is allowed to take.", NULL}, - {NULL}, -}; +PyDoc_STRVAR( + parser_parse_doc, + "parse(self, source, /, old_tree=None, keep_text=True)\n--\n\n" + "Parse a slice of a bytestring or bytes provided in chunks by a callback.\n\n" + "The callback function takes a byte offset and position and returns a bytestring starting " + "at that offset and position. The slices can be of any length. If the given position " + "is at the end of the text, the callback should return an empty slice." DOC_RETURNS + "A :class:`Tree` if parsing succeeded or ``None`` if the parser does not have an " + "assigned language or the timeout expired."); +PyDoc_STRVAR( + parser_reset_doc, + "reset(self, /)\n--\n\n" + "Instruct the parser to start the next parse from the beginning." DOC_NOTE + "If the parser previously failed because of a timeout, then by default, it will resume where " + "it left off on the next call to :meth:`parse`.\nIf you don't want to resume, and instead " + "intend to use this parser to parse some other document, you must call :meth:`reset` first."); +PyDoc_STRVAR(parser_set_language_doc, + "set_language(self, language, /)\n--\n\n" + "Set the language that will be used for parsing.\n\n" + ".. deprecated:: 0.22.0\n\n Use the :attr:`language` setter instead."); +PyDoc_STRVAR(parser_set_included_ranges_doc, + "set_included_ranges(self, ranges, /)\n--\n\n" + "Set the ranges of text that the parser will include when parsing.\n\n" + ".. deprecated:: 0.22.0\n\n Use the :attr:`included_ranges` setter instead."); +PyDoc_STRVAR(parser_set_timeout_micros_doc, + "set_timeout_micros(self, timeout, /)\n--\n\n" + "Set the duration in microseconds that parsing is allowed to take.\n\n" + ".. deprecated:: 0.22.0\n\n Use the :attr:`timeout_micros` setter instead."); static PyMethodDef parser_methods[] = { { .ml_name = "parse", .ml_meth = (PyCFunction)parser_parse, .ml_flags = METH_VARARGS | METH_KEYWORDS, - .ml_doc = "parse(bytes, old_tree=None, keep_text=True)\n--\n\n\ - Parse source code, creating a syntax tree.", + .ml_doc = parser_parse_doc, }, { .ml_name = "reset", .ml_meth = (PyCFunction)parser_reset, .ml_flags = METH_NOARGS, - .ml_doc = "reset()\n--\n\n\ - Instruct the parser to start the next parse from the beginning.", + .ml_doc = parser_reset_doc, }, { .ml_name = "set_timeout_micros", .ml_meth = (PyCFunction)parser_set_timeout_micros_old, .ml_flags = METH_O, - .ml_doc = "set_timeout_micros(timeout_micros)\n--\n\n\ - Set the maximum duration in microseconds that parsing should be allowed to\ - take before halting.", + .ml_doc = parser_set_timeout_micros_doc, }, { .ml_name = "set_included_ranges", .ml_meth = (PyCFunction)parser_set_included_ranges_old, .ml_flags = METH_O, - .ml_doc = "set_included_ranges(ranges)\n--\n\n\ - Set the ranges of text that the parser should include when parsing.", + .ml_doc = parser_set_included_ranges_doc, }, { .ml_name = "set_language", .ml_meth = (PyCFunction)parser_set_language_old, .ml_flags = METH_O, - .ml_doc = "set_language(language)\n--\n\n\ - Set the parser language.", + .ml_doc = parser_set_language_doc, }, {NULL}, }; +static PyGetSetDef parser_accessors[] = { + {"language", (getter)parser_get_language, (setter)parser_set_language, + PyDoc_STR("The language that will be used for parsing."), NULL}, + {"included_ranges", (getter)parser_get_included_ranges, (setter)parser_set_included_ranges, + PyDoc_STR("The ranges of text that the parser will include when parsing."), NULL}, + {"timeout_micros", (getter)parser_get_timeout_micros, (setter)parser_set_timeout_micros, + PyDoc_STR("The duration in microseconds that parsing is allowed to take."), NULL}, + {NULL}, +}; + static PyType_Slot parser_type_slots[] = { - {Py_tp_doc, "A parser"}, + {Py_tp_doc, + PyDoc_STR("A class that is used to produce a :class:`Tree` based on some source code.")}, {Py_tp_new, parser_new}, {Py_tp_init, parser_init}, {Py_tp_dealloc, parser_dealloc}, diff --git a/tree_sitter/binding/query.c b/tree_sitter/binding/query.c index 47b3a80c..89b39aae 100644 --- a/tree_sitter/binding/query.c +++ b/tree_sitter/binding/query.c @@ -622,24 +622,36 @@ PyObject *query_captures(Query *self, PyObject *args, PyObject *kwargs) { return NULL; } +#define QUERY_METHOD_SIGNATURE \ + "(self, node, *, start_point=None, end_point=None, start_byte=None, end_byte=None)\n--\n\n" + +PyDoc_STRVAR(query_matches_doc, + "matches" QUERY_METHOD_SIGNATURE "Get a list of *matches* within the given node.\n\n" + "You can optionally limit the matches to a range of row/column points or of bytes."); +PyDoc_STRVAR( + query_captures_doc, + "captures" QUERY_METHOD_SIGNATURE "Get a list of *captures* within the given node.\n\n" + "You can optionally limit the captures to a range of row/column points or of bytes." DOC_HINT + "This method returns all of the captures while :meth:`matches` only returns the last match."); + static PyMethodDef query_methods[] = { - {.ml_name = "matches", - .ml_meth = (PyCFunction)query_matches, - .ml_flags = METH_KEYWORDS | METH_VARARGS, - .ml_doc = "matches(node)\n--\n\n\ - Get a list of all of the matches within the given node."}, + { + .ml_name = "matches", + .ml_meth = (PyCFunction)query_matches, + .ml_flags = METH_KEYWORDS | METH_VARARGS, + .ml_doc = query_matches_doc, + }, { .ml_name = "captures", .ml_meth = (PyCFunction)query_captures, .ml_flags = METH_KEYWORDS | METH_VARARGS, - .ml_doc = "captures(node)\n--\n\n\ - Get a list of all of the captures within the given node.", + .ml_doc = query_captures_doc, }, {NULL}, }; static PyType_Slot query_type_slots[] = { - {Py_tp_doc, "A set of patterns to search for in a syntax tree."}, + {Py_tp_doc, PyDoc_STR("A set of patterns that match nodes in a syntax tree.")}, {Py_tp_new, query_new}, {Py_tp_dealloc, query_dealloc}, {Py_tp_methods, query_methods}, diff --git a/tree_sitter/binding/range.c b/tree_sitter/binding/range.c index 168afb55..fc52fb2b 100644 --- a/tree_sitter/binding/range.c +++ b/tree_sitter/binding/range.c @@ -81,15 +81,16 @@ PyObject *range_get_end_byte(Range *self, void *Py_UNUSED(payload)) { } static PyGetSetDef range_accessors[] = { - {"start_point", (getter)range_get_start_point, NULL, "The start point of this range", NULL}, - {"start_byte", (getter)range_get_start_byte, NULL, "The start byte of this range", NULL}, - {"end_point", (getter)range_get_end_point, NULL, "The end point of this range", NULL}, - {"end_byte", (getter)range_get_end_byte, NULL, "The end byte of this range", NULL}, + {"start_point", (getter)range_get_start_point, NULL, PyDoc_STR("The start point."), NULL}, + {"start_byte", (getter)range_get_start_byte, NULL, PyDoc_STR("The start byte."), NULL}, + {"end_point", (getter)range_get_end_point, NULL, PyDoc_STR("The end point."), NULL}, + {"end_byte", (getter)range_get_end_byte, NULL, PyDoc_STR("The end byte."), NULL}, {NULL}, }; static PyType_Slot range_type_slots[] = { - {Py_tp_doc, "A range within a document."}, + {Py_tp_doc, PyDoc_STR("A range of positions in a multi-line text document, " + "both in terms of bytes and of rows and columns.")}, {Py_tp_init, range_init}, {Py_tp_dealloc, range_dealloc}, {Py_tp_repr, range_repr}, diff --git a/tree_sitter/binding/tree.c b/tree_sitter/binding/tree.c index d53edd54..97e1943b 100644 --- a/tree_sitter/binding/tree.c +++ b/tree_sitter/binding/tree.c @@ -134,51 +134,74 @@ PyObject *tree_get_included_ranges(Tree *self, PyObject *Py_UNUSED(args)) { return result; } +PyDoc_STRVAR(tree_root_node_with_offset_doc, + "root_node_with_offset(self, offset_bytes, offset_extent, /)\n--\n\n" + "Get the root node of the syntax tree, but with its position shifted " + "forward by the given offset."); +PyDoc_STRVAR(tree_walk_doc, "walk(self, /)\n--\n\n" + "Create a new :class:`TreeCursor` starting from the root of the tree."); +PyDoc_STRVAR(tree_edit_doc, + "edit(self, start_byte, old_end_byte, new_end_byte, start_point, old_end_point, " + "new_end_point)\n--\n\n" + "Edit the syntax tree to keep it in sync with source code that has been edited.\n\n" + "You must describe the edit both in terms of byte offsets and of row/column points."); +PyDoc_STRVAR( + tree_changed_ranges_doc, + "changed_ranges(self, /, new_tree)\n--\n\n" + "Compare this old edited syntax tree to a new syntax tree representing the same document, " + "returning a sequence of ranges whose syntactic structure has changed." DOC_TIP + "For this to work correctly, this syntax tree must have been edited such that its " + "ranges match up to the new tree.\n\nGenerally, you'll want to call this method " + "right after calling the :meth:`Parser.parse` method. Call it on the old tree that " + "was passed to the method, and pass the new tree that was returned from it."); + static PyMethodDef tree_methods[] = { { .ml_name = "root_node_with_offset", .ml_meth = (PyCFunction)tree_root_node_with_offset, .ml_flags = METH_VARARGS, - .ml_doc = "root_node_with_offset(offset_bytes, offset_extent)\n--\n\n\ - Get the root node of the syntax tree, but with its position shifted forward by the given offset.", + .ml_doc = tree_root_node_with_offset_doc, }, { .ml_name = "walk", .ml_meth = (PyCFunction)tree_walk, .ml_flags = METH_NOARGS, - .ml_doc = "walk()\n--\n\n\ - Get a tree cursor for walking this tree.", + .ml_doc = tree_walk_doc, }, { .ml_name = "edit", .ml_meth = (PyCFunction)tree_edit, .ml_flags = METH_KEYWORDS | METH_VARARGS, - .ml_doc = "edit(start_byte, old_end_byte, new_end_byte,\ - start_point, old_end_point, new_end_point)\n--\n\n\ - Edit the syntax tree.", + .ml_doc = tree_edit_doc, }, { .ml_name = "changed_ranges", .ml_meth = (PyCFunction)tree_changed_ranges, .ml_flags = METH_KEYWORDS | METH_VARARGS, - .ml_doc = "changed_ranges(new_tree)\n--\n\n\ - Compare old edited tree to new tree and return changed ranges.", + .ml_doc = tree_changed_ranges_doc, }, {NULL}, }; static PyGetSetDef tree_accessors[] = { - {"root_node", (getter)tree_get_root_node, NULL, "The root node of this tree.", NULL}, - {"text", (getter)tree_get_text, NULL, "The source text for this tree, if unedited.", NULL}, + {"root_node", (getter)tree_get_root_node, NULL, PyDoc_STR("The root node of the syntax tree."), + NULL}, + {"text", (getter)tree_get_text, NULL, + PyDoc_STR("The source text of this tree, if unedited.\n\n" + ".. deprecated:: 0.22.0\n Use ``root_node.text`` instead."), + NULL}, {"included_ranges", (getter)tree_get_included_ranges, NULL, - "Get the included ranges that were used to parse the syntax tree.", NULL}, + PyDoc_STR("The included ranges that were used to parse the syntax tree."), NULL}, {NULL}, }; static PyType_Slot tree_type_slots[] = { - {Py_tp_doc, "A syntax tree"}, {Py_tp_new, NULL}, - {Py_tp_dealloc, tree_dealloc}, {Py_tp_methods, tree_methods}, - {Py_tp_getset, tree_accessors}, {0, NULL}, + {Py_tp_doc, PyDoc_STR("A tree that represents the syntactic structure of a source code file.")}, + {Py_tp_new, NULL}, + {Py_tp_dealloc, tree_dealloc}, + {Py_tp_methods, tree_methods}, + {Py_tp_getset, tree_accessors}, + {0, NULL}, }; PyType_Spec tree_type_spec = { diff --git a/tree_sitter/binding/tree_cursor.c b/tree_sitter/binding/tree_cursor.c index c6e6095c..f2f93883 100644 --- a/tree_sitter/binding/tree_cursor.c +++ b/tree_sitter/binding/tree_cursor.c @@ -22,7 +22,7 @@ PyObject *tree_cursor_get_node(TreeCursor *self, void *Py_UNUSED(payload)) { return self->node; } -PyObject *tree_cursor_get_current_field_id(TreeCursor *self, void *Py_UNUSED(payload)) { +PyObject *tree_cursor_get_field_id(TreeCursor *self, void *Py_UNUSED(payload)) { TSFieldId field_id = ts_tree_cursor_current_field_id(&self->cursor); if (field_id == 0) { Py_RETURN_NONE; @@ -30,7 +30,7 @@ PyObject *tree_cursor_get_current_field_id(TreeCursor *self, void *Py_UNUSED(pay return PyLong_FromUnsignedLong(field_id); } -PyObject *tree_cursor_get_current_field_name(TreeCursor *self, void *Py_UNUSED(payload)) { +PyObject *tree_cursor_get_field_name(TreeCursor *self, void *Py_UNUSED(payload)) { const char *field_name = ts_tree_cursor_current_field_name(&self->cursor); if (field_name == NULL) { Py_RETURN_NONE; @@ -38,12 +38,12 @@ PyObject *tree_cursor_get_current_field_name(TreeCursor *self, void *Py_UNUSED(p return PyUnicode_FromString(field_name); } -PyObject *tree_cursor_get_current_depth(TreeCursor *self, void *Py_UNUSED(args)) { +PyObject *tree_cursor_get_depth(TreeCursor *self, void *Py_UNUSED(args)) { uint32_t depth = ts_tree_cursor_current_depth(&self->cursor); return PyLong_FromUnsignedLong(depth); } -PyObject *tree_cursor_get_current_descendant_index(TreeCursor *self, void *Py_UNUSED(payload)) { +PyObject *tree_cursor_get_descendant_index(TreeCursor *self, void *Py_UNUSED(payload)) { uint32_t index = ts_tree_cursor_current_descendant_index(&self->cursor); return PyLong_FromUnsignedLong(index); } @@ -109,7 +109,7 @@ PyObject *tree_cursor_goto_first_child_for_byte(TreeCursor *self, PyObject *args if (!PyArg_ParseTuple(args, "I:goto_first_child_for_byte", &byte)) { return NULL; } - bool result = ts_tree_cursor_goto_first_child_for_byte(&self->cursor, byte); + int64_t result = ts_tree_cursor_goto_first_child_for_byte(&self->cursor, byte); if (result) { Py_XDECREF(self->node); self->node = NULL; @@ -130,7 +130,8 @@ PyObject *tree_cursor_goto_first_child_for_point(TreeCursor *self, PyObject *arg return NULL; } } - bool result = ts_tree_cursor_goto_first_child_for_point(&self->cursor, (TSPoint){row, column}); + int64_t result = + ts_tree_cursor_goto_first_child_for_point(&self->cursor, (TSPoint){row, column}); if (result) { Py_XDECREF(self->node); self->node = NULL; @@ -179,151 +180,164 @@ PyObject *tree_cursor_copy(PyObject *self, PyObject *Py_UNUSED(args)) { return PyObject_Init((PyObject *)copied, state->tree_cursor_type); } +PyDoc_STRVAR(tree_cursor_goto_first_child_doc, + "goto_first_child(self, /)\n--\n\n" + "Move this cursor to the first child of its current node." DOC_RETURNS "``True`` " + "if the cursor successfully moved, or ``False`` if there were no children."); +PyDoc_STRVAR( + tree_cursor_goto_last_child_doc, + "goto_last_child(self, /)\n--\n\n" + "Move this cursor to the last child of its current node." DOC_RETURNS "``True`` " + "if the cursor successfully moved, or ``False`` if there were no children." DOC_ATTENTION + "This method may be slower than :meth:`goto_first_child` because it needs " + "to iterate through all the children to compute the child's position."); +PyDoc_STRVAR(tree_cursor_goto_parent_doc, + "goto_parent(self, /)\n--\n\n" + "Move this cursor to the parent of its current node." DOC_RETURNS "``True`` " + "if the cursor successfully moved, or ``False`` if there was no parent node " + "(i.e. the cursor was already on the root node)."); +PyDoc_STRVAR(tree_cursor_goto_next_sibling_doc, + "goto_next_sibling(self, /)\n--\n\n" + "Move this cursor to the next sibling of its current node." DOC_RETURNS "``True`` " + "if the cursor successfully moved, or ``False`` if there was no next sibling."); +PyDoc_STRVAR(tree_cursor_goto_previous_sibling_doc, + "goto_previous_sibling(self, /)\n--\n\n" + "Move this cursor to the previous sibling of its current node." DOC_RETURNS + "``True`` if the cursor successfully moved, or ``False`` if there was no previous " + "sibling." DOC_ATTENTION + "This method may be slower than :meth:`goto_next_sibling` due to how node positions " + "are stored.\nIn the worst case, this will need to iterate through all the children " + "up to the previous sibling node to recalculate its position."); +PyDoc_STRVAR( + tree_cursor_goto_descendant_doc, + "goto_descendant(self, index, /)\n--\n\n" + "Move the cursor to the node that is the n-th descendant of the original node that the " + "cursor was constructed with, where ``0`` represents the original node itself."); +PyDoc_STRVAR(tree_cursor_goto_first_child_for_byte_doc, + "goto_first_child_for_byte(self, byte, /)\n--\n\n" + "Move this cursor to the first child of its current node that extends beyond the " + "given byte offset." DOC_RETURNS + "``True`` if the child node was found, ``False`` otherwise."); +PyDoc_STRVAR(tree_cursor_goto_first_child_for_point_doc, + "goto_first_child_for_point(self, *args)\n--\n\n" + "Move this cursor to the first child of its current node that extends beyond the " + "given row/column point.\n\n" + ".. versionchanged:: 0.22.0\n Use ``goto_first_child_for_point(point)`` " + "instead of ``goto_first_child_for_point(row, column)``" DOC_RETURNS + "``True`` if the child node was found, ``False`` otherwise."); +PyDoc_STRVAR(tree_cursor_reset_doc, "reset(self, node, /)\n--\n\n" + "Re-initialize the cursor to start at the original node " + "that it was constructed with."); +PyDoc_STRVAR(tree_cursor_reset_to_doc, + "reset_to(self, cursor, /)\n--\n\n" + "Re-initialize the cursor to the same position as another cursor.\n\n" + "Unlike :meth:`reset`, this will not lose parent information and allows reusing " + "already created cursors."); +PyDoc_STRVAR(tree_cursor_copy_doc, "copy(self, /)\n--\n\n" + "Create an independent copy of the cursor."); +PyDoc_STRVAR(tree_cursor_copy2_doc, "__copy__(self, /)\n--\n\n" + "Use :func:`copy.copy` to create a copy of the cursor."); + static PyMethodDef tree_cursor_methods[] = { { .ml_name = "goto_first_child", .ml_meth = (PyCFunction)tree_cursor_goto_first_child, .ml_flags = METH_NOARGS, - .ml_doc = "goto_first_child()\n--\n\n\ - Go to the first child.\n\n\ - If the current node has children, move to the first child and\n\ - return True. Otherwise, return False.", + .ml_doc = tree_cursor_goto_first_child_doc, }, { .ml_name = "goto_last_child", .ml_meth = (PyCFunction)tree_cursor_goto_last_child, .ml_flags = METH_NOARGS, - .ml_doc = "goto_last_child()\n--\n\n\ - Go to the last child.\n\n\ - If the current node has children, move to the last child and\n\ - return True. Otherwise, return False.", + .ml_doc = tree_cursor_goto_last_child_doc, }, { .ml_name = "goto_parent", .ml_meth = (PyCFunction)tree_cursor_goto_parent, .ml_flags = METH_NOARGS, - .ml_doc = "goto_parent()\n--\n\n\ - Go to the parent.\n\n\ - If the current node is not the root, move to its parent and\n\ - return True. Otherwise, return False.", + .ml_doc = tree_cursor_goto_parent_doc, }, { .ml_name = "goto_next_sibling", .ml_meth = (PyCFunction)tree_cursor_goto_next_sibling, .ml_flags = METH_NOARGS, - .ml_doc = "goto_next_sibling()\n--\n\n\ - Go to the next sibling.\n\n\ - If the current node has a next sibling, move to the next sibling\n\ - and return True. Otherwise, return False.", + .ml_doc = tree_cursor_goto_next_sibling_doc, }, { .ml_name = "goto_previous_sibling", .ml_meth = (PyCFunction)tree_cursor_goto_previous_sibling, .ml_flags = METH_NOARGS, - .ml_doc = "goto_previous_sibling()\n--\n\n\ - Go to the previous sibling.\n\n\ - If the current node has a previous sibling, move to the previous sibling\n\ - and return True. Otherwise, return False.", + .ml_doc = tree_cursor_goto_previous_sibling_doc, }, { .ml_name = "goto_descendant", .ml_meth = (PyCFunction)tree_cursor_goto_descendant, .ml_flags = METH_VARARGS, - .ml_doc = "goto_descendant(index)\n--\n\n\ - Go to the descendant at the given index.\n\n\ - If the current node has a descendant at the given index, move to the\n\ - descendant and return True. Otherwise, return False.", + .ml_doc = tree_cursor_goto_descendant_doc, }, { .ml_name = "goto_first_child_for_byte", .ml_meth = (PyCFunction)tree_cursor_goto_first_child_for_byte, .ml_flags = METH_VARARGS, - .ml_doc = "goto_first_child_for_byte(byte)\n--\n\n\ - Go to the first child that extends beyond the given byte.\n\n\ - If the current node has a child that includes the given byte, move to the\n\ - child and return True. Otherwise, return False.", + .ml_doc = tree_cursor_goto_first_child_for_byte_doc, }, { .ml_name = "goto_first_child_for_point", .ml_meth = (PyCFunction)tree_cursor_goto_first_child_for_point, .ml_flags = METH_VARARGS, - .ml_doc = "goto_first_child_for_point(row, column)\n--\n\n\ - Go to the first child that extends beyond the given point.\n\n\ - If the current node has a child that includes the given point, move to the\n\ - child and return True. Otherwise, return False.", + .ml_doc = tree_cursor_goto_first_child_for_point_doc, }, { .ml_name = "reset", .ml_meth = (PyCFunction)tree_cursor_reset, .ml_flags = METH_VARARGS, - .ml_doc = "reset(node)\n--\n\n\ - Re-initialize a tree cursor to start at a different node.", + .ml_doc = tree_cursor_reset_doc, }, { .ml_name = "reset_to", .ml_meth = (PyCFunction)tree_cursor_reset_to, .ml_flags = METH_VARARGS, - .ml_doc = "reset_to(cursor)\n--\n\n\ - Re-initialize the cursor to the same position as the given cursor.\n\n\ - Unlike `reset`, this will not lose parent information and allows reusing already created cursors\n`", + .ml_doc = tree_cursor_reset_to_doc, }, { .ml_name = "copy", .ml_meth = (PyCFunction)tree_cursor_copy, .ml_flags = METH_NOARGS, - .ml_doc = "copy()\n--\n\n\ - Create an independent copy of the cursor.\n", + .ml_doc = tree_cursor_copy_doc, }, {.ml_name = "__copy__", .ml_meth = (PyCFunction)tree_cursor_copy, .ml_flags = METH_NOARGS, - .ml_doc = NULL}, + .ml_doc = tree_cursor_copy2_doc}, {NULL}, }; static PyGetSetDef tree_cursor_accessors[] = { {"node", (getter)tree_cursor_get_node, NULL, "The current node.", NULL}, - { - "descendant_index", - (getter)tree_cursor_get_current_descendant_index, - NULL, - "current_descendant_index()\n--\n\n\ - Get the index of the cursor's current node out of all of the descendants of the original node.", - NULL, - }, - { - "field_id", - (getter)tree_cursor_get_current_field_id, - NULL, - "current_field_id()\n--\n\n\ - Get the field id of the tree cursor's current node.\n\n\ - If the current node has the field id, return int. Otherwise, return None.", - NULL, - }, - { - "field_name", - (getter)tree_cursor_get_current_field_name, - NULL, - "current_field_name()\n--\n\n\ - Get the field name of the tree cursor's current node.\n\n\ - If the current node has the field name, return str. Otherwise, return None.", - NULL, - }, - { - "depth", - (getter)tree_cursor_get_current_depth, - NULL, - "current_depth()\n--\n\n\ - Get the depth of the cursor's current node relative to the original node.", - NULL, - }, + {"descendant_index", (getter)tree_cursor_get_descendant_index, NULL, + PyDoc_STR("The index of the cursor's current node out of all of the descendants of the " + "original node that the cursor was constructed with.\n\n"), + NULL}, + {"field_id", (getter)tree_cursor_get_field_id, NULL, + PyDoc_STR("The numerical field id of this tree cursor's current node, if available."), NULL}, + {"field_name", (getter)tree_cursor_get_field_name, NULL, + PyDoc_STR("The field name of this tree cursor's current node, if available."), NULL}, + {"depth", (getter)tree_cursor_get_depth, NULL, + PyDoc_STR("The depth of the cursor's current node relative to the original node that it was " + "constructed with."), + NULL}, {NULL}, }; static PyType_Slot tree_cursor_type_slots[] = { - {Py_tp_doc, "A syntax tree cursor"}, {Py_tp_new, NULL}, - {Py_tp_dealloc, tree_cursor_dealloc}, {Py_tp_methods, tree_cursor_methods}, - {Py_tp_getset, tree_cursor_accessors}, {0, NULL}, + {Py_tp_doc, + PyDoc_STR("A class for walking a syntax :class:`Tree` efficiently." DOC_IMPORTANT + "The cursor can only walk into children of the node that it started from.")}, + {Py_tp_new, NULL}, + {Py_tp_dealloc, tree_cursor_dealloc}, + {Py_tp_methods, tree_cursor_methods}, + {Py_tp_getset, tree_cursor_accessors}, + {0, NULL}, }; PyType_Spec tree_cursor_type_spec = { diff --git a/tree_sitter/binding/tree_cursor.h b/tree_sitter/binding/tree_cursor.h index 0e4bdac2..a3696a46 100644 --- a/tree_sitter/binding/tree_cursor.h +++ b/tree_sitter/binding/tree_cursor.h @@ -6,13 +6,13 @@ void tree_cursor_dealloc(TreeCursor *self); PyObject *tree_cursor_get_node(TreeCursor *self, void *payload); -PyObject *tree_cursor_get_current_field_id(TreeCursor *self, void *payload); +PyObject *tree_cursor_get_field_id(TreeCursor *self, void *payload); -PyObject *tree_cursor_get_current_field_name(TreeCursor *self, void *payload); +PyObject *tree_cursor_get_field_name(TreeCursor *self, void *payload); -PyObject *tree_cursor_get_current_depth(TreeCursor *self, void *payload); +PyObject *tree_cursor_get_depth(TreeCursor *self, void *payload); -PyObject *tree_cursor_get_current_descendant_index(TreeCursor *self, void *payload); +PyObject *tree_cursor_get_descendant_index(TreeCursor *self, void *payload); PyObject *tree_cursor_goto_first_child(TreeCursor *self, PyObject *args); diff --git a/tree_sitter/binding/types.h b/tree_sitter/binding/types.h index 0dbcc67f..9c0f15ce 100644 --- a/tree_sitter/binding/types.h +++ b/tree_sitter/binding/types.h @@ -1,5 +1,6 @@ #pragma once +#include "docs.h" #include "tree_sitter/api.h" #include