kiri-mcp-server 0.16.1 → 0.18.0

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.
Files changed (164) hide show
  1. package/README.md +65 -22
  2. package/dist/package.json +4 -2
  3. package/dist/src/client/proxy.js +0 -0
  4. package/dist/src/daemon/daemon.js +0 -0
  5. package/dist/src/indexer/codeintel/dart/adapter.d.ts +36 -0
  6. package/dist/src/indexer/codeintel/dart/adapter.d.ts.map +1 -0
  7. package/dist/src/indexer/codeintel/dart/adapter.js +60 -0
  8. package/dist/src/indexer/codeintel/dart/adapter.js.map +1 -0
  9. package/dist/src/indexer/codeintel/dart/index.d.ts +7 -0
  10. package/dist/src/indexer/codeintel/dart/index.d.ts.map +1 -0
  11. package/dist/src/indexer/codeintel/dart/index.js +7 -0
  12. package/dist/src/indexer/codeintel/dart/index.js.map +1 -0
  13. package/dist/src/indexer/codeintel/index.d.ts +30 -0
  14. package/dist/src/indexer/codeintel/index.d.ts.map +1 -0
  15. package/dist/src/indexer/codeintel/index.js +32 -0
  16. package/dist/src/indexer/codeintel/index.js.map +1 -0
  17. package/dist/src/indexer/codeintel/java/analyzer.d.ts +22 -0
  18. package/dist/src/indexer/codeintel/java/analyzer.d.ts.map +1 -0
  19. package/dist/src/indexer/codeintel/java/analyzer.js +281 -0
  20. package/dist/src/indexer/codeintel/java/analyzer.js.map +1 -0
  21. package/dist/src/indexer/codeintel/java/index.d.ts +7 -0
  22. package/dist/src/indexer/codeintel/java/index.d.ts.map +1 -0
  23. package/dist/src/indexer/codeintel/java/index.js +7 -0
  24. package/dist/src/indexer/codeintel/java/index.js.map +1 -0
  25. package/dist/src/indexer/codeintel/php/analyzer.d.ts +23 -0
  26. package/dist/src/indexer/codeintel/php/analyzer.d.ts.map +1 -0
  27. package/dist/src/indexer/codeintel/php/analyzer.js +342 -0
  28. package/dist/src/indexer/codeintel/php/analyzer.js.map +1 -0
  29. package/dist/src/indexer/codeintel/php/index.d.ts +7 -0
  30. package/dist/src/indexer/codeintel/php/index.d.ts.map +1 -0
  31. package/dist/src/indexer/codeintel/php/index.js +7 -0
  32. package/dist/src/indexer/codeintel/php/index.js.map +1 -0
  33. package/dist/src/indexer/codeintel/registry.d.ts +76 -0
  34. package/dist/src/indexer/codeintel/registry.d.ts.map +1 -0
  35. package/dist/src/indexer/codeintel/registry.js +127 -0
  36. package/dist/src/indexer/codeintel/registry.js.map +1 -0
  37. package/dist/src/indexer/codeintel/rust/analyzer.d.ts +14 -0
  38. package/dist/src/indexer/codeintel/rust/analyzer.d.ts.map +1 -0
  39. package/dist/src/indexer/codeintel/rust/analyzer.js +388 -0
  40. package/dist/src/indexer/codeintel/rust/analyzer.js.map +1 -0
  41. package/dist/src/indexer/codeintel/rust/index.d.ts +5 -0
  42. package/dist/src/indexer/codeintel/rust/index.d.ts.map +1 -0
  43. package/dist/src/indexer/codeintel/rust/index.js +5 -0
  44. package/dist/src/indexer/codeintel/rust/index.js.map +1 -0
  45. package/dist/src/indexer/codeintel/swift/analyzer.d.ts +22 -0
  46. package/dist/src/indexer/codeintel/swift/analyzer.d.ts.map +1 -0
  47. package/dist/src/indexer/codeintel/swift/analyzer.js +271 -0
  48. package/dist/src/indexer/codeintel/swift/analyzer.js.map +1 -0
  49. package/dist/src/indexer/codeintel/swift/index.d.ts +7 -0
  50. package/dist/src/indexer/codeintel/swift/index.d.ts.map +1 -0
  51. package/dist/src/indexer/codeintel/swift/index.js +7 -0
  52. package/dist/src/indexer/codeintel/swift/index.js.map +1 -0
  53. package/dist/src/indexer/codeintel/types.d.ts +114 -0
  54. package/dist/src/indexer/codeintel/types.d.ts.map +1 -0
  55. package/dist/src/indexer/codeintel/types.js +13 -0
  56. package/dist/src/indexer/codeintel/types.js.map +1 -0
  57. package/dist/src/indexer/codeintel/typescript/analyzer.d.ts +22 -0
  58. package/dist/src/indexer/codeintel/typescript/analyzer.d.ts.map +1 -0
  59. package/dist/{indexer/codeintel.js → src/indexer/codeintel/typescript/analyzer.js} +62 -34
  60. package/dist/src/indexer/codeintel/typescript/analyzer.js.map +1 -0
  61. package/dist/src/indexer/codeintel/typescript/index.d.ts +7 -0
  62. package/dist/src/indexer/codeintel/typescript/index.d.ts.map +1 -0
  63. package/dist/src/indexer/codeintel/typescript/index.js +7 -0
  64. package/dist/src/indexer/codeintel/typescript/index.js.map +1 -0
  65. package/dist/src/indexer/codeintel/utils.d.ts +91 -0
  66. package/dist/src/indexer/codeintel/utils.d.ts.map +1 -0
  67. package/dist/src/indexer/codeintel/utils.js +145 -0
  68. package/dist/src/indexer/codeintel/utils.js.map +1 -0
  69. package/dist/src/indexer/codeintel.d.ts +33 -26
  70. package/dist/src/indexer/codeintel.d.ts.map +1 -1
  71. package/dist/src/indexer/codeintel.js +56 -1078
  72. package/dist/src/indexer/codeintel.js.map +1 -1
  73. package/dist/src/indexer/graph-metrics.d.ts.map +1 -1
  74. package/dist/src/indexer/graph-metrics.js +16 -4
  75. package/dist/src/indexer/graph-metrics.js.map +1 -1
  76. package/dist/src/server/boost-profiles.d.ts +1 -1
  77. package/dist/src/server/boost-profiles.d.ts.map +1 -1
  78. package/dist/src/server/boost-profiles.js +22 -0
  79. package/dist/src/server/boost-profiles.js.map +1 -1
  80. package/dist/src/server/main.js +0 -0
  81. package/dist/src/server/rpc.js +4 -4
  82. package/dist/src/server/rpc.js.map +1 -1
  83. package/package.json +10 -2
  84. package/dist/client/cli.js +0 -68
  85. package/dist/client/cli.js.map +0 -1
  86. package/dist/client/index.js +0 -5
  87. package/dist/client/index.js.map +0 -1
  88. package/dist/eval/metrics.js +0 -47
  89. package/dist/eval/metrics.js.map +0 -1
  90. package/dist/indexer/cli.js +0 -362
  91. package/dist/indexer/cli.js.map +0 -1
  92. package/dist/indexer/codeintel.js.map +0 -1
  93. package/dist/indexer/git.js +0 -30
  94. package/dist/indexer/git.js.map +0 -1
  95. package/dist/indexer/language.js +0 -34
  96. package/dist/indexer/language.js.map +0 -1
  97. package/dist/indexer/pipeline/filters/denylist.js +0 -71
  98. package/dist/indexer/pipeline/filters/denylist.js.map +0 -1
  99. package/dist/indexer/schema.js +0 -101
  100. package/dist/indexer/schema.js.map +0 -1
  101. package/dist/server/bootstrap.js +0 -19
  102. package/dist/server/bootstrap.js.map +0 -1
  103. package/dist/server/context.js +0 -1
  104. package/dist/server/context.js.map +0 -1
  105. package/dist/server/fallbacks/degradeController.js +0 -69
  106. package/dist/server/fallbacks/degradeController.js.map +0 -1
  107. package/dist/server/handlers.js +0 -1268
  108. package/dist/server/handlers.js.map +0 -1
  109. package/dist/server/main.js +0 -151
  110. package/dist/server/main.js.map +0 -1
  111. package/dist/server/observability/metrics.js +0 -56
  112. package/dist/server/observability/metrics.js.map +0 -1
  113. package/dist/server/observability/tracing.js +0 -58
  114. package/dist/server/observability/tracing.js.map +0 -1
  115. package/dist/server/rpc.js +0 -477
  116. package/dist/server/rpc.js.map +0 -1
  117. package/dist/server/runtime.js +0 -47
  118. package/dist/server/runtime.js.map +0 -1
  119. package/dist/server/scoring.js +0 -116
  120. package/dist/server/scoring.js.map +0 -1
  121. package/dist/server/stdio.js +0 -76
  122. package/dist/server/stdio.js.map +0 -1
  123. package/dist/shared/duckdb.js +0 -119
  124. package/dist/shared/duckdb.js.map +0 -1
  125. package/dist/shared/embedding.js +0 -98
  126. package/dist/shared/embedding.js.map +0 -1
  127. package/dist/shared/index.js +0 -9
  128. package/dist/shared/index.js.map +0 -1
  129. package/dist/shared/security/config.js +0 -64
  130. package/dist/shared/security/config.js.map +0 -1
  131. package/dist/shared/security/masker.js +0 -56
  132. package/dist/shared/security/masker.js.map +0 -1
  133. package/dist/shared/tokenizer.js +0 -4
  134. package/dist/shared/tokenizer.js.map +0 -1
  135. package/dist/shared/utils/simpleYaml.js +0 -89
  136. package/dist/shared/utils/simpleYaml.js.map +0 -1
  137. package/dist/src/server/rrf.d.ts +0 -86
  138. package/dist/src/server/rrf.d.ts.map +0 -1
  139. package/dist/src/server/rrf.js +0 -108
  140. package/dist/src/server/rrf.js.map +0 -1
  141. package/dist/src/shared/embedding/engine.d.ts +0 -38
  142. package/dist/src/shared/embedding/engine.d.ts.map +0 -1
  143. package/dist/src/shared/embedding/engine.js +0 -6
  144. package/dist/src/shared/embedding/engine.js.map +0 -1
  145. package/dist/src/shared/embedding/lsh-engine.d.ts +0 -11
  146. package/dist/src/shared/embedding/lsh-engine.d.ts.map +0 -1
  147. package/dist/src/shared/embedding/lsh-engine.js +0 -14
  148. package/dist/src/shared/embedding/lsh-engine.js.map +0 -1
  149. package/dist/src/shared/embedding/registry.d.ts +0 -25
  150. package/dist/src/shared/embedding/registry.d.ts.map +0 -1
  151. package/dist/src/shared/embedding/registry.js +0 -50
  152. package/dist/src/shared/embedding/registry.js.map +0 -1
  153. package/dist/src/shared/embedding/semantic-engine.d.ts +0 -14
  154. package/dist/src/shared/embedding/semantic-engine.d.ts.map +0 -1
  155. package/dist/src/shared/embedding/semantic-engine.js +0 -50
  156. package/dist/src/shared/embedding/semantic-engine.js.map +0 -1
  157. package/dist/src/shared/models/model-manager.d.ts +0 -38
  158. package/dist/src/shared/models/model-manager.d.ts.map +0 -1
  159. package/dist/src/shared/models/model-manager.js +0 -116
  160. package/dist/src/shared/models/model-manager.js.map +0 -1
  161. package/dist/src/shared/models/model-manifest.d.ts +0 -22
  162. package/dist/src/shared/models/model-manifest.d.ts.map +0 -1
  163. package/dist/src/shared/models/model-manifest.js +0 -24
  164. package/dist/src/shared/models/model-manifest.js.map +0 -1
