gitnexus 1.6.5-rc.16 → 1.6.5-rc.18

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 (54) hide show
  1. package/dist/_shared/scope-resolution/method-dispatch-index.d.ts +26 -0
  2. package/dist/_shared/scope-resolution/method-dispatch-index.d.ts.map +1 -1
  3. package/dist/_shared/scope-resolution/method-dispatch-index.js +22 -3
  4. package/dist/_shared/scope-resolution/method-dispatch-index.js.map +1 -1
  5. package/dist/_shared/scope-resolution/registries/lookup-core.js +18 -1
  6. package/dist/_shared/scope-resolution/registries/lookup-core.js.map +1 -1
  7. package/dist/core/ingestion/import-resolvers/standard.d.ts +5 -0
  8. package/dist/core/ingestion/import-resolvers/standard.js +27 -1
  9. package/dist/core/ingestion/import-resolvers/utils.js +4 -0
  10. package/dist/core/ingestion/languages/php/arity-metadata.d.ts +28 -0
  11. package/dist/core/ingestion/languages/php/arity-metadata.js +63 -0
  12. package/dist/core/ingestion/languages/php/arity.d.ts +25 -0
  13. package/dist/core/ingestion/languages/php/arity.js +40 -0
  14. package/dist/core/ingestion/languages/php/cache-stats.d.ts +15 -0
  15. package/dist/core/ingestion/languages/php/cache-stats.js +26 -0
  16. package/dist/core/ingestion/languages/php/captures.d.ts +34 -0
  17. package/dist/core/ingestion/languages/php/captures.js +739 -0
  18. package/dist/core/ingestion/languages/php/import-decomposer.d.ts +28 -0
  19. package/dist/core/ingestion/languages/php/import-decomposer.js +265 -0
  20. package/dist/core/ingestion/languages/php/import-target.d.ts +47 -0
  21. package/dist/core/ingestion/languages/php/import-target.js +100 -0
  22. package/dist/core/ingestion/languages/php/index.d.ts +68 -0
  23. package/dist/core/ingestion/languages/php/index.js +72 -0
  24. package/dist/core/ingestion/languages/php/interpret.d.ts +36 -0
  25. package/dist/core/ingestion/languages/php/interpret.js +241 -0
  26. package/dist/core/ingestion/languages/php/merge-bindings.d.ts +19 -0
  27. package/dist/core/ingestion/languages/php/merge-bindings.js +47 -0
  28. package/dist/core/ingestion/languages/php/namespace-siblings.d.ts +51 -0
  29. package/dist/core/ingestion/languages/php/namespace-siblings.js +288 -0
  30. package/dist/core/ingestion/languages/php/query.d.ts +32 -0
  31. package/dist/core/ingestion/languages/php/query.js +326 -0
  32. package/dist/core/ingestion/languages/php/receiver-binding.d.ts +36 -0
  33. package/dist/core/ingestion/languages/php/receiver-binding.js +128 -0
  34. package/dist/core/ingestion/languages/php/scope-resolver.d.ts +23 -0
  35. package/dist/core/ingestion/languages/php/scope-resolver.js +358 -0
  36. package/dist/core/ingestion/languages/php/simple-hooks.d.ts +42 -0
  37. package/dist/core/ingestion/languages/php/simple-hooks.js +111 -0
  38. package/dist/core/ingestion/languages/php.d.ts +0 -7
  39. package/dist/core/ingestion/languages/php.js +15 -0
  40. package/dist/core/ingestion/registry-primary-flag.js +1 -0
  41. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +54 -0
  42. package/dist/core/ingestion/scope-resolution/graph-bridge/method-dispatch.d.ts +1 -1
  43. package/dist/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +12 -2
  44. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +5 -0
  45. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +23 -0
  46. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +68 -7
  47. package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.d.ts +7 -3
  48. package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.js +24 -4
  49. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +21 -2
  50. package/dist/core/ingestion/scope-resolution/pipeline/registry.js +2 -0
  51. package/dist/core/ingestion/scope-resolution/pipeline/run.js +7 -2
  52. package/dist/core/ingestion/tree-sitter-queries.d.ts +1 -1
  53. package/dist/core/ingestion/tree-sitter-queries.js +10 -0
  54. package/package.json +1 -1
