tree-sitter-analyzer 0.6.2__py3-none-any.whl → 0.8.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 (69) hide show
  1. tree_sitter_analyzer/__init__.py +132 -132
  2. tree_sitter_analyzer/__main__.py +11 -11
  3. tree_sitter_analyzer/api.py +533 -533
  4. tree_sitter_analyzer/cli/__init__.py +39 -39
  5. tree_sitter_analyzer/cli/__main__.py +12 -12
  6. tree_sitter_analyzer/cli/commands/__init__.py +26 -26
  7. tree_sitter_analyzer/cli/commands/advanced_command.py +88 -88
  8. tree_sitter_analyzer/cli/commands/base_command.py +160 -160
  9. tree_sitter_analyzer/cli/commands/default_command.py +18 -18
  10. tree_sitter_analyzer/cli/commands/partial_read_command.py +141 -141
  11. tree_sitter_analyzer/cli/commands/query_command.py +81 -81
  12. tree_sitter_analyzer/cli/commands/structure_command.py +138 -138
  13. tree_sitter_analyzer/cli/commands/summary_command.py +101 -101
  14. tree_sitter_analyzer/cli/commands/table_command.py +235 -235
  15. tree_sitter_analyzer/cli/info_commands.py +121 -121
  16. tree_sitter_analyzer/cli_main.py +297 -297
  17. tree_sitter_analyzer/core/__init__.py +15 -15
  18. tree_sitter_analyzer/core/analysis_engine.py +555 -555
  19. tree_sitter_analyzer/core/cache_service.py +320 -320
  20. tree_sitter_analyzer/core/engine.py +566 -566
  21. tree_sitter_analyzer/core/parser.py +293 -293
  22. tree_sitter_analyzer/encoding_utils.py +459 -459
  23. tree_sitter_analyzer/exceptions.py +406 -337
  24. tree_sitter_analyzer/file_handler.py +210 -210
  25. tree_sitter_analyzer/formatters/__init__.py +1 -1
  26. tree_sitter_analyzer/formatters/base_formatter.py +167 -167
  27. tree_sitter_analyzer/formatters/formatter_factory.py +78 -78
  28. tree_sitter_analyzer/interfaces/__init__.py +9 -9
  29. tree_sitter_analyzer/interfaces/cli.py +528 -528
  30. tree_sitter_analyzer/interfaces/cli_adapter.py +343 -343
  31. tree_sitter_analyzer/interfaces/mcp_adapter.py +206 -206
  32. tree_sitter_analyzer/interfaces/mcp_server.py +425 -405
  33. tree_sitter_analyzer/languages/__init__.py +10 -10
  34. tree_sitter_analyzer/languages/javascript_plugin.py +446 -446
  35. tree_sitter_analyzer/languages/python_plugin.py +755 -755
  36. tree_sitter_analyzer/mcp/__init__.py +31 -31
  37. tree_sitter_analyzer/mcp/resources/__init__.py +44 -44
  38. tree_sitter_analyzer/mcp/resources/code_file_resource.py +209 -209
  39. tree_sitter_analyzer/mcp/server.py +346 -333
  40. tree_sitter_analyzer/mcp/tools/__init__.py +30 -30
  41. tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +654 -654
  42. tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py +247 -247
  43. tree_sitter_analyzer/mcp/tools/base_tool.py +54 -54
  44. tree_sitter_analyzer/mcp/tools/read_partial_tool.py +300 -300
  45. tree_sitter_analyzer/mcp/tools/table_format_tool.py +362 -362
  46. tree_sitter_analyzer/mcp/tools/universal_analyze_tool.py +543 -543
  47. tree_sitter_analyzer/mcp/utils/__init__.py +107 -107
  48. tree_sitter_analyzer/mcp/utils/error_handler.py +549 -549
  49. tree_sitter_analyzer/output_manager.py +253 -253
  50. tree_sitter_analyzer/plugins/__init__.py +280 -280
  51. tree_sitter_analyzer/plugins/base.py +529 -529
  52. tree_sitter_analyzer/plugins/manager.py +379 -379
  53. tree_sitter_analyzer/queries/__init__.py +26 -26
  54. tree_sitter_analyzer/queries/java.py +391 -391
  55. tree_sitter_analyzer/queries/javascript.py +148 -148
  56. tree_sitter_analyzer/queries/python.py +285 -285
  57. tree_sitter_analyzer/queries/typescript.py +229 -229
  58. tree_sitter_analyzer/query_loader.py +257 -257
  59. tree_sitter_analyzer/security/__init__.py +22 -0
  60. tree_sitter_analyzer/security/boundary_manager.py +237 -0
  61. tree_sitter_analyzer/security/regex_checker.py +292 -0
  62. tree_sitter_analyzer/security/validator.py +224 -0
  63. tree_sitter_analyzer/table_formatter.py +652 -473
  64. tree_sitter_analyzer/utils.py +277 -277
  65. {tree_sitter_analyzer-0.6.2.dist-info → tree_sitter_analyzer-0.8.0.dist-info}/METADATA +4 -1
  66. tree_sitter_analyzer-0.8.0.dist-info/RECORD +76 -0
  67. tree_sitter_analyzer-0.6.2.dist-info/RECORD +0 -72
  68. {tree_sitter_analyzer-0.6.2.dist-info → tree_sitter_analyzer-0.8.0.dist-info}/WHEEL +0 -0
  69. {tree_sitter_analyzer-0.6.2.dist-info → tree_sitter_analyzer-0.8.0.dist-info}/entry_points.txt +0 -0
