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.

Files changed (64) hide show
  1. tree_sitter_analyzer/__init__.py +1 -1
  2. tree_sitter_analyzer/api.py +216 -8
  3. tree_sitter_analyzer/cli/argument_validator.py +1 -1
  4. tree_sitter_analyzer/cli/commands/advanced_command.py +3 -6
  5. tree_sitter_analyzer/cli/commands/query_command.py +3 -1
  6. tree_sitter_analyzer/cli/commands/table_command.py +3 -3
  7. tree_sitter_analyzer/constants.py +5 -3
  8. tree_sitter_analyzer/core/analysis_engine.py +1 -1
  9. tree_sitter_analyzer/core/cache_service.py +1 -1
  10. tree_sitter_analyzer/core/engine.py +34 -10
  11. tree_sitter_analyzer/core/query.py +82 -2
  12. tree_sitter_analyzer/encoding_utils.py +64 -0
  13. tree_sitter_analyzer/exceptions.py +1 -1
  14. tree_sitter_analyzer/file_handler.py +49 -33
  15. tree_sitter_analyzer/formatters/base_formatter.py +1 -1
  16. tree_sitter_analyzer/formatters/html_formatter.py +24 -14
  17. tree_sitter_analyzer/formatters/javascript_formatter.py +28 -21
  18. tree_sitter_analyzer/formatters/language_formatter_factory.py +7 -4
  19. tree_sitter_analyzer/formatters/markdown_formatter.py +4 -4
  20. tree_sitter_analyzer/formatters/python_formatter.py +4 -4
  21. tree_sitter_analyzer/formatters/typescript_formatter.py +1 -1
  22. tree_sitter_analyzer/interfaces/mcp_adapter.py +4 -2
  23. tree_sitter_analyzer/interfaces/mcp_server.py +10 -10
  24. tree_sitter_analyzer/language_detector.py +30 -5
  25. tree_sitter_analyzer/language_loader.py +46 -26
  26. tree_sitter_analyzer/languages/css_plugin.py +6 -6
  27. tree_sitter_analyzer/languages/html_plugin.py +12 -8
  28. tree_sitter_analyzer/languages/java_plugin.py +330 -520
  29. tree_sitter_analyzer/languages/javascript_plugin.py +22 -78
  30. tree_sitter_analyzer/languages/markdown_plugin.py +277 -297
  31. tree_sitter_analyzer/languages/python_plugin.py +47 -85
  32. tree_sitter_analyzer/languages/typescript_plugin.py +48 -123
  33. tree_sitter_analyzer/mcp/resources/project_stats_resource.py +14 -8
  34. tree_sitter_analyzer/mcp/server.py +38 -23
  35. tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +10 -7
  36. tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py +51 -7
  37. tree_sitter_analyzer/mcp/tools/fd_rg_utils.py +11 -7
  38. tree_sitter_analyzer/mcp/tools/find_and_grep_tool.py +8 -6
  39. tree_sitter_analyzer/mcp/tools/list_files_tool.py +6 -6
  40. tree_sitter_analyzer/mcp/tools/output_format_validator.py +148 -0
  41. tree_sitter_analyzer/mcp/tools/search_content_tool.py +48 -15
  42. tree_sitter_analyzer/mcp/tools/table_format_tool.py +13 -8
  43. tree_sitter_analyzer/mcp/utils/file_output_manager.py +8 -3
  44. tree_sitter_analyzer/mcp/utils/gitignore_detector.py +24 -12
  45. tree_sitter_analyzer/mcp/utils/path_resolver.py +2 -2
  46. tree_sitter_analyzer/models.py +16 -0
  47. tree_sitter_analyzer/mypy_current_errors.txt +2 -0
  48. tree_sitter_analyzer/plugins/base.py +66 -0
  49. tree_sitter_analyzer/queries/java.py +9 -3
  50. tree_sitter_analyzer/queries/javascript.py +3 -8
  51. tree_sitter_analyzer/queries/markdown.py +1 -1
  52. tree_sitter_analyzer/queries/python.py +2 -2
  53. tree_sitter_analyzer/security/boundary_manager.py +2 -5
  54. tree_sitter_analyzer/security/regex_checker.py +2 -2
  55. tree_sitter_analyzer/security/validator.py +5 -1
  56. tree_sitter_analyzer/table_formatter.py +4 -4
  57. tree_sitter_analyzer/utils/__init__.py +27 -116
  58. tree_sitter_analyzer/{utils.py → utils/logging.py} +2 -2
  59. tree_sitter_analyzer/utils/tree_sitter_compat.py +2 -2
  60. {tree_sitter_analyzer-1.9.2.dist-info → tree_sitter_analyzer-1.9.4.dist-info}/METADATA +87 -45
  61. tree_sitter_analyzer-1.9.4.dist-info/RECORD +111 -0
  62. tree_sitter_analyzer-1.9.2.dist-info/RECORD +0 -109
  63. {tree_sitter_analyzer-1.9.2.dist-info → tree_sitter_analyzer-1.9.4.dist-info}/WHEEL +0 -0
  64. {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
- return line[start_point[1] : end_point[1]]
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
- # JavaScript-specific properties
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
- # JavaScript-specific properties
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
- # JavaScript-specific properties
984
- import_type="dynamic",
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(self, tree: "tree_sitter.Tree", source_code: str) -> list:
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] = None
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, tree: "tree_sitter.Tree", source_code: str, query_key: str
1445
- ) -> list[dict]:
1446
- """
1447
- Execute query strategy for JavaScript language
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
- # Map query keys to extraction methods
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
- with open(file_path, encoding="utf-8") as f:
1596
- source_code = f.read()
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