@@ -36,10 +36,26 @@ export interface MethodDispatchIndex {
36
36
  readonly mroByOwnerDefId: ReadonlyMap<DefId, readonly DefId[]>;
37
37
  /** Interfaces / traits → classes that implement them. */
38
38
  readonly implsByInterfaceDefId: ReadonlyMap<DefId, readonly DefId[]>;
39
+ /**
40
+ * Optional parallel MRO view that EXCLUDES mixin-like augmentation
41
+ * (e.g., PHP traits). Populated only when the input supplies
42
+ * `computeExtendsOnlyMro`. Used by the super-branch dispatch in
43
+ * `receiver-bound-calls` so that `parent::method()` walks the
44
+ * inheritance chain only, not the trait-augmented one. Undefined for
45
+ * languages without mixin-like semantics — callers should fall back
46
+ * to `mroFor` when this is missing.
47
+ */
48
+ readonly extendsOnlyMroByOwnerDefId?: ReadonlyMap<DefId, readonly DefId[]>;
39
49
  /** `mroByOwnerDefId.get`, with an empty frozen array on miss. */
40
50
  mroFor(ownerDefId: DefId): readonly DefId[];
41
51
  /** `implsByInterfaceDefId.get`, with an empty frozen array on miss. */
42
52
  implementorsOf(interfaceDefId: DefId): readonly DefId[];
53
+ /**
54
+ * `extendsOnlyMroByOwnerDefId.get`, with an empty frozen array on miss.
55
+ * Undefined when `extendsOnlyMroByOwnerDefId` was not populated; callers
56
+ * should treat this as equivalent to `mroFor` for non-mixin languages.
57
+ */
58
+ readonly extendsOnlyMroFor?: (ownerDefId: DefId) => readonly DefId[];
43
59
  }
44
60
  export interface MethodDispatchInput {
45
61
  /**
@@ -75,6 +91,16 @@ export interface MethodDispatchInput {
75
91
  * write-wins policy and fires at most once per unique owner.
76
92
  */
77
93
  readonly implementsOf: (ownerDefId: DefId) => readonly DefId[];
94
+ /**
95
+ * Optional: return the EXTENDS-only ancestor chain for `ownerDefId`,
96
+ * excluding the owner itself AND any mixin-like augmentation (e.g.,
97
+ * PHP traits). Languages without mixin semantics leave this undefined
98
+ * and the index's `extendsOnlyMroByOwnerDefId` stays unpopulated.
99
+ *
100
+ * Same contract as `computeMro`: pure, deterministic, `[]` on no parents.
101
+ * Called at most once per unique owner (first-write-wins).
102
+ */
103
+ readonly computeExtendsOnlyMro?: (ownerDefId: DefId) => readonly DefId[];
78
104
  }
79
105
  export declare function buildMethodDispatchIndex(input: MethodDispatchInput): MethodDispatchIndex;
80
106
  //# sourceMappingURL=method-dispatch-index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"method-dispatch-index.d.ts","sourceRoot":"","sources":["../../src/scope-resolution/method-dispatch-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAIxC,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC;IAC/D,yDAAyD;IACzD,QAAQ,CAAC,qBAAqB,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC;IAErE,iEAAiE;IACjE,MAAM,CAAC,UAAU,EAAE,KAAK,GAAG,SAAS,KAAK,EAAE,CAAC;IAC5C,uEAAuE;IACvE,cAAc,CAAC,cAAc,EAAE,KAAK,GAAG,SAAS,KAAK,EAAE,CAAC;CACzD;AAED,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC;;;;;;;;;OASG;IACH,QAAQ,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,KAAK,KAAK,SAAS,KAAK,EAAE,CAAC;IAC7D;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,KAAK,KAAK,SAAS,KAAK,EAAE,CAAC;CAChE;AAID,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB,CAqCxF"}
