tree-sitter-analyzer 0.1.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 +121 -0
  2. tree_sitter_analyzer/__main__.py +12 -0
  3. tree_sitter_analyzer/api.py +539 -0
  4. tree_sitter_analyzer/cli/__init__.py +39 -0
  5. tree_sitter_analyzer/cli/__main__.py +13 -0
  6. tree_sitter_analyzer/cli/commands/__init__.py +27 -0
  7. tree_sitter_analyzer/cli/commands/advanced_command.py +88 -0
  8. tree_sitter_analyzer/cli/commands/base_command.py +155 -0
  9. tree_sitter_analyzer/cli/commands/default_command.py +19 -0
  10. tree_sitter_analyzer/cli/commands/partial_read_command.py +133 -0
  11. tree_sitter_analyzer/cli/commands/query_command.py +82 -0
  12. tree_sitter_analyzer/cli/commands/structure_command.py +121 -0
  13. tree_sitter_analyzer/cli/commands/summary_command.py +93 -0
  14. tree_sitter_analyzer/cli/commands/table_command.py +233 -0
  15. tree_sitter_analyzer/cli/info_commands.py +121 -0
  16. tree_sitter_analyzer/cli_main.py +276 -0
  17. tree_sitter_analyzer/core/__init__.py +20 -0
  18. tree_sitter_analyzer/core/analysis_engine.py +574 -0
  19. tree_sitter_analyzer/core/cache_service.py +330 -0
  20. tree_sitter_analyzer/core/engine.py +560 -0
  21. tree_sitter_analyzer/core/parser.py +288 -0
  22. tree_sitter_analyzer/core/query.py +502 -0
  23. tree_sitter_analyzer/encoding_utils.py +460 -0
  24. tree_sitter_analyzer/exceptions.py +340 -0
  25. tree_sitter_analyzer/file_handler.py +222 -0
  26. tree_sitter_analyzer/formatters/__init__.py +1 -0
  27. tree_sitter_analyzer/formatters/base_formatter.py +168 -0
  28. tree_sitter_analyzer/formatters/formatter_factory.py +74 -0
  29. tree_sitter_analyzer/formatters/java_formatter.py +270 -0
  30. tree_sitter_analyzer/formatters/python_formatter.py +235 -0
  31. tree_sitter_analyzer/interfaces/__init__.py +10 -0
  32. tree_sitter_analyzer/interfaces/cli.py +557 -0
  33. tree_sitter_analyzer/interfaces/cli_adapter.py +319 -0
  34. tree_sitter_analyzer/interfaces/mcp_adapter.py +170 -0
  35. tree_sitter_analyzer/interfaces/mcp_server.py +416 -0
  36. tree_sitter_analyzer/java_analyzer.py +219 -0
  37. tree_sitter_analyzer/language_detector.py +400 -0
  38. tree_sitter_analyzer/language_loader.py +228 -0
  39. tree_sitter_analyzer/languages/__init__.py +11 -0
  40. tree_sitter_analyzer/languages/java_plugin.py +1113 -0
  41. tree_sitter_analyzer/languages/python_plugin.py +712 -0
  42. tree_sitter_analyzer/mcp/__init__.py +32 -0
  43. tree_sitter_analyzer/mcp/resources/__init__.py +47 -0
  44. tree_sitter_analyzer/mcp/resources/code_file_resource.py +213 -0
  45. tree_sitter_analyzer/mcp/resources/project_stats_resource.py +550 -0
  46. tree_sitter_analyzer/mcp/server.py +319 -0
  47. tree_sitter_analyzer/mcp/tools/__init__.py +36 -0
  48. tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +558 -0
  49. tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py +245 -0
  50. tree_sitter_analyzer/mcp/tools/base_tool.py +55 -0
  51. tree_sitter_analyzer/mcp/tools/get_positions_tool.py +448 -0
  52. tree_sitter_analyzer/mcp/tools/read_partial_tool.py +302 -0
  53. tree_sitter_analyzer/mcp/tools/table_format_tool.py +359 -0
  54. tree_sitter_analyzer/mcp/tools/universal_analyze_tool.py +476 -0
  55. tree_sitter_analyzer/mcp/utils/__init__.py +106 -0
  56. tree_sitter_analyzer/mcp/utils/error_handler.py +549 -0
  57. tree_sitter_analyzer/models.py +481 -0
  58. tree_sitter_analyzer/output_manager.py +264 -0
  59. tree_sitter_analyzer/plugins/__init__.py +334 -0
  60. tree_sitter_analyzer/plugins/base.py +446 -0
  61. tree_sitter_analyzer/plugins/java_plugin.py +625 -0
  62. tree_sitter_analyzer/plugins/javascript_plugin.py +439 -0
  63. tree_sitter_analyzer/plugins/manager.py +355 -0
  64. tree_sitter_analyzer/plugins/plugin_loader.py +83 -0
  65. tree_sitter_analyzer/plugins/python_plugin.py +598 -0
  66. tree_sitter_analyzer/plugins/registry.py +366 -0
  67. tree_sitter_analyzer/queries/__init__.py +27 -0
  68. tree_sitter_analyzer/queries/java.py +394 -0
  69. tree_sitter_analyzer/queries/javascript.py +149 -0
  70. tree_sitter_analyzer/queries/python.py +286 -0
  71. tree_sitter_analyzer/queries/typescript.py +230 -0
  72. tree_sitter_analyzer/query_loader.py +260 -0
  73. tree_sitter_analyzer/table_formatter.py +448 -0
  74. tree_sitter_analyzer/utils.py +201 -0
  75. tree_sitter_analyzer-0.1.0.dist-info/METADATA +581 -0
  76. tree_sitter_analyzer-0.1.0.dist-info/RECORD +78 -0
  77. tree_sitter_analyzer-0.1.0.dist-info/WHEEL +4 -0
  78. tree_sitter_analyzer-0.1.0.dist-info/entry_points.txt +8 -0
