tree-sitter-analyzer 0.3.0__py3-none-any.whl → 0.6.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 (63) hide show
  1. tree_sitter_analyzer/__init__.py +5 -6
  2. tree_sitter_analyzer/__main__.py +2 -2
  3. tree_sitter_analyzer/api.py +4 -2
  4. tree_sitter_analyzer/cli/__init__.py +3 -3
  5. tree_sitter_analyzer/cli/commands/advanced_command.py +1 -1
  6. tree_sitter_analyzer/cli/commands/base_command.py +1 -1
  7. tree_sitter_analyzer/cli/commands/default_command.py +1 -1
  8. tree_sitter_analyzer/cli/commands/partial_read_command.py +2 -2
  9. tree_sitter_analyzer/cli/commands/query_command.py +5 -5
  10. tree_sitter_analyzer/cli/commands/summary_command.py +2 -2
  11. tree_sitter_analyzer/cli/commands/table_command.py +14 -11
  12. tree_sitter_analyzer/cli/info_commands.py +14 -13
  13. tree_sitter_analyzer/cli_main.py +51 -31
  14. tree_sitter_analyzer/core/analysis_engine.py +54 -90
  15. tree_sitter_analyzer/core/cache_service.py +31 -31
  16. tree_sitter_analyzer/core/engine.py +6 -4
  17. tree_sitter_analyzer/core/parser.py +1 -1
  18. tree_sitter_analyzer/core/query.py +502 -494
  19. tree_sitter_analyzer/encoding_utils.py +3 -2
  20. tree_sitter_analyzer/exceptions.py +23 -23
  21. tree_sitter_analyzer/file_handler.py +7 -14
  22. tree_sitter_analyzer/formatters/base_formatter.py +18 -18
  23. tree_sitter_analyzer/formatters/formatter_factory.py +15 -15
  24. tree_sitter_analyzer/formatters/java_formatter.py +291 -287
  25. tree_sitter_analyzer/formatters/python_formatter.py +259 -255
  26. tree_sitter_analyzer/interfaces/cli.py +1 -1
  27. tree_sitter_analyzer/interfaces/cli_adapter.py +62 -41
  28. tree_sitter_analyzer/interfaces/mcp_adapter.py +43 -17
  29. tree_sitter_analyzer/interfaces/mcp_server.py +9 -9
  30. tree_sitter_analyzer/language_detector.py +398 -398
  31. tree_sitter_analyzer/language_loader.py +224 -224
  32. tree_sitter_analyzer/languages/java_plugin.py +1174 -1129
  33. tree_sitter_analyzer/{plugins → languages}/javascript_plugin.py +3 -3
  34. tree_sitter_analyzer/languages/python_plugin.py +26 -8
  35. tree_sitter_analyzer/mcp/resources/code_file_resource.py +0 -3
  36. tree_sitter_analyzer/mcp/resources/project_stats_resource.py +555 -560
  37. tree_sitter_analyzer/mcp/server.py +4 -4
  38. tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +63 -30
  39. tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py +9 -4
  40. tree_sitter_analyzer/mcp/tools/table_format_tool.py +2 -2
  41. tree_sitter_analyzer/mcp/utils/__init__.py +10 -8
  42. tree_sitter_analyzer/models.py +470 -470
  43. tree_sitter_analyzer/output_manager.py +12 -20
  44. tree_sitter_analyzer/plugins/__init__.py +9 -62
  45. tree_sitter_analyzer/plugins/base.py +53 -1
  46. tree_sitter_analyzer/plugins/manager.py +29 -12
  47. tree_sitter_analyzer/queries/java.py +78 -78
  48. tree_sitter_analyzer/queries/javascript.py +7 -7
  49. tree_sitter_analyzer/queries/python.py +18 -18
  50. tree_sitter_analyzer/queries/typescript.py +12 -12
  51. tree_sitter_analyzer/query_loader.py +17 -14
  52. tree_sitter_analyzer/table_formatter.py +24 -19
  53. tree_sitter_analyzer/utils.py +7 -7
  54. {tree_sitter_analyzer-0.3.0.dist-info → tree_sitter_analyzer-0.6.0.dist-info}/METADATA +11 -11
  55. tree_sitter_analyzer-0.6.0.dist-info/RECORD +72 -0
  56. {tree_sitter_analyzer-0.3.0.dist-info → tree_sitter_analyzer-0.6.0.dist-info}/entry_points.txt +2 -1
  57. tree_sitter_analyzer/java_analyzer.py +0 -218
  58. tree_sitter_analyzer/plugins/java_plugin.py +0 -608
  59. tree_sitter_analyzer/plugins/plugin_loader.py +0 -85
  60. tree_sitter_analyzer/plugins/python_plugin.py +0 -606
  61. tree_sitter_analyzer/plugins/registry.py +0 -374
  62. tree_sitter_analyzer-0.3.0.dist-info/RECORD +0 -77
  63. {tree_sitter_analyzer-0.3.0.dist-info → tree_sitter_analyzer-0.6.0.dist-info}/WHEEL +0 -0
@@ -19,9 +19,9 @@ except ImportError:
19
19
 
20
20
  from ..core.analysis_engine import AnalysisRequest
21
21
  from ..language_loader import loader
