tree-sitter-analyzer 0.3.0__py3-none-any.whl → 0.6.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 (63) hide show
  1. tree_sitter_analyzer/__init__.py +5 -6
  2. tree_sitter_analyzer/__main__.py +2 -2
  3. tree_sitter_analyzer/api.py +4 -2
  4. tree_sitter_analyzer/cli/__init__.py +3 -3
  5. tree_sitter_analyzer/cli/commands/advanced_command.py +1 -1
  6. tree_sitter_analyzer/cli/commands/base_command.py +1 -1
  7. tree_sitter_analyzer/cli/commands/default_command.py +1 -1
  8. tree_sitter_analyzer/cli/commands/partial_read_command.py +2 -2
  9. tree_sitter_analyzer/cli/commands/query_command.py +5 -5
  10. tree_sitter_analyzer/cli/commands/summary_command.py +2 -2
  11. tree_sitter_analyzer/cli/commands/table_command.py +14 -11
  12. tree_sitter_analyzer/cli/info_commands.py +14 -13
  13. tree_sitter_analyzer/cli_main.py +51 -31
  14. tree_sitter_analyzer/core/analysis_engine.py +54 -90
  15. tree_sitter_analyzer/core/cache_service.py +31 -31
  16. tree_sitter_analyzer/core/engine.py +6 -4
  17. tree_sitter_analyzer/core/parser.py +1 -1
  18. tree_sitter_analyzer/core/query.py +502 -494
  19. tree_sitter_analyzer/encoding_utils.py +3 -2
  20. tree_sitter_analyzer/exceptions.py +23 -23
  21. tree_sitter_analyzer/file_handler.py +7 -14
  22. tree_sitter_analyzer/formatters/base_formatter.py +18 -18
  23. tree_sitter_analyzer/formatters/formatter_factory.py +15 -15
  24. tree_sitter_analyzer/formatters/java_formatter.py +291 -287
  25. tree_sitter_analyzer/formatters/python_formatter.py +259 -255
  26. tree_sitter_analyzer/interfaces/cli.py +1 -1
  27. tree_sitter_analyzer/interfaces/cli_adapter.py +62 -41
  28. tree_sitter_analyzer/interfaces/mcp_adapter.py +43 -17
  29. tree_sitter_analyzer/interfaces/mcp_server.py +9 -9
  30. tree_sitter_analyzer/language_detector.py +398 -398
  31. tree_sitter_analyzer/language_loader.py +224 -224
  32. tree_sitter_analyzer/languages/java_plugin.py +1174 -1129
  33. tree_sitter_analyzer/{plugins → languages}/javascript_plugin.py +3 -3
  34. tree_sitter_analyzer/languages/python_plugin.py +26 -8
  35. tree_sitter_analyzer/mcp/resources/code_file_resource.py +0 -3
  36. tree_sitter_analyzer/mcp/resources/project_stats_resource.py +555 -560
  37. tree_sitter_analyzer/mcp/server.py +4 -4
  38. tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +63 -30
  39. tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py +9 -4
  40. tree_sitter_analyzer/mcp/tools/table_format_tool.py +2 -2
  41. tree_sitter_analyzer/mcp/utils/__init__.py +10 -8
  42. tree_sitter_analyzer/models.py +470 -470
  43. tree_sitter_analyzer/output_manager.py +12 -20
  44. tree_sitter_analyzer/plugins/__init__.py +9 -62
  45. tree_sitter_analyzer/plugins/base.py +53 -1
  46. tree_sitter_analyzer/plugins/manager.py +29 -12
  47. tree_sitter_analyzer/queries/java.py +78 -78
  48. tree_sitter_analyzer/queries/javascript.py +7 -7
  49. tree_sitter_analyzer/queries/python.py +18 -18
  50. tree_sitter_analyzer/queries/typescript.py +12 -12
  51. tree_sitter_analyzer/query_loader.py +17 -14
  52. tree_sitter_analyzer/table_formatter.py +24 -19
  53. tree_sitter_analyzer/utils.py +7 -7
  54. {tree_sitter_analyzer-0.3.0.dist-info → tree_sitter_analyzer-0.6.0.dist-info}/METADATA +11 -11
  55. tree_sitter_analyzer-0.6.0.dist-info/RECORD +72 -0
  56. {tree_sitter_analyzer-0.3.0.dist-info → tree_sitter_analyzer-0.6.0.dist-info}/entry_points.txt +2 -1
  57. tree_sitter_analyzer/java_analyzer.py +0 -218
  58. tree_sitter_analyzer/plugins/java_plugin.py +0 -608
  59. tree_sitter_analyzer/plugins/plugin_loader.py +0 -85
  60. tree_sitter_analyzer/plugins/python_plugin.py +0 -606
  61. tree_sitter_analyzer/plugins/registry.py +0 -374
  62. tree_sitter_analyzer-0.3.0.dist-info/RECORD +0 -77
  63. {tree_sitter_analyzer-0.3.0.dist-info → tree_sitter_analyzer-0.6.0.dist-info}/WHEEL +0 -0
