driftdetect-core 0.4.0 → 0.4.2

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 (237) hide show
  1. package/dist/boundaries/boundary-scanner.d.ts +76 -0
  2. package/dist/boundaries/boundary-scanner.d.ts.map +1 -0
  3. package/dist/boundaries/boundary-scanner.js +801 -0
  4. package/dist/boundaries/boundary-scanner.js.map +1 -0
  5. package/dist/boundaries/data-access-learner.d.ts +126 -0
  6. package/dist/boundaries/data-access-learner.d.ts.map +1 -0
  7. package/dist/boundaries/data-access-learner.js +486 -0
  8. package/dist/boundaries/data-access-learner.js.map +1 -0
  9. package/dist/boundaries/index.d.ts +6 -0
  10. package/dist/boundaries/index.d.ts.map +1 -1
  11. package/dist/boundaries/index.js +6 -0
  12. package/dist/boundaries/index.js.map +1 -1
  13. package/dist/boundaries/security-prioritizer.d.ts +118 -0
  14. package/dist/boundaries/security-prioritizer.d.ts.map +1 -0
  15. package/dist/boundaries/security-prioritizer.js +316 -0
  16. package/dist/boundaries/security-prioritizer.js.map +1 -0
  17. package/dist/call-graph/analysis/coverage-analyzer.d.ts +201 -0
  18. package/dist/call-graph/analysis/coverage-analyzer.d.ts.map +1 -0
  19. package/dist/call-graph/analysis/coverage-analyzer.js +553 -0
  20. package/dist/call-graph/analysis/coverage-analyzer.js.map +1 -0
  21. package/dist/call-graph/analysis/dead-code-detector.d.ts +145 -0
  22. package/dist/call-graph/analysis/dead-code-detector.d.ts.map +1 -0
  23. package/dist/call-graph/analysis/dead-code-detector.js +391 -0
  24. package/dist/call-graph/analysis/dead-code-detector.js.map +1 -0
  25. package/dist/call-graph/analysis/graph-builder.d.ts +142 -0
  26. package/dist/call-graph/analysis/graph-builder.d.ts.map +1 -0
  27. package/dist/call-graph/analysis/graph-builder.js +624 -0
  28. package/dist/call-graph/analysis/graph-builder.js.map +1 -0
  29. package/dist/call-graph/analysis/impact-analyzer.d.ts +150 -0
  30. package/dist/call-graph/analysis/impact-analyzer.d.ts.map +1 -0
  31. package/dist/call-graph/analysis/impact-analyzer.js +329 -0
  32. package/dist/call-graph/analysis/impact-analyzer.js.map +1 -0
  33. package/dist/call-graph/analysis/index.d.ts +11 -0
  34. package/dist/call-graph/analysis/index.d.ts.map +1 -0
  35. package/dist/call-graph/analysis/index.js +9 -0
  36. package/dist/call-graph/analysis/index.js.map +1 -0
  37. package/dist/call-graph/analysis/path-finder.d.ts +117 -0
  38. package/dist/call-graph/analysis/path-finder.d.ts.map +1 -0
  39. package/dist/call-graph/analysis/path-finder.js +360 -0
  40. package/dist/call-graph/analysis/path-finder.js.map +1 -0
  41. package/dist/call-graph/analysis/reachability.d.ts +56 -0
  42. package/dist/call-graph/analysis/reachability.d.ts.map +1 -0
  43. package/dist/call-graph/analysis/reachability.js +357 -0
  44. package/dist/call-graph/analysis/reachability.js.map +1 -0
  45. package/dist/call-graph/demo.d.ts +11 -0
  46. package/dist/call-graph/demo.d.ts.map +1 -0
  47. package/dist/call-graph/demo.js +339 -0
  48. package/dist/call-graph/demo.js.map +1 -0
  49. package/dist/call-graph/enrichment/enrichment-engine.d.ts +126 -0
  50. package/dist/call-graph/enrichment/enrichment-engine.d.ts.map +1 -0
  51. package/dist/call-graph/enrichment/enrichment-engine.js +760 -0
  52. package/dist/call-graph/enrichment/enrichment-engine.js.map +1 -0
  53. package/dist/call-graph/enrichment/impact-scorer.d.ts +59 -0
  54. package/dist/call-graph/enrichment/impact-scorer.d.ts.map +1 -0
  55. package/dist/call-graph/enrichment/impact-scorer.js +328 -0
  56. package/dist/call-graph/enrichment/impact-scorer.js.map +1 -0
  57. package/dist/call-graph/enrichment/index.d.ts +12 -0
  58. package/dist/call-graph/enrichment/index.d.ts.map +1 -0
  59. package/dist/call-graph/enrichment/index.js +15 -0
  60. package/dist/call-graph/enrichment/index.js.map +1 -0
  61. package/dist/call-graph/enrichment/remediation-generator.d.ts +41 -0
  62. package/dist/call-graph/enrichment/remediation-generator.d.ts.map +1 -0
  63. package/dist/call-graph/enrichment/remediation-generator.js +609 -0
  64. package/dist/call-graph/enrichment/remediation-generator.js.map +1 -0
  65. package/dist/call-graph/enrichment/sensitivity-classifier.d.ts +71 -0
  66. package/dist/call-graph/enrichment/sensitivity-classifier.d.ts.map +1 -0
  67. package/dist/call-graph/enrichment/sensitivity-classifier.js +454 -0
  68. package/dist/call-graph/enrichment/sensitivity-classifier.js.map +1 -0
  69. package/dist/call-graph/enrichment/types.d.ts +402 -0
  70. package/dist/call-graph/enrichment/types.d.ts.map +1 -0
  71. package/dist/call-graph/enrichment/types.js +9 -0
  72. package/dist/call-graph/enrichment/types.js.map +1 -0
  73. package/dist/call-graph/extractors/base-extractor.d.ts +112 -0
  74. package/dist/call-graph/extractors/base-extractor.d.ts.map +1 -0
  75. package/dist/call-graph/extractors/base-extractor.js +140 -0
  76. package/dist/call-graph/extractors/base-extractor.js.map +1 -0
  77. package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts +76 -0
  78. package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts.map +1 -0
  79. package/dist/call-graph/extractors/csharp-data-access-extractor.js +387 -0
  80. package/dist/call-graph/extractors/csharp-data-access-extractor.js.map +1 -0
  81. package/dist/call-graph/extractors/csharp-extractor.d.ts +87 -0
  82. package/dist/call-graph/extractors/csharp-extractor.d.ts.map +1 -0
  83. package/dist/call-graph/extractors/csharp-extractor.js +470 -0
  84. package/dist/call-graph/extractors/csharp-extractor.js.map +1 -0
  85. package/dist/call-graph/extractors/data-access-extractor.d.ts +76 -0
  86. package/dist/call-graph/extractors/data-access-extractor.d.ts.map +1 -0
  87. package/dist/call-graph/extractors/data-access-extractor.js +234 -0
  88. package/dist/call-graph/extractors/data-access-extractor.js.map +1 -0
  89. package/dist/call-graph/extractors/index.d.ts +26 -0
  90. package/dist/call-graph/extractors/index.d.ts.map +1 -0
  91. package/dist/call-graph/extractors/index.js +36 -0
  92. package/dist/call-graph/extractors/index.js.map +1 -0
  93. package/dist/call-graph/extractors/java-data-access-extractor.d.ts +101 -0
  94. package/dist/call-graph/extractors/java-data-access-extractor.d.ts.map +1 -0
  95. package/dist/call-graph/extractors/java-data-access-extractor.js +611 -0
  96. package/dist/call-graph/extractors/java-data-access-extractor.js.map +1 -0
  97. package/dist/call-graph/extractors/java-extractor.d.ts +87 -0
  98. package/dist/call-graph/extractors/java-extractor.d.ts.map +1 -0
  99. package/dist/call-graph/extractors/java-extractor.js +510 -0
  100. package/dist/call-graph/extractors/java-extractor.js.map +1 -0
  101. package/dist/call-graph/extractors/php-data-access-extractor.d.ts +93 -0
  102. package/dist/call-graph/extractors/php-data-access-extractor.d.ts.map +1 -0
  103. package/dist/call-graph/extractors/php-data-access-extractor.js +589 -0
  104. package/dist/call-graph/extractors/php-data-access-extractor.js.map +1 -0
  105. package/dist/call-graph/extractors/php-extractor.d.ts +104 -0
  106. package/dist/call-graph/extractors/php-extractor.d.ts.map +1 -0
  107. package/dist/call-graph/extractors/php-extractor.js +619 -0
  108. package/dist/call-graph/extractors/php-extractor.js.map +1 -0
  109. package/dist/call-graph/extractors/python-data-access-extractor.d.ts +90 -0
  110. package/dist/call-graph/extractors/python-data-access-extractor.d.ts.map +1 -0
  111. package/dist/call-graph/extractors/python-data-access-extractor.js +537 -0
  112. package/dist/call-graph/extractors/python-data-access-extractor.js.map +1 -0
  113. package/dist/call-graph/extractors/python-extractor.d.ts +98 -0
  114. package/dist/call-graph/extractors/python-extractor.d.ts.map +1 -0
  115. package/dist/call-graph/extractors/python-extractor.js +681 -0
  116. package/dist/call-graph/extractors/python-extractor.js.map +1 -0
  117. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts +91 -0
  118. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts.map +1 -0
  119. package/dist/call-graph/extractors/semantic-data-access-scanner.js +498 -0
  120. package/dist/call-graph/extractors/semantic-data-access-scanner.js.map +1 -0
  121. package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts +122 -0
  122. package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts.map +1 -0
  123. package/dist/call-graph/extractors/typescript-data-access-extractor.js +788 -0
  124. package/dist/call-graph/extractors/typescript-data-access-extractor.js.map +1 -0
  125. package/dist/call-graph/extractors/typescript-extractor.d.ts +145 -0
  126. package/dist/call-graph/extractors/typescript-extractor.d.ts.map +1 -0
  127. package/dist/call-graph/extractors/typescript-extractor.js +904 -0
  128. package/dist/call-graph/extractors/typescript-extractor.js.map +1 -0
  129. package/dist/call-graph/index.d.ts +127 -0
  130. package/dist/call-graph/index.d.ts.map +1 -0
  131. package/dist/call-graph/index.js +247 -0
  132. package/dist/call-graph/index.js.map +1 -0
  133. package/dist/call-graph/store/call-graph-store.d.ts +70 -0
  134. package/dist/call-graph/store/call-graph-store.d.ts.map +1 -0
  135. package/dist/call-graph/store/call-graph-store.js +210 -0
  136. package/dist/call-graph/store/call-graph-store.js.map +1 -0
  137. package/dist/call-graph/store/index.d.ts +7 -0
  138. package/dist/call-graph/store/index.d.ts.map +1 -0
  139. package/dist/call-graph/store/index.js +7 -0
  140. package/dist/call-graph/store/index.js.map +1 -0
  141. package/dist/call-graph/types.d.ts +376 -0
  142. package/dist/call-graph/types.d.ts.map +1 -0
  143. package/dist/call-graph/types.js +8 -0
  144. package/dist/call-graph/types.js.map +1 -0
  145. package/dist/index.d.ts +8 -0
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +12 -0
  148. package/dist/index.js.map +1 -1
  149. package/dist/lake/callgraph-shard-store.d.ts +168 -0
  150. package/dist/lake/callgraph-shard-store.d.ts.map +1 -0
  151. package/dist/lake/callgraph-shard-store.js +466 -0
  152. package/dist/lake/callgraph-shard-store.js.map +1 -0
  153. package/dist/lake/examples-store.d.ts +127 -0
  154. package/dist/lake/examples-store.d.ts.map +1 -0
  155. package/dist/lake/examples-store.js +389 -0
  156. package/dist/lake/examples-store.js.map +1 -0
  157. package/dist/lake/index-store.d.ts +82 -0
  158. package/dist/lake/index-store.d.ts.map +1 -0
  159. package/dist/lake/index-store.js +359 -0
  160. package/dist/lake/index-store.js.map +1 -0
  161. package/dist/lake/index.d.ts +93 -0
  162. package/dist/lake/index.d.ts.map +1 -0
  163. package/dist/lake/index.js +138 -0
  164. package/dist/lake/index.js.map +1 -0
  165. package/dist/lake/lake.bak/index-store.d.ts +82 -0
  166. package/dist/lake/lake.bak/index-store.d.ts.map +1 -0
  167. package/dist/lake/lake.bak/index-store.js +357 -0
  168. package/dist/lake/lake.bak/index-store.js.map +1 -0
  169. package/dist/lake/lake.bak/index.d.ts +81 -0
  170. package/dist/lake/lake.bak/index.d.ts.map +1 -0
  171. package/dist/lake/lake.bak/index.js +114 -0
  172. package/dist/lake/lake.bak/index.js.map +1 -0
  173. package/dist/lake/lake.bak/manifest-store.d.ts +51 -0
  174. package/dist/lake/lake.bak/manifest-store.d.ts.map +1 -0
  175. package/dist/lake/lake.bak/manifest-store.js +347 -0
  176. package/dist/lake/lake.bak/manifest-store.js.map +1 -0
  177. package/dist/lake/lake.bak/query-engine.d.ts +112 -0
  178. package/dist/lake/lake.bak/query-engine.d.ts.map +1 -0
  179. package/dist/lake/lake.bak/query-engine.js +370 -0
  180. package/dist/lake/lake.bak/query-engine.js.map +1 -0
  181. package/dist/lake/lake.bak/types.d.ts +428 -0
  182. package/dist/lake/lake.bak/types.d.ts.map +1 -0
  183. package/dist/lake/lake.bak/types.js +46 -0
  184. package/dist/lake/lake.bak/types.js.map +1 -0
  185. package/dist/lake/lake.bak/view-materializer.d.ts +70 -0
  186. package/dist/lake/lake.bak/view-materializer.d.ts.map +1 -0
  187. package/dist/lake/lake.bak/view-materializer.js +314 -0
  188. package/dist/lake/lake.bak/view-materializer.js.map +1 -0
  189. package/dist/lake/lake.bak/view-store.d.ts +57 -0
  190. package/dist/lake/lake.bak/view-store.d.ts.map +1 -0
  191. package/dist/lake/lake.bak/view-store.js +348 -0
  192. package/dist/lake/lake.bak/view-store.js.map +1 -0
  193. package/dist/lake/manifest-store.d.ts +51 -0
  194. package/dist/lake/manifest-store.d.ts.map +1 -0
  195. package/dist/lake/manifest-store.js +348 -0
  196. package/dist/lake/manifest-store.js.map +1 -0
  197. package/dist/lake/pattern-shard-store.d.ts +87 -0
  198. package/dist/lake/pattern-shard-store.d.ts.map +1 -0
  199. package/dist/lake/pattern-shard-store.js +347 -0
  200. package/dist/lake/pattern-shard-store.js.map +1 -0
  201. package/dist/lake/query-engine.d.ts +124 -0
  202. package/dist/lake/query-engine.d.ts.map +1 -0
  203. package/dist/lake/query-engine.js +453 -0
  204. package/dist/lake/query-engine.js.map +1 -0
  205. package/dist/lake/security-shard-store.d.ts +156 -0
  206. package/dist/lake/security-shard-store.d.ts.map +1 -0
  207. package/dist/lake/security-shard-store.js +498 -0
  208. package/dist/lake/security-shard-store.js.map +1 -0
  209. package/dist/lake/types.d.ts +428 -0
  210. package/dist/lake/types.d.ts.map +1 -0
  211. package/dist/lake/types.js +46 -0
  212. package/dist/lake/types.js.map +1 -0
  213. package/dist/lake/view-materializer.d.ts +70 -0
  214. package/dist/lake/view-materializer.d.ts.map +1 -0
  215. package/dist/lake/view-materializer.js +314 -0
  216. package/dist/lake/view-materializer.js.map +1 -0
  217. package/dist/lake/view-store.d.ts +57 -0
  218. package/dist/lake/view-store.d.ts.map +1 -0
  219. package/dist/lake/view-store.js +348 -0
  220. package/dist/lake/view-store.js.map +1 -0
  221. package/dist/parsers/tree-sitter/index.d.ts +1 -0
  222. package/dist/parsers/tree-sitter/index.d.ts.map +1 -1
  223. package/dist/parsers/tree-sitter/index.js +4 -0
  224. package/dist/parsers/tree-sitter/index.js.map +1 -1
  225. package/dist/parsers/tree-sitter/typescript-loader.d.ts +58 -0
  226. package/dist/parsers/tree-sitter/typescript-loader.d.ts.map +1 -0
  227. package/dist/parsers/tree-sitter/typescript-loader.js +250 -0
  228. package/dist/parsers/tree-sitter/typescript-loader.js.map +1 -0
  229. package/dist/store/project-config.d.ts +154 -0
  230. package/dist/store/project-config.d.ts.map +1 -0
  231. package/dist/store/project-config.js +235 -0
  232. package/dist/store/project-config.js.map +1 -0
  233. package/dist/store/project-registry.d.ts +241 -0
  234. package/dist/store/project-registry.d.ts.map +1 -0
  235. package/dist/store/project-registry.js +557 -0
  236. package/dist/store/project-registry.js.map +1 -0
  237. package/package.json +7 -7
