tree-sitter-analyzer 0.2.0__py3-none-any.whl → 0.3.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 +133 -121
  2. tree_sitter_analyzer/__main__.py +11 -12
  3. tree_sitter_analyzer/api.py +531 -539
  4. tree_sitter_analyzer/cli/__init__.py +39 -39
  5. tree_sitter_analyzer/cli/__main__.py +12 -13
  6. tree_sitter_analyzer/cli/commands/__init__.py +26 -27
  7. tree_sitter_analyzer/cli/commands/advanced_command.py +88 -88
  8. tree_sitter_analyzer/cli/commands/base_command.py +160 -155
  9. tree_sitter_analyzer/cli/commands/default_command.py +18 -19
  10. tree_sitter_analyzer/cli/commands/partial_read_command.py +141 -133
  11. tree_sitter_analyzer/cli/commands/query_command.py +81 -82
  12. tree_sitter_analyzer/cli/commands/structure_command.py +138 -121
  13. tree_sitter_analyzer/cli/commands/summary_command.py +101 -93
  14. tree_sitter_analyzer/cli/commands/table_command.py +232 -233
  15. tree_sitter_analyzer/cli/info_commands.py +120 -121
  16. tree_sitter_analyzer/cli_main.py +277 -276
  17. tree_sitter_analyzer/core/__init__.py +15 -20
  18. tree_sitter_analyzer/core/analysis_engine.py +591 -574
  19. tree_sitter_analyzer/core/cache_service.py +320 -330
  20. tree_sitter_analyzer/core/engine.py +557 -560
  21. tree_sitter_analyzer/core/parser.py +293 -288
  22. tree_sitter_analyzer/core/query.py +494 -502
  23. tree_sitter_analyzer/encoding_utils.py +458 -460
  24. tree_sitter_analyzer/exceptions.py +337 -340
  25. tree_sitter_analyzer/file_handler.py +217 -222
  26. tree_sitter_analyzer/formatters/__init__.py +1 -1
  27. tree_sitter_analyzer/formatters/base_formatter.py +167 -168
  28. tree_sitter_analyzer/formatters/formatter_factory.py +78 -74
  29. tree_sitter_analyzer/formatters/java_formatter.py +287 -270
  30. tree_sitter_analyzer/formatters/python_formatter.py +255 -235
  31. tree_sitter_analyzer/interfaces/__init__.py +9 -10
  32. tree_sitter_analyzer/interfaces/cli.py +528 -557
  33. tree_sitter_analyzer/interfaces/cli_adapter.py +322 -319
  34. tree_sitter_analyzer/interfaces/mcp_adapter.py +180 -170
  35. tree_sitter_analyzer/interfaces/mcp_server.py +405 -416
  36. tree_sitter_analyzer/java_analyzer.py +218 -219
  37. tree_sitter_analyzer/language_detector.py +398 -400
  38. tree_sitter_analyzer/language_loader.py +224 -228
  39. tree_sitter_analyzer/languages/__init__.py +10 -11
  40. tree_sitter_analyzer/languages/java_plugin.py +1129 -1113
  41. tree_sitter_analyzer/languages/python_plugin.py +737 -712
  42. tree_sitter_analyzer/mcp/__init__.py +31 -32
  43. tree_sitter_analyzer/mcp/resources/__init__.py +44 -47
  44. tree_sitter_analyzer/mcp/resources/code_file_resource.py +212 -213
  45. tree_sitter_analyzer/mcp/resources/project_stats_resource.py +560 -550
  46. tree_sitter_analyzer/mcp/server.py +333 -345
  47. tree_sitter_analyzer/mcp/tools/__init__.py +30 -31
  48. tree_sitter_analyzer/mcp/tools/analyze_scale_tool.py +621 -557
  49. tree_sitter_analyzer/mcp/tools/analyze_scale_tool_cli_compatible.py +242 -245
  50. tree_sitter_analyzer/mcp/tools/base_tool.py +54 -55
  51. tree_sitter_analyzer/mcp/tools/read_partial_tool.py +300 -302
  52. tree_sitter_analyzer/mcp/tools/table_format_tool.py +362 -359
  53. tree_sitter_analyzer/mcp/tools/universal_analyze_tool.py +543 -476
  54. tree_sitter_analyzer/mcp/utils/__init__.py +105 -106
  55. tree_sitter_analyzer/mcp/utils/error_handler.py +549 -549
  56. tree_sitter_analyzer/models.py +470 -481
  57. tree_sitter_analyzer/output_manager.py +261 -264
  58. tree_sitter_analyzer/plugins/__init__.py +333 -334
  59. tree_sitter_analyzer/plugins/base.py +477 -446
  60. tree_sitter_analyzer/plugins/java_plugin.py +608 -625
  61. tree_sitter_analyzer/plugins/javascript_plugin.py +446 -439
  62. tree_sitter_analyzer/plugins/manager.py +362 -355
  63. tree_sitter_analyzer/plugins/plugin_loader.py +85 -83
  64. tree_sitter_analyzer/plugins/python_plugin.py +606 -598
  65. tree_sitter_analyzer/plugins/registry.py +374 -366
  66. tree_sitter_analyzer/queries/__init__.py +26 -27
  67. tree_sitter_analyzer/queries/java.py +391 -394
  68. tree_sitter_analyzer/queries/javascript.py +148 -149
  69. tree_sitter_analyzer/queries/python.py +285 -286
  70. tree_sitter_analyzer/queries/typescript.py +229 -230
  71. tree_sitter_analyzer/query_loader.py +254 -260
  72. tree_sitter_analyzer/table_formatter.py +468 -448
  73. tree_sitter_analyzer/utils.py +277 -277
  74. {tree_sitter_analyzer-0.2.0.dist-info → tree_sitter_analyzer-0.3.0.dist-info}/METADATA +21 -6
  75. tree_sitter_analyzer-0.3.0.dist-info/RECORD +77 -0
  76. tree_sitter_analyzer-0.2.0.dist-info/RECORD +0 -77
  77. {tree_sitter_analyzer-0.2.0.dist-info → tree_sitter_analyzer-0.3.0.dist-info}/WHEEL +0 -0
  78. {tree_sitter_analyzer-0.2.0.dist-info → tree_sitter_analyzer-0.3.0.dist-info}/entry_points.txt +0 -0