22
- from ..models import AnalysisResult, Class, Function, Import, Variable
22
+ from ..models import AnalysisResult, Class, CodeElement, Function, Import, Variable
23
+ from ..plugins.base import ElementExtractor, LanguagePlugin
23
24
  from ..utils import log_error, log_warning
24
- from . import ElementExtractor, LanguagePlugin
25
25
 
26
26
 
27
27
  class JavaScriptElementExtractor(ElementExtractor):
@@ -416,7 +416,7 @@ class JavaScriptPlugin(LanguagePlugin):
416
416
  tree = parser.parse(bytes(source_code, "utf8"))
417
417
 
418
418
  extractor = self.create_extractor()
419
- elements = []
419
+ elements: list[CodeElement] = []
420
420
  elements.extend(extractor.extract_functions(tree, source_code))
421
421
  elements.extend(extractor.extract_classes(tree, source_code))
422
422
  elements.extend(extractor.extract_variables(tree, source_code))
@@ -14,7 +14,7 @@ if TYPE_CHECKING:
14
14
  from ..core.analysis_engine import AnalysisRequest
15
15
  from ..models import AnalysisResult
16
16
 
17
- from ..models import Class, Function, Import, Variable
17
+ from ..models import Class, CodeElement, Function, Import, Variable
18
18
  from ..plugins.base import ElementExtractor, LanguagePlugin
19
19
  from ..utils import log_error, log_warning
20
20
 
@@ -301,7 +301,7 @@ class PythonElementExtractor(ElementExtractor):
301
301
  elif name.startswith("_"):
302
302
  visibility = "private"
303
303
 
304
- # 安全地提取原始文本,避免索引越界
304
+ # Safely extract raw text, avoiding index out of bounds
305
305
  start_byte = min(node.start_byte, len(source_code))
306
306
  end_byte = min(node.end_byte, len(source_code))
307
307
  raw_text = (
@@ -402,6 +402,7 @@ class PythonElementExtractor(ElementExtractor):
402
402
  end_line=node.end_point[0] + 1,
403
403
  raw_text=variable_text,
404
404
  language="python",
405
+ variable_type=assignment_type,
405
406
  )
406
407
 
407
408
  except Exception as e:
@@ -416,7 +417,7 @@ class PythonElementExtractor(ElementExtractor):
416
417
  if not self._validate_node(node):
417
418
  return None
418
419
 
419
- # 安全地提取导入文本,避免索引越界
420
+ # Safely extract import text, avoiding index out of bounds
420
421
  start_byte = min(node.start_byte, len(source_code))
421
422
  end_byte = min(node.end_byte, len(source_code))
422
423
  import_text = (
@@ -585,6 +586,7 @@ class PythonPlugin(LanguagePlugin):
585
586
  """Initialize the Python plugin"""
586
587
  super().__init__()
587
588
  self._language_cache: tree_sitter.Language | None = None
589
+ self._extractor: PythonElementExtractor | None = None
588
590
 
589
591
  def get_language_name(self) -> str:
590
592
  """Return the name of the programming language this plugin supports"""
@@ -598,6 +600,12 @@ class PythonPlugin(LanguagePlugin):
598
600
  """Create and return an element extractor for this language"""
599
601
  return PythonElementExtractor()
600
602
 
603
+ def get_extractor(self) -> ElementExtractor:
604
+ """Get the cached extractor instance, creating it if necessary"""
605
+ if self._extractor is None:
606
+ self._extractor = PythonElementExtractor()
607
+ return self._extractor
608
+
601
609
  def get_tree_sitter_language(self) -> Optional["tree_sitter.Language"]:
602
610
  """Get the Tree-sitter language object for Python"""
603
611
  if self._language_cache is None:
@@ -677,13 +685,23 @@ class PythonPlugin(LanguagePlugin):
677
685
 
678
686
  # Extract elements
679
687
  extractor = self.create_extractor()
680
- functions = extractor.extract_functions(parse_result.tree, source_code)
681
- classes = extractor.extract_classes(parse_result.tree, source_code)
682
- variables = extractor.extract_variables(parse_result.tree, source_code)
683
- imports = extractor.extract_imports(parse_result.tree, source_code)
688
+ if parse_result.tree:
689
+ functions = extractor.extract_functions(parse_result.tree, source_code)
690
+ classes = extractor.extract_classes(parse_result.tree, source_code)
691
+ variables = extractor.extract_variables(parse_result.tree, source_code)
692
+ imports = extractor.extract_imports(parse_result.tree, source_code)
693
+ else:
694
+ functions = []
695
+ classes = []
696
+ variables = []
697
+ imports = []
684
698
 
685
699
  # Combine all elements
686
- all_elements = functions + classes + variables + imports
700
+ all_elements: list[CodeElement] = []
701
+ all_elements.extend(functions)
702
+ all_elements.extend(classes)
703
+ all_elements.extend(variables)
704
+ all_elements.extend(imports)
687
705
 
688
706
  return AnalysisResult(
689
707
  file_path=file_path,
@@ -59,9 +59,6 @@ class CodeFileResource:
59
59
  Returns:
60
60
  True if the URI matches the code file pattern
61
61
  """
62
- if not isinstance(uri, str):
63
- return False
64
-
65
62
  return bool(self._uri_pattern.match(uri))
66
63
 
67
64
  def _extract_file_path(self, uri: str) -> str: