Skip to content

Commit ff453e9

Browse files
committed
Add support for tree_sitter>=0.22
1 parent 582bfe2 commit ff453e9

3 files changed

Lines changed: 44 additions & 9 deletions

File tree

code_ast/parsers.py

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@
99
import os
1010
from tree_sitter import Language, Parser
1111

12+
import importlib
13+
from importlib.metadata import version
14+
1215
import logging as logger
1316

1417
# For autoloading
1518
import requests
1619
from git import Repo
1720

21+
1822
try:
1923
from tree_sitter_languages import get_language, get_parser
2024
except ImportError:
@@ -35,6 +39,11 @@ def load_language(lang):
3539
lang is translated to a remote repository
3640
(https://github.com/tree-sitter/tree-sitter-[lang]).
3741
42+
Note: Since tree_sitter v0.22.0, language specifications are loaded as
43+
Python packages. Therefore, autoloading won't work. For these, you
44+
have to install the right python package via PIP
45+
(see: https://github.com/tree-sitter/py-tree-sitter).
46+
3847
Parameters
3948
----------
4049
lang : [python, java, javascript, ...]
@@ -48,6 +57,20 @@ def load_language(lang):
4857
language specification object
4958
5059
"""
60+
if version("tree_sitter") < "0.22.0":
61+
return _pre22_load_language(lang)
62+
return _load_language(lang)
63+
64+
65+
def _load_language(lang):
66+
try:
67+
tree_sitter_pkg = importlib.import_module(f"tree_sitter_{lang}")
68+
return Language(tree_sitter_pkg.language())
69+
except ImportError:
70+
raise ImportError(f"'tree_sitter_{lang}' not found. Please install the package via `pip install tree-sitter-{lang}`.")
71+
72+
73+
def _pre22_load_language(lang):
5174

5275
if get_language is not None:
5376
try:
@@ -72,6 +95,22 @@ def load_language(lang):
7295
_clone_parse_def_from_github(lang, source_lang_path)
7396
return load_language(lang)
7497

98+
99+
def _construct_parser(lang_id, language):
100+
if version("tree_sitter") < "0.22.0":
101+
return _pre22_construct_parser(lang_id, language)
102+
return Parser(language)
103+
104+
def _pre22_construct_parser(lang_id, language):
105+
if get_parser is not None:
106+
return get_parser(lang_id)
107+
else:
108+
parser = Parser()
109+
parser.set_language(language)
110+
return parser
111+
112+
113+
75114
# Parser ---------------------------------------------------------------
76115

77116
class ASTParser:
@@ -97,13 +136,9 @@ def __init__(self, lang):
97136

98137
self.lang_id = lang
99138
self.lang = load_language(lang)
139+
self.parser = _construct_parser(self.lang_id, self.lang)
100140

101-
if get_parser is not None:
102-
self.parser = get_parser(self.lang_id)
103-
else:
104-
self.parser = Parser()
105-
self.parser.set_language(self.lang)
106-
141+
107142
def parse_bytes(self, data):
108143
"""
109144
Parses source code as bytes into AST

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "code_ast"
7-
version = "v0.1.1"
7+
version = "v0.1.2"
88
description = "Fast structural analysis of any programming language in Python"
99
readme = "README.md"
1010
requires-python = ">= 3.8"

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
setup(
77
name = 'code_ast',
88
packages = ['code_ast'],
9-
version = '0.1.1',
9+
version = '0.1.2',
1010
license='MIT',
1111
description = 'Fast structural analysis of any programming language in Python',
1212
long_description = long_description,
@@ -17,7 +17,7 @@
1717
download_url = 'https://github.com/cedricrupb/code_ast/archive/refs/tags/v0.1.0.tar.gz',
1818
keywords = ['code', 'ast', 'syntax', 'program', 'language processing'],
1919
install_requires=[
20-
'tree_sitter==0.21.3',
20+
'tree_sitter>=0.21.3',
2121
'GitPython>=3.1.41',
2222
'requests>=2.32.0',
2323
],

0 commit comments

Comments
 (0)