@@ -1,235 +1,255 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- """
4
- Python-specific table formatter.
5
- """
6
-
7
- from typing import Any, Dict, List
8
- from .base_formatter import BaseTableFormatter
9
-
10
-
11
- class PythonTableFormatter(BaseTableFormatter):
12
- """Python言語専用のテーブルフォーマッター"""
13
-
14
- def _format_full_table(self, data: Dict[str, Any]) -> str:
15
- """Python用完全版テーブル形式"""
16
- lines = []
17
-
18
- # ヘッダー - Python用(複数クラス対応)
19
- classes = data.get("classes", [])
20
- if len(classes) > 1:
21
- # 複数クラスがある場合はファイル名を使用
22
- file_name = data.get("file_path", "Unknown").split("/")[-1].split("\\")[-1]
23
- lines.append(f"# {file_name}")
24
- else:
25
- # 単一クラスの場合はクラス名を使用
26
- class_name = classes[0].get("name", "Unknown") if classes else "Unknown"
27
- lines.append(f"# {class_name}")
28
- lines.append("")
29
-
30
- # Imports
31
- imports = data.get("imports", [])
32
- if imports:
33
- lines.append("## Imports")
34
- lines.append("```python")
35
- for imp in imports:
36
- lines.append(str(imp.get("statement", "")))
37
- lines.append("```")
38
- lines.append("")
39
-
40
- # Classes - Python用(複数クラス対応)
41
- if len(classes) > 1:
42
- lines.append("## Classes")
43
- lines.append("| Class | Type | Visibility | Lines | Methods | Fields |")
44
- lines.append("|-------|------|------------|-------|---------|--------|")
45
-
46
- for class_info in classes:
47
- name = str(class_info.get("name", "Unknown"))
48
- class_type = str(class_info.get("type", "class"))
49
- visibility = str(class_info.get("visibility", "public"))
50
- line_range = class_info.get("line_range", {})
51
- lines_str = f"{line_range.get('start', 0)}-{line_range.get('end', 0)}"
52
-
53
- # このクラスのメソッド数とフィールド数を計算
54
- class_methods = [m for m in data.get("methods", [])
55
- if line_range.get('start', 0) <= m.get('line_range', {}).get('start', 0) <= line_range.get('end', 0)]
56
- class_fields = [f for f in data.get("fields", [])
57
- if line_range.get('start', 0) <= f.get('line_range', {}).get('start', 0) <= line_range.get('end', 0)]
58
-
59
- lines.append(f"| {name} | {class_type} | {visibility} | {lines_str} | {len(class_methods)} | {len(class_fields)} |")
60
- else:
61
- # 単一クラスの場合
62
- lines.append("## Class Info")
63
- lines.append("| Property | Value |")
64
- lines.append("|----------|-------|")
65
-
66
- class_info = data.get("classes", [{}])[0] if data.get("classes") else {}
67
- stats = data.get("statistics") or {}
68
-
69
- lines.append(f"| Package | (default) |")
70
- lines.append(f"| Type | {str(class_info.get('type', 'class'))} |")
71
- lines.append(f"| Visibility | {str(class_info.get('visibility', 'public'))} |")
72
- lines.append(
73
- f"| Lines | {class_info.get('line_range', {}).get('start', 0)}-{class_info.get('line_range', {}).get('end', 0)} |"
74
- )
75
- lines.append(f"| Total Methods | {stats.get('method_count', 0)} |")
76
- lines.append(f"| Total Fields | {stats.get('field_count', 0)} |")
77
-
78
- lines.append("")
79
-
80
- # Fields
81
- fields = data.get("fields", [])
82
- if fields:
83
- lines.append("## Fields")
84
- lines.append("| Name | Type | Vis | Modifiers | Line | Doc |")
85
- lines.append("|------|------|-----|-----------|------|-----|")
86
-
87
- for field in fields:
88
- name = str(field.get("name", ""))
89
- field_type = str(field.get("type", ""))
90
- visibility = self._convert_visibility(str(field.get("visibility", "")))
91
- modifiers = ",".join([str(m) for m in field.get("modifiers", [])])
92
- line = field.get("line_range", {}).get("start", 0)
93
- doc = str(field.get("javadoc", "")) or "-"
94
- doc = doc.replace("\n", " ").replace("|", "\\|")[:50]
95
-
96
- lines.append(
97
- f"| {name} | {field_type} | {visibility} | {modifiers} | {line} | {doc} |"
98
- )
99
- lines.append("")
100
-
101
- # Methods - Python用(コンストラクタ分離なし)
102
- methods = data.get("methods", [])
103
- if methods:
104
- lines.append("## Methods")
105
- lines.append("| Method | Signature | Vis | Lines | Cols | Cx | Doc |")
106
- lines.append("|--------|-----------|-----|-------|------|----|----|")
107
-
108
- for method in methods:
109
- lines.append(self._format_method_row(method))
110
- lines.append("")
111
-
112
- # 末尾の空行を削除
113
- while lines and lines[-1] == "":
114
- lines.pop()
115
-
116
- return "\n".join(lines)
117
-
118
- def _format_compact_table(self, data: Dict[str, Any]) -> str:
119
- """Python用コンパクト版テーブル形式"""
120
- lines = []
121
-
122
- # ヘッダー
123
- classes = data.get("classes", [])
124
- if len(classes) > 1:
125
- file_name = data.get("file_path", "Unknown").split("/")[-1].split("\\")[-1]
126
- lines.append(f"# {file_name}")
127
- else:
128
- class_name = classes[0].get("name", "Unknown") if classes else "Unknown"
129
- lines.append(f"# {class_name}")
130
- lines.append("")
131
-
132
- # 基本情報
133
- stats = data.get("statistics") or {}
134
- lines.append("## Info")
135
- lines.append("| Property | Value |")
136
- lines.append("|----------|-------|")
137
- lines.append(f"| Classes | {len(classes)} |")
138
- lines.append(f"| Methods | {stats.get('method_count', 0)} |")
139
- lines.append(f"| Fields | {stats.get('field_count', 0)} |")
140
- lines.append("")
141
-
142
- # メソッド(簡略版)
143
- methods = data.get("methods", [])
144
- if methods:
145
- lines.append("## Methods")
146
- lines.append("| Method | Sig | V | L | Cx | Doc |")
147
- lines.append("|--------|-----|---|---|----|----|")
148
-
149
- for method in methods:
150
- name = str(method.get("name", ""))
151
- signature = self._create_compact_signature(method)
152
- visibility = self._convert_visibility(str(method.get("visibility", "")))
153
- line_range = method.get("line_range", {})
154
- lines_str = f"{line_range.get('start', 0)}-{line_range.get('end', 0)}"
155
- complexity = method.get("complexity_score", 0)
156
- doc = self._clean_csv_text(
157
- self._extract_doc_summary(str(method.get("javadoc", "")))
158
- )
159
-
160
- lines.append(
161
- f"| {name} | {signature} | {visibility} | {lines_str} | {complexity} | {doc} |"
162
- )
163
- lines.append("")
164
-
165
- # 末尾の空行を削除
166
- while lines and lines[-1] == "":
167
- lines.pop()
168
-
169
- return "\n".join(lines)
170
-
171
- def _format_method_row(self, method: Dict[str, Any]) -> str:
172
- """Python用メソッド行のフォーマット"""
173
- name = str(method.get("name", ""))
174
- signature = self._create_full_signature(method)
175
- visibility = self._convert_visibility(str(method.get("visibility", "")))
176
- line_range = method.get("line_range", {})
177
- lines_str = f"{line_range.get('start', 0)}-{line_range.get('end', 0)}"
178
- cols_str = "5-6" # デフォルト値
179
- complexity = method.get("complexity_score", 0)
180
- doc = self._clean_csv_text(
181
- self._extract_doc_summary(str(method.get("javadoc", "")))
182
- )
183
-
184
- return f"| {name} | {signature} | {visibility} | {lines_str} | {cols_str} | {complexity} | {doc} |"
185
-
186
- def _create_compact_signature(self, method: Dict[str, Any]) -> str:
187
- """Python用コンパクトなメソッドシグネチャを作成"""
188
- params = method.get("parameters", [])
189
- param_types = []
190
-
191
- for p in params:
192
- if isinstance(p, dict):
193
- param_types.append(self._shorten_type(p.get("type", "Any")))
194
- else:
195
- param_types.append("Any")
196
-
197
- params_str = ",".join(param_types)
198
- return_type = self._shorten_type(method.get("return_type", "Any"))
199
-
200
- return f"({params_str}):{return_type}"
201
-
202
- def _shorten_type(self, type_name: Any) -> str:
203
- """Python用型名を短縮"""
204
- if type_name is None:
205
- return "Any"
206
-
207
- if not isinstance(type_name, str):
208
- type_name = str(type_name)
209
-
210
- type_mapping = {
211
- "str": "s",
212
- "int": "i",
213
- "float": "f",
214
- "bool": "b",
215
- "None": "N",
216
- "Any": "A",
217
- "List": "L",
218
- "Dict": "D",
219
- "Optional": "O",
220
- "Union": "U",
221
- }
222
-
223
- # List[str] -> L[s]
224
- if "List[" in type_name:
225
- return type_name.replace("List[", "L[").replace("str", "s").replace("int", "i")
226
-
227
- # Dict[str, int] -> D[s,i]
228
- if "Dict[" in type_name:
229
- return type_name.replace("Dict[", "D[").replace("str", "s").replace("int", "i")
230
-
231
- # Optional[str] -> O[s]
232
- if "Optional[" in type_name:
233
- return type_name.replace("Optional[", "O[").replace("str", "s")
234
-
235
- return type_mapping.get(type_name, type_name[:3] if len(type_name) > 3 else type_name)
1
+ #!/usr/bin/env python3
2
+ """
3
+ Python-specific table formatter.
4
+ """
5
+
6
+ from typing import Any
7
+
8
+ from .base_formatter import BaseTableFormatter
9
+
10
+
11
+ class PythonTableFormatter(BaseTableFormatter):
12
+ """Python言語専用のテーブルフォーマッター"""
13
+
14
+ def _format_full_table(self, data: dict[str, Any]) -> str:
15
+ """Python用完全版テーブル形式"""
16
+ lines = []
17
+
18
+ # ヘッダー - Python用(複数クラス対応)
19
+ classes = data.get("classes", [])
20
+ if len(classes) > 1:
21
+ # 複数クラスがある場合はファイル名を使用
22
+ file_name = data.get("file_path", "Unknown").split("/")[-1].split("\\")[-1]
23
+ lines.append(f"# {file_name}")
24
+ else:
25
+ # 単一クラスの場合はクラス名を使用
26
+ class_name = classes[0].get("name", "Unknown") if classes else "Unknown"
27
+ lines.append(f"# {class_name}")
28
+ lines.append("")
29
+
30
+ # Imports
31
+ imports = data.get("imports", [])
32
+ if imports:
33
+ lines.append("## Imports")
34
+ lines.append("```python")
35
+ for imp in imports:
36
+ lines.append(str(imp.get("statement", "")))
37
+ lines.append("```")
38
+ lines.append("")
39
+
40
+ # Classes - Python用(複数クラス対応)
41
+ if len(classes) > 1:
42
+ lines.append("## Classes")
43
+ lines.append("| Class | Type | Visibility | Lines | Methods | Fields |")
44
+ lines.append("|-------|------|------------|-------|---------|--------|")
45
+
46
+ for class_info in classes:
47
+ name = str(class_info.get("name", "Unknown"))
48
+ class_type = str(class_info.get("type", "class"))
49
+ visibility = str(class_info.get("visibility", "public"))
50
+ line_range = class_info.get("line_range", {})
51
+ lines_str = f"{line_range.get('start', 0)}-{line_range.get('end', 0)}"
52
+
53
+ # このクラスのメソッド数とフィールド数を計算
54
+ class_methods = [
55
+ m
56
+ for m in data.get("methods", [])
57
+ if line_range.get("start", 0)
58
+ <= m.get("line_range", {}).get("start", 0)
59
+ <= line_range.get("end", 0)
60
+ ]
61
+ class_fields = [
62
+ f
63
+ for f in data.get("fields", [])
64
+ if line_range.get("start", 0)
65
+ <= f.get("line_range", {}).get("start", 0)
66
+ <= line_range.get("end", 0)
67
+ ]
68
+
69
+ lines.append(
70
+ f"| {name} | {class_type} | {visibility} | {lines_str} | {len(class_methods)} | {len(class_fields)} |"
71
+ )
72
+ else:
73
+ # 単一クラスの場合
74
+ lines.append("## Class Info")
75
+ lines.append("| Property | Value |")
76
+ lines.append("|----------|-------|")
77
+
78
+ class_info = data.get("classes", [{}])[0] if data.get("classes") else {}
79
+ stats = data.get("statistics") or {}
80
+
81
+ lines.append("| Package | (default) |")
82
+ lines.append(f"| Type | {str(class_info.get('type', 'class'))} |")
83
+ lines.append(
84
+ f"| Visibility | {str(class_info.get('visibility', 'public'))} |"
85
+ )
86
+ lines.append(
87
+ f"| Lines | {class_info.get('line_range', {}).get('start', 0)}-{class_info.get('line_range', {}).get('end', 0)} |"
88
+ )
89
+ lines.append(f"| Total Methods | {stats.get('method_count', 0)} |")
90
+ lines.append(f"| Total Fields | {stats.get('field_count', 0)} |")
91
+
92
+ lines.append("")
93
+
94
+ # Fields
95
+ fields = data.get("fields", [])
96
+ if fields:
97
+ lines.append("## Fields")
98
+ lines.append("| Name | Type | Vis | Modifiers | Line | Doc |")
99
+ lines.append("|------|------|-----|-----------|------|-----|")
100
+
101
+ for field in fields:
102
+ name = str(field.get("name", ""))
103
+ field_type = str(field.get("type", ""))
104
+ visibility = self._convert_visibility(str(field.get("visibility", "")))
105
+ modifiers = ",".join([str(m) for m in field.get("modifiers", [])])
106
+ line = field.get("line_range", {}).get("start", 0)
107
+ doc = str(field.get("javadoc", "")) or "-"
108
+ doc = doc.replace("\n", " ").replace("|", "\\|")[:50]
109
+
110
+ lines.append(
111
+ f"| {name} | {field_type} | {visibility} | {modifiers} | {line} | {doc} |"
112
+ )
113
+ lines.append("")
114
+
115
+ # Methods - Python用(コンストラクタ分離なし)
116
+ methods = data.get("methods", [])
117
+ if methods:
118
+ lines.append("## Methods")
119
+ lines.append("| Method | Signature | Vis | Lines | Cols | Cx | Doc |")
120
+ lines.append("|--------|-----------|-----|-------|------|----|----|")
121
+
122
+ for method in methods:
123
+ lines.append(self._format_method_row(method))
124
+ lines.append("")
125
+
126
+ # 末尾の空行を削除
127
+ while lines and lines[-1] == "":
128
+ lines.pop()
129
+
130
+ return "\n".join(lines)
131
+
132
+ def _format_compact_table(self, data: dict[str, Any]) -> str:
133
+ """Python用コンパクト版テーブル形式"""
134
+ lines = []
135
+
136
+ # ヘッダー
137
+ classes = data.get("classes", [])
138
+ if len(classes) > 1:
139
+ file_name = data.get("file_path", "Unknown").split("/")[-1].split("\\")[-1]
140
+ lines.append(f"# {file_name}")
141
+ else:
142
+ class_name = classes[0].get("name", "Unknown") if classes else "Unknown"
143
+ lines.append(f"# {class_name}")
144
+ lines.append("")
145
+
146
+ # 基本情報
147
+ stats = data.get("statistics") or {}
148
+ lines.append("## Info")
149
+ lines.append("| Property | Value |")
150
+ lines.append("|----------|-------|")
151
+ lines.append(f"| Classes | {len(classes)} |")
152
+ lines.append(f"| Methods | {stats.get('method_count', 0)} |")
153
+ lines.append(f"| Fields | {stats.get('field_count', 0)} |")
154
+ lines.append("")
155
+
156
+ # メソッド(簡略版)
157
+ methods = data.get("methods", [])
158
+ if methods:
159
+ lines.append("## Methods")
160
+ lines.append("| Method | Sig | V | L | Cx | Doc |")
161
+ lines.append("|--------|-----|---|---|----|----|")
162
+
163
+ for method in methods:
164
+ name = str(method.get("name", ""))
165
+ signature = self._create_compact_signature(method)
166
+ visibility = self._convert_visibility(str(method.get("visibility", "")))
167
+ line_range = method.get("line_range", {})
168
+ lines_str = f"{line_range.get('start', 0)}-{line_range.get('end', 0)}"
169
+ complexity = method.get("complexity_score", 0)
170
+ doc = self._clean_csv_text(
171
+ self._extract_doc_summary(str(method.get("javadoc", "")))
172
+ )
173
+
174
+ lines.append(
175
+ f"| {name} | {signature} | {visibility} | {lines_str} | {complexity} | {doc} |"
176
+ )
177
+ lines.append("")
178
+
179
+ # 末尾の空行を削除
180
+ while lines and lines[-1] == "":
181
+ lines.pop()
182
+
183
+ return "\n".join(lines)
184
+
185
+ def _format_method_row(self, method: dict[str, Any]) -> str:
186
+ """Python用メソッド行のフォーマット"""
187
+ name = str(method.get("name", ""))
188
+ signature = self._create_full_signature(method)
189
+ visibility = self._convert_visibility(str(method.get("visibility", "")))
190
+ line_range = method.get("line_range", {})
191
+ lines_str = f"{line_range.get('start', 0)}-{line_range.get('end', 0)}"
192
+ cols_str = "5-6" # デフォルト値
193
+ complexity = method.get("complexity_score", 0)
194
+ doc = self._clean_csv_text(
195
+ self._extract_doc_summary(str(method.get("javadoc", "")))
196
+ )
197
+
198
+ return f"| {name} | {signature} | {visibility} | {lines_str} | {cols_str} | {complexity} | {doc} |"
199
+
200
+ def _create_compact_signature(self, method: dict[str, Any]) -> str:
201
+ """Python用コンパクトなメソッドシグネチャを作成"""
202
+ params = method.get("parameters", [])
203
+ param_types = []
204
+
205
+ for p in params:
206
+ if isinstance(p, dict):
207
+ param_types.append(self._shorten_type(p.get("type", "Any")))
208
+ else:
209
+ param_types.append("Any")
210
+
211
+ params_str = ",".join(param_types)
212
+ return_type = self._shorten_type(method.get("return_type", "Any"))
213
+
214
+ return f"({params_str}):{return_type}"
215
+
216
+ def _shorten_type(self, type_name: Any) -> str:
217
+ """Python用型名を短縮"""
218
+ if type_name is None:
219
+ return "Any"
220
+
221
+ if not isinstance(type_name, str):
222
+ type_name = str(type_name)
223
+
224
+ type_mapping = {
225
+ "str": "s",
226
+ "int": "i",
227
+ "float": "f",
228
+ "bool": "b",
229
+ "None": "N",
230
+ "Any": "A",
231
+ "List": "L",
232
+ "Dict": "D",
233
+ "Optional": "O",
234
+ "Union": "U",
235
+ }
236
+
237
+ # List[str] -> L[s]
238
+ if "List[" in type_name:
239
+ return (
240
+ type_name.replace("List[", "L[").replace("str", "s").replace("int", "i")
241
+ )
242
+
243
+ # Dict[str, int] -> D[s,i]
244
+ if "Dict[" in type_name:
245
+ return (
246
+ type_name.replace("Dict[", "D[").replace("str", "s").replace("int", "i")
247
+ )
248
+
249
+ # Optional[str] -> O[s]
250
+ if "Optional[" in type_name:
251
+ return type_name.replace("Optional[", "O[").replace("str", "s")
252
+
253
+ return type_mapping.get(
254
+ type_name, type_name[:3] if len(type_name) > 3 else type_name
255
+ )
@@ -1,10 +1,9 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- """
4
- Interfaces Package
5
-
6
- This package contains the external interfaces for the tree-sitter analyzer.
7
- Each interface provides a different way to interact with the core analysis engine.
8
- """
9
-
10
- # This file makes the interfaces directory a Python package
1
+ #!/usr/bin/env python3
2
+ """
3
+ Interfaces Package
4
+
5
+ This package contains the external interfaces for the tree-sitter analyzer.
6
+ Each interface provides a different way to interact with the core analysis engine.
7
+ """
8
+
9
+ # This file makes the interfaces directory a Python package