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,233 +1,232 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- """
4
- Table Command
5
-
6
- Handles table format output generation.
7
- """
8
-
9
- import sys
10
-
11
- from ...output_manager import output_error
12
- from ...table_formatter import create_table_formatter
13
- from .base_command import BaseCommand
14
-
15
-
16
- class TableCommand(BaseCommand):
17
- """Command for generating table format output."""
18
-
19
- async def execute_async(self, language: str) -> int:
20
- """Execute table format generation."""
21
- try:
22
- # Perform analysis
23
- analysis_result = await self.analyze_file(language)
24
- if not analysis_result:
25
- return 1
26
-
27
- # Convert analysis result to structure format
28
- structure_result = self._convert_to_structure_format(
29
- analysis_result, language
30
- )
31
-
32
- # Create table formatter
33
- include_javadoc = getattr(self.args, "include_javadoc", False)
34
- formatter = create_table_formatter(
35
- self.args.table, language, include_javadoc
36
- )
37
- table_output = formatter.format_structure(structure_result)
38
-
39
- # Output table
40
- self._output_table(table_output)
41
-
42
- return 0
43
-
44
- except Exception as e:
45
- output_error(f"ERROR: テーブル形式での解析でエラーが発生しました: {e}")
46
- return 1
47
-
48
- def _convert_to_structure_format(self, analysis_result, language: str) -> dict:
49
- """Convert AnalysisResult to the format expected by table formatter."""
50
- classes = []
51
- methods = []
52
- fields = []
53
- imports = []
54
- package_name = "unknown"
55
-
56
- # Process each element
57
- for i, element in enumerate(analysis_result.elements):
58
- try:
59
- element_type = getattr(element, "__class__", type(element)).__name__
60
- element_name = getattr(element, "name", None)
61
-
62
- if element_type == "Package":
63
- package_name = element_name
64
- elif element_type == "Class":
65
- classes.append(self._convert_class_element(element, i))
66
- elif element_type == "Function":
67
- methods.append(self._convert_function_element(element, language))
68
- elif element_type == "Variable":
69
- fields.append(self._convert_variable_element(element, language))
70
- elif element_type == "Import":
71
- imports.append(self._convert_import_element(element))
72
-
73
- except Exception as element_error:
74
- output_error(f"ERROR: Element {i} processing failed: {element_error}")
75
- continue
76
-
77
- return {
78
- "file_path": analysis_result.file_path,
79
- "language": analysis_result.language,
80
- "line_count": analysis_result.line_count,
81
- "package": {"name": package_name},
82
- "classes": classes,
83
- "methods": methods,
84
- "fields": fields,
85
- "imports": imports,
86
- "statistics": {
87
- "method_count": len(methods),
88
- "field_count": len(fields),
89
- "class_count": len(classes),
90
- "import_count": len(imports),
91
- },
92
- }
93
-
94
- def _convert_class_element(self, element, index: int) -> dict:
95
- """Convert class element to table format."""
96
- element_name = getattr(element, "name", None)
97
- final_name = element_name if element_name else f"UnknownClass_{index}"
98
-
99
- return {
100
- "name": final_name,
101
- "type": "class",
102
- "visibility": "public",
103
- "line_range": {
104
- "start": getattr(element, "start_line", 0),
105
- "end": getattr(element, "end_line", 0),
106
- },
107
- }
108
-
109
- def _convert_function_element(self, element, language: str) -> dict:
110
- """Convert function element to table format."""
111
- # Process parameters based on language
112
- params = getattr(element, "parameters", [])
113
- processed_params = self._process_parameters(params, language)
114
-
115
- # Get visibility
116
- visibility = self._get_element_visibility(element)
117
-
118
- # Get JavaDoc if enabled
119
- include_javadoc = getattr(self.args, "include_javadoc", False)
120
- javadoc = getattr(element, "docstring", "") or "" if include_javadoc else ""
121
-
122
- return {
123
- "name": getattr(element, "name", str(element)),
124
- "visibility": visibility,
125
- "return_type": getattr(element, "return_type", "Any"),
126
- "parameters": processed_params,
127
- "is_constructor": getattr(element, "is_constructor", False),
128
- "is_static": getattr(element, "is_static", False),
129
- "complexity_score": getattr(element, "complexity_score", 1),
130
- "line_range": {
131
- "start": getattr(element, "start_line", 0),
132
- "end": getattr(element, "end_line", 0),
133
- },
134
- "javadoc": javadoc,
135
- }
136
-
137
- def _convert_variable_element(self, element, language: str) -> dict:
138
- """Convert variable element to table format."""
139
- # Get field type based on language
140
- if language == "python":
141
- field_type = getattr(element, "variable_type", "") or ""
142
- else:
143
- field_type = getattr(element, "variable_type", "") or getattr(
144
- element, "field_type", ""
145
- )
146
-
147
- # Get visibility
148
- field_visibility = self._get_element_visibility(element)
149
-
150
- # Get JavaDoc if enabled
151
- include_javadoc = getattr(self.args, "include_javadoc", False)
152
- javadoc = getattr(element, "docstring", "") or "" if include_javadoc else ""
153
-
154
- return {
155
- "name": getattr(element, "name", str(element)),
156
- "type": field_type,
157
- "visibility": field_visibility,
158
- "modifiers": getattr(element, "modifiers", []),
159
- "line_range": {
160
- "start": getattr(element, "start_line", 0),
161
- "end": getattr(element, "end_line", 0),
162
- },
163
- "javadoc": javadoc,
164
- }
165
-
166
- def _convert_import_element(self, element) -> dict:
167
- """Convert import element to table format."""
168
- return {
169
- "statement": getattr(element, "name", str(element)),
170
- "name": getattr(element, "name", str(element)),
171
- }
172
-
173
- def _process_parameters(self, params, language: str) -> list:
174
- """Process parameters based on language syntax."""
175
- if isinstance(params, str):
176
- param_list = []
177
- if params.strip():
178
- param_names = [p.strip() for p in params.split(",") if p.strip()]
179
- param_list = [{"name": name, "type": "Any"} for name in param_names]
180
- return param_list
181
- elif isinstance(params, list):
182
- param_list = []
183
- for param in params:
184
- if isinstance(param, str):
185
- param = param.strip()
186
- if language == "python":
187
- # Python format: "name: type"
188
- if ":" in param:
189
- parts = param.split(":", 1)
190
- param_name = parts[0].strip()
191
- param_type = parts[1].strip() if len(parts) > 1 else "Any"
192
- param_list.append({"name": param_name, "type": param_type})
193
- else:
194
- param_list.append({"name": param, "type": "Any"})
195
- else:
196
- # Java format: "Type name"
197
- last_space_idx = param.rfind(" ")
198
- if last_space_idx != -1:
199
- param_type = param[:last_space_idx].strip()
200
- param_name = param[last_space_idx + 1 :].strip()
201
- if param_type and param_name:
202
- param_list.append(
203
- {"name": param_name, "type": param_type}
204
- )
205
- else:
206
- param_list.append({"name": param, "type": "Any"})
207
- else:
208
- param_list.append({"name": param, "type": "Any"})
209
- elif isinstance(param, dict):
210
- param_list.append(param)
211
- else:
212
- param_list.append({"name": str(param), "type": "Any"})
213
- return param_list
214
- else:
215
- return []
216
-
217
- def _get_element_visibility(self, element) -> str:
218
- """Get element visibility."""
219
- visibility = getattr(element, "visibility", "public")
220
- if hasattr(element, "is_private") and getattr(element, "is_private", False):
221
- visibility = "private"
222
- elif hasattr(element, "is_public") and getattr(element, "is_public", False):
223
- visibility = "public"
224
- return visibility
225
-
226
- def _output_table(self, table_output: str) -> None:
227
- """Output the table with proper encoding."""
228
- try:
229
- # Windows対応: UTF-8エンコーディングで出力
230
- sys.stdout.buffer.write(table_output.encode("utf-8"))
231
- except (AttributeError, UnicodeEncodeError):
232
- # フォールバック: 通常のprint
233
- print(table_output, end="")
1
+ #!/usr/bin/env python3
2
+ """
3
+ Table Command
4
+
5
+ Handles table format output generation.
6
+ """
7
+
8
+ import sys
9
+
10
+ from ...output_manager import output_error
11
+ from ...table_formatter import create_table_formatter
12
+ from .base_command import BaseCommand
13
+
14
+
15
+ class TableCommand(BaseCommand):
16
+ """Command for generating table format output."""
17
+
18
+ async def execute_async(self, language: str) -> int:
19
+ """Execute table format generation."""
20
+ try:
21
+ # Perform analysis
22
+ analysis_result = await self.analyze_file(language)
23
+ if not analysis_result:
24
+ return 1
25
+
26
+ # Convert analysis result to structure format
27
+ structure_result = self._convert_to_structure_format(
28
+ analysis_result, language
29
+ )
30
+
31
+ # Create table formatter
32
+ include_javadoc = getattr(self.args, "include_javadoc", False)
33
+ formatter = create_table_formatter(
34
+ self.args.table, language, include_javadoc
35
+ )
36
+ table_output = formatter.format_structure(structure_result)
37
+
38
+ # Output table
39
+ self._output_table(table_output)
40
+
41
+ return 0
42
+
43
+ except Exception as e:
44
+ output_error(f"ERROR: テーブル形式での解析でエラーが発生しました: {e}")
45
+ return 1
46
+
47
+ def _convert_to_structure_format(self, analysis_result, language: str) -> dict:
48
+ """Convert AnalysisResult to the format expected by table formatter."""
49
+ classes = []
50
+ methods = []
51
+ fields = []
52
+ imports = []
53
+ package_name = "unknown"
54
+
55
+ # Process each element
56
+ for i, element in enumerate(analysis_result.elements):
57
+ try:
58
+ element_type = getattr(element, "__class__", type(element)).__name__
59
+ element_name = getattr(element, "name", None)
60
+
61
+ if element_type == "Package":
62
+ package_name = element_name
63
+ elif element_type == "Class":
64
+ classes.append(self._convert_class_element(element, i))
65
+ elif element_type == "Function":
66
+ methods.append(self._convert_function_element(element, language))
67
+ elif element_type == "Variable":
68
+ fields.append(self._convert_variable_element(element, language))
69
+ elif element_type == "Import":
70
+ imports.append(self._convert_import_element(element))
71
+
72
+ except Exception as element_error:
73
+ output_error(f"ERROR: Element {i} processing failed: {element_error}")
74
+ continue
75
+
76
+ return {
77
+ "file_path": analysis_result.file_path,
78
+ "language": analysis_result.language,
79
+ "line_count": analysis_result.line_count,
80
+ "package": {"name": package_name},
81
+ "classes": classes,
82
+ "methods": methods,
83
+ "fields": fields,
84
+ "imports": imports,
85
+ "statistics": {
86
+ "method_count": len(methods),
87
+ "field_count": len(fields),
88
+ "class_count": len(classes),
89
+ "import_count": len(imports),
90
+ },
91
+ }
92
+
93
+ def _convert_class_element(self, element, index: int) -> dict:
94
+ """Convert class element to table format."""
95
+ element_name = getattr(element, "name", None)
96
+ final_name = element_name if element_name else f"UnknownClass_{index}"
97
+
98
+ return {
99
+ "name": final_name,
100
+ "type": "class",
101
+ "visibility": "public",
102
+ "line_range": {
103
+ "start": getattr(element, "start_line", 0),
104
+ "end": getattr(element, "end_line", 0),
105
+ },
106
+ }
107
+
108
+ def _convert_function_element(self, element, language: str) -> dict:
109
+ """Convert function element to table format."""
110
+ # Process parameters based on language
111
+ params = getattr(element, "parameters", [])
112
+ processed_params = self._process_parameters(params, language)
113
+
114
+ # Get visibility
115
+ visibility = self._get_element_visibility(element)
116
+
117
+ # Get JavaDoc if enabled
118
+ include_javadoc = getattr(self.args, "include_javadoc", False)
119
+ javadoc = getattr(element, "docstring", "") or "" if include_javadoc else ""
120
+
121
+ return {
122
+ "name": getattr(element, "name", str(element)),
123
+ "visibility": visibility,
124
+ "return_type": getattr(element, "return_type", "Any"),
125
+ "parameters": processed_params,
126
+ "is_constructor": getattr(element, "is_constructor", False),
127
+ "is_static": getattr(element, "is_static", False),
128
+ "complexity_score": getattr(element, "complexity_score", 1),
129
+ "line_range": {
130
+ "start": getattr(element, "start_line", 0),
131
+ "end": getattr(element, "end_line", 0),
132
+ },
133
+ "javadoc": javadoc,
134
+ }
135
+
136
+ def _convert_variable_element(self, element, language: str) -> dict:
137
+ """Convert variable element to table format."""
138
+ # Get field type based on language
139
+ if language == "python":
140
+ field_type = getattr(element, "variable_type", "") or ""
141
+ else:
142
+ field_type = getattr(element, "variable_type", "") or getattr(
143
+ element, "field_type", ""
144
+ )
145
+
146
+ # Get visibility
147
+ field_visibility = self._get_element_visibility(element)
148
+
149
+ # Get JavaDoc if enabled
150
+ include_javadoc = getattr(self.args, "include_javadoc", False)
151
+ javadoc = getattr(element, "docstring", "") or "" if include_javadoc else ""
152
+
153
+ return {
154
+ "name": getattr(element, "name", str(element)),
155
+ "type": field_type,
156
+ "visibility": field_visibility,
157
+ "modifiers": getattr(element, "modifiers", []),
158
+ "line_range": {
159
+ "start": getattr(element, "start_line", 0),
160
+ "end": getattr(element, "end_line", 0),
161
+ },
162
+ "javadoc": javadoc,
163
+ }
164
+
165
+ def _convert_import_element(self, element) -> dict:
166
+ """Convert import element to table format."""
167
+ return {
168
+ "statement": getattr(element, "name", str(element)),
169
+ "name": getattr(element, "name", str(element)),
170
+ }
171
+
172
+ def _process_parameters(self, params, language: str) -> list:
173
+ """Process parameters based on language syntax."""
174
+ if isinstance(params, str):
175
+ param_list = []
176
+ if params.strip():
177
+ param_names = [p.strip() for p in params.split(",") if p.strip()]
178
+ param_list = [{"name": name, "type": "Any"} for name in param_names]
179
+ return param_list
180
+ elif isinstance(params, list):
181
+ param_list = []
182
+ for param in params:
183
+ if isinstance(param, str):
184
+ param = param.strip()
185
+ if language == "python":
186
+ # Python format: "name: type"
187
+ if ":" in param:
188
+ parts = param.split(":", 1)
189
+ param_name = parts[0].strip()
190
+ param_type = parts[1].strip() if len(parts) > 1 else "Any"
191
+ param_list.append({"name": param_name, "type": param_type})
192
+ else:
193
+ param_list.append({"name": param, "type": "Any"})
194
+ else:
195
+ # Java format: "Type name"
196
+ last_space_idx = param.rfind(" ")
197
+ if last_space_idx != -1:
198
+ param_type = param[:last_space_idx].strip()
199
+ param_name = param[last_space_idx + 1 :].strip()
200
+ if param_type and param_name:
201
+ param_list.append(
202
+ {"name": param_name, "type": param_type}
203
+ )
204
+ else:
205
+ param_list.append({"name": param, "type": "Any"})
206
+ else:
207
+ param_list.append({"name": param, "type": "Any"})
208
+ elif isinstance(param, dict):
209
+ param_list.append(param)
210
+ else:
211
+ param_list.append({"name": str(param), "type": "Any"})
212
+ return param_list
213
+ else:
214
+ return []
215
+
216
+ def _get_element_visibility(self, element) -> str:
217
+ """Get element visibility."""
218
+ visibility = getattr(element, "visibility", "public")
219
+ if hasattr(element, "is_private") and getattr(element, "is_private", False):
220
+ visibility = "private"
221
+ elif hasattr(element, "is_public") and getattr(element, "is_public", False):
222
+ visibility = "public"
223
+ return visibility
224
+
225
+ def _output_table(self, table_output: str) -> None:
226
+ """Output the table with proper encoding."""
227
+ try:
228
+ # Windows対応: UTF-8エンコーディングで出力
229
+ sys.stdout.buffer.write(table_output.encode("utf-8"))
230
+ except (AttributeError, UnicodeEncodeError):
231
+ # フォールバック: 通常のprint
232
+ print(table_output, end="")