@@ -0,0 +1,342 @@
1
+ /**
2
+ * PHP Language Analyzer
3
+ *
4
+ * tree-sitter-php を使用したシンボル抽出と依存関係解析。
5
+ * class, interface, trait, function, method, property, constant, namespace をサポート。
6
+ * Pure PHP ファイルと HTML-mixed PHP ファイルの両方に対応。
7
+ */
8
+ import { createRequire } from "node:module";
9
+ import Parser from "tree-sitter";
10
+ import { treeSitterPointToLine, sanitizeTreeSitterSignature, assignSymbolIds, symbolsToSnippets, createDependencyRecorder, cleanDocComment, } from "../utils.js";
11
+ // tree-sitter-php is a CommonJS module, so import it using require.
12
+ // tree-sitter-php: Using version 0.22.8 for compatibility with tree-sitter 0.22.4.
13
+ // Version 0.24.2 had a nodeTypeInfo bug that caused runtime errors.
14
+ // php_only: for pure PHP files (<?php at start)
15
+ // php: for HTML-mixed PHP files (HTML with <?php ... ?> tags)
16
+ const require = createRequire(import.meta.url);
17
+ const PHPModule = require("tree-sitter-php");
18
+ const PHP_ONLY = PHPModule.php_only;
19
+ const PHP_MIXED = PHPModule.php;
20
+ /**
21
+ * PHP ファイルが pure PHP か HTML-mixed かを検出
22
+ *
23
+ * Pure PHP: ファイル先頭が <?php タグで始まる (空白、shebang、BOM は許容)
24
+ * HTML-mixed: <?php タグより前に HTML コンテンツがある
25
+ *
26
+ * 対応するケース:
27
+ * - 大文字小文字を無視した PHP タグ (<?php, <?PHP)
28
+ * - ショートタグ (<?=)
29
+ * - shebang (#!/usr/bin/env php)
30
+ * - UTF-8 BOM (\uFEFF)
31
+ */
32
+ function detectPHPType(content) {
33
+ // Regex to find the first PHP open tag, ignoring shebangs, whitespace, and BOM.
34
+ // It checks for <?php (case-insensitive), <?=, or <? (short tag)
35
+ const phpTagRegex = /^(?:\s*|#!\/.*?\n|\uFEFF)*<\?(?:php|=)?/i;
36
+ const match = content.match(phpTagRegex);
37
+ if (!match) {
38
+ // No PHP tags found at the beginning - treat as HTML-mixed
39
+ return "html-mixed";
40
+ }
41
+ // If the match occurs at or near the beginning (after only whitespace/shebang/BOM),
42
+ // it's a pure PHP file
43
+ return "pure";
44
+ }
45
+ /**
46
+ * PHPDoc コメント (ブロックコメント形式) を抽出
47
+ */
48
+ function getPHPDocComment(node, content) {
49
+ const parent = node.parent;
50
+ if (!parent)
51
+ return null;
52
+ // 親ノードのすべての子から、このノードの直前にあるコメントを探す
53
+ const precedingComments = [];
54
+ const siblings = parent.children;
55
+ const nodeIndex = siblings.indexOf(node);
56
+ // このノードより前の兄弟を逆順で調べる
57
+ for (let i = nodeIndex - 1; i >= 0; i--) {
58
+ const sibling = siblings[i];
59
+ if (!sibling)
60
+ continue;
61
+ // commentをチェック
62
+ if (sibling.type === "comment") {
63
+ const commentText = content.substring(sibling.startIndex, sibling.endIndex);
64
+ // PHPDoc コメント形式のみ抽出
65
+ if (commentText.startsWith("/**") && commentText.endsWith("*/")) {
66
+ precedingComments.unshift(cleanDocComment(commentText));
67
+ }
68
+ }
69
+ else if (sibling.type !== "text" && !sibling.text.trim().match(/^\s*$/)) {
70
+ // コメント以外の実質的なノードに到達したら終了
71
+ break;
72
+ }
73
+ }
74
+ if (precedingComments.length === 0) {
75
+ return null;
76
+ }
77
+ return precedingComments.join("\n");
78
+ }
79
+ /**
80
+ * 子ノードから名前を抽出
81
+ */
82
+ function extractName(node, content) {
83
+ function findName(n) {
84
+ if (n.type === "name") {
85
+ return n;
86
+ }
87
+ for (const child of n.namedChildren) {
88
+ const found = findName(child);
89
+ if (found)
90
+ return found;
91
+ }
92
+ return null;
93
+ }
94
+ const nameNode = findName(node);
95
+ return nameNode ? content.substring(nameNode.startIndex, nameNode.endIndex) : null;
96
+ }
97
+ /**
98
+ * シンボルレコードを作成
99
+ */
100
+ function createPHPSymbolRecords(tree, content) {
101
+ const results = [];
102
+ /**
103
+ * ノードからシグネチャを取得
104
+ */
105
+ function getSignature(node) {
106
+ const nodeText = content.substring(node.startIndex, node.endIndex);
107
+ return sanitizeTreeSitterSignature(nodeText);
108
+ }
109
+ /**
110
+ * ツリーを再帰的にトラバースしてシンボルを抽出
111
+ */
112
+ function visit(node) {
113
+ // class_declaration: クラス宣言
114
+ if (node.type === "class_declaration") {
115
+ const name = extractName(node, content);
116
+ if (name) {
117
+ results.push({
118
+ name,
119
+ kind: "class",
120
+ rangeStartLine: treeSitterPointToLine(node.startPosition),
121
+ rangeEndLine: treeSitterPointToLine(node.endPosition),
122
+ signature: getSignature(node),
123
+ doc: getPHPDocComment(node, content),
124
+ });
125
+ }
126
+ }
127
+ // interface_declaration: インターフェース宣言
128
+ else if (node.type === "interface_declaration") {
129
+ const name = extractName(node, content);
130
+ if (name) {
131
+ results.push({
132
+ name,
133
+ kind: "interface",
134
+ rangeStartLine: treeSitterPointToLine(node.startPosition),
135
+ rangeEndLine: treeSitterPointToLine(node.endPosition),
136
+ signature: getSignature(node),
137
+ doc: getPHPDocComment(node, content),
138
+ });
139
+ }
140
+ }
141
+ // trait_declaration: トレイト宣言
142
+ else if (node.type === "trait_declaration") {
143
+ const name = extractName(node, content);
144
+ if (name) {
145
+ results.push({
146
+ name,
147
+ kind: "trait",
148
+ rangeStartLine: treeSitterPointToLine(node.startPosition),
149
+ rangeEndLine: treeSitterPointToLine(node.endPosition),
150
+ signature: getSignature(node),
151
+ doc: getPHPDocComment(node, content),
152
+ });
153
+ }
154
+ }
155
+ // function_definition: トップレベル関数またはメソッド
156
+ else if (node.type === "function_definition" || node.type === "method_declaration") {
157
+ const name = extractName(node, content);
158
+ if (name) {
159
+ // 親がclass_declaration/trait_declaration/interface_declarationの子孫の場合はmethod、それ以外はfunction
160
+ let isMethod = false;
161
+ let parentNode = node.parent;
162
+ while (parentNode) {
163
+ if (parentNode.type === "class_declaration" ||
164
+ parentNode.type === "trait_declaration" ||
165
+ parentNode.type === "interface_declaration") {
166
+ isMethod = true;
167
+ break;
168
+ }
169
+ parentNode = parentNode.parent;
170
+ }
171
+ const kind = isMethod ? "method" : "function";
172
+ results.push({
173
+ name,
174
+ kind,
175
+ rangeStartLine: treeSitterPointToLine(node.startPosition),
176
+ rangeEndLine: treeSitterPointToLine(node.endPosition),
177
+ signature: getSignature(node),
178
+ doc: getPHPDocComment(node, content),
179
+ });
180
+ }
181
+ }
182
+ // property_declaration: プロパティ
183
+ else if (node.type === "property_declaration") {
184
+ // property_element から変数名を抽出
185
+ const propertyElement = node.namedChildren.find((child) => child.type === "property_element");
186
+ if (propertyElement) {
187
+ const variableNameNode = propertyElement.namedChildren.find((child) => child.type === "variable_name");
188
+ if (variableNameNode) {
189
+ const name = content
190
+ .substring(variableNameNode.startIndex, variableNameNode.endIndex)
191
+ .replace(/^\$/, ""); // $を除去
192
+ results.push({
193
+ name,
194
+ kind: "property",
195
+ rangeStartLine: treeSitterPointToLine(node.startPosition),
196
+ rangeEndLine: treeSitterPointToLine(node.endPosition),
197
+ signature: getSignature(node),
198
+ doc: getPHPDocComment(node, content),
199
+ });
200
+ }
201
+ }
202
+ }
203
+ // const_declaration: 定数(クラス定数)
204
+ else if (node.type === "const_declaration") {
205
+ const constElement = node.namedChildren.find((child) => child.type === "const_element");
206
+ if (constElement) {
207
+ const name = extractName(constElement, content);
208
+ if (name) {
209
+ results.push({
210
+ name,
211
+ kind: "constant",
212
+ rangeStartLine: treeSitterPointToLine(node.startPosition),
213
+ rangeEndLine: treeSitterPointToLine(node.endPosition),
214
+ signature: getSignature(node),
215
+ doc: getPHPDocComment(node, content),
216
+ });
217
+ }
218
+ }
219
+ }
220
+ // namespace_definition: 名前空間
221
+ else if (node.type === "namespace_definition") {
222
+ const namespaceName = node.namedChildren.find((child) => child.type === "namespace_name");
223
+ if (namespaceName) {
224
+ const name = content.substring(namespaceName.startIndex, namespaceName.endIndex);
225
+ results.push({
226
+ name,
227
+ kind: "namespace",
228
+ rangeStartLine: treeSitterPointToLine(node.startPosition),
229
+ rangeEndLine: treeSitterPointToLine(node.endPosition),
230
+ signature: getSignature(node),
231
+ doc: getPHPDocComment(node, content),
232
+ });
233
+ }
234
+ }
235
+ // 子ノードを再帰的に訪問
236
+ for (const child of node.namedChildren) {
237
+ visit(child);
238
+ }
239
+ }
240
+ visit(tree.rootNode);
241
+ return assignSymbolIds(results);
242
+ }
243
+ /**
244
+ * PHP の use 文を解析して依存関係を収集
245
+ */
246
+ function collectPHPDependencies(_sourcePath, tree, content, _fileSet) {
247
+ const { record, getDependencies } = createDependencyRecorder();
248
+ function visit(node) {
249
+ // namespace_use_declaration: use文
250
+ if (node.type === "namespace_use_declaration") {
251
+ // namespace_use_clauseを探す(通常のuse文)
252
+ const useClauses = node.namedChildren.filter((child) => child.type === "namespace_use_clause");
253
+ for (const useClause of useClauses) {
254
+ // qualified_nameまたはnameを抽出
255
+ const qualifiedName = useClause.namedChildren.find((child) => child.type === "qualified_name" || child.type === "name");
256
+ if (qualifiedName) {
257
+ const importName = content.substring(qualifiedName.startIndex, qualifiedName.endIndex);
258
+ // Treat all namespaced imports as packages until composer.json parsing is implemented.
259
+ // PSR-4 maps namespace prefixes to base directories (e.g., App\ -> src/),
260
+ // not relative paths from the current file's directory.
261
+ // TODO: Implement proper PSR-4 resolution by parsing composer.json
262
+ record("package", importName);
263
+ }
264
+ }
265
+ // namespace_use_groupを探す(グループ化されたuse文: use Foo\{Bar, Baz};)
266
+ const useGroups = node.namedChildren.filter((child) => child.type === "namespace_use_group");
267
+ if (useGroups.length > 0) {
268
+ // プレフィックスを取得(例: App\Services)
269
+ const prefixNode = node.namedChildren.find((child) => child.type === "namespace_name");
270
+ const prefix = prefixNode
271
+ ? content.substring(prefixNode.startIndex, prefixNode.endIndex)
272
+ : "";
273
+ for (const useGroup of useGroups) {
274
+ // namespace_use_group_clauseを処理
275
+ const groupClauses = useGroup.namedChildren.filter((child) => child.type === "namespace_use_group_clause");
276
+ for (const groupClause of groupClauses) {
277
+ const namespaceName = groupClause.namedChildren.find((child) => child.type === "namespace_name" || child.type === "name");
278
+ if (namespaceName) {
279
+ const suffix = content.substring(namespaceName.startIndex, namespaceName.endIndex);
280
+ const fullName = prefix ? `${prefix}\\${suffix}` : suffix;
281
+ // Treat all namespaced imports as packages (same reasoning as above)
282
+ record("package", fullName);
283
+ }
284
+ }
285
+ }
286
+ }
287
+ }
288
+ // 子ノードを再帰的に訪問
289
+ for (const child of node.namedChildren) {
290
+ visit(child);
291
+ }
292
+ }
293
+ visit(tree.rootNode);
294
+ return getDependencies();
295
+ }
296
+ /**
297
+ * PHP Language Analyzer
298
+ *
299
+ * LanguageAnalyzer インターフェースを実装し、
300
+ * PHP ファイルのシンボル抽出と依存関係解析を提供
301
+ */
302
+ export class PHPAnalyzer {
303
+ language = "PHP";
304
+ async analyze(context) {
305
+ const { pathInRepo, content, fileSet } = context;
306
+ try {
307
+ // Create new parser instance for each file (thread-safety for concurrent processing)
308
+ const parser = new Parser();
309
+ // tree-sitter-php provides two parsers:
310
+ // - php_only: for pure PHP files (<?php at start)
311
+ // - php: for HTML-mixed PHP files (HTML with <?php ... ?> tags)
312
+ const phpType = detectPHPType(content);
313
+ const language = phpType === "html-mixed" ? PHP_MIXED : PHP_ONLY;
314
+ // Validate language object before setting it
315
+ if (!language || typeof language !== "object") {
316
+ throw new Error(`Tree-sitter language for PHP type "${phpType}" is invalid or undefined`);
317
+ }
318
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
319
+ parser.setLanguage(language);
320
+ const tree = parser.parse(content);
321
+ // シンボル抽出
322
+ const symbols = createPHPSymbolRecords(tree, content);
323
+ // シンボルからスニペットを生成
324
+ const snippets = symbolsToSnippets(symbols);
325
+ // 依存関係を収集
326
+ const dependencies = collectPHPDependencies(pathInRepo, tree, content, fileSet);
327
+ return { symbols, snippets, dependencies };
328
+ }
329
+ catch (error) {
330
+ // パース失敗時は空の結果を返して他のファイルの処理を継続
331
+ console.error(`Failed to parse PHP file ${pathInRepo}:`, error);
332
+ return { symbols: [], snippets: [], dependencies: [] };
333
+ }
334
+ }
335
+ }
336
+ /**
337
+ * PHP アナライザーのファクトリ関数
338
+ */
339
+ export function createPHPAnalyzer() {
340
+ return new PHPAnalyzer();
341
+ }
342
+ //# sourceMappingURL=analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../../../../src/indexer/codeintel/php/analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC3B,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,oEAAoE;AACpE,mFAAmF;AACnF,oEAAoE;AACpE,gDAAgD;AAChD,8DAA8D;AAC9D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAC7C,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;AACpC,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC;AAIhC;;;;;;;;;;;GAWG;AACH,SAAS,aAAa,CAAC,OAAe;IACpC,gFAAgF;IAChF,iEAAiE;IACjE,MAAM,WAAW,GAAG,0CAA0C,CAAC;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAEzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,2DAA2D;QAC3D,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,oFAAoF;IACpF,uBAAuB;IACvB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAa,EAAE,OAAe;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,kCAAkC;IAClC,MAAM,iBAAiB,GAAa,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC,qBAAqB;IACrB,KAAK,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,eAAe;QACf,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC5E,oBAAoB;YACpB,IAAI,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChE,iBAAiB,CAAC,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1E,yBAAyB;YACzB,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,IAAa,EAAE,OAAe;IACjD,SAAS,QAAQ,CAAC,CAAU;QAC1B,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,CAAC;QACX,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACrF,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,IAAiB,EAAE,OAAe;IAChE,MAAM,OAAO,GAA0C,EAAE,CAAC;IAE1D;;OAEG;IACH,SAAS,YAAY,CAAC,IAAa;QACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnE,OAAO,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,SAAS,KAAK,CAAC,IAAa;QAC1B,2BAA2B;QAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxC,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI;oBACJ,IAAI,EAAE,OAAO;oBACb,cAAc,EAAE,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC;oBACzD,YAAY,EAAE,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC;oBACrD,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC;oBAC7B,GAAG,EAAE,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC;iBACrC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,oCAAoC;aAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxC,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI;oBACJ,IAAI,EAAE,WAAW;oBACjB,cAAc,EAAE,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC;oBACzD,YAAY,EAAE,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC;oBACrD,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC;oBAC7B,GAAG,EAAE,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC;iBACrC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,4BAA4B;aACvB,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxC,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI;oBACJ,IAAI,EAAE,OAAO;oBACb,cAAc,EAAE,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC;oBACzD,YAAY,EAAE,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC;oBACrD,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC;oBAC7B,GAAG,EAAE,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC;iBACrC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,uCAAuC;aAClC,IAAI,IAAI,CAAC,IAAI,KAAK,qBAAqB,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YACnF,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxC,IAAI,IAAI,EAAE,CAAC;gBACT,yFAAyF;gBACzF,IAAI,QAAQ,GAAG,KAAK,CAAC;gBACrB,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC7B,OAAO,UAAU,EAAE,CAAC;oBAClB,IACE,UAAU,CAAC,IAAI,KAAK,mBAAmB;wBACvC,UAAU,CAAC,IAAI,KAAK,mBAAmB;wBACvC,UAAU,CAAC,IAAI,KAAK,uBAAuB,EAC3C,CAAC;wBACD,QAAQ,GAAG,IAAI,CAAC;wBAChB,MAAM;oBACR,CAAC;oBACD,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;gBACjC,CAAC;gBACD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC9C,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI;oBACJ,IAAI;oBACJ,cAAc,EAAE,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC;oBACzD,YAAY,EAAE,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC;oBACrD,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC;oBAC7B,GAAG,EAAE,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC;iBACrC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,8BAA8B;aACzB,IAAI,IAAI,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;YAC9C,4BAA4B;YAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC;YAC9F,IAAI,eAAe,EAAE,CAAC;gBACpB,MAAM,gBAAgB,GAAG,eAAe,CAAC,aAAa,CAAC,IAAI,CACzD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,eAAe,CAC1C,CAAC;gBACF,IAAI,gBAAgB,EAAE,CAAC;oBACrB,MAAM,IAAI,GAAG,OAAO;yBACjB,SAAS,CAAC,gBAAgB,CAAC,UAAU,EAAE,gBAAgB,CAAC,QAAQ,CAAC;yBACjE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO;oBAC9B,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI;wBACJ,IAAI,EAAE,UAAU;wBAChB,cAAc,EAAE,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC;wBACzD,YAAY,EAAE,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC;wBACrD,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC;wBAC7B,GAAG,EAAE,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC;qBACrC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QACD,+BAA+B;aAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;YACxF,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBAChD,IAAI,IAAI,EAAE,CAAC;oBACT,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI;wBACJ,IAAI,EAAE,UAAU;wBAChB,cAAc,EAAE,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC;wBACzD,YAAY,EAAE,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC;wBACrD,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC;wBAC7B,GAAG,EAAE,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC;qBACrC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QACD,6BAA6B;aACxB,IAAI,IAAI,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;YAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC;YAC1F,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACjF,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI;oBACJ,IAAI,EAAE,WAAW;oBACjB,cAAc,EAAE,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC;oBACzD,YAAY,EAAE,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC;oBACrD,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC;oBAC7B,GAAG,EAAE,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC;iBACrC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,cAAc;QACd,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvC,KAAK,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAErB,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAC7B,WAAmB,EACnB,IAAiB,EACjB,OAAe,EACf,QAAqB;IAErB,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,wBAAwB,EAAE,CAAC;IAE/D,SAAS,KAAK,CAAC,IAAa;QAC1B,kCAAkC;QAClC,IAAI,IAAI,CAAC,IAAI,KAAK,2BAA2B,EAAE,CAAC;YAC9C,mCAAmC;YACnC,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,sBAAsB,CACjD,CAAC;YACF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,2BAA2B;gBAC3B,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,CAAC,IAAI,CAChD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CACpE,CAAC;gBACF,IAAI,aAAa,EAAE,CAAC;oBAClB,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;oBACvF,uFAAuF;oBACvF,0EAA0E;oBAC1E,wDAAwD;oBACxD,mEAAmE;oBACnE,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;YAED,4DAA4D;YAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,qBAAqB,CAAC,CAAC;YAC7F,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,8BAA8B;gBAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC;gBACvF,MAAM,MAAM,GAAG,UAAU;oBACvB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC;oBAC/D,CAAC,CAAC,EAAE,CAAC;gBAEP,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,gCAAgC;oBAChC,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAChD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,4BAA4B,CACvD,CAAC;oBACF,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;wBACvC,MAAM,aAAa,GAAG,WAAW,CAAC,aAAa,CAAC,IAAI,CAClD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CACpE,CAAC;wBACF,IAAI,aAAa,EAAE,CAAC;4BAClB,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;4BACnF,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;4BAC1D,qEAAqE;4BACrE,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;wBAC9B,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,cAAc;QACd,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvC,KAAK,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAErB,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IACb,QAAQ,GAAG,KAAK,CAAC;IAE1B,KAAK,CAAC,OAAO,CAAC,OAAwB;QACpC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAEjD,IAAI,CAAC;YACH,qFAAqF;YACrF,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YAE5B,wCAAwC;YACxC,kDAAkD;YAClD,gEAAgE;YAChE,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;YAEjE,6CAA6C;YAC7C,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC9C,MAAM,IAAI,KAAK,CAAC,sCAAsC,OAAO,2BAA2B,CAAC,CAAC;YAC5F,CAAC;YAED,8DAA8D;YAC9D,MAAM,CAAC,WAAW,CAAC,QAAe,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEnC,SAAS;YACT,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAEtD,iBAAiB;YACjB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAE5C,UAAU;YACV,MAAM,YAAY,GAAG,sBAAsB,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEhF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,8BAA8B;YAC9B,OAAO,CAAC,KAAK,CAAC,4BAA4B,UAAU,GAAG,EAAE,KAAK,CAAC,CAAC;YAChE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;QACzD,CAAC;IACH,CAAC;CAGF;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,WAAW,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * PHP Analyzer Module
3
+ *
4
+ * PHP ファイル用の言語アナライザーをエクスポート
5
+ */
6
+ export { PHPAnalyzer, createPHPAnalyzer } from "./analyzer.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/indexer/codeintel/php/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * PHP Analyzer Module
3
+ *
4
+ * PHP ファイル用の言語アナライザーをエクスポート
5
+ */
6
+ export { PHPAnalyzer, createPHPAnalyzer } from "./analyzer.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/indexer/codeintel/php/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Language Analyzer Registry
3
+ *
4
+ * Alloyで検証済みのPlan A (Central Registry) 設計に基づく実装。
5
+ *
6
+ * 検証済みの不変条件:
7
+ * - NoConflictingAnalyzers: 各言語に対して最大1つのアナライザー
8
+ * - DeterministicLookup: レジストリ検索は決定的
9
+ * - LockConsistency: ファイルレベルのロック整合性
10
+ * - NoDeadlock: デッドロックなし
11
+ */
12
+ import type { AnalysisContext, AnalysisResult, LanguageAnalyzer } from "./types.js";
13
+ /**
14
+ * 言語アナライザーを管理するシングルトンレジストリ
15
+ */
16
+ export declare class LanguageRegistry {
17
+ private static instance;
18
+ private readonly analyzers;
19
+ private constructor();
20
+ /**
21
+ * レジストリのシングルトンインスタンスを取得
22
+ */
23
+ static getInstance(): LanguageRegistry;
24
+ /**
25
+ * テスト用: レジストリをリセット
26
+ */
27
+ static resetForTesting(): void;
28
+ /**
29
+ * アナライザーを登録
30
+ *
31
+ * @param analyzer - 登録するアナライザー
32
+ * @throws Error - 同じ言語のアナライザーが既に登録されている場合
33
+ */
34
+ register(analyzer: LanguageAnalyzer): void;
35
+ /**
36
+ * 既存のアナライザーを置換
37
+ * 既存のアナライザーがあればdispose()を呼び出してから置換
38
+ *
39
+ * @param analyzer - 新しいアナライザー
40
+ */
41
+ replace(analyzer: LanguageAnalyzer): Promise<void>;
42
+ /**
43
+ * 指定した言語のアナライザーを取得
44
+ *
45
+ * @param language - 言語識別子
46
+ * @returns アナライザー (未登録の場合はundefined)
47
+ */
48
+ getAnalyzer(language: string): LanguageAnalyzer | undefined;
49
+ /**
50
+ * 指定した言語がサポートされているかを確認
51
+ *
52
+ * @param language - 言語識別子
53
+ * @returns サポートされていればtrue
54
+ */
55
+ isSupported(language: string): boolean;
56
+ /**
57
+ * 登録されている全ての言語を取得
58
+ *
59
+ * @returns 言語識別子の配列
60
+ */
61
+ getRegisteredLanguages(): string[];
62
+ /**
63
+ * ソースコードを解析
64
+ *
65
+ * @param language - 言語識別子 (nullの場合は空の結果を返す)
66
+ * @param context - 解析コンテキスト
67
+ * @returns 解析結果
68
+ */
69
+ analyze(language: string | null, context: AnalysisContext): Promise<AnalysisResult>;
70
+ /**
71
+ * 全てのアナライザーのリソースを解放
72
+ * プロセス終了時やテスト終了時に呼び出す
73
+ */
74
+ cleanup(): Promise<void>;
75
+ }
76
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../src/indexer/codeintel/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGpF;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;IAEjE,OAAO;IAIP;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,gBAAgB;IAOtC;;OAEG;IACH,MAAM,CAAC,eAAe,IAAI,IAAI;IAQ9B;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAU1C;;;;;OAKG;IACG,OAAO,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxD;;;;;OAKG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI3D;;;;;OAKG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAItC;;;;OAIG;IACH,sBAAsB,IAAI,MAAM,EAAE;IAIlC;;;;;;OAMG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAazF;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB/B"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Language Analyzer Registry
3
+ *
4
+ * Alloyで検証済みのPlan A (Central Registry) 設計に基づく実装。
5
+ *
6
+ * 検証済みの不変条件:
7
+ * - NoConflictingAnalyzers: 各言語に対して最大1つのアナライザー
8
+ * - DeterministicLookup: レジストリ検索は決定的
9
+ * - LockConsistency: ファイルレベルのロック整合性
10
+ * - NoDeadlock: デッドロックなし
11
+ */
12
+ import { emptyResult } from "./types.js";
13
+ /**
14
+ * 言語アナライザーを管理するシングルトンレジストリ
15
+ */
16
+ export class LanguageRegistry {
17
+ static instance = null;
18
+ analyzers = new Map();
19
+ constructor() {
20
+ // シングルトンパターン: 外部からのインスタンス化を防止
21
+ }
22
+ /**
23
+ * レジストリのシングルトンインスタンスを取得
24
+ */
25
+ static getInstance() {
26
+ if (!LanguageRegistry.instance) {
27
+ LanguageRegistry.instance = new LanguageRegistry();
28
+ }
29
+ return LanguageRegistry.instance;
30
+ }
31
+ /**
32
+ * テスト用: レジストリをリセット
33
+ */
34
+ static resetForTesting() {
35
+ if (LanguageRegistry.instance) {
36
+ // 既存のアナライザーをクリーンアップ (同期的)
37
+ LanguageRegistry.instance.analyzers.clear();
38
+ }
39
+ LanguageRegistry.instance = null;
40
+ }
41
+ /**
42
+ * アナライザーを登録
43
+ *
44
+ * @param analyzer - 登録するアナライザー
45
+ * @throws Error - 同じ言語のアナライザーが既に登録されている場合
46
+ */
47
+ register(analyzer) {
48
+ if (this.analyzers.has(analyzer.language)) {
49
+ throw new Error(`Analyzer already registered for language: ${analyzer.language}. ` +
50
+ `Use replace() to update an existing analyzer.`);
51
+ }
52
+ this.analyzers.set(analyzer.language, analyzer);
53
+ }
54
+ /**
55
+ * 既存のアナライザーを置換
56
+ * 既存のアナライザーがあればdispose()を呼び出してから置換
57
+ *
58
+ * @param analyzer - 新しいアナライザー
59
+ */
60
+ async replace(analyzer) {
61
+ const existing = this.analyzers.get(analyzer.language);
62
+ if (existing?.dispose) {
63
+ await existing.dispose();
64
+ }
65
+ this.analyzers.set(analyzer.language, analyzer);
66
+ }
67
+ /**
68
+ * 指定した言語のアナライザーを取得
69
+ *
70
+ * @param language - 言語識別子
71
+ * @returns アナライザー (未登録の場合はundefined)
72
+ */
73
+ getAnalyzer(language) {
74
+ return this.analyzers.get(language);
75
+ }
76
+ /**
77
+ * 指定した言語がサポートされているかを確認
78
+ *
79
+ * @param language - 言語識別子
80
+ * @returns サポートされていればtrue
81
+ */
82
+ isSupported(language) {
83
+ return this.analyzers.has(language);
84
+ }
85
+ /**
86
+ * 登録されている全ての言語を取得
87
+ *
88
+ * @returns 言語識別子の配列
89
+ */
90
+ getRegisteredLanguages() {
91
+ return Array.from(this.analyzers.keys());
92
+ }
93
+ /**
94
+ * ソースコードを解析
95
+ *
96
+ * @param language - 言語識別子 (nullの場合は空の結果を返す)
97
+ * @param context - 解析コンテキスト
98
+ * @returns 解析結果
99
+ */
100
+ async analyze(language, context) {
101
+ if (!language) {
102
+ return emptyResult();
103
+ }
104
+ const analyzer = this.analyzers.get(language);
105
+ if (!analyzer) {
106
+ return emptyResult();
107
+ }
108
+ return analyzer.analyze(context);
109
+ }
110
+ /**
111
+ * 全てのアナライザーのリソースを解放
112
+ * プロセス終了時やテスト終了時に呼び出す
113
+ */
114
+ async cleanup() {
115
+ const disposePromises = [];
116
+ for (const analyzer of this.analyzers.values()) {
117
+ if (analyzer.dispose) {
118
+ disposePromises.push(analyzer.dispose().catch((err) => {
119
+ console.error(`Failed to dispose analyzer for ${analyzer.language}:`, err);
120
+ }));
121
+ }
122
+ }
123
+ await Promise.allSettled(disposePromises);
124
+ this.analyzers.clear();
125
+ }
126
+ }
127
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/indexer/codeintel/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Rust Language Analyzer
3
+ *
4
+ * tree-sitter-rust を使用して Rust コードのシンボルと依存関係を抽出する。
5
+ * 構造化シンボルは struct/enum/trait/impl/fn/mod/type/const/static/macro を対象とし、
6
+ * use/extern crate/mod から依存関係を推定する。
7
+ */
8
+ import type { AnalysisContext, AnalysisResult, LanguageAnalyzer } from "../types.js";
9
+ export declare class RustAnalyzer implements LanguageAnalyzer {
10
+ readonly language = "Rust";
11
+ analyze(context: AnalysisContext): Promise<AnalysisResult>;
12
+ }
13
+ export declare function createRustAnalyzer(): RustAnalyzer;
14
+ //# sourceMappingURL=analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../../../../src/indexer/codeintel/rust/analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAgB,MAAM,aAAa,CAAC;AAgcnG,qBAAa,YAAa,YAAW,gBAAgB;IACnD,QAAQ,CAAC,QAAQ,UAAU;IAErB,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAwBjE;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CAEjD"}