@@ -0,0 +1,288 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Parser module for tree_sitter_analyzer.core.
4
+
5
+ This module provides the Parser class which handles Tree-sitter parsing
6
+ operations in the new architecture.
7
+ """
8
+
9
+ import logging
10
+ from pathlib import Path
11
+ from typing import Optional, Union, List, NamedTuple, Any, Dict
12
+ from tree_sitter import Language, Parser as TreeSitterParser, Tree
13
+
14
+ from ..encoding_utils import EncodingManager
15
+ from ..language_loader import get_loader
16
+
17
+ # Configure logging
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ class ParseResult(NamedTuple):
22
+ """
23
+ Result of parsing operation containing tree and metadata.
24
+
25
+ Attributes:
26
+ tree: The parsed Tree-sitter tree (None if parsing failed)
27
+ source_code: The source code that was parsed
28
+ language: The programming language used for parsing
29
+ file_path: Path to the file (if parsing from file)
30
+ success: Whether parsing was successful
31
+ error_message: Error message if parsing failed
32
+ """
33
+ tree: Optional[Tree]
34
+ source_code: str
35
+ language: str
36
+ file_path: Optional[str]
37
+ success: bool
38
+ error_message: Optional[str]
39
+
40
+
41
+ class Parser:
42
+ """
43
+ Tree-sitter parser wrapper for the new architecture.
44
+
45
+ This class provides a unified interface for parsing code files and strings
46
+ using Tree-sitter parsers with proper error handling and encoding support.
47
+ """
48
+
49
+ def __init__(self) -> None:
50
+ """Initialize the Parser with language loader."""
51
+ self._loader = get_loader()
52
+ self._encoding_manager = EncodingManager()
53
+ logger.info("Parser initialized successfully")
54
+
55
+ def parse_file(
56
+ self,
57
+ file_path: Union[str, Path],
58
+ language: str
59
+ ) -> ParseResult:
60
+ """
61
+ Parse a source code file.
62
+
63
+ Args:
64
+ file_path: Path to the file to parse
65
+ language: Programming language for parsing
66
+
67
+ Returns:
68
+ ParseResult containing the parsed tree and metadata
69
+ """
70
+ file_path_str = str(file_path)
71
+
72
+ try:
73
+ # Check if file exists
74
+ path_obj = Path(file_path_str)
75
+ if not path_obj.exists():
76
+ return ParseResult(
77
+ tree=None,
78
+ source_code="",
79
+ language=language,
80
+ file_path=file_path_str,
81
+ success=False,
82
+ error_message=f"File not found: {file_path_str}"
83
+ )
84
+
85
+ # Read file content with encoding detection
86
+ try:
87
+ source_code, detected_encoding = self._encoding_manager.read_file_safe(path_obj)
88
+ logger.debug(f"Read file {file_path_str} with encoding {detected_encoding}")
89
+ except PermissionError as e:
90
+ return ParseResult(
91
+ tree=None,
92
+ source_code="",
93
+ language=language,
94
+ file_path=file_path_str,
95
+ success=False,
96
+ error_message=f"Permission denied: {str(e)}"
97
+ )
98
+ except Exception as e:
99
+ return ParseResult(
100
+ tree=None,
101
+ source_code="",
102
+ language=language,
103
+ file_path=file_path_str,
104
+ success=False,
105
+ error_message=f"Error reading file: {str(e)}"
106
+ )
107
+
108
+ # Parse the code
109
+ return self.parse_code(source_code, language, filename=file_path_str)
110
+
111
+ except Exception as e:
112
+ logger.error(f"Unexpected error parsing file {file_path_str}: {e}")
113
+ return ParseResult(
114
+ tree=None,
115
+ source_code="",
116
+ language=language,
117
+ file_path=file_path_str,
118
+ success=False,
119
+ error_message=f"Unexpected error: {str(e)}"
120
+ )
121
+
122
+ def parse_code(
123
+ self,
124
+ source_code: str,
125
+ language: str,
126
+ filename: Optional[str] = None
127
+ ) -> ParseResult:
128
+ """
129
+ Parse source code string.
130
+
131
+ Args:
132
+ source_code: The source code to parse
133
+ language: Programming language for parsing
134
+ filename: Optional filename for metadata
135
+
136
+ Returns:
137
+ ParseResult containing the parsed tree and metadata
138
+ """
139
+ try:
140
+ # Check if language is supported
141
+ if not self.is_language_supported(language):
142
+ return ParseResult(
143
+ tree=None,
144
+ source_code=source_code,
145
+ language=language,
146
+ file_path=filename,
147
+ success=False,
148
+ error_message=f"Unsupported language: {language}"
149
+ )
150
+
151
+ # Create parser for the language
152
+ parser = self._loader.create_parser_safely(language)
153
+ if parser is None:
154
+ return ParseResult(
155
+ tree=None,
156
+ source_code=source_code,
157
+ language=language,
158
+ file_path=filename,
159
+ success=False,
160
+ error_message=f"Failed to create parser for language: {language}"
161
+ )
162
+
163
+ # Parse the code
164
+ source_bytes = self._encoding_manager.safe_encode(source_code)
165
+ tree = parser.parse(source_bytes)
166
+
167
+ if tree is None:
168
+ return ParseResult(
169
+ tree=None,
170
+ source_code=source_code,
171
+ language=language,
172
+ file_path=filename,
173
+ success=False,
174
+ error_message="Parsing failed - tree is None"
175
+ )
176
+
177
+ logger.debug(f"Successfully parsed {language} code")
178
+ return ParseResult(
179
+ tree=tree,
180
+ source_code=source_code,
181
+ language=language,
182
+ file_path=filename,
183
+ success=True,
184
+ error_message=None
185
+ )
186
+
187
+ except Exception as e:
188
+ logger.error(f"Error parsing {language} code: {e}")
189
+ return ParseResult(
190
+ tree=None,
191
+ source_code=source_code,
192
+ language=language,
193
+ file_path=filename,
194
+ success=False,
195
+ error_message=f"Parsing error: {str(e)}"
196
+ )
197
+
198
+ def is_language_supported(self, language: str) -> bool:
199
+ """
200
+ Check if a programming language is supported.
201
+
202
+ Args:
203
+ language: Programming language to check
204
+
205
+ Returns:
206
+ True if language is supported, False otherwise
207
+ """
208
+ try:
209
+ return self._loader.is_language_available(language)
210
+ except Exception as e:
211
+ logger.error(f"Error checking language support for {language}: {e}")
212
+ return False
213
+
214
+ def get_supported_languages(self) -> List[str]:
215
+ """
216
+ Get list of supported programming languages.
217
+
218
+ Returns:
219
+ List of supported language names
220
+ """
221
+ try:
222
+ return self._loader.get_supported_languages()
223
+ except Exception as e:
224
+ logger.error(f"Error getting supported languages: {e}")
225
+ return []
226
+
227
+ def validate_ast(self, tree: Optional[Tree]) -> bool:
228
+ """
229
+ Validate an AST tree.
230
+
231
+ Args:
232
+ tree: Tree-sitter tree to validate
233
+
234
+ Returns:
235
+ True if tree is valid, False otherwise
236
+ """
237
+ if tree is None:
238
+ return False
239
+
240
+ try:
241
+ # Basic validation - check if tree has a root node
242
+ root_node = tree.root_node
243
+ return root_node is not None
244
+ except Exception as e:
245
+ logger.error(f"Error validating AST: {e}")
246
+ return False
247
+
248
+ def get_parse_errors(self, tree: Tree) -> List[Dict[str, Any]]:
249
+ """
250
+ Extract parse errors from a tree.
251
+
252
+ Args:
253
+ tree: Tree-sitter tree to check for errors
254
+
255
+ Returns:
256
+ List of error information dictionaries
257
+ """
258
+ errors = []
259
+
260
+ try:
261
+ def find_error_nodes(node: Any) -> None:
262
+ """Recursively find error nodes in the tree."""
263
+ if hasattr(node, 'type') and node.type == 'ERROR':
264
+ errors.append({
265
+ 'type': 'ERROR',
266
+ 'start_point': node.start_point,
267
+ 'end_point': node.end_point,
268
+ 'text': node.text.decode('utf-8', errors='replace') if node.text else ''
269
+ })
270
+
271
+ if hasattr(node, 'children'):
272
+ for child in node.children:
273
+ find_error_nodes(child)
274
+
275
+ if tree and tree.root_node:
276
+ find_error_nodes(tree.root_node)
277
+
278
+ except Exception as e:
279
+ logger.error(f"Error extracting parse errors: {e}")
280
+
281
+ return errors
282
+
283
+
284
+
285
+ # Module-level loader for backward compatibility
286
+ loader = get_loader()
287
+
288
+ loader = get_loader()