tree-sitter-analyzer 0.9.3__py3-none-any.whl → 0.9.5__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 (33) hide show
  1. tree_sitter_analyzer/cli/commands/default_command.py +18 -18
  2. tree_sitter_analyzer/cli/commands/partial_read_command.py +139 -141
  3. tree_sitter_analyzer/cli/commands/query_command.py +92 -88
  4. tree_sitter_analyzer/cli/commands/table_command.py +235 -235
  5. tree_sitter_analyzer/cli/info_commands.py +121 -121
  6. tree_sitter_analyzer/cli_main.py +307 -307
  7. tree_sitter_analyzer/core/analysis_engine.py +584 -584
  8. tree_sitter_analyzer/core/cache_service.py +5 -4
  9. tree_sitter_analyzer/core/query.py +502 -502
  10. tree_sitter_analyzer/encoding_utils.py +9 -2
  11. tree_sitter_analyzer/exceptions.py +400 -406
  12. tree_sitter_analyzer/formatters/java_formatter.py +291 -291
  13. tree_sitter_analyzer/formatters/python_formatter.py +259 -259
  14. tree_sitter_analyzer/interfaces/mcp_server.py +426 -425
  15. tree_sitter_analyzer/language_detector.py +398 -398
  16. tree_sitter_analyzer/language_loader.py +224 -224
  17. tree_sitter_analyzer/languages/java_plugin.py +1202 -1202
  18. tree_sitter_analyzer/mcp/resources/project_stats_resource.py +559 -555
  19. tree_sitter_analyzer/mcp/server.py +30 -9
  20. tree_sitter_analyzer/mcp/tools/read_partial_tool.py +21 -4
  21. tree_sitter_analyzer/mcp/tools/table_format_tool.py +22 -4
  22. tree_sitter_analyzer/mcp/utils/error_handler.py +569 -567
  23. tree_sitter_analyzer/models.py +470 -470
  24. tree_sitter_analyzer/security/__init__.py +22 -22
  25. tree_sitter_analyzer/security/boundary_manager.py +251 -243
  26. tree_sitter_analyzer/security/regex_checker.py +297 -292
  27. tree_sitter_analyzer/table_formatter.py +708 -652
  28. tree_sitter_analyzer/utils.py +61 -19
  29. tree_sitter_analyzer-0.9.5.dist-info/METADATA +567 -0
  30. {tree_sitter_analyzer-0.9.3.dist-info → tree_sitter_analyzer-0.9.5.dist-info}/RECORD +32 -32
  31. tree_sitter_analyzer-0.9.3.dist-info/METADATA +0 -409
  32. {tree_sitter_analyzer-0.9.3.dist-info → tree_sitter_analyzer-0.9.5.dist-info}/WHEEL +0 -0
  33. {tree_sitter_analyzer-0.9.3.dist-info → tree_sitter_analyzer-0.9.5.dist-info}/entry_points.txt +0 -0