@@ -1,235 +1,235 @@
1
- #!/usr/bin/env python3
2
- """
3
- Table Command
4
-
5
- Handles table format output generation.
6
- """
7
-
8
- import sys
9
- from typing import Any
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: An error occurred during table format analysis: {e}")
46
- return 1
47
-
48
- def _convert_to_structure_format(
49
- self, analysis_result: Any, language: str
50
- ) -> dict[str, Any]:
51
- """Convert AnalysisResult to the format expected by table formatter."""
52
- classes = []
53
- methods = []
54
- fields = []
55
- imports = []
56
- package_name = "unknown"
57
-
58
- # Process each element
59
- for i, element in enumerate(analysis_result.elements):
60
- try:
61
- element_type = getattr(element, "__class__", type(element)).__name__
62
- element_name = getattr(element, "name", None)
63
-
64
- if element_type == "Package":
65
- package_name = str(element_name)
66
- elif element_type == "Class":
67
- classes.append(self._convert_class_element(element, i))
68
- elif element_type == "Function":
69
- methods.append(self._convert_function_element(element, language))
70
- elif element_type == "Variable":
71
- fields.append(self._convert_variable_element(element, language))
72
- elif element_type == "Import":
73
- imports.append(self._convert_import_element(element))
74
-
75
- except Exception as element_error:
76
- output_error(f"ERROR: Element {i} processing failed: {element_error}")
77
- continue
78
-
79
- return {
80
- "file_path": analysis_result.file_path,
81
- "language": analysis_result.language,
82
- "line_count": analysis_result.line_count,
83
- "package": {"name": package_name},
84
- "classes": classes,
85
- "methods": methods,
86
- "fields": fields,
87
- "imports": imports,
88
- "statistics": {
89
- "method_count": len(methods),
90
- "field_count": len(fields),
91
- "class_count": len(classes),
92
- "import_count": len(imports),
93
- },
94
- }
95
-
96
- def _convert_class_element(self, element: Any, index: int) -> dict[str, Any]:
97
- """Convert class element to table format."""
98
- element_name = getattr(element, "name", None)
99
- final_name = element_name if element_name else f"UnknownClass_{index}"
100
-
101
- return {
102
- "name": final_name,
103
- "type": "class",
104
- "visibility": "public",
105
- "line_range": {
106
- "start": getattr(element, "start_line", 0),
107
- "end": getattr(element, "end_line", 0),
108
- },
109
- }
110
-
111
- def _convert_function_element(self, element: Any, language: str) -> dict[str, Any]:
112
- """Convert function element to table format."""
113
- # Process parameters based on language
114
- params = getattr(element, "parameters", [])
115
- processed_params = self._process_parameters(params, language)
116
-
117
- # Get visibility
118
- visibility = self._get_element_visibility(element)
119
-
120
- # Get JavaDoc if enabled
121
- include_javadoc = getattr(self.args, "include_javadoc", False)
122
- javadoc = getattr(element, "docstring", "") or "" if include_javadoc else ""
123
-
124
- return {
125
- "name": getattr(element, "name", str(element)),
126
- "visibility": visibility,
127
- "return_type": getattr(element, "return_type", "Any"),
128
- "parameters": processed_params,
129
- "is_constructor": getattr(element, "is_constructor", False),
130
- "is_static": getattr(element, "is_static", False),
131
- "complexity_score": getattr(element, "complexity_score", 1),
132
- "line_range": {
133
- "start": getattr(element, "start_line", 0),
134
- "end": getattr(element, "end_line", 0),
135
- },
136
- "javadoc": javadoc,
137
- }
138
-
139
- def _convert_variable_element(self, element: Any, language: str) -> dict[str, Any]:
140
- """Convert variable element to table format."""
141
- # Get field type based on language
142
- if language == "python":
143
- field_type = getattr(element, "variable_type", "") or ""
144
- else:
145
- field_type = getattr(element, "variable_type", "") or getattr(
146
- element, "field_type", ""
147
- )
148
-
149
- # Get visibility
150
- field_visibility = self._get_element_visibility(element)
151
-
152
- # Get JavaDoc if enabled
153
- include_javadoc = getattr(self.args, "include_javadoc", False)
154
- javadoc = getattr(element, "docstring", "") or "" if include_javadoc else ""
155
-
156
- return {
157
- "name": getattr(element, "name", str(element)),
158
- "type": field_type,
159
- "visibility": field_visibility,
160
- "modifiers": getattr(element, "modifiers", []),
161
- "line_range": {
162
- "start": getattr(element, "start_line", 0),
163
- "end": getattr(element, "end_line", 0),
164
- },
165
- "javadoc": javadoc,
166
- }
167
-
168
- def _convert_import_element(self, element: Any) -> dict[str, Any]:
169
- """Convert import element to table format."""
170
- return {
171
- "statement": getattr(element, "name", str(element)),
172
- "name": getattr(element, "name", str(element)),
173
- }
174
-
175
- def _process_parameters(self, params: Any, language: str) -> list[dict[str, str]]:
176
- """Process parameters based on language syntax."""
177
- if isinstance(params, str):
178
- param_list = []
179
- if params.strip():
180
- param_names = [p.strip() for p in params.split(",") if p.strip()]
181
- param_list = [{"name": name, "type": "Any"} for name in param_names]
182
- return param_list
183
- elif isinstance(params, list):
184
- param_list = []
185
- for param in params:
186
- if isinstance(param, str):
187
- param = param.strip()
188
- if language == "python":
189
- # Python format: "name: type"
190
- if ":" in param:
191
- parts = param.split(":", 1)
192
- param_name = parts[0].strip()
193
- param_type = parts[1].strip() if len(parts) > 1 else "Any"
194
- param_list.append({"name": param_name, "type": param_type})
195
- else:
196
- param_list.append({"name": param, "type": "Any"})
197
- else:
198
- # Java format: "Type name"
199
- last_space_idx = param.rfind(" ")
200
- if last_space_idx != -1:
201
- param_type = param[:last_space_idx].strip()
202
- param_name = param[last_space_idx + 1 :].strip()
203
- if param_type and param_name:
204
- param_list.append(
205
- {"name": param_name, "type": param_type}
206
- )
207
- else:
208
- param_list.append({"name": param, "type": "Any"})
209
- else:
210
- param_list.append({"name": param, "type": "Any"})
211
- elif isinstance(param, dict):
212
- param_list.append(param)
213
- else:
214
- param_list.append({"name": str(param), "type": "Any"})
215
- return param_list
216
- else:
217
- return []
218
-
219
- def _get_element_visibility(self, element: Any) -> str:
220
- """Get element visibility."""
221
- visibility = getattr(element, "visibility", "public")
222
- if hasattr(element, "is_private") and getattr(element, "is_private", False):
223
- visibility = "private"
224
- elif hasattr(element, "is_public") and getattr(element, "is_public", False):
225
- visibility = "public"
226
- return visibility
227
-
228
- def _output_table(self, table_output: str) -> None:
229
- """Output the table with proper encoding."""
230
- try:
231
- # Windows support: Output with UTF-8 encoding
232
- sys.stdout.buffer.write(table_output.encode("utf-8"))
233
- except (AttributeError, UnicodeEncodeError):
234
- # Fallback: Normal print
235
- 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
+ from typing import Any
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: An error occurred during table format analysis: {e}")
46
+ return 1
47
+
48
+ def _convert_to_structure_format(
49
+ self, analysis_result: Any, language: str
50
+ ) -> dict[str, Any]:
51
+ """Convert AnalysisResult to the format expected by table formatter."""
52
+ classes = []
53
+ methods = []
54
+ fields = []
55
+ imports = []
56
+ package_name = "unknown"
57
+
58
+ # Process each element
59
+ for i, element in enumerate(analysis_result.elements):
60
+ try:
61
+ element_type = getattr(element, "__class__", type(element)).__name__
62
+ element_name = getattr(element, "name", None)
63
+
64
+ if element_type == "Package":
65
+ package_name = str(element_name)
66
+ elif element_type == "Class":
67
+ classes.append(self._convert_class_element(element, i))
68
+ elif element_type == "Function":
69
+ methods.append(self._convert_function_element(element, language))
70
+ elif element_type == "Variable":
71
+ fields.append(self._convert_variable_element(element, language))
72
+ elif element_type == "Import":
73
+ imports.append(self._convert_import_element(element))
74
+
75
+ except Exception as element_error:
76
+ output_error(f"ERROR: Element {i} processing failed: {element_error}")
77
+ continue
78
+
79
+ return {
80
+ "file_path": analysis_result.file_path,
81
+ "language": analysis_result.language,
82
+ "line_count": analysis_result.line_count,
83
+ "package": {"name": package_name},
84
+ "classes": classes,
85
+ "methods": methods,
86
+ "fields": fields,
87
+ "imports": imports,
88
+ "statistics": {
89
+ "method_count": len(methods),
90
+ "field_count": len(fields),
91
+ "class_count": len(classes),
92
+ "import_count": len(imports),
93
+ },
94
+ }
95
+
96
+ def _convert_class_element(self, element: Any, index: int) -> dict[str, Any]:
97
+ """Convert class element to table format."""
98
+ element_name = getattr(element, "name", None)
99
+ final_name = element_name if element_name else f"UnknownClass_{index}"
100
+
101
+ return {
102
+ "name": final_name,
103
+ "type": "class",
104
+ "visibility": "public",
105
+ "line_range": {
106
+ "start": getattr(element, "start_line", 0),
107
+ "end": getattr(element, "end_line", 0),
108
+ },
109
+ }
110
+
111
+ def _convert_function_element(self, element: Any, language: str) -> dict[str, Any]:
112
+ """Convert function element to table format."""
113
+ # Process parameters based on language
114
+ params = getattr(element, "parameters", [])
115
+ processed_params = self._process_parameters(params, language)
116
+
117
+ # Get visibility
118
+ visibility = self._get_element_visibility(element)
119
+
120
+ # Get JavaDoc if enabled
121
+ include_javadoc = getattr(self.args, "include_javadoc", False)
122
+ javadoc = getattr(element, "docstring", "") or "" if include_javadoc else ""
123
+
124
+ return {
125
+ "name": getattr(element, "name", str(element)),
126
+ "visibility": visibility,
127
+ "return_type": getattr(element, "return_type", "Any"),
128
+ "parameters": processed_params,
129
+ "is_constructor": getattr(element, "is_constructor", False),
130
+ "is_static": getattr(element, "is_static", False),
131
+ "complexity_score": getattr(element, "complexity_score", 1),
132
+ "line_range": {
133
+ "start": getattr(element, "start_line", 0),
134
+ "end": getattr(element, "end_line", 0),
135
+ },
136
+ "javadoc": javadoc,
137
+ }
138
+
139
+ def _convert_variable_element(self, element: Any, language: str) -> dict[str, Any]:
140
+ """Convert variable element to table format."""
141
+ # Get field type based on language
142
+ if language == "python":
143
+ field_type = getattr(element, "variable_type", "") or ""
144
+ else:
145
+ field_type = getattr(element, "variable_type", "") or getattr(
146
+ element, "field_type", ""
147
+ )
148
+
149
+ # Get visibility
150
+ field_visibility = self._get_element_visibility(element)
151
+
152
+ # Get JavaDoc if enabled
153
+ include_javadoc = getattr(self.args, "include_javadoc", False)
154
+ javadoc = getattr(element, "docstring", "") or "" if include_javadoc else ""
155
+
156
+ return {
157
+ "name": getattr(element, "name", str(element)),
158
+ "type": field_type,
159
+ "visibility": field_visibility,
160
+ "modifiers": getattr(element, "modifiers", []),
161
+ "line_range": {
162
+ "start": getattr(element, "start_line", 0),
163
+ "end": getattr(element, "end_line", 0),
164
+ },
165
+ "javadoc": javadoc,
166
+ }
167
+
168
+ def _convert_import_element(self, element: Any) -> dict[str, Any]:
169
+ """Convert import element to table format."""
170
+ return {
171
+ "statement": getattr(element, "name", str(element)),
172
+ "name": getattr(element, "name", str(element)),
173
+ }
174
+
175
+ def _process_parameters(self, params: Any, language: str) -> list[dict[str, str]]:
176
+ """Process parameters based on language syntax."""
177
+ if isinstance(params, str):
178
+ param_list = []
179
+ if params.strip():
180
+ param_names = [p.strip() for p in params.split(",") if p.strip()]
181
+ param_list = [{"name": name, "type": "Any"} for name in param_names]
182
+ return param_list
183
+ elif isinstance(params, list):
184
+ param_list = []
185
+ for param in params:
186
+ if isinstance(param, str):
187
+ param = param.strip()
188
+ if language == "python":
189
+ # Python format: "name: type"
190
+ if ":" in param:
191
+ parts = param.split(":", 1)
192
+ param_name = parts[0].strip()
193
+ param_type = parts[1].strip() if len(parts) > 1 else "Any"
194
+ param_list.append({"name": param_name, "type": param_type})
195
+ else:
196
+ param_list.append({"name": param, "type": "Any"})
197
+ else:
198
+ # Java format: "Type name"
199
+ last_space_idx = param.rfind(" ")
200
+ if last_space_idx != -1:
201
+ param_type = param[:last_space_idx].strip()
202
+ param_name = param[last_space_idx + 1 :].strip()
203
+ if param_type and param_name:
204
+ param_list.append(
205
+ {"name": param_name, "type": param_type}
206
+ )
207
+ else:
208
+ param_list.append({"name": param, "type": "Any"})
209
+ else:
210
+ param_list.append({"name": param, "type": "Any"})
211
+ elif isinstance(param, dict):
212
+ param_list.append(param)
213
+ else:
214
+ param_list.append({"name": str(param), "type": "Any"})
215
+ return param_list
216
+ else:
217
+ return []
218
+
219
+ def _get_element_visibility(self, element: Any) -> str:
220
+ """Get element visibility."""
221
+ visibility = getattr(element, "visibility", "public")
222
+ if hasattr(element, "is_private") and getattr(element, "is_private", False):
223
+ visibility = "private"
224
+ elif hasattr(element, "is_public") and getattr(element, "is_public", False):
225
+ visibility = "public"
226
+ return visibility
227
+
228
+ def _output_table(self, table_output: str) -> None:
229
+ """Output the table with proper encoding."""
230
+ try:
231
+ # Windows support: Output with UTF-8 encoding
232
+ sys.stdout.buffer.write(table_output.encode("utf-8"))
233
+ except (AttributeError, UnicodeEncodeError):
234
+ # Fallback: Normal print
235
+ print(table_output, end="")