tree-sitter-analyzer 0.7.0__py3-none-any.whl → 0.8.1__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.
- tree_sitter_analyzer/__init__.py +132 -132
- tree_sitter_analyzer/__main__.py +11 -11
- tree_sitter_analyzer/api.py +533 -533
- tree_sitter_analyzer/cli/__init__.py +39 -39
- tree_sitter_analyzer/cli/__main__.py +12 -12
- tree_sitter_analyzer/cli/commands/__init__.py +26 -26
- tree_sitter_analyzer/cli/commands/advanced_command.py +88 -88
- tree_sitter_analyzer/cli/commands/base_command.py +178 -160
- tree_sitter_analyzer/cli/commands/default_command.py +18 -18
- tree_sitter_analyzer/cli/commands/partial_read_command.py +141 -141
- tree_sitter_analyzer/cli/commands/query_command.py +88 -81
- tree_sitter_analyzer/cli/commands/structure_command.py +138 -138
- tree_sitter_analyzer/cli/commands/summary_command.py +101 -101
- tree_sitter_analyzer/cli/commands/table_command.py +235 -235
- tree_sitter_analyzer/cli/info_commands.py +121 -121
- tree_sitter_analyzer/cli_main.py +303 -297
- tree_sitter_analyzer/core/__init__.py +15 -15
- tree_sitter_analyzer/core/analysis_engine.py +580 -555
- tree_sitter_analyzer/core/cache_service.py +320 -320
- tree_sitter_analyzer/core/engine.py +566 -566
- tree_sitter_analyzer/core/parser.py +293 -293
- tree_sitter_analyzer/encoding_utils.py +459 -459
- tree_sitter_analyzer/exceptions.py +406 -337
- tree_sitter_analyzer/file_handler.py +210 -210
- tree_sitter_analyzer/formatters/__init__.py +1 -1
- tree_sitter_analyzer/formatters/base_formatter.py +167 -167
- tree_sitter_analyzer/formatters/formatter_factory.py +78 -78
- tree_sitter_analyzer/interfaces/__init__.py +9 -9
- tree_sitter_analyzer/interfaces/cli.py +528 -528
- tree_sitter_analyzer/interfaces/cli_adapter.py +343 -343
- tree_sitter_analyzer/interfaces/mcp_adapter.py +206 -206
- tree_sitter_analyzer/interfaces/mcp_server.py +425 -405
- tree_sitter_analyzer/languages/__init__.py +10 -10
- tree_sitter_analyzer/languages/javascript_plugin.py +446 -446
- tree_sitter_analyzer/languages/python_plugin.py +755 -755
- tree_sitter_analyzer/mcp/__init__.py +31 -31
- tree_sitter_analyzer/mcp/resources/__init__.py +44 -44
- tree_sitter_analyzer/mcp/resources/code_file_resource.py +209 -209
- tree_sitter_analyzer/mcp/server.py +408 -333
- tree_sitter_analyzer/mcp/tools/__init__.py +30 -30
- tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +673 -654
- tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py +247 -247
- tree_sitter_analyzer/mcp/tools/base_tool.py +54 -54
- tree_sitter_analyzer/mcp/tools/read_partial_tool.py +308 -300
- tree_sitter_analyzer/mcp/tools/table_format_tool.py +379 -362
- tree_sitter_analyzer/mcp/tools/universal_analyze_tool.py +559 -543
- tree_sitter_analyzer/mcp/utils/__init__.py +107 -107
- tree_sitter_analyzer/mcp/utils/error_handler.py +549 -549
- tree_sitter_analyzer/output_manager.py +253 -253
- tree_sitter_analyzer/plugins/__init__.py +280 -280
- tree_sitter_analyzer/plugins/base.py +529 -529
- tree_sitter_analyzer/plugins/manager.py +379 -379
- tree_sitter_analyzer/project_detector.py +317 -0
- tree_sitter_analyzer/queries/__init__.py +26 -26
- tree_sitter_analyzer/queries/java.py +391 -391
- tree_sitter_analyzer/queries/javascript.py +148 -148
- tree_sitter_analyzer/queries/python.py +285 -285
- tree_sitter_analyzer/queries/typescript.py +229 -229
- tree_sitter_analyzer/query_loader.py +257 -257
- tree_sitter_analyzer/security/__init__.py +22 -0
- tree_sitter_analyzer/security/boundary_manager.py +237 -0
- tree_sitter_analyzer/security/regex_checker.py +292 -0
- tree_sitter_analyzer/security/validator.py +241 -0
- tree_sitter_analyzer/table_formatter.py +652 -589
- tree_sitter_analyzer/utils.py +277 -277
- {tree_sitter_analyzer-0.7.0.dist-info → tree_sitter_analyzer-0.8.1.dist-info}/METADATA +27 -1
- tree_sitter_analyzer-0.8.1.dist-info/RECORD +77 -0
- tree_sitter_analyzer-0.7.0.dist-info/RECORD +0 -72
- {tree_sitter_analyzer-0.7.0.dist-info → tree_sitter_analyzer-0.8.1.dist-info}/WHEEL +0 -0
- {tree_sitter_analyzer-0.7.0.dist-info → tree_sitter_analyzer-0.8.1.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"
|
|
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"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="")
|