tree-sitter-analyzer 0.2.0__py3-none-any.whl → 0.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of tree-sitter-analyzer might be problematic. Click here for more details.

Files changed (78) hide show
  1. tree_sitter_analyzer/__init__.py +133 -121
  2. tree_sitter_analyzer/__main__.py +11 -12
  3. tree_sitter_analyzer/api.py +531 -539
  4. tree_sitter_analyzer/cli/__init__.py +39 -39
  5. tree_sitter_analyzer/cli/__main__.py +12 -13
  6. tree_sitter_analyzer/cli/commands/__init__.py +26 -27
  7. tree_sitter_analyzer/cli/commands/advanced_command.py +88 -88
  8. tree_sitter_analyzer/cli/commands/base_command.py +160 -155
  9. tree_sitter_analyzer/cli/commands/default_command.py +18 -19
  10. tree_sitter_analyzer/cli/commands/partial_read_command.py +141 -133
  11. tree_sitter_analyzer/cli/commands/query_command.py +81 -82
  12. tree_sitter_analyzer/cli/commands/structure_command.py +138 -121
  13. tree_sitter_analyzer/cli/commands/summary_command.py +101 -93
  14. tree_sitter_analyzer/cli/commands/table_command.py +232 -233
  15. tree_sitter_analyzer/cli/info_commands.py +120 -121
  16. tree_sitter_analyzer/cli_main.py +277 -276
  17. tree_sitter_analyzer/core/__init__.py +15 -20
  18. tree_sitter_analyzer/core/analysis_engine.py +591 -574
  19. tree_sitter_analyzer/core/cache_service.py +320 -330
  20. tree_sitter_analyzer/core/engine.py +557 -560
  21. tree_sitter_analyzer/core/parser.py +293 -288
  22. tree_sitter_analyzer/core/query.py +494 -502
  23. tree_sitter_analyzer/encoding_utils.py +458 -460
  24. tree_sitter_analyzer/exceptions.py +337 -340
  25. tree_sitter_analyzer/file_handler.py +217 -222
  26. tree_sitter_analyzer/formatters/__init__.py +1 -1
  27. tree_sitter_analyzer/formatters/base_formatter.py +167 -168
  28. tree_sitter_analyzer/formatters/formatter_factory.py +78 -74
  29. tree_sitter_analyzer/formatters/java_formatter.py +287 -270
  30. tree_sitter_analyzer/formatters/python_formatter.py +255 -235
  31. tree_sitter_analyzer/interfaces/__init__.py +9 -10
  32. tree_sitter_analyzer/interfaces/cli.py +528 -557
  33. tree_sitter_analyzer/interfaces/cli_adapter.py +322 -319
  34. tree_sitter_analyzer/interfaces/mcp_adapter.py +180 -170
  35. tree_sitter_analyzer/interfaces/mcp_server.py +405 -416
  36. tree_sitter_analyzer/java_analyzer.py +218 -219
  37. tree_sitter_analyzer/language_detector.py +398 -400
  38. tree_sitter_analyzer/language_loader.py +224 -228
  39. tree_sitter_analyzer/languages/__init__.py +10 -11
  40. tree_sitter_analyzer/languages/java_plugin.py +1129 -1113
  41. tree_sitter_analyzer/languages/python_plugin.py +737 -712
  42. tree_sitter_analyzer/mcp/__init__.py +31 -32
  43. tree_sitter_analyzer/mcp/resources/__init__.py +44 -47
  44. tree_sitter_analyzer/mcp/resources/code_file_resource.py +212 -213
  45. tree_sitter_analyzer/mcp/resources/project_stats_resource.py +560 -550
  46. tree_sitter_analyzer/mcp/server.py +333 -345
  47. tree_sitter_analyzer/mcp/tools/__init__.py +30 -31
  48. tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +621 -557
  49. tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py +242 -245
  50. tree_sitter_analyzer/mcp/tools/base_tool.py +54 -55
  51. tree_sitter_analyzer/mcp/tools/read_partial_tool.py +300 -302
  52. tree_sitter_analyzer/mcp/tools/table_format_tool.py +362 -359
  53. tree_sitter_analyzer/mcp/tools/universal_analyze_tool.py +543 -476
  54. tree_sitter_analyzer/mcp/utils/__init__.py +105 -106
  55. tree_sitter_analyzer/mcp/utils/error_handler.py +549 -549
  56. tree_sitter_analyzer/models.py +470 -481
  57. tree_sitter_analyzer/output_manager.py +261 -264
  58. tree_sitter_analyzer/plugins/__init__.py +333 -334
  59. tree_sitter_analyzer/plugins/base.py +477 -446
  60. tree_sitter_analyzer/plugins/java_plugin.py +608 -625
  61. tree_sitter_analyzer/plugins/javascript_plugin.py +446 -439
  62. tree_sitter_analyzer/plugins/manager.py +362 -355
  63. tree_sitter_analyzer/plugins/plugin_loader.py +85 -83
  64. tree_sitter_analyzer/plugins/python_plugin.py +606 -598
  65. tree_sitter_analyzer/plugins/registry.py +374 -366
  66. tree_sitter_analyzer/queries/__init__.py +26 -27
  67. tree_sitter_analyzer/queries/java.py +391 -394
  68. tree_sitter_analyzer/queries/javascript.py +148 -149
  69. tree_sitter_analyzer/queries/python.py +285 -286
  70. tree_sitter_analyzer/queries/typescript.py +229 -230
  71. tree_sitter_analyzer/query_loader.py +254 -260
  72. tree_sitter_analyzer/table_formatter.py +468 -448
  73. tree_sitter_analyzer/utils.py +277 -277
  74. {tree_sitter_analyzer-0.2.0.dist-info → tree_sitter_analyzer-0.3.0.dist-info}/METADATA +21 -6
  75. tree_sitter_analyzer-0.3.0.dist-info/RECORD +77 -0
  76. tree_sitter_analyzer-0.2.0.dist-info/RECORD +0 -77
  77. {tree_sitter_analyzer-0.2.0.dist-info → tree_sitter_analyzer-0.3.0.dist-info}/WHEEL +0 -0
  78. {tree_sitter_analyzer-0.2.0.dist-info → tree_sitter_analyzer-0.3.0.dist-info}/entry_points.txt +0 -0