1
+ {"version":3,"file":"method-dispatch-index.d.ts","sourceRoot":"","sources":["../../src/scope-resolution/method-dispatch-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAIxC,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC;IAC/D,yDAAyD;IACzD,QAAQ,CAAC,qBAAqB,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC;IACrE;;;;;;;;OAQG;IACH,QAAQ,CAAC,0BAA0B,CAAC,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC;IAE3E,iEAAiE;IACjE,MAAM,CAAC,UAAU,EAAE,KAAK,GAAG,SAAS,KAAK,EAAE,CAAC;IAC5C,uEAAuE;IACvE,cAAc,CAAC,cAAc,EAAE,KAAK,GAAG,SAAS,KAAK,EAAE,CAAC;IACxD;;;;OAIG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,KAAK,SAAS,KAAK,EAAE,CAAC;CACtE;AAED,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC;;;;;;;;;OASG;IACH,QAAQ,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,KAAK,KAAK,SAAS,KAAK,EAAE,CAAC;IAC7D;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,KAAK,KAAK,SAAS,KAAK,EAAE,CAAC;IAC/D;;;;;;;;OAQG;IACH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,KAAK,SAAS,KAAK,EAAE,CAAC;CAC1E;AAID,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB,CAgDxF"}
@@ -30,6 +30,9 @@
30
30
  // ─── Builder ────────────────────────────────────────────────────────────────
31
31
  export function buildMethodDispatchIndex(input) {
32
32
  const mroByOwnerDefId = new Map();
33
+ const extendsOnlyByOwnerDefId = input.computeExtendsOnlyMro
34
+ ? new Map()
35
+ : undefined;
33
36
  const implsBuilding = new Map();
34
37
  const implsSeen = new Map();
35
38
  for (const ownerId of input.owners) {
@@ -39,6 +42,12 @@ export function buildMethodDispatchIndex(input) {
39
42
  const chain = input.computeMro(ownerId);
40
43
  mroByOwnerDefId.set(ownerId, Object.freeze(chain.slice()));
41
44
  }
45
+ if (input.computeExtendsOnlyMro !== undefined &&
46
+ extendsOnlyByOwnerDefId !== undefined &&
47
+ !extendsOnlyByOwnerDefId.has(ownerId)) {
48
+ const extOnly = input.computeExtendsOnlyMro(ownerId);
49
+ extendsOnlyByOwnerDefId.set(ownerId, Object.freeze(extOnly.slice()));
50
+ }
42
51
  for (const ifaceId of input.implementsOf(ownerId)) {
43
52
  let seen = implsSeen.get(ifaceId);
44
53
  if (seen === undefined) {
@@ -60,12 +69,12 @@ export function buildMethodDispatchIndex(input) {
60
69
  for (const [ifaceId, owners] of implsBuilding) {
61
70
  implsByInterfaceDefId.set(ifaceId, Object.freeze(owners.slice()));
62
71
  }
63
- return wrapIndex(mroByOwnerDefId, implsByInterfaceDefId);
72
+ return wrapIndex(mroByOwnerDefId, implsByInterfaceDefId, extendsOnlyByOwnerDefId);
64
73
  }
65
74
  // ─── Internal ───────────────────────────────────────────────────────────────
66
75
  const EMPTY = Object.freeze([]);
67
- function wrapIndex(mroByOwnerDefId, implsByInterfaceDefId) {
68
- return {
76
+ function wrapIndex(mroByOwnerDefId, implsByInterfaceDefId, extendsOnlyMroByOwnerDefId) {
77
+ const base = {
69
78
  mroByOwnerDefId,
70
79
  implsByInterfaceDefId,
71
80
  mroFor(ownerDefId) {
@@ -75,5 +84,15 @@ function wrapIndex(mroByOwnerDefId, implsByInterfaceDefId) {
75
84
  return implsByInterfaceDefId.get(interfaceDefId) ?? EMPTY;
76
85
  },
77
86
  };
87
+ if (extendsOnlyMroByOwnerDefId !== undefined) {
88
+ return {
89
+ ...base,
90
+ extendsOnlyMroByOwnerDefId,
91
+ extendsOnlyMroFor(ownerDefId) {
92
+ return extendsOnlyMroByOwnerDefId.get(ownerDefId) ?? EMPTY;
93
+ },
94
+ };
95
+ }
96
+ return base;
78
97
  }
79
98
  //# sourceMappingURL=method-dispatch-index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"method-dispatch-index.js","sourceRoot":"","sources":["../../src/scope-resolution/method-dispatch-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAyDH,+EAA+E;AAE/E,MAAM,UAAU,wBAAwB,CAAC,KAA0B;IACjE,MAAM,eAAe,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC3D,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE/C,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACnC,sEAAsE;QACtE,2DAA2D;QAC3D,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACxC,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7D,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAClD,IAAI,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,GAAG,IAAI,GAAG,EAAS,CAAC;gBACxB,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,SAAS;YAChC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAElB,IAAI,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,GAAG,EAAE,CAAC;gBACZ,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACrC,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAA2B,CAAC;IACjE,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9C,qBAAqB,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,SAAS,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC;AAC3D,CAAC;AAED,+EAA+E;AAE/E,MAAM,KAAK,GAAqB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAElD,SAAS,SAAS,CAChB,eAA6C,EAC7C,qBAAmD;IAEnD,OAAO;QACL,eAAe;QACf,qBAAqB;QACrB,MAAM,CAAC,UAAiB;YACtB,OAAO,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC;QAClD,CAAC;QACD,cAAc,CAAC,cAAqB;YAClC,OAAO,qBAAqB,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC;QAC5D,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"method-dispatch-index.js","sourceRoot":"","sources":["../../src/scope-resolution/method-dispatch-index.ts"],"names":[],"mappings":"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"}
@@ -299,14 +299,31 @@ function applyArityFilter(callsite, perCandidate, ctx) {
299
299
  return;
300
300
  }
301
301
  let anyCompatible = false;
302
+ let anyUnknown = false;
302
303
  for (const state of perCandidate.values()) {
303
304
  const verdict = arityFn(callsite, state.def);
304
305
  state.signals.arityVerdict = verdict;
305
306
  if (verdict === 'compatible')
306
307
  anyCompatible = true;
308
+ else if (verdict === 'unknown')
309
+ anyUnknown = true;
307
310
  }
308
- if (!anyCompatible)
311
+ // When ALL candidates are 'incompatible' (none compatible, none unknown),
312
+ // the call is genuinely arity-broken — drop every candidate so the
313
+ // registry returns no resolution. This matches the PHP variadic case
314
+ // f(int $req, ...$rest) called with zero args: every candidate definitively
315
+ // rejects, and emitting an edge to a definitively-rejected callable is
316
+ // a false positive. When some candidates are 'unknown' (missing metadata),
317
+ // keep the set so downstream evidence can break the tie — that's the
318
+ // original safety-fallback behavior.
319
+ if (!anyCompatible) {
320
+ if (!anyUnknown) {
321
+ for (const defId of perCandidate.keys()) {
322
+ perCandidate.delete(defId);
323
+ }
324
+ }
309
325
  return;
326
+ }
310
327
  // Filter: when at least one compatible candidate exists, drop incompatibles.
311
328
  for (const [defId, state] of perCandidate) {
312
329
  if (state.signals.arityVerdict === 'incompatible') {
@@ -1 +1 @@
1
- {"version":3,"file":"lookup-core.js","sourceRoot":"","sources":["../../../src/scope-resolution/registries/lookup-core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lookup-core.js","sourceRoot":"","sources":["../../../src/scope-resolution/registries/lookup-core.ts"],"names":[],"mappings":"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"}
@@ -28,3 +28,8 @@ export declare const resolveImportPath: (currentFile: string, importPath: string
28
28
  export declare function resolveStandard(rawImportPath: string, filePath: string, ctx: ResolveCtx, language: SupportedLanguages): ImportResult;
29
29
  /** Create a reusable standard-resolution strategy for a given language. */
30
30
  export declare function createStandardStrategy(language: SupportedLanguages): ImportResolverStrategy;
31
+ /**
32
+ * Strip a JS-family extension from a path, returning the stem.
33
+ * Returns `null` if the path does not end with a JS-family extension.
34
+ */
35
+ export declare function stripJsExtension(path: string): string | null;
@@ -108,7 +108,20 @@ export const resolveImportPath = (currentFile, importPath, allFiles, allFileList
108
108
  const basePath = currentDir.join('/');
109
109
  if (importPath.startsWith('.')) {
110
110
  const resolved = tryResolveWithExtensions(basePath, allFiles);
111
- return cache(resolved);
111
+ if (resolved)
112
+ return cache(resolved);
113
+ // TypeScript ESM: imports use .js/.jsx/.mjs/.cjs but source files are
114
+ // .ts/.tsx/.mts/.cts. Strip the JS-family extension and re-resolve.
115
+ // NOTE: This fallback only applies to relative imports. Path alias imports
116
+ // (e.g. @/utils.js via tsconfig paths) do not yet strip .js extensions —
117
+ // that is a known limitation tracked for follow-up.
118
+ if (language === SupportedLanguages.TypeScript || language === SupportedLanguages.JavaScript) {
119
+ const stripped = stripJsExtension(basePath);
120
+ if (stripped !== null) {
121
+ return cache(tryResolveWithExtensions(stripped, allFiles));
122
+ }
123
+ }
124
+ return cache(null);
112
125
  }
113
126
  // ---- Generic package/absolute import resolution (suffix matching) ----
114
127
  // Java wildcards are handled in processImports, not here
@@ -140,3 +153,16 @@ export function resolveStandard(rawImportPath, filePath, ctx, language) {
140
153
  export function createStandardStrategy(language) {
141
154
  return (raw, fp, ctx) => resolveStandard(raw, fp, ctx, language);
142
155
  }
156
+ // ============================================================================
157
+ // ESM extension helpers
158
+ // ============================================================================
159
+ /** JS-family extensions that TypeScript ESM maps to TS equivalents. */
160
+ const JS_EXTENSION_PATTERN = /\.(js|jsx|mjs|cjs)$/;
161
+ /**
162
+ * Strip a JS-family extension from a path, returning the stem.
163
+ * Returns `null` if the path does not end with a JS-family extension.
164
+ */
165
+ export function stripJsExtension(path) {
166
+ const match = JS_EXTENSION_PATTERN.exec(path);
167
+ return match ? path.slice(0, -match[0].length) : null;
168
+ }
@@ -8,8 +8,12 @@ export const EXTENSIONS = [
8
8
  // TypeScript/JavaScript
9
9
  '.tsx',
10
10
  '.ts',
11
+ '.mts',
12
+ '.cts',
11
13
  '.jsx',
12
14
  '.js',
15
+ '.mjs',
16
+ '.cjs',
13
17
  '.vue',
14
18
  '/index.tsx',
15
19
  '/index.ts',
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Extract PHP arity metadata from a method-like tree-sitter node —
3
+ * `method_declaration` or `function_definition`.
4
+ *
5
+ * Reuses `phpMethodConfig.extractParameters` so scope-extracted defs
6
+ * carry the same arity semantics as the legacy parse-worker path:
7
+ * - `variadic_parameter` (`...$args`) collapses `parameterCount` to
8
+ * `undefined`, which `phpArityCompatibility` then treats as
9
+ * "max unknown" — the candidate stays eligible at `argCount >= required`.
10
+ * - Defaulted parameters (`= expr`) contribute to `optionalCount`;
11
+ * `requiredParameterCount = total − optionalCount − (variadic ? 1 : 0)`.
12
+ * The variadic slot itself accepts zero args so it is subtracted from
13
+ * the required count — `f(int $a, ...$rest)` requires exactly 1 arg,
14
+ * not 2, and `f(...$rest)` requires 0.
15
+ * - `property_promotion_parameter` (constructor-promoted) is counted
16
+ * the same as `simple_parameter` since both consume an argument slot.
17
+ * - `parameterTypes` collects declared type names; a literal `'...'`
18
+ * marker is appended for variadic methods so `phpArityCompatibility`
19
+ * can detect them without re-reading the AST.
20
+ */
21
+ import type { SyntaxNode } from '../../utils/ast-helpers.js';
22
+ interface PhpArityMetadata {
23
+ readonly parameterCount: number | undefined;
24
+ readonly requiredParameterCount: number | undefined;
25
+ readonly parameterTypes: readonly string[] | undefined;
26
+ }
27
+ export declare function computePhpArityMetadata(fnNode: SyntaxNode): PhpArityMetadata;
28
+ export {};
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Extract PHP arity metadata from a method-like tree-sitter node —
3
+ * `method_declaration` or `function_definition`.
4
+ *
5
+ * Reuses `phpMethodConfig.extractParameters` so scope-extracted defs
6
+ * carry the same arity semantics as the legacy parse-worker path:
7
+ * - `variadic_parameter` (`...$args`) collapses `parameterCount` to
8
+ * `undefined`, which `phpArityCompatibility` then treats as
9
+ * "max unknown" — the candidate stays eligible at `argCount >= required`.
10
+ * - Defaulted parameters (`= expr`) contribute to `optionalCount`;
11
+ * `requiredParameterCount = total − optionalCount − (variadic ? 1 : 0)`.
12
+ * The variadic slot itself accepts zero args so it is subtracted from
13
+ * the required count — `f(int $a, ...$rest)` requires exactly 1 arg,
14
+ * not 2, and `f(...$rest)` requires 0.
15
+ * - `property_promotion_parameter` (constructor-promoted) is counted
16
+ * the same as `simple_parameter` since both consume an argument slot.
17
+ * - `parameterTypes` collects declared type names; a literal `'...'`
18
+ * marker is appended for variadic methods so `phpArityCompatibility`
19
+ * can detect them without re-reading the AST.
20
+ */
21
+ import { phpMethodConfig } from '../../method-extractors/configs/php.js';
22
+ export function computePhpArityMetadata(fnNode) {
23
+ const params = phpMethodConfig.extractParameters?.(fnNode) ?? [];
24
+ let hasVariadic = false;
25
+ let optionalCount = 0;
26
+ const types = [];
27
+ for (const p of params) {
28
+ if (p.isVariadic) {
29
+ hasVariadic = true;
30
+ }
31
+ else if (p.isOptional) {
32
+ optionalCount++;
33
+ }
34
+ if (p.type !== null)
35
+ types.push(p.type);
36
+ }
37
+ // PHP variadic marker convention: append the literal '...' string to
38
+ // `parameterTypes`. This is intentionally DIFFERENT from C#, which uses
39
+ // the literal 'params' (its source-language keyword). The shared
40
+ // `narrowOverloadCandidates` pass in `scope-resolution/passes/overload-
41
+ // narrowing.ts` checks for the C# 'params' marker — that branch is
42
+ // dead code for PHP because PHP variadic methods set `parameterCount
43
+ // = undefined` (see line below), which skips the `max !== undefined`
44
+ // gate that hosts the 'params' check. PHP's actual variadic-aware
45
+ // arity logic lives in `phpArityCompatibility` (arity.ts) and now
46
+ // also in `phpEmitUnresolvedReceiverEdges` (scope-resolver.ts), both
47
+ // of which check `'...'`. Finding 9 of PR #1497 adversarial review.
48
+ if (hasVariadic)
49
+ types.push('...');
50
+ const total = params.length;
51
+ // Variadic methods accept any arg count ≥ required — leave `parameterCount`
52
+ // undefined so the registry treats max as unknown.
53
+ const parameterCount = hasVariadic ? undefined : total;
54
+ // The variadic slot itself accepts zero args; subtract it from the required
55
+ // count so PHP's ArgumentCountError-equivalent calls (too few args before
56
+ // the variadic) are correctly rejected by arity compatibility.
57
+ const requiredParameterCount = total - optionalCount - (hasVariadic ? 1 : 0);
58
+ return {
59
+ parameterCount,
60
+ requiredParameterCount,
61
+ parameterTypes: types.length > 0 ? types : undefined,
62
+ };
63
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * PHP arity check, accommodating variadic (`...$args`) and default parameters.
3
+ *
4
+ * The `def` metadata synthesized by `arity-metadata.ts`:
5
+ * - `parameterCount` — total formal parameters; `undefined` when
6
+ * the method has a variadic `...$param`.
7
+ * - `requiredParameterCount` — min required (excludes defaulted params
8
+ * and the variadic itself).
9
+ * - `parameterTypes` — declared type strings; contains the
10
+ * literal `'...'` when the method is variadic.
11
+ *
12
+ * Verdicts:
13
+ * - `'compatible'` — `required <= argCount <= max`, OR the def has
14
+ * variadic (any `argCount >= required`).
15
+ * - `'incompatible'` — argCount below required, or above max with no variadic.
16
+ * - `'unknown'` — metadata absent / incomplete; named-args can satisfy
17
+ * any arity so we return unknown when we detect them.
18
+ *
19
+ * PHP supports named arguments (PHP 8.0+): `save(force: true)`. Named-arg
20
+ * call sites cannot be arity-checked statically without parsing arg names,
21
+ * so we return `'unknown'` when the callsite carries named args (signalled
22
+ * by a negative `arity` value per the shared Callsite contract).
23
+ */
24
+ import type { Callsite, SymbolDefinition } from '../../../../_shared/index.js';
25
+ export declare function phpArityCompatibility(def: SymbolDefinition, callsite: Callsite): 'compatible' | 'unknown' | 'incompatible';
@@ -0,0 +1,40 @@
1
+ /**
2
+ * PHP arity check, accommodating variadic (`...$args`) and default parameters.
3
+ *
4
+ * The `def` metadata synthesized by `arity-metadata.ts`:
5
+ * - `parameterCount` — total formal parameters; `undefined` when
6
+ * the method has a variadic `...$param`.
7
+ * - `requiredParameterCount` — min required (excludes defaulted params
8
+ * and the variadic itself).
9
+ * - `parameterTypes` — declared type strings; contains the
10
+ * literal `'...'` when the method is variadic.
11
+ *
12
+ * Verdicts:
13
+ * - `'compatible'` — `required <= argCount <= max`, OR the def has
14
+ * variadic (any `argCount >= required`).
15
+ * - `'incompatible'` — argCount below required, or above max with no variadic.
16
+ * - `'unknown'` — metadata absent / incomplete; named-args can satisfy
17
+ * any arity so we return unknown when we detect them.
18
+ *
19
+ * PHP supports named arguments (PHP 8.0+): `save(force: true)`. Named-arg
20
+ * call sites cannot be arity-checked statically without parsing arg names,
21
+ * so we return `'unknown'` when the callsite carries named args (signalled
22
+ * by a negative `arity` value per the shared Callsite contract).
23
+ */
24
+ export function phpArityCompatibility(def, callsite) {
25
+ const max = def.parameterCount;
26
+ const min = def.requiredParameterCount;
27
+ if (max === undefined && min === undefined)
28
+ return 'unknown';
29
+ const argCount = callsite.arity;
30
+ // Negative arity signals named-argument call sites — can't narrow statically.
31
+ if (!Number.isFinite(argCount) || argCount < 0)
32
+ return 'unknown';
33
+ const hasVarArgs = def.parameterTypes !== undefined &&
34
+ def.parameterTypes.some((t) => t === '...' || t.startsWith('...'));
35
+ if (min !== undefined && argCount < min)
36
+ return 'incompatible';
37
+ if (max !== undefined && argCount > max && !hasVarArgs)
38
+ return 'incompatible';
39
+ return 'compatible';
40
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Dev-mode counters for the cross-phase scope-captures parse cache
3
+ * (PHP mirror of `languages/csharp/cache-stats.ts`).
4
+ *
5
+ * Gated by `PROF_SCOPE_RESOLUTION=1`. Production builds fold every
6
+ * increment into dead code via the module-level `PROF` constant, so
7
+ * the hot path in `captures.ts` stays branch-free.
8
+ */
9
+ export declare function recordCacheHit(): void;
10
+ export declare function recordCacheMiss(): void;
11
+ export declare function getPhpCaptureCacheStats(): {
12
+ hits: number;
13
+ misses: number;
14
+ };
15
+ export declare function resetPhpCaptureCacheStats(): void;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Dev-mode counters for the cross-phase scope-captures parse cache
3
+ * (PHP mirror of `languages/csharp/cache-stats.ts`).
4
+ *
5
+ * Gated by `PROF_SCOPE_RESOLUTION=1`. Production builds fold every
6
+ * increment into dead code via the module-level `PROF` constant, so
7
+ * the hot path in `captures.ts` stays branch-free.
8
+ */
9
+ const PROF = process.env.PROF_SCOPE_RESOLUTION === '1';
10
+ let CACHE_HITS = 0;
11
+ let CACHE_MISSES = 0;
12
+ export function recordCacheHit() {
13
+ if (PROF)
14
+ CACHE_HITS++;
15
+ }
16
+ export function recordCacheMiss() {
17
+ if (PROF)
18
+ CACHE_MISSES++;
19
+ }
20
+ export function getPhpCaptureCacheStats() {
21
+ return { hits: CACHE_HITS, misses: CACHE_MISSES };
22
+ }
23
+ export function resetPhpCaptureCacheStats() {
24
+ CACHE_HITS = 0;
25
+ CACHE_MISSES = 0;
26
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * `emitScopeCaptures` for PHP (RFC #909 Ring 3 LANG-php).
3
+ *
4
+ * Drives the PHP scope query against tree-sitter-php and groups raw
5
+ * matches into `CaptureMatch[]` for the central extractor. Layers two
6
+ * synthesized streams on top:
7
+ *
8
+ * 1. **Decomposed use declarations** — each `namespace_use_declaration`
9
+ * is re-emitted with `@import.kind/source/name/alias` markers so
10
+ * `interpretPhpImport` can recover the ParsedImport shape without
11
+ * re-parsing raw text. Grouped uses fan out to one match per clause.
12
+ *
13
+ * 2. **Receiver-binding synthesis** — `$this` and `parent` type-bindings
14
+ * are synthesized on every non-static method entry. PHP's grammar
15
+ * does not express "implicit receiver of a non-static class method"
16
+ * via a clean `.scm` pattern, so we walk up the AST in code.
17
+ *
18
+ * 3. **Arity metadata synthesis** — `@declaration.parameter-count` /
19
+ * `@declaration.required-parameter-count` / `@declaration.parameter-types`
20
+ * are synthesized on function-like declarations so the registry can
21
+ * narrow overloads.
22
+ *
23
+ * 4. **PHPDoc synthesis** — @param and @return annotations in comment
24
+ * nodes preceding method/function declarations are extracted and emitted
25
+ * as `@type-binding.parameter` and `@type-binding.return` matches.
26
+ *
27
+ * 5. **Foreach loop synthesis** — `foreach ($users as $user)` emits
28
+ * a `@type-binding.alias` match binding the loop variable to the
29
+ * element type of the iterable (resolved from PHPDoc or scopeEnv).
30
+ *
31
+ * Pure given the input source text. No I/O, no globals consulted.
32
+ */
33
+ import type { CaptureMatch } from '../../../../_shared/index.js';
34
+ export declare function emitPhpScopeCaptures(sourceText: string, _filePath: string, cachedTree?: unknown): readonly CaptureMatch[];