@@ -1,218 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Java Code Analyzer with tree-sitter
4
- """
5
-
6
- from typing import Any
7
-
8
- try:
9
- import tree_sitter
10
- import tree_sitter_java as tsjava
11
- from tree_sitter import Language, Parser
12
-
13
- TREE_SITTER_AVAILABLE = True
14
- except ImportError:
15
- TREE_SITTER_AVAILABLE = False
16
- from .utils import log_error
17
-
18
- log_error(
19
- "tree-sitter libraries not found. Please install tree-sitter and tree-sitter-java."
20
- )
21
-
22
- from .file_handler import read_file_with_fallback
23
- from .output_manager import output_error, output_info, output_warning
24
- from .utils import log_error, log_info
25
-
26
-
27
- class CodeAnalyzer:
28
- """
29
- Tree-sitterを使用してソースコードを解析するコアクラス。
30
-
31
- Attributes:
32
- language: Tree-sitter言語オブジェクト
33
- parser: Tree-sitterパーサー
34
- source_code_bytes: 解析対象のソースコードのバイト列
35
- tree: 構築されたAST
36
- """
37
-
38
- def __init__(self, language: str = "java") -> None:
39
- """
40
- 指定された言語用のパーサーを初期化する。
41
-
42
- Args:
43
- language: 解析対象のプログラミング言語。現在はJavaのみサポート。
44
-
45
- Raises:
46
- SystemExit: Tree-sitterライブラリの初期化に失敗した場合
47
- """
48
- if not TREE_SITTER_AVAILABLE:
49
- output_error("ERROR: Tree-sitter libraries not available.")
50
- raise RuntimeError("Tree-sitter libraries not available")
51
-
52
- try:
53
- if language != "java":
54
- output_warning(
55
- "WARNING: Currently only Java is supported. Using Java parser."
56
- )
57
-
58
- self.language = Language(tsjava.language())
59
- self.parser = Parser(self.language)
60
- self.source_code_bytes: bytes = b""
61
- self.tree: tree_sitter.Tree | None = None
62
-
63
- except Exception as e:
64
- output_error(
65
- f"ERROR: '{language}' 言語の初期化に失敗しました。ライブラリが正しくインストールされているか確認してください。"
66
- )
67
- output_error(f"詳細: {e}")
68
- raise RuntimeError(
69
- f"Failed to initialize language '{language}': {e}"
70
- ) from e
71
-
72
- def parse_file(self, file_path: str) -> bool:
73
- """
74
- 指定されたファイルを解析し、AST(抽象構文木)を構築する。
75
-
76
- Args:
77
- file_path: 解析するソースファイルのパス
78
-
79
- Returns:
80
- 解析に成功した場合はTrue、失敗した場合はFalse
81
-
82
- Raises:
83
- None: エラーは内部でハンドリングし、戻り値で示す
84
- """
85
- try:
86
- source_bytes = read_file_with_fallback(file_path)
87
- if source_bytes is None:
88
- output_error(
89
- f"ERROR: ファイル '{file_path}' の読み込みに失敗しました。"
90
- )
91
- return False
92
-
93
- self.source_code_bytes = source_bytes
94
- self.tree = self.parser.parse(self.source_code_bytes)
95
-
96
- if self.tree is None:
97
- output_error(f"ERROR: '{file_path}' のAST構築に失敗しました。")
98
- return False
99
-
100
- log_info(f"INFO: '{file_path}' の解析が完了し、ASTを構築しました。")
101
- return True
102
-
103
- except Exception as e:
104
- output_error(f"ERROR: ファイル解析中にエラーが発生しました: {e}")
105
- return False
106
-
107
- def execute_query(self, query_string: str) -> list[dict[str, Any]]:
108
- """
109
- ASTに対して指定されたクエリを実行し、マッチしたノードの情報を抽出する。
110
-
111
- Args:
112
- query_string: 実行するTree-sitterクエリ
113
-
114
- Returns:
115
- マッチした各ノードの情報(内容、位置、キャプチャ名)のリスト
116
-
117
- Raises:
118
- None: エラーは内部でハンドリングし、空リストを返す
119
- """
120
- if not self.tree:
121
- output_error(
122
- "ERROR: ASTが構築されていません。先にparse_fileを実行してください。"
123
- )
124
- return []
125
-
126
- try:
127
- query = self.language.query(query_string)
128
- except Exception as e:
129
- output_error(
130
- f"ERROR: クエリのコンパイルに失敗しました。\nクエリ: {query_string}\nエラー: {e}"
131
- )
132
- return []
133
-
134
- try:
135
- captures = query.captures(self.tree.root_node)
136
- except Exception as e:
137
- output_error(f"ERROR: クエリの実行に失敗しました: {e}")
138
- return []
139
-
140
- results = []
141
-
142
- # Tree-sitter 0.24以降の辞書形式に対応
143
- try:
144
- if isinstance(captures, dict):
145
- # 新しい辞書形式: {capture_name: [nodes...]}
146
- for capture_name, nodes in captures.items():
147
- if isinstance(nodes, list):
148
- for node in nodes:
149
- try:
150
- start_line = node.start_point[0] + 1
151
- end_line = node.end_point[0] + 1
152
- node_text = self.source_code_bytes[
153
- node.start_byte : node.end_byte
154
- ].decode("utf-8", errors="ignore")
155
-
156
- results.append(
157
- {
158
- "capture_name": capture_name,
159
- "content": node_text,
160
- "start_line": start_line,
161
- "end_line": end_line,
162
- "node_type": node.type,
163
- }
164
- )
165
- except Exception as e:
166
- output_warning(
167
- f"WARNING: ノード処理中にエラーが発生しました: {e}"
168
- )
169
- continue
170
- else:
171
- # 古い形式への対応(フォールバック)
172
- if hasattr(captures, "__iter__"):
173
- for capture in captures:
174
- try:
175
- if isinstance(capture, tuple) and len(capture) == 2:
176
- node, capture_name = capture
177
- start_line = node.start_point[0] + 1
178
- end_line = node.end_point[0] + 1
179
- node_text = self.source_code_bytes[
180
- node.start_byte : node.end_byte
181
- ].decode("utf-8", errors="ignore")
182
-
183
- results.append(
184
- {
185
- "capture_name": capture_name,
186
- "content": node_text,
187
- "start_line": start_line,
188
- "end_line": end_line,
189
- "node_type": node.type,
190
- }
191
- )
192
- except Exception as e:
193
- output_warning(
194
- f"WARNING: ノード処理中にエラーが発生しました: {e}"
195
- )
196
- continue
197
-
198
- except Exception as e:
199
- output_error(f"ERROR: capture処理中に予期しないエラーが発生しました: {e}")
200
- return []
201
-
202
- return results
203
-
204
-
205
- def main() -> None:
206
- """
207
- モジュールが直接実行された場合のエントリーポイント。
208
- 通常はcli.pyを使用することを推奨。
209
- """
210
- output_warning("注意: 直接的なモジュール実行は非推奨です。")
211
- output_warning("代わりに以下を使用してください:")
212
- output_info(" uv run java-analyzer <file> --query-key <key>")
213
- output_info(" または")
214
- output_info(" python -m tree_sitter_analyzer.cli <file> --query-key <key>")
215
-
216
-
217
- if __name__ == "__main__":
218
- main()