From f459c3d8722b9759bbf58904a031f600a7cdea16 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Sat, 25 May 2024 00:02:49 +0300 Subject: [PATCH] feat(bindings)!: use capsules in python --- cli/src/generate/grammar_files.rs | 16 +++++++++++++--- cli/src/generate/templates/__init__.pyi | 2 +- cli/src/generate/templates/py-binding.c | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/cli/src/generate/grammar_files.rs b/cli/src/generate/grammar_files.rs index 72164ef5..0673fe35 100644 --- a/cli/src/generate/grammar_files.rs +++ b/cli/src/generate/grammar_files.rs @@ -447,9 +447,19 @@ pub fn generate_grammar_files( let lang_path = path.join(format!("tree_sitter_{}", language_name.to_snake_case())); missing_path(&lang_path, create_dir)?; - missing_path(lang_path.join("binding.c"), |path| { - generate_file(path, PY_BINDING_C_TEMPLATE, language_name) - })?; + missing_path_else( + lang_path.join("binding.c"), + |path| generate_file(path, PY_BINDING_C_TEMPLATE, language_name), + |path| { + let binding_c = fs::read_to_string(path) + .with_context(|| "Failed to read bindings/python/binding.c")?; + if !binding_c.contains("PyCapsule_New") { + eprintln!("Replacing bindings/python/binding.c with new binding API"); + generate_file(path, PY_BINDING_C_TEMPLATE, language_name)?; + } + Ok(()) + }, + )?; missing_path(lang_path.join("__init__.py"), |path| { generate_file(path, INIT_PY_TEMPLATE, language_name) diff --git a/cli/src/generate/templates/__init__.pyi b/cli/src/generate/templates/__init__.pyi index c8d33680..abf6633f 100644 --- a/cli/src/generate/templates/__init__.pyi +++ b/cli/src/generate/templates/__init__.pyi @@ -7,4 +7,4 @@ from typing import Final # LOCALS_QUERY: Final[str] # TAGS_QUERY: Final[str] -def language() -> int: ... +def language() -> object: ... diff --git a/cli/src/generate/templates/py-binding.c b/cli/src/generate/templates/py-binding.c index b1572ccc..74309fa8 100644 --- a/cli/src/generate/templates/py-binding.c +++ b/cli/src/generate/templates/py-binding.c @@ -5,7 +5,7 @@ typedef struct TSLanguage TSLanguage; TSLanguage *tree_sitter_LOWER_PARSER_NAME(void); static PyObject* _binding_language(PyObject *Py_UNUSED(self), PyObject *Py_UNUSED(args)) { - return PyLong_FromVoidPtr(tree_sitter_LOWER_PARSER_NAME()); + return PyCapsule_New(tree_sitter_LOWER_PARSER_NAME(), "tree_sitter.Language", NULL); } static PyMethodDef methods[] = {