tree-sitter-analyzer 1.9.2__py3-none-any.whl → 1.9.4__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 +1 -1
- tree_sitter_analyzer/api.py +216 -8
- tree_sitter_analyzer/cli/argument_validator.py +1 -1
- tree_sitter_analyzer/cli/commands/advanced_command.py +3 -6
- tree_sitter_analyzer/cli/commands/query_command.py +3 -1
- tree_sitter_analyzer/cli/commands/table_command.py +3 -3
- tree_sitter_analyzer/constants.py +5 -3
- tree_sitter_analyzer/core/analysis_engine.py +1 -1
- tree_sitter_analyzer/core/cache_service.py +1 -1
- tree_sitter_analyzer/core/engine.py +34 -10
- tree_sitter_analyzer/core/query.py +82 -2
- tree_sitter_analyzer/encoding_utils.py +64 -0
- tree_sitter_analyzer/exceptions.py +1 -1
- tree_sitter_analyzer/file_handler.py +49 -33
- tree_sitter_analyzer/formatters/base_formatter.py +1 -1
- tree_sitter_analyzer/formatters/html_formatter.py +24 -14
- tree_sitter_analyzer/formatters/javascript_formatter.py +28 -21
- tree_sitter_analyzer/formatters/language_formatter_factory.py +7 -4
- tree_sitter_analyzer/formatters/markdown_formatter.py +4 -4
- tree_sitter_analyzer/formatters/python_formatter.py +4 -4
- tree_sitter_analyzer/formatters/typescript_formatter.py +1 -1
- tree_sitter_analyzer/interfaces/mcp_adapter.py +4 -2
- tree_sitter_analyzer/interfaces/mcp_server.py +10 -10
- tree_sitter_analyzer/language_detector.py +30 -5
- tree_sitter_analyzer/language_loader.py +46 -26
- tree_sitter_analyzer/languages/css_plugin.py +6 -6
- tree_sitter_analyzer/languages/html_plugin.py +12 -8
- tree_sitter_analyzer/languages/java_plugin.py +330 -520
- tree_sitter_analyzer/languages/javascript_plugin.py +22 -78
- tree_sitter_analyzer/languages/markdown_plugin.py +277 -297
- tree_sitter_analyzer/languages/python_plugin.py +47 -85
- tree_sitter_analyzer/languages/typescript_plugin.py +48 -123
- tree_sitter_analyzer/mcp/resources/project_stats_resource.py +14 -8
- tree_sitter_analyzer/mcp/server.py +38 -23
- tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +10 -7
- tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py +51 -7
- tree_sitter_analyzer/mcp/tools/fd_rg_utils.py +11 -7
- tree_sitter_analyzer/mcp/tools/find_and_grep_tool.py +8 -6
- tree_sitter_analyzer/mcp/tools/list_files_tool.py +6 -6
- tree_sitter_analyzer/mcp/tools/output_format_validator.py +148 -0
- tree_sitter_analyzer/mcp/tools/search_content_tool.py +48 -15
- tree_sitter_analyzer/mcp/tools/table_format_tool.py +13 -8
- tree_sitter_analyzer/mcp/utils/file_output_manager.py +8 -3
- tree_sitter_analyzer/mcp/utils/gitignore_detector.py +24 -12
- tree_sitter_analyzer/mcp/utils/path_resolver.py +2 -2
- tree_sitter_analyzer/models.py +16 -0
- tree_sitter_analyzer/mypy_current_errors.txt +2 -0
- tree_sitter_analyzer/plugins/base.py +66 -0
- tree_sitter_analyzer/queries/java.py +9 -3
- tree_sitter_analyzer/queries/javascript.py +3 -8
- tree_sitter_analyzer/queries/markdown.py +1 -1
- tree_sitter_analyzer/queries/python.py +2 -2
- tree_sitter_analyzer/security/boundary_manager.py +2 -5
- tree_sitter_analyzer/security/regex_checker.py +2 -2
- tree_sitter_analyzer/security/validator.py +5 -1
- tree_sitter_analyzer/table_formatter.py +4 -4
- tree_sitter_analyzer/utils/__init__.py +27 -116
- tree_sitter_analyzer/{utils.py → utils/logging.py} +2 -2
- tree_sitter_analyzer/utils/tree_sitter_compat.py +2 -2
- {tree_sitter_analyzer-1.9.2.dist-info → tree_sitter_analyzer-1.9.4.dist-info}/METADATA +87 -45
- tree_sitter_analyzer-1.9.4.dist-info/RECORD +111 -0
- tree_sitter_analyzer-1.9.2.dist-info/RECORD +0 -109
- {tree_sitter_analyzer-1.9.2.dist-info → tree_sitter_analyzer-1.9.4.dist-info}/WHEEL +0 -0
- {tree_sitter_analyzer-1.9.2.dist-info → tree_sitter_analyzer-1.9.4.dist-info}/entry_points.txt +0 -0
|
@@ -205,7 +205,7 @@ class JavaScriptElementExtractor(ElementExtractor):
|
|
|
205
205
|
|
|
206
206
|
def _traverse_and_extract_iterative(
|
|
207
207
|
self,
|
|
208
|
-
root_node: "tree_sitter.Node",
|
|
208
|
+
root_node: Optional["tree_sitter.Node"],
|
|
209
209
|
extractors: dict[str, Any],
|
|
210
210
|
results: list[Any],
|
|
211
211
|
element_type: str,
|
|
@@ -315,7 +315,8 @@ class JavaScriptElementExtractor(ElementExtractor):
|
|
|
315
315
|
|
|
316
316
|
if start_point[0] == end_point[0]:
|
|
317
317
|
line = self.content_lines[start_point[0]]
|
|
318
|
-
|
|
318
|
+
result: str = line[start_point[1] : end_point[1]]
|
|
319
|
+
return result
|
|
319
320
|
else:
|
|
320
321
|
lines = []
|
|
321
322
|
for i in range(start_point[0], end_point[0] + 1):
|
|
@@ -494,7 +495,6 @@ class JavaScriptElementExtractor(ElementExtractor):
|
|
|
494
495
|
)
|
|
495
496
|
except Exception as e:
|
|
496
497
|
log_debug(f"Failed to extract method info: {e}")
|
|
497
|
-
# Re-raise for debugging
|
|
498
498
|
raise
|
|
499
499
|
|
|
500
500
|
def _extract_generator_function_optimized(
|
|
@@ -645,13 +645,9 @@ class JavaScriptElementExtractor(ElementExtractor):
|
|
|
645
645
|
raw_text=raw_text,
|
|
646
646
|
language="javascript",
|
|
647
647
|
variable_type=self._infer_type_from_value(prop_value),
|
|
648
|
-
value=prop_value,
|
|
649
648
|
is_static=is_static,
|
|
650
649
|
is_constant=False, # Class properties are not const
|
|
651
|
-
|
|
652
|
-
# class_name=class_name, # Not available since class_name is commented out
|
|
653
|
-
declaration_kind="property",
|
|
654
|
-
framework_type=self.framework_type,
|
|
650
|
+
initializer=prop_value,
|
|
655
651
|
)
|
|
656
652
|
except Exception as e:
|
|
657
653
|
log_debug(f"Failed to extract property info: {e}")
|
|
@@ -824,7 +820,7 @@ class JavaScriptElementExtractor(ElementExtractor):
|
|
|
824
820
|
is_setter = True
|
|
825
821
|
|
|
826
822
|
return (
|
|
827
|
-
name,
|
|
823
|
+
name or "",
|
|
828
824
|
parameters,
|
|
829
825
|
is_async,
|
|
830
826
|
is_static,
|
|
@@ -948,12 +944,8 @@ class JavaScriptElementExtractor(ElementExtractor):
|
|
|
948
944
|
raw_text=import_text,
|
|
949
945
|
language="javascript",
|
|
950
946
|
module_path=source,
|
|
951
|
-
|
|
952
|
-
import_type=import_type,
|
|
947
|
+
module_name=source,
|
|
953
948
|
imported_names=names,
|
|
954
|
-
is_default=is_default,
|
|
955
|
-
is_namespace=is_namespace,
|
|
956
|
-
is_dynamic=False,
|
|
957
949
|
)
|
|
958
950
|
except Exception as e:
|
|
959
951
|
log_debug(f"Failed to extract import info: {e}")
|
|
@@ -980,9 +972,8 @@ class JavaScriptElementExtractor(ElementExtractor):
|
|
|
980
972
|
raw_text=node_text,
|
|
981
973
|
language="javascript",
|
|
982
974
|
module_path=source,
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
is_dynamic=True,
|
|
975
|
+
module_name=source,
|
|
976
|
+
imported_names=["dynamic_import"],
|
|
986
977
|
)
|
|
987
978
|
except Exception as e:
|
|
988
979
|
log_debug(f"Failed to extract dynamic import: {e}")
|
|
@@ -1019,7 +1010,6 @@ class JavaScriptElementExtractor(ElementExtractor):
|
|
|
1019
1010
|
|
|
1020
1011
|
except Exception as e:
|
|
1021
1012
|
log_debug(f"Failed to extract CommonJS requires: {e}")
|
|
1022
|
-
# Re-raise for debugging
|
|
1023
1013
|
raise
|
|
1024
1014
|
|
|
1025
1015
|
return imports
|
|
@@ -1218,9 +1208,11 @@ class JavaScriptElementExtractor(ElementExtractor):
|
|
|
1218
1208
|
else:
|
|
1219
1209
|
return "unknown"
|
|
1220
1210
|
|
|
1221
|
-
def extract_elements(
|
|
1211
|
+
def extract_elements(
|
|
1212
|
+
self, tree: "tree_sitter.Tree", source_code: str
|
|
1213
|
+
) -> list[CodeElement]:
|
|
1222
1214
|
"""Extract elements from source code using tree-sitter AST"""
|
|
1223
|
-
elements = []
|
|
1215
|
+
elements: list[CodeElement] = []
|
|
1224
1216
|
|
|
1225
1217
|
try:
|
|
1226
1218
|
elements.extend(self.extract_functions(tree, source_code))
|
|
@@ -1293,7 +1285,7 @@ class JavaScriptElementExtractor(ElementExtractor):
|
|
|
1293
1285
|
return cleaned
|
|
1294
1286
|
current_line -= 1
|
|
1295
1287
|
|
|
1296
|
-
self._jsdoc_cache[target_line] =
|
|
1288
|
+
self._jsdoc_cache[target_line] = ""
|
|
1297
1289
|
return None
|
|
1298
1290
|
|
|
1299
1291
|
except Exception as e:
|
|
@@ -1441,62 +1433,13 @@ class JavaScriptPlugin(LanguagePlugin):
|
|
|
1441
1433
|
}
|
|
1442
1434
|
|
|
1443
1435
|
def execute_query_strategy(
|
|
1444
|
-
self,
|
|
1445
|
-
) ->
|
|
1446
|
-
"""
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
Args:
|
|
1450
|
-
tree: Tree-sitter tree object
|
|
1451
|
-
source_code: Source code string
|
|
1452
|
-
query_key: Query key to execute
|
|
1453
|
-
|
|
1454
|
-
Returns:
|
|
1455
|
-
List of query results
|
|
1456
|
-
"""
|
|
1457
|
-
# Use the extractor to get elements based on query_key
|
|
1458
|
-
extractor = self.get_extractor()
|
|
1436
|
+
self, query_key: str | None, language: str
|
|
1437
|
+
) -> str | None:
|
|
1438
|
+
"""Execute query strategy for JavaScript language"""
|
|
1439
|
+
queries = self.get_queries()
|
|
1440
|
+
return queries.get(query_key) if query_key else None
|
|
1459
1441
|
|
|
1460
|
-
|
|
1461
|
-
if query_key in [
|
|
1462
|
-
"function",
|
|
1463
|
-
"functions",
|
|
1464
|
-
"async_function",
|
|
1465
|
-
"async_functions",
|
|
1466
|
-
"arrow_function",
|
|
1467
|
-
"arrow_functions",
|
|
1468
|
-
"method",
|
|
1469
|
-
"methods",
|
|
1470
|
-
"constructor",
|
|
1471
|
-
"constructors",
|
|
1472
|
-
]:
|
|
1473
|
-
elements = extractor.extract_functions(tree, source_code)
|
|
1474
|
-
elif query_key in ["class", "classes", "react_component", "react_components"]:
|
|
1475
|
-
elements = extractor.extract_classes(tree, source_code)
|
|
1476
|
-
elif query_key in ["variable", "variables"]:
|
|
1477
|
-
elements = extractor.extract_variables(tree, source_code)
|
|
1478
|
-
elif query_key in ["import", "imports"]:
|
|
1479
|
-
elements = extractor.extract_imports(tree, source_code)
|
|
1480
|
-
else:
|
|
1481
|
-
# For unknown query keys, return empty list
|
|
1482
|
-
return []
|
|
1483
|
-
|
|
1484
|
-
# Convert elements to query result format
|
|
1485
|
-
results = []
|
|
1486
|
-
for element in elements:
|
|
1487
|
-
result = {
|
|
1488
|
-
"capture_name": query_key,
|
|
1489
|
-
"node_type": self._get_node_type_for_element(element),
|
|
1490
|
-
"start_line": element.start_line,
|
|
1491
|
-
"end_line": element.end_line,
|
|
1492
|
-
"text": element.raw_text,
|
|
1493
|
-
"name": element.name,
|
|
1494
|
-
}
|
|
1495
|
-
results.append(result)
|
|
1496
|
-
|
|
1497
|
-
return results
|
|
1498
|
-
|
|
1499
|
-
def _get_node_type_for_element(self, element) -> str:
|
|
1442
|
+
def _get_node_type_for_element(self, element: Any) -> str:
|
|
1500
1443
|
"""Get appropriate node type for element"""
|
|
1501
1444
|
from ..models import Class, Function, Import, Variable
|
|
1502
1445
|
|
|
@@ -1592,8 +1535,9 @@ class JavaScriptPlugin(LanguagePlugin):
|
|
|
1592
1535
|
)
|
|
1593
1536
|
|
|
1594
1537
|
try:
|
|
1595
|
-
|
|
1596
|
-
|
|
1538
|
+
from ..encoding_utils import read_file_safe
|
|
1539
|
+
|
|
1540
|
+
source_code, _ = read_file_safe(file_path)
|
|
1597
1541
|
|
|
1598
1542
|
parser = tree_sitter.Parser()
|
|
1599
1543
|
parser.language = language
|