@@ -0,0 +1,619 @@
1
+ /**
2
+ * PHP Call Graph Extractor
3
+ *
4
+ * Extracts functions, calls, imports, and exports from PHP
5
+ * using tree-sitter for AST parsing.
6
+ *
7
+ * Handles:
8
+ * - Function definitions
9
+ * - Class methods (public, private, protected, static)
10
+ * - Constructors and destructors
11
+ * - Traits
12
+ * - Namespaces and use statements
13
+ * - Arrow functions (fn =>)
14
+ * - Closures
15
+ * - Laravel controller actions
16
+ * - Static method calls (Class::method())
17
+ */
18
+ import { BaseCallGraphExtractor } from './base-extractor.js';
19
+ import { isPhpTreeSitterAvailable, createPhpParser, } from '../../parsers/tree-sitter/php-loader.js';
20
+ /**
21
+ * PHP call graph extractor using tree-sitter
22
+ */
23
+ export class PhpCallGraphExtractor extends BaseCallGraphExtractor {
24
+ language = 'php';
25
+ extensions = ['.php', '.phtml', '.php3', '.php4', '.php5', '.php7', '.phps'];
26
+ parser = null;
27
+ /**
28
+ * Check if tree-sitter is available
29
+ */
30
+ static isAvailable() {
31
+ return isPhpTreeSitterAvailable();
32
+ }
33
+ /**
34
+ * Extract call graph information from PHP source
35
+ */
36
+ extract(source, filePath) {
37
+ const result = this.createEmptyResult(filePath);
38
+ if (!isPhpTreeSitterAvailable()) {
39
+ result.errors.push('Tree-sitter not available for PHP parsing');
40
+ return result;
41
+ }
42
+ try {
43
+ if (!this.parser) {
44
+ this.parser = createPhpParser();
45
+ }
46
+ const tree = this.parser.parse(source);
47
+ // Extract namespace
48
+ let currentNamespace = null;
49
+ this.visitNode(tree.rootNode, result, source, null, currentNamespace);
50
+ }
51
+ catch (error) {
52
+ result.errors.push(error instanceof Error ? error.message : 'Unknown parse error');
53
+ }
54
+ return result;
55
+ }
56
+ /**
57
+ * Visit a tree-sitter node and extract information
58
+ */
59
+ visitNode(node, result, source, currentClass, currentNamespace) {
60
+ switch (node.type) {
61
+ case 'namespace_definition':
62
+ this.extractNamespace(node, result, source);
63
+ break;
64
+ case 'class_declaration':
65
+ this.extractClassDeclaration(node, result, source, currentNamespace);
66
+ break;
67
+ case 'interface_declaration':
68
+ this.extractInterfaceDeclaration(node, result, source, currentNamespace);
69
+ break;
70
+ case 'trait_declaration':
71
+ this.extractTraitDeclaration(node, result, source, currentNamespace);
72
+ break;
73
+ case 'function_definition':
74
+ this.extractFunctionDefinition(node, result, source, currentNamespace);
75
+ break;
76
+ case 'method_declaration':
77
+ this.extractMethodDeclaration(node, result, source, currentClass, currentNamespace);
78
+ break;
79
+ case 'namespace_use_declaration':
80
+ this.extractUseDeclaration(node, result);
81
+ break;
82
+ case 'function_call_expression':
83
+ this.extractFunctionCall(node, result, source);
84
+ break;
85
+ case 'member_call_expression':
86
+ this.extractMemberCall(node, result, source);
87
+ break;
88
+ case 'scoped_call_expression':
89
+ this.extractScopedCall(node, result, source);
90
+ break;
91
+ case 'object_creation_expression':
92
+ this.extractObjectCreation(node, result, source);
93
+ break;
94
+ default:
95
+ // Recurse into children
96
+ for (const child of node.children) {
97
+ this.visitNode(child, result, source, currentClass, currentNamespace);
98
+ }
99
+ }
100
+ }
101
+ /**
102
+ * Extract namespace and visit children with namespace context
103
+ */
104
+ extractNamespace(node, result, source) {
105
+ const nameNode = node.childForFieldName('name');
106
+ const namespaceName = nameNode?.text ?? '';
107
+ // Visit children with namespace context
108
+ for (const child of node.children) {
109
+ if (child.type === 'compound_statement' || child.type === 'declaration_list') {
110
+ for (const decl of child.children) {
111
+ this.visitNode(decl, result, source, null, namespaceName);
112
+ }
113
+ }
114
+ else {
115
+ this.visitNode(child, result, source, null, namespaceName);
116
+ }
117
+ }
118
+ }
119
+ /**
120
+ * Extract a class declaration
121
+ */
122
+ extractClassDeclaration(node, result, source, currentNamespace) {
123
+ const nameNode = node.childForFieldName('name');
124
+ if (!nameNode)
125
+ return;
126
+ const className = nameNode.text;
127
+ const fullClassName = currentNamespace ? `${currentNamespace}\\${className}` : className;
128
+ // Get base class (extends)
129
+ const baseClasses = [];
130
+ const baseClauseNode = node.childForFieldName('base_clause');
131
+ if (baseClauseNode) {
132
+ for (const child of baseClauseNode.children) {
133
+ if (child.type === 'name' || child.type === 'qualified_name') {
134
+ baseClasses.push(child.text);
135
+ }
136
+ }
137
+ }
138
+ // Get interfaces (implements)
139
+ const interfacesNode = node.childForFieldName('interfaces');
140
+ if (interfacesNode) {
141
+ for (const child of interfacesNode.children) {
142
+ if (child.type === 'name' || child.type === 'qualified_name') {
143
+ baseClasses.push(child.text);
144
+ }
145
+ }
146
+ }
147
+ // Get methods
148
+ const methods = [];
149
+ const bodyNode = node.childForFieldName('body');
150
+ if (bodyNode) {
151
+ for (const member of bodyNode.children) {
152
+ if (member.type === 'method_declaration') {
153
+ const methodNameNode = member.childForFieldName('name');
154
+ if (methodNameNode) {
155
+ methods.push(methodNameNode.text);
156
+ }
157
+ }
158
+ }
159
+ }
160
+ // Check visibility
161
+ const isExported = !this.hasModifier(node, 'abstract'); // Abstract classes can't be instantiated directly
162
+ result.classes.push(this.createClass({
163
+ name: className,
164
+ startLine: node.startPosition.row + 1,
165
+ endLine: node.endPosition.row + 1,
166
+ baseClasses,
167
+ methods,
168
+ isExported,
169
+ }));
170
+ // Visit class body with class context
171
+ if (bodyNode) {
172
+ for (const member of bodyNode.children) {
173
+ this.visitNode(member, result, source, fullClassName, currentNamespace);
174
+ }
175
+ }
176
+ }
177
+ /**
178
+ * Extract an interface declaration
179
+ */
180
+ extractInterfaceDeclaration(node, result, source, currentNamespace) {
181
+ const nameNode = node.childForFieldName('name');
182
+ if (!nameNode)
183
+ return;
184
+ const interfaceName = nameNode.text;
185
+ const fullName = currentNamespace ? `${currentNamespace}\\${interfaceName}` : interfaceName;
186
+ // Get extended interfaces
187
+ const baseClasses = [];
188
+ const baseClauseNode = node.childForFieldName('base_clause');
189
+ if (baseClauseNode) {
190
+ for (const child of baseClauseNode.children) {
191
+ if (child.type === 'name' || child.type === 'qualified_name') {
192
+ baseClasses.push(child.text);
193
+ }
194
+ }
195
+ }
196
+ // Get methods
197
+ const methods = [];
198
+ const bodyNode = node.childForFieldName('body');
199
+ if (bodyNode) {
200
+ for (const member of bodyNode.children) {
201
+ if (member.type === 'method_declaration') {
202
+ const methodNameNode = member.childForFieldName('name');
203
+ if (methodNameNode) {
204
+ methods.push(methodNameNode.text);
205
+ }
206
+ }
207
+ }
208
+ }
209
+ result.classes.push(this.createClass({
210
+ name: interfaceName,
211
+ startLine: node.startPosition.row + 1,
212
+ endLine: node.endPosition.row + 1,
213
+ baseClasses,
214
+ methods,
215
+ isExported: true,
216
+ }));
217
+ // Visit interface body
218
+ if (bodyNode) {
219
+ for (const member of bodyNode.children) {
220
+ this.visitNode(member, result, source, fullName, currentNamespace);
221
+ }
222
+ }
223
+ }
224
+ /**
225
+ * Extract a trait declaration
226
+ */
227
+ extractTraitDeclaration(node, result, source, currentNamespace) {
228
+ const nameNode = node.childForFieldName('name');
229
+ if (!nameNode)
230
+ return;
231
+ const traitName = nameNode.text;
232
+ const fullName = currentNamespace ? `${currentNamespace}\\${traitName}` : traitName;
233
+ // Get methods
234
+ const methods = [];
235
+ const bodyNode = node.childForFieldName('body');
236
+ if (bodyNode) {
237
+ for (const member of bodyNode.children) {
238
+ if (member.type === 'method_declaration') {
239
+ const methodNameNode = member.childForFieldName('name');
240
+ if (methodNameNode) {
241
+ methods.push(methodNameNode.text);
242
+ }
243
+ }
244
+ }
245
+ }
246
+ result.classes.push(this.createClass({
247
+ name: traitName,
248
+ startLine: node.startPosition.row + 1,
249
+ endLine: node.endPosition.row + 1,
250
+ baseClasses: [],
251
+ methods,
252
+ isExported: true,
253
+ }));
254
+ // Visit trait body
255
+ if (bodyNode) {
256
+ for (const member of bodyNode.children) {
257
+ this.visitNode(member, result, source, fullName, currentNamespace);
258
+ }
259
+ }
260
+ }
261
+ /**
262
+ * Extract a function definition (not a method)
263
+ */
264
+ extractFunctionDefinition(node, result, source, currentNamespace) {
265
+ const nameNode = node.childForFieldName('name');
266
+ if (!nameNode)
267
+ return;
268
+ const name = nameNode.text;
269
+ const qualifiedName = currentNamespace ? `${currentNamespace}\\${name}` : name;
270
+ // Get return type
271
+ const returnTypeNode = node.childForFieldName('return_type');
272
+ const returnType = returnTypeNode?.text;
273
+ // Get parameters
274
+ const parametersNode = node.childForFieldName('parameters');
275
+ const parameters = parametersNode ? this.extractParameters(parametersNode) : [];
276
+ // Get attributes (PHP 8+)
277
+ const decorators = this.extractAttributes(node);
278
+ // Get body
279
+ const bodyNode = node.childForFieldName('body');
280
+ const func = this.createFunction({
281
+ name,
282
+ qualifiedName,
283
+ startLine: node.startPosition.row + 1,
284
+ endLine: node.endPosition.row + 1,
285
+ startColumn: node.startPosition.column,
286
+ endColumn: node.endPosition.column,
287
+ parameters,
288
+ returnType,
289
+ isMethod: false,
290
+ isStatic: false,
291
+ isExported: true, // PHP functions are always "exported" within their namespace
292
+ isConstructor: false,
293
+ isAsync: false,
294
+ decorators,
295
+ bodyStartLine: bodyNode ? bodyNode.startPosition.row + 1 : node.startPosition.row + 1,
296
+ bodyEndLine: bodyNode ? bodyNode.endPosition.row + 1 : node.endPosition.row + 1,
297
+ });
298
+ result.functions.push(func);
299
+ // Extract calls from function body
300
+ if (bodyNode) {
301
+ this.extractCallsFromBody(bodyNode, result, source);
302
+ }
303
+ }
304
+ /**
305
+ * Extract a method declaration
306
+ */
307
+ extractMethodDeclaration(node, result, source, currentClass, _currentNamespace) {
308
+ const nameNode = node.childForFieldName('name');
309
+ if (!nameNode)
310
+ return;
311
+ const name = nameNode.text;
312
+ const isStatic = this.hasModifier(node, 'static');
313
+ const isPublic = this.hasModifier(node, 'public') || !this.hasAnyVisibility(node);
314
+ const isConstructor = name === '__construct';
315
+ const isDestructor = name === '__destruct';
316
+ // Get return type
317
+ const returnTypeNode = node.childForFieldName('return_type');
318
+ const returnType = returnTypeNode?.text;
319
+ // Get parameters
320
+ const parametersNode = node.childForFieldName('parameters');
321
+ const parameters = parametersNode ? this.extractParameters(parametersNode) : [];
322
+ // Get attributes
323
+ const decorators = this.extractAttributes(node);
324
+ // Get body
325
+ const bodyNode = node.childForFieldName('body');
326
+ const func = this.createFunction({
327
+ name: isConstructor ? 'constructor' : (isDestructor ? 'destructor' : name),
328
+ qualifiedName: currentClass ? `${currentClass}.${isConstructor ? 'constructor' : name}` : name,
329
+ startLine: node.startPosition.row + 1,
330
+ endLine: node.endPosition.row + 1,
331
+ startColumn: node.startPosition.column,
332
+ endColumn: node.endPosition.column,
333
+ parameters,
334
+ returnType,
335
+ isMethod: currentClass !== null,
336
+ isStatic,
337
+ isExported: isPublic,
338
+ isConstructor,
339
+ isAsync: false,
340
+ className: currentClass ?? undefined,
341
+ decorators,
342
+ bodyStartLine: bodyNode ? bodyNode.startPosition.row + 1 : node.startPosition.row + 1,
343
+ bodyEndLine: bodyNode ? bodyNode.endPosition.row + 1 : node.endPosition.row + 1,
344
+ });
345
+ result.functions.push(func);
346
+ // Extract calls from method body
347
+ if (bodyNode) {
348
+ this.extractCallsFromBody(bodyNode, result, source);
349
+ }
350
+ }
351
+ /**
352
+ * Extract a use declaration (namespace import)
353
+ */
354
+ extractUseDeclaration(node, result) {
355
+ for (const child of node.children) {
356
+ if (child.type === 'namespace_use_clause') {
357
+ const nameNode = child.childForFieldName('name');
358
+ const aliasNode = child.childForFieldName('alias');
359
+ if (nameNode) {
360
+ const fullName = nameNode.text;
361
+ const parts = fullName.split('\\');
362
+ const localName = aliasNode?.text ?? parts.pop() ?? fullName;
363
+ result.imports.push(this.createImport({
364
+ source: fullName,
365
+ names: [{
366
+ imported: fullName,
367
+ local: localName,
368
+ }],
369
+ line: node.startPosition.row + 1,
370
+ }));
371
+ }
372
+ }
373
+ }
374
+ }
375
+ /**
376
+ * Extract a function call (global function)
377
+ */
378
+ extractFunctionCall(node, result, _source) {
379
+ const funcNode = node.childForFieldName('function');
380
+ if (!funcNode)
381
+ return;
382
+ let calleeName;
383
+ let receiver;
384
+ // Qualified name: \Namespace\func() or Namespace\func()
385
+ if (funcNode.type === 'qualified_name') {
386
+ const parts = funcNode.text.split('\\').filter(p => p);
387
+ calleeName = parts.pop() ?? funcNode.text;
388
+ if (parts.length > 0) {
389
+ receiver = parts.join('\\');
390
+ }
391
+ }
392
+ // Simple name: func()
393
+ else {
394
+ calleeName = funcNode.text;
395
+ }
396
+ // Count arguments
397
+ const argsNode = node.childForFieldName('arguments');
398
+ let argumentCount = 0;
399
+ if (argsNode) {
400
+ for (const child of argsNode.children) {
401
+ if (child.type === 'argument') {
402
+ argumentCount++;
403
+ }
404
+ }
405
+ }
406
+ const call = this.createCall({
407
+ calleeName,
408
+ receiver,
409
+ fullExpression: node.text,
410
+ line: node.startPosition.row + 1,
411
+ column: node.startPosition.column,
412
+ argumentCount,
413
+ isMethodCall: false,
414
+ isConstructorCall: false,
415
+ });
416
+ result.calls.push(call);
417
+ }
418
+ /**
419
+ * Extract a member call ($obj->method())
420
+ */
421
+ extractMemberCall(node, result, _source) {
422
+ const nameNode = node.childForFieldName('name');
423
+ const objectNode = node.childForFieldName('object');
424
+ if (!nameNode)
425
+ return;
426
+ const calleeName = nameNode.text;
427
+ const receiver = objectNode?.text;
428
+ // Count arguments
429
+ const argsNode = node.childForFieldName('arguments');
430
+ let argumentCount = 0;
431
+ if (argsNode) {
432
+ for (const child of argsNode.children) {
433
+ if (child.type === 'argument') {
434
+ argumentCount++;
435
+ }
436
+ }
437
+ }
438
+ const call = this.createCall({
439
+ calleeName,
440
+ receiver,
441
+ fullExpression: node.text,
442
+ line: node.startPosition.row + 1,
443
+ column: node.startPosition.column,
444
+ argumentCount,
445
+ isMethodCall: true,
446
+ isConstructorCall: false,
447
+ });
448
+ result.calls.push(call);
449
+ }
450
+ /**
451
+ * Extract a scoped call (Class::method() or self::method())
452
+ */
453
+ extractScopedCall(node, result, _source) {
454
+ const nameNode = node.childForFieldName('name');
455
+ const scopeNode = node.childForFieldName('scope');
456
+ if (!nameNode)
457
+ return;
458
+ const calleeName = nameNode.text;
459
+ const receiver = scopeNode?.text;
460
+ // Count arguments
461
+ const argsNode = node.childForFieldName('arguments');
462
+ let argumentCount = 0;
463
+ if (argsNode) {
464
+ for (const child of argsNode.children) {
465
+ if (child.type === 'argument') {
466
+ argumentCount++;
467
+ }
468
+ }
469
+ }
470
+ const call = this.createCall({
471
+ calleeName,
472
+ receiver,
473
+ fullExpression: node.text,
474
+ line: node.startPosition.row + 1,
475
+ column: node.startPosition.column,
476
+ argumentCount,
477
+ isMethodCall: true,
478
+ isConstructorCall: false,
479
+ });
480
+ result.calls.push(call);
481
+ }
482
+ /**
483
+ * Extract an object creation (new Foo())
484
+ */
485
+ extractObjectCreation(node, result, _source) {
486
+ // Find the class name - could be in different positions
487
+ let calleeName;
488
+ let receiver;
489
+ for (const child of node.children) {
490
+ if (child.type === 'name' || child.type === 'qualified_name') {
491
+ const parts = child.text.split('\\').filter(p => p);
492
+ calleeName = parts.pop();
493
+ if (parts.length > 0) {
494
+ receiver = parts.join('\\');
495
+ }
496
+ break;
497
+ }
498
+ }
499
+ if (!calleeName)
500
+ return;
501
+ // Count arguments
502
+ const argsNode = node.childForFieldName('arguments');
503
+ let argumentCount = 0;
504
+ if (argsNode) {
505
+ for (const child of argsNode.children) {
506
+ if (child.type === 'argument') {
507
+ argumentCount++;
508
+ }
509
+ }
510
+ }
511
+ const call = this.createCall({
512
+ calleeName,
513
+ receiver,
514
+ fullExpression: node.text,
515
+ line: node.startPosition.row + 1,
516
+ column: node.startPosition.column,
517
+ argumentCount,
518
+ isMethodCall: false,
519
+ isConstructorCall: true,
520
+ });
521
+ result.calls.push(call);
522
+ }
523
+ /**
524
+ * Extract calls from a function/method body
525
+ */
526
+ extractCallsFromBody(node, result, source) {
527
+ const visit = (n) => {
528
+ if (n.type === 'function_call_expression') {
529
+ this.extractFunctionCall(n, result, source);
530
+ }
531
+ else if (n.type === 'member_call_expression') {
532
+ this.extractMemberCall(n, result, source);
533
+ }
534
+ else if (n.type === 'scoped_call_expression') {
535
+ this.extractScopedCall(n, result, source);
536
+ }
537
+ else if (n.type === 'object_creation_expression') {
538
+ this.extractObjectCreation(n, result, source);
539
+ }
540
+ // Don't recurse into nested function/class declarations
541
+ if (n.type !== 'function_definition' && n.type !== 'class_declaration' && n.type !== 'anonymous_function_creation_expression') {
542
+ for (const child of n.children) {
543
+ visit(child);
544
+ }
545
+ }
546
+ };
547
+ for (const child of node.children) {
548
+ visit(child);
549
+ }
550
+ }
551
+ /**
552
+ * Extract parameters from a formal_parameters node
553
+ */
554
+ extractParameters(node) {
555
+ const params = [];
556
+ for (const child of node.children) {
557
+ if (child.type === 'simple_parameter' || child.type === 'variadic_parameter' || child.type === 'property_promotion_parameter') {
558
+ const nameNode = child.childForFieldName('name');
559
+ const typeNode = child.childForFieldName('type');
560
+ const defaultNode = child.childForFieldName('default_value');
561
+ if (nameNode) {
562
+ // Remove $ prefix from PHP variable names
563
+ const name = nameNode.text.replace(/^\$/, '');
564
+ params.push(this.parseParameter(name, typeNode?.text, defaultNode !== null, child.type === 'variadic_parameter'));
565
+ }
566
+ }
567
+ }
568
+ return params;
569
+ }
570
+ /**
571
+ * Extract attributes (PHP 8+) from a node
572
+ */
573
+ extractAttributes(node) {
574
+ const attributes = [];
575
+ // Look for attribute_list siblings before the node
576
+ let sibling = node.previousNamedSibling;
577
+ while (sibling && sibling.type === 'attribute_list') {
578
+ for (const attr of sibling.children) {
579
+ if (attr.type === 'attribute') {
580
+ attributes.unshift(`#[${attr.text}]`);
581
+ }
582
+ }
583
+ sibling = sibling.previousNamedSibling;
584
+ }
585
+ return attributes;
586
+ }
587
+ /**
588
+ * Check if a node has a specific modifier
589
+ */
590
+ hasModifier(node, modifier) {
591
+ for (const child of node.children) {
592
+ if (child.type === 'visibility_modifier' && child.text === modifier) {
593
+ return true;
594
+ }
595
+ if (child.type === 'static_modifier' && modifier === 'static') {
596
+ return true;
597
+ }
598
+ if (child.type === 'abstract_modifier' && modifier === 'abstract') {
599
+ return true;
600
+ }
601
+ if (child.type === 'final_modifier' && modifier === 'final') {
602
+ return true;
603
+ }
604
+ }
605
+ return false;
606
+ }
607
+ /**
608
+ * Check if a node has any visibility modifier
609
+ */
610
+ hasAnyVisibility(node) {
611
+ for (const child of node.children) {
612
+ if (child.type === 'visibility_modifier') {
613
+ return true;
614
+ }
615
+ }
616
+ return false;
617
+ }
618
+ }
619
+ //# sourceMappingURL=php-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"php-extractor.js","sourceRoot":"","sources":["../../../src/call-graph/extractors/php-extractor.ts"],"names":[],"mappings":"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"}