99import os
1010from tree_sitter import Language , Parser
1111
12+ import importlib
13+ from importlib .metadata import version
14+
1215import logging as logger
1316
1417# For autoloading
1518import requests
1619from git import Repo
1720
21+
1822try :
1923 from tree_sitter_languages import get_language , get_parser
2024except 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
77116class 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
0 commit comments