@zzzen/pyright-internal 1.2.0-dev.20260913 → 1.2.0-dev.20260920

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 (74) hide show
  1. package/dist/analyzer/checker.js +2 -3
  2. package/dist/analyzer/checker.js.map +1 -1
  3. package/dist/analyzer/program.js +1 -0
  4. package/dist/analyzer/program.js.map +1 -1
  5. package/dist/analyzer/typeCacheUtils.d.ts +1 -0
  6. package/dist/analyzer/typeCacheUtils.js +28 -1
  7. package/dist/analyzer/typeCacheUtils.js.map +1 -1
  8. package/dist/analyzer/typeEvaluator.d.ts +1 -1
  9. package/dist/analyzer/typeEvaluator.js +7 -10
  10. package/dist/analyzer/typeEvaluator.js.map +1 -1
  11. package/dist/analyzer/typeEvaluatorTypes.d.ts +1 -0
  12. package/dist/analyzer/typedDicts.js +3 -7
  13. package/dist/analyzer/typedDicts.js.map +1 -1
  14. package/dist/analyzer/types.js +7 -0
  15. package/dist/analyzer/types.js.map +1 -1
  16. package/dist/common/configOptions.d.ts +1 -0
  17. package/dist/common/configOptions.js +16 -0
  18. package/dist/common/configOptions.js.map +1 -1
  19. package/dist/common/envVarUtils.js +3 -3
  20. package/dist/common/envVarUtils.js.map +1 -1
  21. package/dist/tests/envVarUtils.test.js +16 -0
  22. package/dist/tests/envVarUtils.test.js.map +1 -1
  23. package/dist/tests/evaluationTrace.integration.test.d.ts +1 -0
  24. package/dist/tests/evaluationTrace.integration.test.js +266 -0
  25. package/dist/tests/evaluationTrace.integration.test.js.map +1 -0
  26. package/dist/tests/evaluationTrace.test.d.ts +1 -0
  27. package/dist/tests/evaluationTrace.test.js +422 -0
  28. package/dist/tests/evaluationTrace.test.js.map +1 -0
  29. package/dist/tests/evaluationTrace.viewer.test.d.ts +1 -0
  30. package/dist/tests/evaluationTrace.viewer.test.js +529 -0
  31. package/dist/tests/evaluationTrace.viewer.test.js.map +1 -0
  32. package/dist/tests/mypyPrimerAnalysis.test.js +1193 -47
  33. package/dist/tests/mypyPrimerAnalysis.test.js.map +1 -1
  34. package/dist/tests/mypyPrimerMcp.test.d.ts +1 -0
  35. package/dist/tests/mypyPrimerMcp.test.js +186 -0
  36. package/dist/tests/mypyPrimerMcp.test.js.map +1 -0
  37. package/dist/tests/typeCacheUtils.test.js +15 -0
  38. package/dist/tests/typeCacheUtils.test.js.map +1 -1
  39. package/dist/tests/typeEvaluator7.test.js +4 -0
  40. package/dist/tests/typeEvaluator7.test.js.map +1 -1
  41. package/dist/trace/capture.d.ts +31 -0
  42. package/dist/trace/capture.js +272 -0
  43. package/dist/trace/capture.js.map +1 -0
  44. package/dist/trace/cli.d.ts +1 -0
  45. package/dist/trace/cli.js +196 -0
  46. package/dist/trace/cli.js.map +1 -0
  47. package/dist/trace/nativeAdapter.d.ts +16 -0
  48. package/dist/trace/nativeAdapter.js +422 -0
  49. package/dist/trace/nativeAdapter.js.map +1 -0
  50. package/dist/trace/nativeBridge.d.ts +46 -0
  51. package/dist/trace/nativeBridge.js +416 -0
  52. package/dist/trace/nativeBridge.js.map +1 -0
  53. package/dist/trace/reader.d.ts +83 -0
  54. package/dist/trace/reader.js +296 -0
  55. package/dist/trace/reader.js.map +1 -0
  56. package/dist/trace/recorder.d.ts +59 -0
  57. package/dist/trace/recorder.js +303 -0
  58. package/dist/trace/recorder.js.map +1 -0
  59. package/dist/trace/runtimeLoader.d.ts +23 -0
  60. package/dist/trace/runtimeLoader.js +172 -0
  61. package/dist/trace/runtimeLoader.js.map +1 -0
  62. package/dist/trace/viewerAssets.d.ts +2 -0
  63. package/dist/trace/viewerAssets.js +76 -0
  64. package/dist/trace/viewerAssets.js.map +1 -0
  65. package/dist/trace/viewerClient.d.ts +1 -0
  66. package/dist/trace/viewerClient.js +485 -0
  67. package/dist/trace/viewerClient.js.map +1 -0
  68. package/dist/trace/viewerModel.d.ts +308 -0
  69. package/dist/trace/viewerModel.js +524 -0
  70. package/dist/trace/viewerModel.js.map +1 -0
  71. package/dist/trace/viewerServer.d.ts +7 -0
  72. package/dist/trace/viewerServer.js +185 -0
  73. package/dist/trace/viewerServer.js.map +1 -0
  74. package/package.json +4 -2
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ /*
3
+ * cli.ts
4
+ * Copyright (c) Microsoft Corporation.
5
+ * Licensed under the MIT license.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.main = main;
9
+ const fs_1 = require("fs");
10
+ const capture_1 = require("./capture");
11
+ const reader_1 = require("./reader");
12
+ const viewerServer_1 = require("./viewerServer");
13
+ const help = `Pyright evaluation traces (developer-only, local unbundled builds)
14
+ capture --target <repo> --input <python> --output <new.ndjson>
15
+ [--runtime <unbundled src>] [--experimental]
16
+ [--mode trace|audit|clean] [--file <python> --start <offset> --end <offset>]
17
+ [--operation <native operation id>] [--events <n>] [--bytes <n>] [--depth <n>]
18
+ compare <same capture options> (writes clean/audit JSON alongside the trace)
19
+ query <artifact.ndjson> timeline [--kind <kind>] [--span <id>]
20
+ query <artifact.ndjson> history|latest --entity <id> [--at <sequence>]
21
+ query <artifact.ndjson> neighbors --entity <id> [--relation <relation>]
22
+ query <artifact.ndjson> pairs
23
+ query <artifact.ndjson> diff --baseline <span> --replay <span>
24
+ query <artifact.ndjson> summary|coverage
25
+ view <artifact.ndjson> [--port <0..65535>] (loopback-only; Ctrl+C stops)
26
+ All offsets are zero-based UTF-16 offsets. Output paths must not already exist.
27
+ An absent event is not proof of no effect; inspect coverage and the footer.`;
28
+ async function main(argv = process.argv.slice(2)) {
29
+ if (!argv.length || argv.includes('--help')) {
30
+ console.log(help);
31
+ return;
32
+ }
33
+ const positionals = [];
34
+ const flags = new Map();
35
+ const allowed = new Set([
36
+ 'target',
37
+ 'input',
38
+ 'output',
39
+ 'runtime',
40
+ 'experimental',
41
+ 'mode',
42
+ 'file',
43
+ 'start',
44
+ 'end',
45
+ 'operation',
46
+ 'events',
47
+ 'bytes',
48
+ 'depth',
49
+ 'kind',
50
+ 'span',
51
+ 'entity',
52
+ 'at',
53
+ 'relation',
54
+ 'baseline',
55
+ 'replay',
56
+ 'port',
57
+ ]);
58
+ for (let i = 0; i < argv.length; i++) {
59
+ const token = argv[i];
60
+ if (!token.startsWith('--')) {
61
+ positionals.push(token);
62
+ continue;
63
+ }
64
+ const name = token.slice(2);
65
+ if (!allowed.has(name) || flags.has(name)) {
66
+ throw new Error(`Unknown or repeated option ${token}`);
67
+ }
68
+ if (name === 'experimental') {
69
+ flags.set(name, 'true');
70
+ }
71
+ else {
72
+ const value = argv[++i];
73
+ if (!value || value.startsWith('--')) {
74
+ throw new Error(`Missing value for ${token}`);
75
+ }
76
+ flags.set(name, value);
77
+ }
78
+ }
79
+ const required = (name) => {
80
+ const value = flags.get(name);
81
+ if (!value) {
82
+ throw new Error(`--${name} is required`);
83
+ }
84
+ return value;
85
+ };
86
+ const number = (name) => {
87
+ const value = flags.get(name);
88
+ if (value === undefined) {
89
+ return undefined;
90
+ }
91
+ const parsed = Number(value);
92
+ if (!Number.isSafeInteger(parsed) || parsed < 0) {
93
+ throw new Error(`Invalid --${name}: ${value}`);
94
+ }
95
+ return parsed;
96
+ };
97
+ const [command, path, query] = positionals;
98
+ if (command === 'view') {
99
+ if (!path || positionals.length !== 2 || [...flags.keys()].some((flag) => flag !== 'port')) {
100
+ throw new Error('Usage: view <artifact.ndjson> [--port <0..65535>]');
101
+ }
102
+ const viewer = await (0, viewerServer_1.startViewer)((0, viewerServer_1.loadViewerModel)(path), number('port'));
103
+ console.log(`Pyright trace viewer: ${viewer.url}\nPID ${process.pid}. Local read-only artifact; Ctrl+C to stop.`);
104
+ let closing = false;
105
+ const stop = () => {
106
+ if (!closing) {
107
+ closing = true;
108
+ viewer
109
+ .close()
110
+ .catch((error) => {
111
+ console.error('Viewer shutdown failed:', error);
112
+ process.exitCode = 1;
113
+ })
114
+ .finally(() => {
115
+ process.removeListener('SIGINT', stop);
116
+ process.removeListener('SIGTERM', stop);
117
+ });
118
+ }
119
+ };
120
+ process.on('SIGINT', stop);
121
+ process.on('SIGTERM', stop);
122
+ return;
123
+ }
124
+ if (command === 'capture' || command === 'compare') {
125
+ const mode = flags.get('mode') ?? 'trace';
126
+ if (!['trace', 'audit', 'clean'].includes(mode)) {
127
+ throw new Error(`Invalid mode ${mode}`);
128
+ }
129
+ const options = {
130
+ target: required('target'),
131
+ input: required('input'),
132
+ output: required('output'),
133
+ runtime: flags.get('runtime'),
134
+ mode: mode,
135
+ experimental: flags.has('experimental'),
136
+ selection: {
137
+ file: flags.get('file') ?? required('input'),
138
+ start: number('start'),
139
+ end: number('end'),
140
+ operation: number('operation'),
141
+ },
142
+ limits: Object.fromEntries(['events', 'bytes', 'depth'].filter((name) => flags.has(name)).map((name) => [name, number(name)])),
143
+ };
144
+ if (command === 'compare') {
145
+ console.log(JSON.stringify((0, capture_1.compareCaptures)(options), null, 2));
146
+ return;
147
+ }
148
+ const result = (0, capture_1.capture)(options);
149
+ console.log(JSON.stringify({ mode, output: options.output, audit: result.audit, diagnostics: result.diagnostics }));
150
+ return;
151
+ }
152
+ if (command !== 'query' || !path) {
153
+ throw new Error(help);
154
+ }
155
+ if ((0, fs_1.statSync)(path).size > 128 * 1024 * 1024) {
156
+ throw new Error('Artifact exceeds reader byte limit');
157
+ }
158
+ const reader = new reader_1.TraceReader((0, reader_1.readTrace)((0, fs_1.readFileSync)(path, 'utf8')));
159
+ let result;
160
+ switch (query) {
161
+ case 'timeline':
162
+ result = reader.timeline(flags.get('kind'), flags.get('span'));
163
+ break;
164
+ case 'history':
165
+ result = reader.history(required('entity'), number('at'));
166
+ break;
167
+ case 'latest':
168
+ result = reader.latest(required('entity'), number('at'));
169
+ break;
170
+ case 'neighbors':
171
+ result = reader.neighborhood(required('entity'), flags.get('relation'));
172
+ break;
173
+ case 'pairs':
174
+ result = reader.pairs();
175
+ break;
176
+ case 'diff':
177
+ result = reader.diff(required('baseline'), required('replay'));
178
+ break;
179
+ case 'coverage':
180
+ result = [reader.records[0], reader.records[reader.records.length - 1]];
181
+ break;
182
+ case 'summary':
183
+ result = reader.records.filter((r) => r.kind === 'summary');
184
+ break;
185
+ default:
186
+ throw new Error(`Unknown query ${query}`);
187
+ }
188
+ console.log(JSON.stringify(result, null, 2));
189
+ }
190
+ if (require.main === module) {
191
+ main().catch((error) => {
192
+ console.error(error instanceof Error ? error.message : error);
193
+ process.exitCode = 1;
194
+ });
195
+ }
196
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../../../src/trace/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface HookSite {
2
+ id: string;
3
+ file: string;
4
+ label: string;
5
+ line: number;
6
+ start: number;
7
+ length: number;
8
+ text: string;
9
+ }
10
+ export declare const adapterVersion = "native-commonjs-v1";
11
+ export declare function adapterFiles(experimental: boolean): string[];
12
+ export declare function instrument(file: string, code: string, experimental?: boolean): {
13
+ code: string;
14
+ sites: HookSite[];
15
+ counts: Record<string, number>;
16
+ };
@@ -0,0 +1,422 @@
1
+ "use strict";
2
+ /*
3
+ * nativeAdapter.ts
4
+ * Copyright (c) Microsoft Corporation.
5
+ * Licensed under the MIT license.
6
+ *
7
+ * AST instrumentation for supported unbundled CommonJS builds. Hook locations
8
+ * are derived from syntax, never byte/line replacements. No files are changed.
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.adapterVersion = void 0;
45
+ exports.adapterFiles = adapterFiles;
46
+ exports.instrument = instrument;
47
+ const ts = __importStar(require("typescript"));
48
+ exports.adapterVersion = 'native-commonjs-v1';
49
+ const modules = {
50
+ 'analyzer/typeEvaluator.js': {
51
+ factory: 'createTypeEvaluator',
52
+ state: [
53
+ 'typeCache',
54
+ 'expectedTypeCache',
55
+ 'typeFormTypeCache',
56
+ 'incompleteGenCount',
57
+ 'codeFlowAnalyzerCache',
58
+ 'returnTypeInferenceTypeCache',
59
+ 'returnTypeInferenceContextStack',
60
+ 'suppressedNodeStack',
61
+ 'signatureTrackerStack',
62
+ 'symbolResolutionStack',
63
+ 'deferredClassCompletions',
64
+ 'speculativeTypeTracker',
65
+ ],
66
+ functions: [
67
+ 'getTypeOfExpression',
68
+ 'readTypeCacheEntry',
69
+ 'readTypeFormTypeCacheEntry',
70
+ 'isTypeCacheEntryValid',
71
+ 'readTypeCache',
72
+ 'writeTypeCache',
73
+ 'addExpectedTypeCacheEntry',
74
+ 'validateCallArgs',
75
+ 'validateArgType',
76
+ 'inferFunctionReturnType',
77
+ 'disposeEvaluator',
78
+ ],
79
+ required: ['collection', 'branch', 'generation', 'field-write'],
80
+ },
81
+ 'analyzer/codeFlowEngine.js': {
82
+ factory: 'getCodeFlowEngine',
83
+ state: ['flowIncompleteGeneration', 'reachabilityCache', 'callIsNoReturnCache', 'isReachableRecursionSet'],
84
+ functions: [
85
+ 'createCodeFlowAnalyzer',
86
+ 'getTypeFromCodeFlow',
87
+ 'getTypeFromFlowNode',
88
+ 'setCacheEntry',
89
+ 'setIncompleteSubtype',
90
+ 'getCacheEntry',
91
+ 'preventRecursion',
92
+ 'getFlowNodeReachability',
93
+ 'isCallNoReturn',
94
+ ],
95
+ required: ['collection', 'branch', 'generation', 'field-write'],
96
+ },
97
+ 'analyzer/typeCacheUtils.js': {
98
+ optionalFunctions: ['findContextualTypeCacheEntry'],
99
+ functions: [
100
+ 'contextualTypeCacheEntryMatches',
101
+ 'addContextualTypeCacheEntry',
102
+ 'enterSpeculativeContext',
103
+ 'leaveSpeculativeContext',
104
+ 'trackEntry',
105
+ 'disableSpeculativeMode',
106
+ 'enableSpeculativeMode',
107
+ 'getSpeculativeType',
108
+ 'addSpeculativeType',
109
+ '_dependentTypesMatch',
110
+ ],
111
+ required: ['collection', 'branch'],
112
+ },
113
+ 'analyzer/constraintTracker.js': {
114
+ functions: ['ConstraintSet.setBounds', 'ConstraintSet.getTypeVar', 'ConstraintTracker.setBounds'],
115
+ required: ['collection'],
116
+ },
117
+ 'common/diagnosticSink.js': {
118
+ functions: ['fetchAndClear', 'addDiagnostic', 'addDiagnostics'],
119
+ required: ['collection'],
120
+ },
121
+ 'analyzer/analyzerNodeInfo.js': {
122
+ functions: ['AnalyzerNodeInfoStore.setFileInfo'],
123
+ required: [],
124
+ },
125
+ 'analyzer/overloadResultController.js': {
126
+ functions: ['_trial', 'evaluate', 'evaluateAndContinue', 'beforeCall'],
127
+ required: ['collection', 'branch', 'evaluator-link'],
128
+ },
129
+ };
130
+ function adapterFiles(experimental) {
131
+ return Object.keys(modules).filter((file) => experimental || !file.includes('overloadResultController'));
132
+ }
133
+ const bridgeName = '__pyrightTrace';
134
+ function parseExpression(text) {
135
+ const file = ts.createSourceFile('hook.js', `(${text});`, ts.ScriptTarget.ES2020, false, ts.ScriptKind.JS);
136
+ return synthesize(file.statements[0].expression);
137
+ }
138
+ function parseStatements(text) {
139
+ return ts
140
+ .createSourceFile('hook.js', text, ts.ScriptTarget.ES2020, false, ts.ScriptKind.JS)
141
+ .statements.map(synthesize);
142
+ }
143
+ function synthesize(node) {
144
+ ts.setTextRange(node, { pos: -1, end: -1 });
145
+ ts.forEachChild(node, (child) => {
146
+ synthesize(child);
147
+ });
148
+ return node;
149
+ }
150
+ function instrument(file, code, experimental = false) {
151
+ let spec = modules[file];
152
+ if (!spec) {
153
+ throw new Error(`No adapter for ${file}`);
154
+ }
155
+ if (experimental && file === 'analyzer/typeCacheUtils.js') {
156
+ spec = {
157
+ ...spec,
158
+ functions: [
159
+ ...spec.functions,
160
+ 'useTestOnlyCacheIsolation',
161
+ 'SpeculativeTypeTracker.useTestOnlyCacheIsolation',
162
+ ],
163
+ };
164
+ }
165
+ const source = ts.createSourceFile(file, code, ts.ScriptTarget.ES2020, true, ts.ScriptKind.JS);
166
+ const sites = [];
167
+ const counts = {};
168
+ const matches = new Map([...spec.functions, ...(spec.optionalFunctions ?? [])].map((name) => [name, 0]));
169
+ const declarations = new Set();
170
+ let collisions = false;
171
+ const scan = (node) => {
172
+ if (ts.isIdentifier(node)) {
173
+ if (node.text.startsWith('__ptr') || node.text === bridgeName) {
174
+ collisions = true;
175
+ }
176
+ }
177
+ if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name)) {
178
+ declarations.add(node.name.text);
179
+ }
180
+ ts.forEachChild(node, scan);
181
+ };
182
+ scan(source);
183
+ if (collisions) {
184
+ throw new Error(`Adapter identifier collision in ${file}`);
185
+ }
186
+ for (const name of spec.state ?? []) {
187
+ if (!declarations.has(name)) {
188
+ throw new Error(`Adapter drift: missing state ${file}:${name}`);
189
+ }
190
+ }
191
+ const site = (node, label, kind) => {
192
+ counts[kind] = (counts[kind] ?? 0) + 1;
193
+ const result = {
194
+ id: `${file}:${sites.length + 1}`,
195
+ file,
196
+ label,
197
+ start: node.getStart(source),
198
+ length: node.getWidth(source),
199
+ line: source.getLineAndCharacterOfPosition(node.getStart(source)).line + 1,
200
+ text: node.getText(source).slice(0, 1000),
201
+ };
202
+ sites.push(result);
203
+ return ts.factory.createStringLiteral(result.id);
204
+ };
205
+ const call = (name, args) => ts.factory.createCallExpression(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier(bridgeName), name), undefined, args);
206
+ let currentFunction = '';
207
+ let currentClass = '';
208
+ let selected = false;
209
+ let inFactory = false;
210
+ let currentOwner = 'undefined';
211
+ let parameters = [];
212
+ let factoryCount = 0;
213
+ const transform = (context) => {
214
+ const visit = (node) => {
215
+ if (ts.isClassDeclaration(node) || ts.isClassExpression(node)) {
216
+ const saved = currentClass;
217
+ currentClass = node.name?.text ?? '';
218
+ const updated = ts.visitEachChild(node, visit, context);
219
+ currentClass = saved;
220
+ return updated;
221
+ }
222
+ if (ts.isFunctionDeclaration(node) ||
223
+ ts.isFunctionExpression(node) ||
224
+ ts.isArrowFunction(node) ||
225
+ ts.isMethodDeclaration(node)) {
226
+ const name = node.name && ts.isIdentifier(node.name)
227
+ ? node.name.text
228
+ : ts.isVariableDeclaration(node.parent) && ts.isIdentifier(node.parent.name)
229
+ ? node.parent.name.text
230
+ : ts.isBinaryExpression(node.parent) && ts.isPropertyAccessExpression(node.parent.left)
231
+ ? node.parent.left.name.text
232
+ : '';
233
+ const qualified = `${currentClass}.${name}`;
234
+ const key = matches.has(qualified) ? qualified : name;
235
+ const isSelected = matches.has(key);
236
+ const isFlowAnalyzer = file === 'analyzer/codeFlowEngine.js' && name === 'createCodeFlowAnalyzer';
237
+ const isFactory = name === spec.factory || isFlowAnalyzer;
238
+ if (isSelected) {
239
+ matches.set(key, matches.get(key) + 1);
240
+ }
241
+ if (name === spec.factory) {
242
+ factoryCount++;
243
+ }
244
+ if ((isSelected || isFactory) && (!node.body || !ts.isBlock(node.body))) {
245
+ throw new Error(`Adapter drift: expected block body ${file}:${name}`);
246
+ }
247
+ if (isFactory && node.body && ts.isBlock(node.body)) {
248
+ const declared = new Set(node.body.statements.flatMap((s) => ts.isVariableStatement(s)
249
+ ? s.declarationList.declarations.flatMap((d) => ts.isIdentifier(d.name) ? [d.name.text] : [])
250
+ : []));
251
+ for (const state of isFlowAnalyzer ? ['flowNodeTypeCacheSet'] : spec.state) {
252
+ if (!declared.has(state)) {
253
+ throw new Error(`Adapter drift: ${name} does not directly declare state ${state}`);
254
+ }
255
+ }
256
+ }
257
+ if (isSelected &&
258
+ (node.parameters.some((p) => !ts.isIdentifier(p.name) || !!p.dotDotDotToken) ||
259
+ node.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword) ||
260
+ ('asteriskToken' in node && node.asteriskToken))) {
261
+ throw new Error(`Unsupported asynchronous/generator/destructured hook ${file}:${name}`);
262
+ }
263
+ const previous = { currentFunction, selected, inFactory, currentOwner, parameters };
264
+ currentFunction = name;
265
+ selected = isSelected;
266
+ inFactory = isFactory || inFactory;
267
+ parameters = node.parameters.map((p) => p.name.getText(source));
268
+ if (isFactory) {
269
+ currentOwner = `__ptrOwner_${name}`;
270
+ }
271
+ let updated = ts.visitEachChild(node, visit, context);
272
+ if ((isSelected || isFactory) && updated.body && ts.isBlock(updated.body)) {
273
+ let statements = [...updated.body.statements];
274
+ if (isFactory) {
275
+ const state = isFlowAnalyzer ? ['flowNodeTypeCacheSet'] : spec.state;
276
+ const parent = name === 'getCodeFlowEngine' ? 'evaluator' : previous.currentOwner;
277
+ statements.unshift(...parseStatements(`${bridgeName}.owner(${currentOwner}, ${JSON.stringify(name)}, () => ({${state.join(',')}}), ${parent});`));
278
+ }
279
+ if (isSelected) {
280
+ const hook = site(node, key, 'function');
281
+ const args = parameters;
282
+ const owner = currentOwner;
283
+ const receiver = ts.isMethodDeclaration(node) ? 'this' : 'undefined';
284
+ const prefix = parseStatements(`const __ptrSpan = ${bridgeName}.enter(${JSON.stringify(hook.text)}, ${owner}, ` +
285
+ `{${args.join(',')}}, ${receiver});`);
286
+ const originalBody = ts.factory.createBlock(statements, true);
287
+ const caught = ts.factory.createCatchClause('__ptrError', ts.factory.createBlock([
288
+ ts.factory.createExpressionStatement(call('thrown', [
289
+ ts.factory.createIdentifier('__ptrSpan'),
290
+ ts.factory.createIdentifier('__ptrError'),
291
+ ])),
292
+ ts.factory.createThrowStatement(ts.factory.createIdentifier('__ptrError')),
293
+ ], true));
294
+ const final = ts.factory.createBlock([
295
+ ts.factory.createExpressionStatement(call('exit', [ts.factory.createIdentifier('__ptrSpan')])),
296
+ ], true);
297
+ statements = [...prefix, ts.factory.createTryStatement(originalBody, caught, final)];
298
+ }
299
+ if (isFactory) {
300
+ statements.unshift(...parseStatements(`const ${currentOwner} = {};`));
301
+ }
302
+ const body = ts.factory.updateBlock(updated.body, statements);
303
+ if (ts.isFunctionDeclaration(updated)) {
304
+ updated = ts.factory.updateFunctionDeclaration(updated, updated.modifiers, updated.asteriskToken, updated.name, updated.typeParameters, updated.parameters, updated.type, body);
305
+ }
306
+ else if (ts.isMethodDeclaration(updated)) {
307
+ updated = ts.factory.updateMethodDeclaration(updated, updated.modifiers, updated.asteriskToken, updated.name, updated.questionToken, updated.typeParameters, updated.parameters, updated.type, body);
308
+ }
309
+ else if (ts.isArrowFunction(updated)) {
310
+ updated = ts.factory.updateArrowFunction(updated, updated.modifiers, updated.typeParameters, updated.parameters, updated.type, updated.equalsGreaterThanToken, body);
311
+ }
312
+ else if (ts.isFunctionExpression(updated)) {
313
+ updated = ts.factory.updateFunctionExpression(updated, updated.modifiers, updated.asteriskToken, updated.name, updated.typeParameters, updated.parameters, updated.type, body);
314
+ }
315
+ }
316
+ ({ currentFunction, selected, inFactory, currentOwner, parameters } = previous);
317
+ return updated;
318
+ }
319
+ if (ts.isReturnStatement(node)) {
320
+ const value = node.expression
321
+ ? ts.visitNode(node.expression, visit)
322
+ : ts.factory.createIdentifier('undefined');
323
+ if (selected) {
324
+ const result = currentFunction === 'createCodeFlowAnalyzer'
325
+ ? call('bind', [ts.factory.createIdentifier(currentOwner), value])
326
+ : value;
327
+ return ts.factory.updateReturnStatement(node, call('returned', [
328
+ ts.factory.createIdentifier('__ptrSpan'),
329
+ result,
330
+ parseExpression(`{${parameters.join(',')}}`),
331
+ site(node, currentFunction, 'return'),
332
+ ]));
333
+ }
334
+ if (currentFunction === spec.factory) {
335
+ return ts.factory.updateReturnStatement(node, call('bind', [ts.factory.createIdentifier(currentOwner), value]));
336
+ }
337
+ }
338
+ if (currentFunction === '_trial' &&
339
+ ts.isVariableStatement(node) &&
340
+ node.declarationList.declarations.some((d) => ts.isIdentifier(d.name) && d.name.text === 'evaluator')) {
341
+ counts['evaluator-link'] = (counts['evaluator-link'] ?? 0) + 1;
342
+ return [
343
+ ts.visitEachChild(node, visit, context),
344
+ ...parseStatements(`${bridgeName}.linkCurrent(evaluator);`),
345
+ ];
346
+ }
347
+ if (selected && ts.isIfStatement(node)) {
348
+ return ts.factory.updateIfStatement(node, call('branch', [
349
+ site(node.expression, currentFunction, 'branch'),
350
+ ts.visitNode(node.expression, visit),
351
+ ]), ts.visitNode(node.thenStatement, visit), ts.visitNode(node.elseStatement, visit));
352
+ }
353
+ if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression) && !node.questionDotToken) {
354
+ const receiver = node.expression.expression;
355
+ const method = node.expression.name.text;
356
+ const receiverText = receiver.getText(source);
357
+ // These names identify native state containers, not Python fixtures or
358
+ // selected source functions. The manifest reports every matched site.
359
+ if (/cache|stack|pendingNodes|closedFinallyGateNodes|incompleteEntries|candidates|_typeVarMap|_diagnostic|entriesToUndo|_activeDependentTypes|RecursionSet/i.test(receiverText) &&
360
+ ['get', 'has', 'set', 'delete', 'clear', 'add', 'push', 'pop'].includes(method) &&
361
+ !node.expression.questionDotToken) {
362
+ return ts.factory.updateCallExpression(node, call('method', [
363
+ site(node, currentFunction, 'collection'),
364
+ ts.visitNode(receiver, visit),
365
+ ts.factory.createStringLiteral(method),
366
+ ]), undefined, node.arguments.map((arg) => ts.visitNode(arg, visit)));
367
+ }
368
+ }
369
+ if ((ts.isPostfixUnaryExpression(node) || ts.isPrefixUnaryExpression(node)) &&
370
+ ts.isIdentifier(node.operand) &&
371
+ ['incompleteGenCount', 'flowIncompleteGeneration'].includes(node.operand.text)) {
372
+ return call('effect', [
373
+ site(node, node.operand.text, 'generation'),
374
+ node,
375
+ parseExpression(`{value:${node.operand.text}, domain:${JSON.stringify(node.operand.text)}}`),
376
+ ]);
377
+ }
378
+ if (ts.isBinaryExpression(node) &&
379
+ node.operatorToken.kind === ts.SyntaxKind.EqualsToken &&
380
+ ts.isPropertyAccessExpression(node.left) &&
381
+ (selected || node.left.name.text === 'inferredReturnType')) {
382
+ const receiver = node.left.expression;
383
+ if (ts.isIdentifier(receiver) ||
384
+ receiver.kind === ts.SyntaxKind.ThisKeyword ||
385
+ (ts.isPropertyAccessExpression(receiver) && ts.isIdentifier(receiver.expression))) {
386
+ return call('effect', [
387
+ site(node, currentFunction, 'field-write'),
388
+ ts.visitEachChild(node, visit, context),
389
+ ts.factory.createObjectLiteralExpression([
390
+ ts.factory.createPropertyAssignment('target', receiver),
391
+ ts.factory.createPropertyAssignment('field', ts.factory.createStringLiteral(node.left.name.text)),
392
+ ]),
393
+ ]);
394
+ }
395
+ }
396
+ return ts.visitEachChild(node, visit, context);
397
+ };
398
+ return (root) => ts.visitNode(root, visit);
399
+ };
400
+ const result = ts.transform(source, [transform]);
401
+ try {
402
+ for (const [name, count] of matches) {
403
+ counts[`function:${name}`] = count;
404
+ if (count !== 1 && !(count === 0 && spec.optionalFunctions?.includes(name))) {
405
+ throw new Error(`Adapter drift: expected one ${file}:${name}, found ${count}`);
406
+ }
407
+ }
408
+ if (spec.factory && factoryCount !== 1) {
409
+ throw new Error(`Adapter drift: expected one factory ${file}:${spec.factory}, found ${factoryCount}`);
410
+ }
411
+ for (const kind of spec.required) {
412
+ if (!counts[kind]) {
413
+ throw new Error(`Adapter drift: missing ${kind} in ${file}`);
414
+ }
415
+ }
416
+ return { code: ts.createPrinter().printFile(result.transformed[0]), sites, counts };
417
+ }
418
+ finally {
419
+ result.dispose();
420
+ }
421
+ }
422
+ //# sourceMappingURL=nativeAdapter.js.map