@@ -1,260 +1,254 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- """
4
- Dynamic query loader for language-specific Tree-sitter queries.
5
- Optimized with enhanced caching and lazy loading for better performance.
6
- """
7
-
8
- import importlib
9
- import pkgutil
10
- from functools import lru_cache
11
- from pathlib import Path
12
- from typing import Dict, List, Optional, Set, Tuple
13
-
14
- from .utils import log_debug, log_error, log_warning
15
-
16
-
17
- class QueryLoader:
18
- """Load and manage language-specific Tree-sitter queries with optimizations."""
19
-
20
- # --- Predefined Queries (from query_library.py) ---
21
- _PREDEFINED_QUERIES: Dict[str, Dict[str, str]] = {
22
- "java": {
23
- "class": "(class_declaration) @class",
24
- "interface": "(interface_declaration) @interface",
25
- "method": "(method_declaration) @method",
26
- "constructor": "(constructor_declaration) @constructor",
27
- "field": "(field_declaration) @field",
28
- "import": "(import_declaration) @import",
29
- "package": "(package_declaration) @package",
30
- "annotation": "(annotation) @annotation",
31
- "method_name": "(method_declaration name: (identifier) @method.name)",
32
- "class_name": "(class_declaration name: (identifier) @class.name)",
33
- "method_invocations": "(method_invocation name: (identifier) @invocation.name)",
34
- "class_with_body": "(class_declaration name: (identifier) @class.name body: (class_body) @class.body)",
35
- "method_with_body": "(method_declaration name: (identifier) @method.name body: (block) @method.body)",
36
- }
37
- # Add other languages here if needed
38
- }
39
-
40
- _QUERY_DESCRIPTIONS: Dict[str, str] = {
41
- "class": "クラス宣言を抽出",
42
- "interface": "インターフェース宣言を抽出",
43
- "method": "メソッド宣言を抽出",
44
- "constructor": "コンストラクタ宣言を抽出",
45
- "field": "フィールド宣言を抽出",
46
- "import": "インポート文を抽出",
47
- "package": "パッケージ宣言を抽出",
48
- "annotation": "アノテーションを抽出",
49
- "method_name": "メソッド名のみを抽出",
50
- "class_name": "クラス名のみを抽出",
51
- "method_invocations": "メソッド呼び出しを抽出",
52
- "class_with_body": "クラス宣言と本体を抽出",
53
- "method_with_body": "メソッド宣言と本体を抽出",
54
- }
55
-
56
-
57
- def __init__(self) -> None:
58
- self._loaded_queries: Dict[str, dict] = {}
59
- self._query_modules: Dict[str, object] = {}
60
- self._failed_languages: Set[str] = set() # 読み込み失敗した言語をキャッシュ
61
-
62
- def load_language_queries(self, language: str) -> dict:
63
- """Load queries for a specific language with optimized caching."""
64
- if language in self._failed_languages:
65
- return {}
66
-
67
- if language in self._loaded_queries:
68
- return self._loaded_queries[language]
69
-
70
- # Start with predefined queries
71
- queries = self._PREDEFINED_QUERIES.get(language, {}).copy()
72
-
73
- try:
74
- module_name = f"tree_sitter_analyzer.queries.{language}"
75
- module = importlib.import_module(module_name)
76
-
77
- if hasattr(module, "get_all_queries"):
78
- queries.update(module.get_all_queries())
79
- elif hasattr(module, "ALL_QUERIES"):
80
- queries.update(module.ALL_QUERIES)
81
- else:
82
- for attr_name in dir(module):
83
- if not attr_name.startswith("_"):
84
- attr_value = getattr(module, attr_name)
85
- if isinstance(attr_value, (str, dict)):
86
- queries[attr_name] = attr_value
87
-
88
- self._loaded_queries[language] = queries
89
- self._query_modules[language] = module
90
- return queries
91
-
92
- except ImportError:
93
- log_warning(f"No dynamic query module for '{language}', using predefined queries.")
94
- self._loaded_queries[language] = queries
95
- return queries
96
- except Exception as e:
97
- log_error(f"Error loading dynamic queries for '{language}': {e}")
98
- self._failed_languages.add(language)
99
- self._loaded_queries[language] = {} # Reset on error
100
- return {}
101
-
102
- def get_query(self, language: str, query_name: str) -> Optional[str]:
103
- """Get a specific query for a language with optimized lookup."""
104
- queries = self.load_language_queries(language)
105
-
106
- if query_name in queries:
107
- query_info = queries[query_name]
108
- if isinstance(query_info, dict) and "query" in query_info:
109
- return str(query_info["query"])
110
- elif isinstance(query_info, str):
111
- return query_info
112
-
113
- return None
114
-
115
- def get_query_description(self, language: str, query_name: str) -> Optional[str]:
116
- """Get description for a specific query."""
117
- # Check predefined descriptions first
118
- if query_name in self._QUERY_DESCRIPTIONS:
119
- return self._QUERY_DESCRIPTIONS[query_name]
120
-
121
- queries = self.load_language_queries(language)
122
- if query_name in queries:
123
- query_info = queries[query_name]
124
- if isinstance(query_info, dict) and "description" in query_info:
125
- return str(query_info["description"])
126
- return f"Query '{query_name}' for {language}"
127
-
128
- return None
129
-
130
- def list_queries_for_language(self, language: str) -> List[str]:
131
- """List all available queries for a language."""
132
- queries = self.load_language_queries(language)
133
- return list(queries.keys())
134
-
135
- def list_queries(self, language: str) -> List[str]:
136
- """List all available queries for a language.
137
-
138
- Args:
139
- language: The programming language to list queries for
140
-
141
- Returns:
142
- List of query names available for the specified language
143
- """
144
- return self.list_queries_for_language(language)
145
-
146
- @lru_cache(maxsize=16) # キャッシュサイズを制限
147
- def list_supported_languages(self) -> List[str]:
148
- """List all languages that have query modules available."""
149
- languages = []
150
-
151
- # 既知の言語をチェック
152
- known_languages = [
153
- "java",
154
- "javascript",
155
- "typescript",
156
- "python",
157
- "c",
158
- "cpp",
159
- "rust",
160
- "go",
161
- ]
162
-
163
- for language in known_languages:
164
- if language not in self._failed_languages:
165
- try:
166
- module_name = f"tree_sitter_analyzer.queries.{language}"
167
- importlib.import_module(module_name)
168
- languages.append(language)
169
- except ImportError:
170
- self._failed_languages.add(language)
171
-
172
- return languages
173
-
174
- def get_common_queries(self) -> List[str]:
175
- """Get commonly used queries across languages."""
176
- # Return a flat list of common query names
177
- return ["functions", "classes", "variables", "imports"]
178
-
179
- def get_all_queries_for_language(self, language: str) -> Dict[str, Tuple[str, str]]:
180
- """Get all query information for a language including metadata.
181
-
182
- Returns:
183
- Dictionary mapping query names to (query_string, description) tuples
184
- """
185
- queries = self.load_language_queries(language)
186
- result = {}
187
-
188
- for name, query_info in queries.items():
189
- if isinstance(query_info, dict):
190
- query_string = query_info.get("query", "")
191
- description = query_info.get(
192
- "description", f"Query '{name}' for {language}"
193
- )
194
- result[name] = (query_string, description)
195
- elif isinstance(query_info, str):
196
- result[name] = (query_info, f"Query '{name}' for {language}")
197
-
198
- return result
199
-
200
- def refresh_cache(self) -> None:
201
- """Refresh the query cache."""
202
- self._loaded_queries.clear()
203
- self._query_modules.clear()
204
- self._failed_languages.clear()
205
- # LRUキャッシュもクリア
206
- self.list_supported_languages.cache_clear()
207
-
208
- def is_language_supported(self, language: str) -> bool:
209
- """Check if a language has query support."""
210
- if language in self._failed_languages:
211
- return False
212
- return language in self.list_supported_languages()
213
-
214
- def preload_languages(self, languages: List[str]) -> Dict[str, bool]:
215
- """Preload queries for multiple languages efficiently."""
216
- results = {}
217
- for language in languages:
218
- try:
219
- queries = self.load_language_queries(language)
220
- results[language] = len(queries) > 0
221
- except Exception:
222
- results[language] = False
223
- return results
224
-
225
-
226
- # グローバルインスタンス(シングルトンパターン)
227
- _query_loader_instance = None
228
-
229
-
230
- def get_query_loader() -> QueryLoader:
231
- """Get singleton query loader instance."""
232
- global _query_loader_instance
233
- if _query_loader_instance is None:
234
- _query_loader_instance = QueryLoader()
235
- return _query_loader_instance
236
-
237
-
238
- # 後方互換性のため
239
- query_loader = get_query_loader()
240
-
241
-
242
- # 便利関数(最適化済み)
243
- def get_query(language: str, query_name: str) -> Optional[str]:
244
- """Get a specific query."""
245
- return get_query_loader().get_query(language, query_name)
246
-
247
-
248
- def list_queries(language: str) -> List[str]:
249
- """List queries for a language."""
250
- return get_query_loader().list_queries_for_language(language)
251
-
252
-
253
- def list_supported_languages() -> List[str]:
254
- """List all supported languages."""
255
- return get_query_loader().list_supported_languages()
256
-
257
-
258
- def is_language_supported(language: str) -> bool:
259
- """Check if language is supported."""
260
- return get_query_loader().is_language_supported(language)
1
+ #!/usr/bin/env python3
2
+ """
3
+ Dynamic query loader for language-specific Tree-sitter queries.
4
+ Optimized with enhanced caching and lazy loading for better performance.
5
+ """
6
+
7
+ import importlib
8
+
9
+ from .utils import log_error, log_warning
10
+
11
+
12
+ class QueryLoader:
13
+ """Load and manage language-specific Tree-sitter queries with optimizations."""
14
+
15
+ # --- Predefined Queries (from query_library.py) ---
16
+ _PREDEFINED_QUERIES: dict[str, dict[str, str]] = {
17
+ "java": {
18
+ "class": "(class_declaration) @class",
19
+ "interface": "(interface_declaration) @interface",
20
+ "method": "(method_declaration) @method",
21
+ "constructor": "(constructor_declaration) @constructor",
22
+ "field": "(field_declaration) @field",
23
+ "import": "(import_declaration) @import",
24
+ "package": "(package_declaration) @package",
25
+ "annotation": "(annotation) @annotation",
26
+ "method_name": "(method_declaration name: (identifier) @method.name)",
27
+ "class_name": "(class_declaration name: (identifier) @class.name)",
28
+ "method_invocations": "(method_invocation name: (identifier) @invocation.name)",
29
+ "class_with_body": "(class_declaration name: (identifier) @class.name body: (class_body) @class.body)",
30
+ "method_with_body": "(method_declaration name: (identifier) @method.name body: (block) @method.body)",
31
+ }
32
+ # Add other languages here if needed
33
+ }
34
+
35
+ _QUERY_DESCRIPTIONS: dict[str, str] = {
36
+ "class": "クラス宣言を抽出",
37
+ "interface": "インターフェース宣言を抽出",
38
+ "method": "メソッド宣言を抽出",
39
+ "constructor": "コンストラクタ宣言を抽出",
40
+ "field": "フィールド宣言を抽出",
41
+ "import": "インポート文を抽出",
42
+ "package": "パッケージ宣言を抽出",
43
+ "annotation": "アノテーションを抽出",
44
+ "method_name": "メソッド名のみを抽出",
45
+ "class_name": "クラス名のみを抽出",
46
+ "method_invocations": "メソッド呼び出しを抽出",
47
+ "class_with_body": "クラス宣言と本体を抽出",
48
+ "method_with_body": "メソッド宣言と本体を抽出",
49
+ }
50
+
51
+ def __init__(self) -> None:
52
+ self._loaded_queries: dict[str, dict] = {}
53
+ self._query_modules: dict[str, object] = {}
54
+ self._failed_languages: set[str] = set() # 読み込み失敗した言語をキャッシュ
55
+
56
+ def load_language_queries(self, language: str) -> dict:
57
+ """Load queries for a specific language with optimized caching."""
58
+ if language in self._failed_languages:
59
+ return {}
60
+
61
+ if language in self._loaded_queries:
62
+ return self._loaded_queries[language]
63
+
64
+ # Start with predefined queries
65
+ queries = self._PREDEFINED_QUERIES.get(language, {}).copy()
66
+
67
+ try:
68
+ module_name = f"tree_sitter_analyzer.queries.{language}"
69
+ module = importlib.import_module(module_name)
70
+
71
+ if hasattr(module, "get_all_queries"):
72
+ queries.update(module.get_all_queries())
73
+ elif hasattr(module, "ALL_QUERIES"):
74
+ queries.update(module.ALL_QUERIES)
75
+ else:
76
+ for attr_name in dir(module):
77
+ if not attr_name.startswith("_"):
78
+ attr_value = getattr(module, attr_name)
79
+ if isinstance(attr_value, str | dict):
80
+ queries[attr_name] = attr_value
81
+
82
+ self._loaded_queries[language] = queries
83
+ self._query_modules[language] = module
84
+ return queries
85
+
86
+ except ImportError:
87
+ log_warning(
88
+ f"No dynamic query module for '{language}', using predefined queries."
89
+ )
90
+ self._loaded_queries[language] = queries
91
+ return queries
92
+ except Exception as e:
93
+ log_error(f"Error loading dynamic queries for '{language}': {e}")
94
+ self._failed_languages.add(language)
95
+ self._loaded_queries[language] = {} # Reset on error
96
+ return {}
97
+
98
+ def get_query(self, language: str, query_name: str) -> str | None:
99
+ """Get a specific query for a language with optimized lookup."""
100
+ queries = self.load_language_queries(language)
101
+
102
+ if query_name in queries:
103
+ query_info = queries[query_name]
104
+ if isinstance(query_info, dict) and "query" in query_info:
105
+ return str(query_info["query"])
106
+ elif isinstance(query_info, str):
107
+ return query_info
108
+
109
+ return None
110
+
111
+ def get_query_description(self, language: str, query_name: str) -> str | None:
112
+ """Get description for a specific query."""
113
+ # Check predefined descriptions first
114
+ if query_name in self._QUERY_DESCRIPTIONS:
115
+ return self._QUERY_DESCRIPTIONS[query_name]
116
+
117
+ queries = self.load_language_queries(language)
118
+ if query_name in queries:
119
+ query_info = queries[query_name]
120
+ if isinstance(query_info, dict) and "description" in query_info:
121
+ return str(query_info["description"])
122
+ return f"Query '{query_name}' for {language}"
123
+
124
+ return None
125
+
126
+ def list_queries_for_language(self, language: str) -> list[str]:
127
+ """List all available queries for a language."""
128
+ queries = self.load_language_queries(language)
129
+ return list(queries.keys())
130
+
131
+ def list_queries(self, language: str) -> list[str]:
132
+ """List all available queries for a language.
133
+
134
+ Args:
135
+ language: The programming language to list queries for
136
+
137
+ Returns:
138
+ List of query names available for the specified language
139
+ """
140
+ return self.list_queries_for_language(language)
141
+
142
+ def list_supported_languages(self) -> list[str]:
143
+ """List all languages that have query modules available."""
144
+ languages = []
145
+
146
+ # 既知の言語をチェック
147
+ known_languages = [
148
+ "java",
149
+ "javascript",
150
+ "typescript",
151
+ "python",
152
+ "c",
153
+ "cpp",
154
+ "rust",
155
+ "go",
156
+ ]
157
+
158
+ for language in known_languages:
159
+ if language not in self._failed_languages:
160
+ try:
161
+ module_name = f"tree_sitter_analyzer.queries.{language}"
162
+ importlib.import_module(module_name)
163
+ languages.append(language)
164
+ except ImportError:
165
+ self._failed_languages.add(language)
166
+
167
+ return languages
168
+
169
+ def get_common_queries(self) -> list[str]:
170
+ """Get commonly used queries across languages."""
171
+ # Return a flat list of common query names
172
+ return ["functions", "classes", "variables", "imports"]
173
+
174
+ def get_all_queries_for_language(self, language: str) -> dict[str, tuple[str, str]]:
175
+ """Get all query information for a language including metadata.
176
+
177
+ Returns:
178
+ Dictionary mapping query names to (query_string, description) tuples
179
+ """
180
+ queries = self.load_language_queries(language)
181
+ result = {}
182
+
183
+ for name, query_info in queries.items():
184
+ if isinstance(query_info, dict):
185
+ query_string = query_info.get("query", "")
186
+ description = query_info.get(
187
+ "description", f"Query '{name}' for {language}"
188
+ )
189
+ result[name] = (query_string, description)
190
+ elif isinstance(query_info, str):
191
+ result[name] = (query_info, f"Query '{name}' for {language}")
192
+
193
+ return result
194
+
195
+ def refresh_cache(self) -> None:
196
+ """Refresh the query cache."""
197
+ self._loaded_queries.clear()
198
+ self._query_modules.clear()
199
+ self._failed_languages.clear()
200
+ # Cache was removed for memory efficiency
201
+
202
+ def is_language_supported(self, language: str) -> bool:
203
+ """Check if a language has query support."""
204
+ if language in self._failed_languages:
205
+ return False
206
+ return language in self.list_supported_languages()
207
+
208
+ def preload_languages(self, languages: list[str]) -> dict[str, bool]:
209
+ """Preload queries for multiple languages efficiently."""
210
+ results = {}
211
+ for language in languages:
212
+ try:
213
+ queries = self.load_language_queries(language)
214
+ results[language] = len(queries) > 0
215
+ except Exception:
216
+ results[language] = False
217
+ return results
218
+
219
+
220
+ # グローバルインスタンス(シングルトンパターン)
221
+ _query_loader_instance = None
222
+
223
+
224
+ def get_query_loader() -> QueryLoader:
225
+ """Get singleton query loader instance."""
226
+ global _query_loader_instance
227
+ if _query_loader_instance is None:
228
+ _query_loader_instance = QueryLoader()
229
+ return _query_loader_instance
230
+
231
+
232
+ # 後方互換性のため
233
+ query_loader = get_query_loader()
234
+
235
+
236
+ # 便利関数(最適化済み)
237
+ def get_query(language: str, query_name: str) -> str | None:
238
+ """Get a specific query."""
239
+ return get_query_loader().get_query(language, query_name)
240
+
241
+
242
+ def list_queries(language: str) -> list[str]:
243
+ """List queries for a language."""
244
+ return get_query_loader().list_queries_for_language(language)
245
+
246
+
247
+ def list_supported_languages() -> list[str]:
248
+ """List all supported languages."""
249
+ return get_query_loader().list_supported_languages()
250
+
251
+
252
+ def is_language_supported(language: str) -> bool:
253
+ """Check if language is supported."""
254
+ return get_query_loader().is_language_supported(language)