@@ -1,224 +1,224 @@
1
- #!/usr/bin/env python3
2
- """
3
- Dynamic Language Loader
4
-
5
- Handles loading of Tree-sitter language parsers with efficient caching
6
- and lazy loading for optimal performance.
7
- """
8
-
9
- import importlib
10
- from typing import TYPE_CHECKING, Any, Optional
11
-
12
- if TYPE_CHECKING:
13
- from tree_sitter import Language, Parser
14
-
15
- try:
16
- import tree_sitter
17
-
18
- TREE_SITTER_AVAILABLE = True
19
- except ImportError:
20
- TREE_SITTER_AVAILABLE = False
21
-
22
- from .utils import log_warning
23
-
24
-
25
- class LanguageLoader:
26
- """Optimized language loader with enhanced caching"""
27
-
28
- # 対応言語とモジュールのマッピング(最適化:frozendict使用を検討)
29
- LANGUAGE_MODULES = {
30
- "java": "tree_sitter_java",
31
- "javascript": "tree_sitter_javascript",
32
- "typescript": "tree_sitter_typescript",
33
- "tsx": "tree_sitter_typescript",
34
- "python": "tree_sitter_python",
35
- "c": "tree_sitter_c",
36
- "cpp": "tree_sitter_cpp",
37
- "rust": "tree_sitter_rust",
38
- "go": "tree_sitter_go",
39
- }
40
-
41
- # TypeScript特別処理(TypeScriptとTSX)
42
- TYPESCRIPT_DIALECTS = {"typescript": "typescript", "tsx": "tsx"}
43
-
44
- @property
45
- def SUPPORTED_LANGUAGES(self) -> list:
46
- """サポートされている言語のリストを取得するプロパティ"""
47
- return list(self.LANGUAGE_MODULES.keys())
48
-
49
- def __init__(self) -> None:
50
- """ローダーを初期化(最適化:事前キャッシュ容量指定)"""
51
- self._loaded_languages: dict[str, Language] = {}
52
- self._loaded_modules: dict[str, Any] = {}
53
- self._availability_cache: dict[str, bool] = {}
54
- self._parser_cache: dict[str, Parser] = {} # パーサーキャッシュ追加
55
- self._unavailable_languages: set[str] = set() # 利用不可言語の記録
56
-
57
- def is_language_available(self, language: str) -> bool:
58
- """
59
- 指定された言語のライブラリが利用可能かチェック
60
-
61
- Args:
62
- language: 言語名
63
-
64
- Returns:
65
- 利用可能性
66
- """
67
- # 事前に利用不可とわかっている言語は即座に返す
68
- if language in self._unavailable_languages:
69
- return False
70
-
71
- if language in self._availability_cache:
72
- return self._availability_cache[language]
73
-
74
- if not TREE_SITTER_AVAILABLE:
75
- self._availability_cache[language] = False
76
- self._unavailable_languages.add(language)
77
- return False
78
-
79
- module_name = self.LANGUAGE_MODULES.get(language)
80
- if not module_name:
81
- self._availability_cache[language] = False
82
- self._unavailable_languages.add(language)
83
- return False
84
-
85
- try:
86
- importlib.import_module(module_name)
87
- self._availability_cache[language] = True
88
- return True
89
- except ImportError:
90
- self._availability_cache[language] = False
91
- self._unavailable_languages.add(language)
92
- return False
93
-
94
- def load_language(self, language: str) -> Optional["Language"]:
95
- """Load and return a tree-sitter Language object for the specified language"""
96
- if not TREE_SITTER_AVAILABLE:
97
- log_warning("Tree-sitter is not available")
98
- return None
99
-
100
- # キャッシュから取得(最適化)
101
- if language in self._loaded_languages:
102
- return self._loaded_languages[language]
103
-
104
- if not self.is_language_available(language):
105
- return None
106
-
107
- try:
108
- module_name = self.LANGUAGE_MODULES[language]
109
-
110
- # モジュールキャッシュから取得または新規読み込み
111
- if module_name not in self._loaded_modules:
112
- self._loaded_modules[module_name] = importlib.import_module(module_name)
113
-
114
- module = self._loaded_modules[module_name]
115
-
116
- # TypeScript特別処理
117
- if language in self.TYPESCRIPT_DIALECTS:
118
- dialect = self.TYPESCRIPT_DIALECTS[language]
119
- if hasattr(module, "language_typescript") and dialect == "typescript":
120
- language_func = module.language_typescript
121
- elif hasattr(module, "language_tsx") and dialect == "tsx":
122
- language_func = module.language_tsx
123
- elif hasattr(module, "language"):
124
- language_func = module.language
125
- else:
126
- return None
127
- else:
128
- if hasattr(module, "language"):
129
- language_func = module.language
130
- else:
131
- return None
132
-
133
- # Language オブジェクト作成(最適化:一度だけ作成)
134
- tree_sitter_language = tree_sitter.Language(language_func())
135
- self._loaded_languages[language] = tree_sitter_language
136
- return tree_sitter_language
137
-
138
- except (ImportError, AttributeError, Exception) as e:
139
- log_warning(f"Failed to load language '{language}': {e}")
140
- self._unavailable_languages.add(language)
141
- return None
142
-
143
- def create_parser_safely(self, language: str) -> Optional["Parser"]:
144
- """Create a parser for the specified language with error handling"""
145
- if not TREE_SITTER_AVAILABLE:
146
- log_warning("Tree-sitter is not available")
147
- return None
148
-
149
- # パーサーキャッシュから取得
150
- if language in self._parser_cache:
151
- return self._parser_cache[language]
152
-
153
- tree_sitter_language = self.load_language(language)
154
- if tree_sitter_language is None:
155
- return None
156
-
157
- try:
158
- parser = tree_sitter.Parser(tree_sitter_language)
159
- # パーサーをキャッシュ(最適化)
160
- self._parser_cache[language] = parser
161
- return parser
162
- except Exception as e:
163
- log_warning(f"Failed to create parser for '{language}': {e}")
164
- return None
165
-
166
- def create_parser(self, language: str) -> Optional["Parser"]:
167
- """Create a parser for the specified language (alias for create_parser_safely)"""
168
- return self.create_parser_safely(language)
169
-
170
- def get_supported_languages(self) -> list:
171
- """
172
- サポートされている言語のリストを取得(最適化:結果キャッシュ)
173
-
174
- Returns:
175
- サポート言語のリスト
176
- """
177
- # 利用可能な言語のみを返す(効率化)
178
- return [
179
- lang
180
- for lang in self.LANGUAGE_MODULES.keys()
181
- if lang not in self._unavailable_languages
182
- and self.is_language_available(lang)
183
- ]
184
-
185
- def clear_cache(self) -> None:
186
- """キャッシュをクリア(メモリ管理用)"""
187
- self._loaded_languages.clear()
188
- self._loaded_modules.clear()
189
- self._availability_cache.clear()
190
- self._parser_cache.clear()
191
- self._unavailable_languages.clear()
192
- # 可用性キャッシュもクリア
193
- self._availability_cache.clear()
194
-
195
-
196
- # グローバルインスタンス(最適化:シングルトンパターン)
197
- _loader_instance = None
198
-
199
-
200
- def get_loader() -> "LanguageLoader":
201
- """Get singleton loader instance"""
202
- global _loader_instance
203
- if _loader_instance is None:
204
- _loader_instance = LanguageLoader()
205
- return _loader_instance
206
-
207
-
208
- # 後方互換性のため
209
- loader = get_loader()
210
-
211
-
212
- def check_language_availability(language: str) -> bool:
213
- """言語の利用可能性をチェック"""
214
- return get_loader().is_language_available(language)
215
-
216
-
217
- def create_parser_safely(language: str) -> Optional["Parser"]:
218
- """安全にパーサーを作成"""
219
- return get_loader().create_parser_safely(language)
220
-
221
-
222
- def load_language(language: str) -> Optional["Language"]:
223
- """言語をロード"""
224
- return get_loader().load_language(language)
1
+ #!/usr/bin/env python3
2
+ """
3
+ Dynamic Language Loader
4
+
5
+ Handles loading of Tree-sitter language parsers with efficient caching
6
+ and lazy loading for optimal performance.
7
+ """
8
+
9
+ import importlib
10
+ from typing import TYPE_CHECKING, Any, Optional
11
+
12
+ if TYPE_CHECKING:
13
+ from tree_sitter import Language, Parser
14
+
15
+ try:
16
+ import tree_sitter
17
+
18
+ TREE_SITTER_AVAILABLE = True
19
+ except ImportError:
20
+ TREE_SITTER_AVAILABLE = False
21
+
22
+ from .utils import log_warning
23
+
24
+
25
+ class LanguageLoader:
26
+ """Optimized language loader with enhanced caching"""
27
+
28
+ # 対応言語とモジュールのマッピング(最適化:frozendict使用を検討)
29
+ LANGUAGE_MODULES = {
30
+ "java": "tree_sitter_java",
31
+ "javascript": "tree_sitter_javascript",
32
+ "typescript": "tree_sitter_typescript",
33
+ "tsx": "tree_sitter_typescript",
34
+ "python": "tree_sitter_python",
35
+ "c": "tree_sitter_c",
36
+ "cpp": "tree_sitter_cpp",
37
+ "rust": "tree_sitter_rust",
38
+ "go": "tree_sitter_go",
39
+ }
40
+
41
+ # TypeScript特別処理(TypeScriptとTSX)
42
+ TYPESCRIPT_DIALECTS = {"typescript": "typescript", "tsx": "tsx"}
43
+
44
+ @property
45
+ def SUPPORTED_LANGUAGES(self) -> list:
46
+ """サポートされている言語のリストを取得するプロパティ"""
47
+ return list(self.LANGUAGE_MODULES.keys())
48
+
49
+ def __init__(self) -> None:
50
+ """ローダーを初期化(最適化:事前キャッシュ容量指定)"""
51
+ self._loaded_languages: dict[str, Language] = {}
52
+ self._loaded_modules: dict[str, Any] = {}
53
+ self._availability_cache: dict[str, bool] = {}
54
+ self._parser_cache: dict[str, Parser] = {} # パーサーキャッシュ追加
55
+ self._unavailable_languages: set[str] = set() # 利用不可言語の記録
56
+
57
+ def is_language_available(self, language: str) -> bool:
58
+ """
59
+ 指定された言語のライブラリが利用可能かチェック
60
+
61
+ Args:
62
+ language: 言語名
63
+
64
+ Returns:
65
+ 利用可能性
66
+ """
67
+ # 事前に利用不可とわかっている言語は即座に返す
68
+ if language in self._unavailable_languages:
69
+ return False
70
+
71
+ if language in self._availability_cache:
72
+ return self._availability_cache[language]
73
+
74
+ if not TREE_SITTER_AVAILABLE:
75
+ self._availability_cache[language] = False
76
+ self._unavailable_languages.add(language)
77
+ return False
78
+
79
+ module_name = self.LANGUAGE_MODULES.get(language)
80
+ if not module_name:
81
+ self._availability_cache[language] = False
82
+ self._unavailable_languages.add(language)
83
+ return False
84
+
85
+ try:
86
+ importlib.import_module(module_name)
87
+ self._availability_cache[language] = True
88
+ return True
89
+ except ImportError:
90
+ self._availability_cache[language] = False
91
+ self._unavailable_languages.add(language)
92
+ return False
93
+
94
+ def load_language(self, language: str) -> Optional["Language"]:
95
+ """Load and return a tree-sitter Language object for the specified language"""
96
+ if not TREE_SITTER_AVAILABLE:
97
+ log_warning("Tree-sitter is not available")
98
+ return None
99
+
100
+ # キャッシュから取得(最適化)
101
+ if language in self._loaded_languages:
102
+ return self._loaded_languages[language]
103
+
104
+ if not self.is_language_available(language):
105
+ return None
106
+
107
+ try:
108
+ module_name = self.LANGUAGE_MODULES[language]
109
+
110
+ # モジュールキャッシュから取得または新規読み込み
111
+ if module_name not in self._loaded_modules:
112
+ self._loaded_modules[module_name] = importlib.import_module(module_name)
113
+
114
+ module = self._loaded_modules[module_name]
115
+
116
+ # TypeScript特別処理
117
+ if language in self.TYPESCRIPT_DIALECTS:
118
+ dialect = self.TYPESCRIPT_DIALECTS[language]
119
+ if hasattr(module, "language_typescript") and dialect == "typescript":
120
+ language_func = module.language_typescript
121
+ elif hasattr(module, "language_tsx") and dialect == "tsx":
122
+ language_func = module.language_tsx
123
+ elif hasattr(module, "language"):
124
+ language_func = module.language
125
+ else:
126
+ return None
127
+ else:
128
+ if hasattr(module, "language"):
129
+ language_func = module.language
130
+ else:
131
+ return None
132
+
133
+ # Language オブジェクト作成(最適化:一度だけ作成)
134
+ tree_sitter_language = tree_sitter.Language(language_func())
135
+ self._loaded_languages[language] = tree_sitter_language
136
+ return tree_sitter_language
137
+
138
+ except (ImportError, AttributeError, Exception) as e:
139
+ log_warning(f"Failed to load language '{language}': {e}")
140
+ self._unavailable_languages.add(language)
141
+ return None
142
+
143
+ def create_parser_safely(self, language: str) -> Optional["Parser"]:
144
+ """Create a parser for the specified language with error handling"""
145
+ if not TREE_SITTER_AVAILABLE:
146
+ log_warning("Tree-sitter is not available")
147
+ return None
148
+
149
+ # パーサーキャッシュから取得
150
+ if language in self._parser_cache:
151
+ return self._parser_cache[language]
152
+
153
+ tree_sitter_language = self.load_language(language)
154
+ if tree_sitter_language is None:
155
+ return None
156
+
157
+ try:
158
+ parser = tree_sitter.Parser(tree_sitter_language)
159
+ # パーサーをキャッシュ(最適化)
160
+ self._parser_cache[language] = parser
161
+ return parser
162
+ except Exception as e:
163
+ log_warning(f"Failed to create parser for '{language}': {e}")
164
+ return None
165
+
166
+ def create_parser(self, language: str) -> Optional["Parser"]:
167
+ """Create a parser for the specified language (alias for create_parser_safely)"""
168
+ return self.create_parser_safely(language)
169
+
170
+ def get_supported_languages(self) -> list:
171
+ """
172
+ サポートされている言語のリストを取得(最適化:結果キャッシュ)
173
+
174
+ Returns:
175
+ サポート言語のリスト
176
+ """
177
+ # 利用可能な言語のみを返す(効率化)
178
+ return [
179
+ lang
180
+ for lang in self.LANGUAGE_MODULES.keys()
181
+ if lang not in self._unavailable_languages
182
+ and self.is_language_available(lang)
183
+ ]
184
+
185
+ def clear_cache(self) -> None:
186
+ """キャッシュをクリア(メモリ管理用)"""
187
+ self._loaded_languages.clear()
188
+ self._loaded_modules.clear()
189
+ self._availability_cache.clear()
190
+ self._parser_cache.clear()
191
+ self._unavailable_languages.clear()
192
+ # 可用性キャッシュもクリア
193
+ self._availability_cache.clear()
194
+
195
+
196
+ # グローバルインスタンス(最適化:シングルトンパターン)
197
+ _loader_instance = None
198
+
199
+
200
+ def get_loader() -> "LanguageLoader":
201
+ """Get singleton loader instance"""
202
+ global _loader_instance
203
+ if _loader_instance is None:
204
+ _loader_instance = LanguageLoader()
205
+ return _loader_instance
206
+
207
+
208
+ # 後方互換性のため
209
+ loader = get_loader()
210
+
211
+
212
+ def check_language_availability(language: str) -> bool:
213
+ """言語の利用可能性をチェック"""
214
+ return get_loader().is_language_available(language)
215
+
216
+
217
+ def create_parser_safely(language: str) -> Optional["Parser"]:
218
+ """安全にパーサーを作成"""
219
+ return get_loader().create_parser_safely(language)
220
+
221
+
222
+ def load_language(language: str) -> Optional["Language"]:
223
+ """言語をロード"""
224
+ return get_loader().load_language(language)