From 0a6186dafc82b91481178253208584f674101244 Mon Sep 17 00:00:00 2001 From: Wolfvin Date: Wed, 1 Jul 2026 03:20:25 +0000 Subject: [PATCH] =?UTF-8?q?fix(languages):=20tsx=20grammar=20loads=20via?= =?UTF-8?q?=20tree=5Fsitter=5Ftypescript=20module=20=E2=80=94=20closes=20#?= =?UTF-8?q?115?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #112 introduced universal_grammar_loader but _import_module_name('tsx') returned 'tree_sitter_tsx' which doesn't exist on PyPI. The tsx grammar ships inside the tree-sitter-typescript wheel and is imported as tree_sitter_typescript, then accessed via language_tsx(). Added MODULE_NAME_OVERRIDES table (parallels existing PACKAGE_NAME_OVERRIDES and ENTRY_FUNCTION_OVERRIDES) so tsx maps to tree_sitter_typescript. Verified: load_grammar('tsx') now returns a Language object instead of None. Also fixes #119: docstring previously claimed '158+ languages' but supported_languages() returns 104 (the actual count from EXTENSION_MAP + BASENAME_MAP). Updated docstring to '100+ languages' and pointed readers to supported_languages() for the exact count. --- scripts/universal_grammar_loader.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/scripts/universal_grammar_loader.py b/scripts/universal_grammar_loader.py index 95dd266f..94c0d50e 100644 --- a/scripts/universal_grammar_loader.py +++ b/scripts/universal_grammar_loader.py @@ -2,8 +2,10 @@ Universal Tree-Sitter Grammar Loader for CodeLens (issue #18) ============================================================= -Auto-detects and loads tree-sitter grammars for 158+ languages from PyPI -``tree-sitter-`` packages. +Auto-detects and loads tree-sitter grammars for 100+ languages from PyPI +``tree-sitter-`` packages. The number of supported languages is +determined by the entries in :data:`EXTENSION_MAP`; call +:func:`supported_languages` for the exact count at runtime. Public API ---------- @@ -486,12 +488,28 @@ def _normalize_language_name(language: str) -> str: return language.strip().lower().replace("-", "_").replace(" ", "_") +# ── Module name overrides ──────────────────────────────────────── +# Some languages share a single Python wheel with another language and +# therefore expose a non-default module name. Notably ``tsx`` and +# ``typescript`` both ship in the ``tree-sitter-typescript`` wheel whose +# import name is ``tree_sitter_typescript`` (there is no +# ``tree_sitter_tsx`` module on PyPI). +MODULE_NAME_OVERRIDES: dict = { + "tsx": "tree_sitter_typescript", +} + + def _import_module_name(language: str) -> str: """Return the Python module name to import for a given language. Almost all tree-sitter packages use ``tree_sitter_`` (snake_case). + Languages listed in :data:`MODULE_NAME_OVERRIDES` ship under a different + module name (e.g. ``tsx`` → ``tree_sitter_typescript``). """ - return "tree_sitter_" + _normalize_language_name(language) + norm = _normalize_language_name(language) + if norm in MODULE_NAME_OVERRIDES: + return MODULE_NAME_OVERRIDES[norm] + return "tree_sitter_" + norm def _package_name(language: str) -> str: