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

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 (199) hide show
  1. package/dist/analyzer/checker.d.ts +2 -1
  2. package/dist/analyzer/checker.js +17 -4
  3. package/dist/analyzer/checker.js.map +1 -1
  4. package/dist/analyzer/codeFlowEngine.js +9 -3
  5. package/dist/analyzer/codeFlowEngine.js.map +1 -1
  6. package/dist/analyzer/operations.js +1 -1
  7. package/dist/analyzer/operations.js.map +1 -1
  8. package/dist/analyzer/overloadResult.d.ts +15 -0
  9. package/dist/analyzer/overloadResult.js +233 -0
  10. package/dist/analyzer/overloadResult.js.map +1 -0
  11. package/dist/analyzer/overloadResultAdmission.d.ts +20 -0
  12. package/dist/analyzer/overloadResultAdmission.js +448 -0
  13. package/dist/analyzer/overloadResultAdmission.js.map +1 -0
  14. package/dist/analyzer/overloadResultController.d.ts +227 -0
  15. package/dist/analyzer/overloadResultController.js +904 -0
  16. package/dist/analyzer/overloadResultController.js.map +1 -0
  17. package/dist/analyzer/overloadResultSelector.d.ts +24 -0
  18. package/dist/analyzer/overloadResultSelector.js +131 -0
  19. package/dist/analyzer/overloadResultSelector.js.map +1 -0
  20. package/dist/analyzer/parseTreeUtils.d.ts +1 -0
  21. package/dist/analyzer/parseTreeUtils.js +4 -0
  22. package/dist/analyzer/parseTreeUtils.js.map +1 -1
  23. package/dist/analyzer/program.d.ts +13 -2
  24. package/dist/analyzer/program.js +99 -46
  25. package/dist/analyzer/program.js.map +1 -1
  26. package/dist/analyzer/protocols.d.ts +1 -0
  27. package/dist/analyzer/protocols.js +286 -6
  28. package/dist/analyzer/protocols.js.map +1 -1
  29. package/dist/analyzer/sourceFile.d.ts +6 -2
  30. package/dist/analyzer/sourceFile.js +9 -3
  31. package/dist/analyzer/sourceFile.js.map +1 -1
  32. package/dist/analyzer/tracePrinter.js +4 -0
  33. package/dist/analyzer/tracePrinter.js.map +1 -1
  34. package/dist/analyzer/typeCacheUtils.d.ts +5 -0
  35. package/dist/analyzer/typeCacheUtils.js +64 -1
  36. package/dist/analyzer/typeCacheUtils.js.map +1 -1
  37. package/dist/analyzer/typeComplexity.js +2 -0
  38. package/dist/analyzer/typeComplexity.js.map +1 -1
  39. package/dist/analyzer/typeEvaluator.d.ts +11 -2
  40. package/dist/analyzer/typeEvaluator.js +358 -21
  41. package/dist/analyzer/typeEvaluator.js.map +1 -1
  42. package/dist/analyzer/typeEvaluatorTypes.d.ts +31 -1
  43. package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
  44. package/dist/analyzer/typeGuards.d.ts +1 -1
  45. package/dist/analyzer/typePrinter.js +8 -0
  46. package/dist/analyzer/typePrinter.js.map +1 -1
  47. package/dist/analyzer/typeUtils.d.ts +1 -1
  48. package/dist/analyzer/typeUtils.js +29 -26
  49. package/dist/analyzer/typeUtils.js.map +1 -1
  50. package/dist/analyzer/typeWalker.d.ts +2 -1
  51. package/dist/analyzer/typeWalker.js +12 -0
  52. package/dist/analyzer/typeWalker.js.map +1 -1
  53. package/dist/analyzer/typedDicts.js +4 -7
  54. package/dist/analyzer/typedDicts.js.map +1 -1
  55. package/dist/analyzer/types.d.ts +16 -2
  56. package/dist/analyzer/types.js +101 -2
  57. package/dist/analyzer/types.js.map +1 -1
  58. package/dist/common/configOptions.d.ts +2 -0
  59. package/dist/common/configOptions.js +18 -0
  60. package/dist/common/configOptions.js.map +1 -1
  61. package/dist/common/envVarUtils.js +3 -3
  62. package/dist/common/envVarUtils.js.map +1 -1
  63. package/dist/languageServerBase.js +2 -2
  64. package/dist/languageServerBase.js.map +1 -1
  65. package/dist/languageService/callHierarchyProvider.js +3 -2
  66. package/dist/languageService/callHierarchyProvider.js.map +1 -1
  67. package/dist/languageService/completionProvider.js +4 -1
  68. package/dist/languageService/completionProvider.js.map +1 -1
  69. package/dist/tests/config.test.js +48 -0
  70. package/dist/tests/config.test.js.map +1 -1
  71. package/dist/tests/envVarUtils.test.js +16 -0
  72. package/dist/tests/envVarUtils.test.js.map +1 -1
  73. package/dist/tests/evaluationTrace.integration.test.d.ts +1 -0
  74. package/dist/tests/evaluationTrace.integration.test.js +266 -0
  75. package/dist/tests/evaluationTrace.integration.test.js.map +1 -0
  76. package/dist/tests/evaluationTrace.test.d.ts +1 -0
  77. package/dist/tests/evaluationTrace.test.js +422 -0
  78. package/dist/tests/evaluationTrace.test.js.map +1 -0
  79. package/dist/tests/evaluationTrace.viewer.test.d.ts +1 -0
  80. package/dist/tests/evaluationTrace.viewer.test.js +529 -0
  81. package/dist/tests/evaluationTrace.viewer.test.js.map +1 -0
  82. package/dist/tests/fourslash/showcallhierarchy.incomingCalls.aliasedFunction.fourslash.js +10 -6
  83. package/dist/tests/fourslash/showcallhierarchy.incomingCalls.aliasedFunction.fourslash.js.map +1 -1
  84. package/dist/tests/fourslash/showcallhierarchy.incomingCalls.function.fourslash.js +16 -10
  85. package/dist/tests/fourslash/showcallhierarchy.incomingCalls.function.fourslash.js.map +1 -1
  86. package/dist/tests/harness/fourslash/testState.js +10 -9
  87. package/dist/tests/harness/fourslash/testState.js.map +1 -1
  88. package/dist/tests/languageServer.test.js +129 -0
  89. package/dist/tests/languageServer.test.js.map +1 -1
  90. package/dist/tests/mypyPrimerAnalysis.test.js +1193 -47
  91. package/dist/tests/mypyPrimerAnalysis.test.js.map +1 -1
  92. package/dist/tests/mypyPrimerMcp.test.d.ts +1 -0
  93. package/dist/tests/mypyPrimerMcp.test.js +186 -0
  94. package/dist/tests/mypyPrimerMcp.test.js.map +1 -0
  95. package/dist/tests/overloadResult.test.d.ts +1 -0
  96. package/dist/tests/overloadResult.test.js +182 -0
  97. package/dist/tests/overloadResult.test.js.map +1 -0
  98. package/dist/tests/overloadResultController.test.d.ts +1 -0
  99. package/dist/tests/overloadResultController.test.js +2146 -0
  100. package/dist/tests/overloadResultController.test.js.map +1 -0
  101. package/dist/tests/protocolRequirement.test.d.ts +1 -0
  102. package/dist/tests/protocolRequirement.test.js +122 -0
  103. package/dist/tests/protocolRequirement.test.js.map +1 -0
  104. package/dist/tests/protocolRequirementAdversarial.test.d.ts +1 -0
  105. package/dist/tests/protocolRequirementAdversarial.test.js +92 -0
  106. package/dist/tests/protocolRequirementAdversarial.test.js.map +1 -0
  107. package/dist/tests/protocolRequirementBoundary.test.d.ts +1 -0
  108. package/dist/tests/protocolRequirementBoundary.test.js +119 -0
  109. package/dist/tests/protocolRequirementBoundary.test.js.map +1 -0
  110. package/dist/tests/protocolRequirementComplexity.test.d.ts +1 -0
  111. package/dist/tests/protocolRequirementComplexity.test.js +159 -0
  112. package/dist/tests/protocolRequirementComplexity.test.js.map +1 -0
  113. package/dist/tests/protocolRequirementCycles.test.d.ts +1 -0
  114. package/dist/tests/protocolRequirementCycles.test.js +160 -0
  115. package/dist/tests/protocolRequirementCycles.test.js.map +1 -0
  116. package/dist/tests/protocolRequirementGeneral.test.d.ts +1 -0
  117. package/dist/tests/protocolRequirementGeneral.test.js +120 -0
  118. package/dist/tests/protocolRequirementGeneral.test.js.map +1 -0
  119. package/dist/tests/protocolRequirementInstances.test.d.ts +1 -0
  120. package/dist/tests/protocolRequirementInstances.test.js +164 -0
  121. package/dist/tests/protocolRequirementInstances.test.js.map +1 -0
  122. package/dist/tests/protocolRequirementListStub.test.d.ts +1 -0
  123. package/dist/tests/protocolRequirementListStub.test.js +244 -0
  124. package/dist/tests/protocolRequirementListStub.test.js.map +1 -0
  125. package/dist/tests/protocolRequirementPopulated.test.d.ts +1 -0
  126. package/dist/tests/protocolRequirementPopulated.test.js +172 -0
  127. package/dist/tests/protocolRequirementPopulated.test.js.map +1 -0
  128. package/dist/tests/protocolRequirementRecursive.test.d.ts +1 -0
  129. package/dist/tests/protocolRequirementRecursive.test.js +118 -0
  130. package/dist/tests/protocolRequirementRecursive.test.js.map +1 -0
  131. package/dist/tests/protocolRequirementSpeculative.test.d.ts +1 -0
  132. package/dist/tests/protocolRequirementSpeculative.test.js +200 -0
  133. package/dist/tests/protocolRequirementSpeculative.test.js.map +1 -0
  134. package/dist/tests/protocolRequirementState.test.d.ts +1 -0
  135. package/dist/tests/protocolRequirementState.test.js +161 -0
  136. package/dist/tests/protocolRequirementState.test.js.map +1 -0
  137. package/dist/tests/testState.test.js +64 -0
  138. package/dist/tests/testState.test.js.map +1 -1
  139. package/dist/tests/testUtils.d.ts +6 -1
  140. package/dist/tests/testUtils.js +11 -6
  141. package/dist/tests/testUtils.js.map +1 -1
  142. package/dist/tests/typeCacheIsolation.test.d.ts +1 -0
  143. package/dist/tests/typeCacheIsolation.test.js +109 -0
  144. package/dist/tests/typeCacheIsolation.test.js.map +1 -0
  145. package/dist/tests/typeCacheUtils.test.js +74 -0
  146. package/dist/tests/typeCacheUtils.test.js.map +1 -1
  147. package/dist/tests/typeEvaluator1.test.js +5 -1
  148. package/dist/tests/typeEvaluator1.test.js.map +1 -1
  149. package/dist/tests/typeEvaluator4.test.js +6 -2
  150. package/dist/tests/typeEvaluator4.test.js.map +1 -1
  151. package/dist/tests/typeEvaluator5.test.js +25 -0
  152. package/dist/tests/typeEvaluator5.test.js.map +1 -1
  153. package/dist/tests/typeEvaluator6.test.js +7 -23
  154. package/dist/tests/typeEvaluator6.test.js.map +1 -1
  155. package/dist/tests/typeEvaluator7.test.js +241 -2
  156. package/dist/tests/typeEvaluator7.test.js.map +1 -1
  157. package/dist/tests/typeServer/typeServer.inProc.test.js +86 -0
  158. package/dist/tests/typeServer/typeServer.inProc.test.js.map +1 -1
  159. package/dist/tests/typeUtils.test.js +36 -0
  160. package/dist/tests/typeUtils.test.js.map +1 -1
  161. package/dist/trace/capture.d.ts +31 -0
  162. package/dist/trace/capture.js +272 -0
  163. package/dist/trace/capture.js.map +1 -0
  164. package/dist/trace/cli.d.ts +1 -0
  165. package/dist/trace/cli.js +196 -0
  166. package/dist/trace/cli.js.map +1 -0
  167. package/dist/trace/nativeAdapter.d.ts +16 -0
  168. package/dist/trace/nativeAdapter.js +418 -0
  169. package/dist/trace/nativeAdapter.js.map +1 -0
  170. package/dist/trace/nativeBridge.d.ts +46 -0
  171. package/dist/trace/nativeBridge.js +416 -0
  172. package/dist/trace/nativeBridge.js.map +1 -0
  173. package/dist/trace/reader.d.ts +83 -0
  174. package/dist/trace/reader.js +296 -0
  175. package/dist/trace/reader.js.map +1 -0
  176. package/dist/trace/recorder.d.ts +59 -0
  177. package/dist/trace/recorder.js +303 -0
  178. package/dist/trace/recorder.js.map +1 -0
  179. package/dist/trace/runtimeLoader.d.ts +23 -0
  180. package/dist/trace/runtimeLoader.js +172 -0
  181. package/dist/trace/runtimeLoader.js.map +1 -0
  182. package/dist/trace/viewerAssets.d.ts +2 -0
  183. package/dist/trace/viewerAssets.js +76 -0
  184. package/dist/trace/viewerAssets.js.map +1 -0
  185. package/dist/trace/viewerClient.d.ts +1 -0
  186. package/dist/trace/viewerClient.js +485 -0
  187. package/dist/trace/viewerClient.js.map +1 -0
  188. package/dist/trace/viewerModel.d.ts +308 -0
  189. package/dist/trace/viewerModel.js +524 -0
  190. package/dist/trace/viewerModel.js.map +1 -0
  191. package/dist/trace/viewerServer.d.ts +7 -0
  192. package/dist/trace/viewerServer.js +185 -0
  193. package/dist/trace/viewerServer.js.map +1 -0
  194. package/dist/typeServer/protocol/typeServerProtocol.d.ts +8 -2
  195. package/dist/typeServer/protocol/typeServerProtocol.js +1 -0
  196. package/dist/typeServer/protocol/typeServerProtocol.js.map +1 -1
  197. package/dist/typeServer/typeServerConversionUtils.js +9 -0
  198. package/dist/typeServer/typeServerConversionUtils.js.map +1 -1
  199. package/package.json +4 -2
@@ -48,7 +48,6 @@ var __importStar = (this && this.__importStar) || (function () {
48
48
  };
49
49
  })();
50
50
  Object.defineProperty(exports, "__esModule", { value: true });
51
- exports.maxCodeComplexity = void 0;
52
51
  exports.createTypeEvaluator = createTypeEvaluator;
53
52
  const cancellationUtils_1 = require("../common/cancellationUtils");
54
53
  const collectionUtils_1 = require("../common/collectionUtils");
@@ -98,6 +97,7 @@ const typeGuards_1 = require("./typeGuards");
98
97
  const TypePrinter = __importStar(require("./typePrinter"));
99
98
  const types_1 = require("./types");
100
99
  const typeUtils_1 = require("./typeUtils");
100
+ const overloadResultSelector_1 = require("./overloadResultSelector");
101
101
  // This table contains the names of several built-in types that
102
102
  // are not subscriptable at runtime on older versions of Python.
103
103
  // It lists the first version of Python where subscripting is
@@ -190,13 +190,11 @@ const maxTypedDeclsPerSymbol = 16;
190
190
  const verifyTypeCacheEvaluatorFlags = false;
191
191
  // This debugging option prints each expression and its evaluated type.
192
192
  const printExpressionTypes = false;
193
- // The following number is chosen somewhat arbitrarily. We need to cut
194
- // off code flow analysis at some point for code flow graphs that are too
195
- // complex. Otherwise we risk overflowing the stack or incurring extremely
196
- // long analysis times. This number has been tuned empirically.
197
- exports.maxCodeComplexity = 768;
198
193
  function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
199
194
  const nodeInfo = AnalyzerNodeInfo.createAnalyzerNodeInfoAccessor(evaluatorOptions.nodeInfoReader);
195
+ const maxCodeComplexity = evaluatorOptions.maxCodeComplexity;
196
+ const operationController = evaluatorOptions.experimentalOverloadResult ?? evaluatorOptions.testOnlyExpression;
197
+ let operationRouter = evaluatorOptions.experimentalOverloadResult?.isAutomatic ? undefined : operationController;
200
198
  const symbolResolutionStack = [];
201
199
  const speculativeTypeTracker = new typeCacheUtils_1.SpeculativeTypeTracker();
202
200
  const suppressedNodeStack = [];
@@ -267,6 +265,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
267
265
  // circular references in complex data structures, so it fails
268
266
  // to clean up the objects if we don't help it out.
269
267
  function disposeEvaluator() {
268
+ operationController?.dispose?.();
270
269
  functionRecursionMap = new Map();
271
270
  codeFlowAnalyzerCache = new Map();
272
271
  typeCache = new Map();
@@ -292,9 +291,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
292
291
  return typeFormTypeCache;
293
292
  }
294
293
  function readTypeFormTypeCacheEntry(node, expectedType) {
295
- return getTypeFormTypeCache(node)
296
- .get(node.id)
297
- ?.find((entry) => (0, typeCacheUtils_1.contextualTypeCacheEntryMatches)(entry, expectedType));
294
+ return (0, typeCacheUtils_1.findContextualTypeCacheEntry)(getTypeFormTypeCache(node).get(node.id), expectedType);
298
295
  }
299
296
  // Contextual reads consult expectedTypeCache and prefer a matching TypeForm result.
300
297
  // Runtime-only consumers must use readTypeCacheEntry so this precedence is not
@@ -399,6 +396,9 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
399
396
  function setTypeResultForNode(node, typeResult, flags = 0 /* EvalFlags.None */) {
400
397
  writeTypeCache(node, typeResult, flags);
401
398
  }
399
+ function getMaxCodeComplexity() {
400
+ return maxCodeComplexity;
401
+ }
402
402
  function setAsymmetricDescriptorAssignment(node) {
403
403
  if (isSpeculativeModeInUse(/* node */ undefined)) {
404
404
  return;
@@ -470,10 +470,40 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
470
470
  }
471
471
  return undefined;
472
472
  }
473
+ function finishOverloadActivation() {
474
+ if (!returnTypeInferenceTypeCache && !isSpeculativeModeInUse(undefined)) {
475
+ try {
476
+ evaluatorOptions.experimentalOverloadResult.finishActivation();
477
+ }
478
+ finally {
479
+ // Install routing before an activation restart re-enters evaluation.
480
+ if (evaluatorOptions.experimentalOverloadResult.roots.size) {
481
+ operationRouter = operationController;
482
+ }
483
+ }
484
+ }
485
+ }
486
+ function runWithOverloadActivation(callback) {
487
+ return evaluatorOptions.experimentalOverloadResult.runWithActivation(() => {
488
+ const result = callback();
489
+ if (evaluatorOptions.experimentalOverloadResult.hasPendingActivation) {
490
+ finishOverloadActivation();
491
+ }
492
+ return result;
493
+ });
494
+ }
473
495
  // Determines the type of the specified node by evaluating it in
474
496
  // context, logging any errors in the process. This may require the
475
497
  // type of surrounding statements to be evaluated.
476
498
  function getType(node) {
499
+ if (evaluatorOptions.experimentalOverloadResult?.needsActivationBoundary()) {
500
+ return runWithOverloadActivation(() => getType(node));
501
+ }
502
+ const canonical = operationRouter?.route?.({ kind: 'query', node })?.result ??
503
+ evaluatorOptions.testOnlyExpression?.query?.(node);
504
+ if (canonical) {
505
+ return canonical.type;
506
+ }
477
507
  initializePrefetchedTypes(node);
478
508
  let type = evaluateContextualTypeForSubnode(node, () => {
479
509
  evaluateTypesForExpressionInContext(node);
@@ -512,6 +542,14 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
512
542
  return type;
513
543
  }
514
544
  function getTypeResult(node) {
545
+ if (evaluatorOptions.experimentalOverloadResult?.needsActivationBoundary()) {
546
+ return runWithOverloadActivation(() => getTypeResult(node));
547
+ }
548
+ const canonical = operationRouter?.route?.({ kind: 'query', node })?.result ??
549
+ evaluatorOptions.testOnlyExpression?.query?.(node);
550
+ if (canonical) {
551
+ return canonical;
552
+ }
515
553
  return evaluateContextualTypeForSubnode(node, () => {
516
554
  evaluateTypesForExpressionInContext(node);
517
555
  });
@@ -647,6 +685,9 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
647
685
  }
648
686
  }
649
687
  function getTypeOfExpression(node, flags = 0 /* EvalFlags.None */, inferenceContext) {
688
+ if (evaluatorOptions.experimentalOverloadResult?.needsActivationBoundary()) {
689
+ return runWithOverloadActivation(() => getTypeOfExpression(node, flags, inferenceContext));
690
+ }
650
691
  let useTypeFormCache = (flags & 1073741824 /* EvalFlags.TypeFormArg */) !== 0;
651
692
  if (inferenceContext) {
652
693
  inferenceContext.expectedType = (0, typeUtils_1.transformPossibleRecursiveTypeAlias)(inferenceContext.expectedType);
@@ -658,6 +699,15 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
658
699
  if ((flags & 1073741824 /* EvalFlags.TypeFormArg */) !== 0 && (flags & 33554432 /* EvalFlags.NoConvertSpecialForm */) === 0) {
659
700
  flags |= 32 /* EvalFlags.NoParamSpec */ | 64 /* EvalFlags.NoTypeVarTuple */;
660
701
  }
702
+ const testResult = operationRouter?.route?.({
703
+ kind: 'expression',
704
+ node,
705
+ flags,
706
+ context: inferenceContext,
707
+ })?.result ?? operationRouter?.dispatch(node, flags, inferenceContext);
708
+ if (testResult) {
709
+ return testResult;
710
+ }
661
711
  // Is this type already cached?
662
712
  const cacheEntry = useTypeFormCache
663
713
  ? readTypeFormTypeCacheEntry(node, inferenceContext?.expectedType)
@@ -697,6 +747,12 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
697
747
  // at that point.
698
748
  initializePrefetchedTypes(node);
699
749
  let typeResult = getTypeOfExpressionCore(node, flags, inferenceContext);
750
+ if (evaluatorOptions.experimentalOverloadResult?.hasPendingActivation) {
751
+ finishOverloadActivation();
752
+ }
753
+ if (operationRouter) {
754
+ typeResult = operationRouter.project(node, typeResult);
755
+ }
700
756
  // Should we disable type promotions for bytes?
701
757
  if ((0, types_1.isInstantiableClass)(typeResult.type) &&
702
758
  typeResult.type.priv.includePromotions &&
@@ -1346,6 +1402,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
1346
1402
  }
1347
1403
  recursionCount++;
1348
1404
  switch (type.category) {
1405
+ case 10 /* TypeCategory.OverloadResult */:
1406
+ return true;
1349
1407
  case 0 /* TypeCategory.Unbound */:
1350
1408
  case 1 /* TypeCategory.Unknown */:
1351
1409
  case 2 /* TypeCategory.Any */:
@@ -1444,6 +1502,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
1444
1502
  }
1445
1503
  recursionCount++;
1446
1504
  switch (type.category) {
1505
+ case 10 /* TypeCategory.OverloadResult */:
1506
+ return true;
1447
1507
  case 1 /* TypeCategory.Unknown */:
1448
1508
  case 4 /* TypeCategory.Function */:
1449
1509
  case 5 /* TypeCategory.Overloaded */:
@@ -2431,6 +2491,10 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
2431
2491
  }
2432
2492
  return undefined;
2433
2493
  }
2494
+ function getFunctionClassType(type) {
2495
+ const classType = (0, types_1.isMethodType)(type) ? prefetched?.methodClass : prefetched?.functionClass;
2496
+ return classType && (0, types_1.isInstantiableClass)(classType) ? classType : undefined;
2497
+ }
2434
2498
  function getTypingType(node, symbolName) {
2435
2499
  return (getTypeOfModule(node, symbolName, ['typing']) ?? getTypeOfModule(node, symbolName, ['typing_extensions']));
2436
2500
  }
@@ -2458,7 +2522,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
2458
2522
  function checkCodeFlowTooComplex(node) {
2459
2523
  const scopeNode = node.nodeType === 31 /* ParseNodeType.Function */ ? node : ParseTreeUtils.getExecutionScopeNode(node, nodeInfo);
2460
2524
  const codeComplexity = nodeInfo.getCodeFlowComplexity(scopeNode);
2461
- if (codeComplexity > exports.maxCodeComplexity) {
2525
+ if (codeComplexity > maxCodeComplexity) {
2462
2526
  let errorRange = scopeNode;
2463
2527
  if (scopeNode.nodeType === 31 /* ParseNodeType.Function */) {
2464
2528
  errorRange = scopeNode.d.name;
@@ -2575,7 +2639,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
2575
2639
  }
2576
2640
  if (isNodeReachable(node)) {
2577
2641
  const fileInfo = nodeInfo.getFileInfo(node);
2578
- return fileInfo.diagnosticSink.addDiagnosticWithTextRange(diagLevel, message, range ?? node);
2642
+ const sink = evaluatorOptions.experimentalOverloadResult?.getDiagnosticSink(node) ?? fileInfo.diagnosticSink;
2643
+ return sink.addDiagnosticWithTextRange(diagLevel, message, range ?? node);
2579
2644
  }
2580
2645
  return undefined;
2581
2646
  }
@@ -3532,7 +3597,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
3532
3597
  }
3533
3598
  else {
3534
3599
  // Handle the special case of "reveal_type" and "reveal_locals".
3535
- if (name === 'reveal_type' || name === 'reveal_locals') {
3600
+ if (ParseTreeUtils.isImplicitRevealTypeName(node) || name === 'reveal_locals') {
3536
3601
  type = types_1.AnyType.create();
3537
3602
  }
3538
3603
  else {
@@ -4436,6 +4501,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
4436
4501
  }
4437
4502
  break;
4438
4503
  }
4504
+ case 10 /* TypeCategory.OverloadResult */:
4505
+ throw new Error('Overload-result member dispatch is not enabled');
4439
4506
  default:
4440
4507
  (0, debug_1.assertNever)(baseType);
4441
4508
  }
@@ -6283,6 +6350,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
6283
6350
  else {
6284
6351
  baseTypeResult = getTypeOfExpression(node.d.leftExpr, 2 /* EvalFlags.CallBaseDefaults */ | (flags & 4 /* EvalFlags.ForwardRefs */));
6285
6352
  }
6353
+ operationRouter?.beforeCall(node);
6286
6354
  const argList = ParseTreeUtils.getArgsByRuntimeOrder(node).map((arg) => {
6287
6355
  const functionArg = {
6288
6356
  valueExpression: arg.d.valueExpr,
@@ -6300,8 +6368,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
6300
6368
  typeResult = getTypeOfSuperCall(node);
6301
6369
  }
6302
6370
  else if ((0, types_1.isAnyOrUnknown)(baseTypeResult.type) &&
6303
- node.d.leftExpr.nodeType === 38 /* ParseNodeType.Name */ &&
6304
- node.d.leftExpr.d.value === 'reveal_type') {
6371
+ ParseTreeUtils.isImplicitRevealTypeName(node.d.leftExpr)) {
6305
6372
  // Handle the implicit "reveal_type" call.
6306
6373
  typeResult = getTypeOfRevealType(node, inferenceContext);
6307
6374
  }
@@ -7062,6 +7129,20 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
7062
7129
  isTypeIncomplete = true;
7063
7130
  }
7064
7131
  if (!callResult.argumentErrors && callResult.returnType) {
7132
+ if (evaluatorOptions.experimentalOverloadResult &&
7133
+ !callResult.isTypeIncomplete &&
7134
+ !overload.priv.boundToType &&
7135
+ !overload.shared.methodClass &&
7136
+ !overload.shared.declaration?.isMethod &&
7137
+ errorNode.nodeType === 9 /* ParseNodeType.Call */ &&
7138
+ errorNode.d.leftExpr.nodeType === 38 /* ParseNodeType.Name */ &&
7139
+ errorNode.parent?.nodeType === 3 /* ParseNodeType.Assignment */ &&
7140
+ errorNode.parent.d.rightExpr === errorNode &&
7141
+ expandedArgTypes.length === 1 &&
7142
+ !hasArgTypeOverride &&
7143
+ callResult.argResults) {
7144
+ evaluatorOptions.experimentalOverloadResult.considerActivation(errorNode, callResult.argResults);
7145
+ }
7065
7146
  overloadsUsedForCall.push(overload);
7066
7147
  matchedOverload = overload;
7067
7148
  const matchedOverloadInfo = {
@@ -7280,6 +7361,115 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
7280
7361
  });
7281
7362
  return winningOverloadIndex === undefined ? undefined : matches[winningOverloadIndex].overload;
7282
7363
  }
7364
+ function selectAutomaticOverloadResult(node, limit, proofUnits) {
7365
+ const budget = new overloadResultSelector_1.OverloadSelectionBudget(proofUnits);
7366
+ const coverage = [];
7367
+ const matches = [];
7368
+ const decline = (reason) => ({
7369
+ candidates: [],
7370
+ reason: budget.exceeded ? 'proof-limit' : reason,
7371
+ coverage,
7372
+ matches,
7373
+ units: budget.used,
7374
+ });
7375
+ return useSpeculativeMode(node, () => {
7376
+ const callee = getTypeOfExpression(node.d.leftExpr, 2 /* EvalFlags.NoSpecialize */);
7377
+ if (callee.isIncomplete || callee.typeErrors || !(0, types_1.isOverloaded)(callee.type)) {
7378
+ return decline('not-complete-overloaded-function');
7379
+ }
7380
+ const overloads = types_1.OverloadedType.getOverloads(callee.type);
7381
+ if (overloads.length > limit) {
7382
+ return decline('candidate-limit');
7383
+ }
7384
+ const args = node.d.args.map((arg) => ({
7385
+ argCategory: arg.d.argCategory,
7386
+ valueExpression: arg.d.valueExpr,
7387
+ node: arg,
7388
+ name: arg.d.name,
7389
+ }));
7390
+ const sources = node.d.args.map((arg) => getTypeOfExpression(arg.d.valueExpr));
7391
+ if (sources.some((s) => s.isIncomplete || s.typeErrors || (0, types_1.isAny)(s.type) || !(0, overloadResultSelector_1.isFixedOverloadArgumentShape)(s.type, budget))) {
7392
+ return decline('unsupported-argument-shape');
7393
+ }
7394
+ if (!sources.some((s) => (0, overloadResultSelector_1.hasNestedOverloadAny)(s.type))) {
7395
+ return decline('no-invariant-any');
7396
+ }
7397
+ const returns = [];
7398
+ for (let index = 0; index < overloads.length; index++) {
7399
+ checkForCancellation();
7400
+ const overload = overloads[index];
7401
+ const declaration = overload.shared.declaration;
7402
+ const declaredReturnType = overload.shared.declaredReturnType;
7403
+ const returnType = types_1.FunctionType.getEffectiveReturnType(overload);
7404
+ if (!declaration ||
7405
+ declaration.isMethod ||
7406
+ overload.shared.methodClass ||
7407
+ overload.priv.boundToType ||
7408
+ overload.shared.typeParams.length ||
7409
+ !declaredReturnType ||
7410
+ !returnType ||
7411
+ declaration.node.d.decorators.length !== 1 ||
7412
+ overload.shared.parameters.some((p, i) => p.category !== 0 /* ParamCategory.Simple */ ||
7413
+ !p.name ||
7414
+ p.defaultExpr ||
7415
+ types_1.FunctionType.getParamDefaultType(overload, i))) {
7416
+ return decline('unsupported-signature');
7417
+ }
7418
+ if (!(0, overloadResultSelector_1.isFixedOverloadReturnShape)(declaredReturnType, budget) ||
7419
+ (returnType !== declaredReturnType && !(0, overloadResultSelector_1.isFixedOverloadReturnShape)(returnType, budget))) {
7420
+ return decline('unsupported-return-shape');
7421
+ }
7422
+ const mapping = matchArgsToParams(node, args, { type: overload, isIncomplete: false }, index);
7423
+ if (mapping.isTypeIncomplete) {
7424
+ return decline('incomplete-mapping');
7425
+ }
7426
+ if (mapping.argumentErrors) {
7427
+ continue;
7428
+ }
7429
+ if (mapping.argParams.length !== args.length ||
7430
+ mapping.argParams.some((p, i) => p.argument !== args[i] ||
7431
+ p.isDefaultArg ||
7432
+ p.requiresTypeVarMatching ||
7433
+ !(0, overloadResultSelector_1.isFixedOverloadArgumentShape)(p.paramType, budget))) {
7434
+ return decline('unsupported-mapping');
7435
+ }
7436
+ // This is the ordinary matcher and solver, not a parallel
7437
+ // assignability algorithm. Only complete successful matches count.
7438
+ const matched = useSpeculativeMode(node, () => validateArgTypesWithContext(node, mapping, new constraintTracker_1.ConstraintTracker(), true, undefined));
7439
+ if (matched.isTypeIncomplete || !matched.returnType) {
7440
+ return decline('incomplete-solution');
7441
+ }
7442
+ if (!(0, overloadResultSelector_1.isFixedOverloadReturnShape)(matched.returnType, budget)) {
7443
+ return decline('unsupported-solved-return-shape');
7444
+ }
7445
+ if (matched.argumentErrors) {
7446
+ continue;
7447
+ }
7448
+ const proof = mapping.argParams.map((p, i) => (0, overloadResultSelector_1.getFixedOverloadCoverage)(sources[i].type, p.paramType, budget));
7449
+ const covered = proof.includes('unsupported')
7450
+ ? 'unsupported'
7451
+ : proof.includes('not-covered')
7452
+ ? 'not-covered'
7453
+ : 'covered';
7454
+ coverage.push(covered);
7455
+ matches.push(index);
7456
+ if (covered === 'unsupported') {
7457
+ return decline('unsupported-coverage');
7458
+ }
7459
+ if (!returns.some((type) => (0, types_1.isTypeSame)(type, matched.returnType))) {
7460
+ returns.push(matched.returnType);
7461
+ }
7462
+ // A covering overload ends the retained prefix; earlier
7463
+ // non-covering matches remain live alternatives.
7464
+ if (covered === 'covered') {
7465
+ break;
7466
+ }
7467
+ }
7468
+ return returns.length > 1
7469
+ ? { candidates: returns, reason: 'selected', coverage, matches, units: budget.used }
7470
+ : decline('equivalent-or-single-return');
7471
+ });
7472
+ }
7283
7473
  function validateOverloadedArgTypes(errorNode, argList, typeResult, constraints, skipUnknownArgCheck, inferenceContext) {
7284
7474
  const filteredMatchResults = [];
7285
7475
  let contextFreeArgTypes;
@@ -12155,8 +12345,9 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
12155
12345
  }
12156
12346
  // Validate that we received at least two type arguments. One type argument
12157
12347
  // is allowed if it's an unpacked TypeVarTuple or tuple. None is also allowed
12158
- // since it is used to define NoReturn in typeshed stubs).
12159
- if (types.length === 1 && !allowSingleTypeArg && !(0, typeUtils_1.isNoneInstance)(types[0])) {
12348
+ // since it is used to define NoReturn in typeshed stubs). No type arguments,
12349
+ // as in "Union[()]", is a runtime error.
12350
+ if (types.length === 0 || (types.length === 1 && !allowSingleTypeArg && !(0, typeUtils_1.isNoneInstance)(types[0]))) {
12160
12351
  if ((flags & (256 /* EvalFlags.TypeExpression */ | 1073741824 /* EvalFlags.TypeFormArg */)) !== 0) {
12161
12352
  addDiagnostic(diagnosticRules_1.DiagnosticRule.reportInvalidTypeArguments, localize_1.LocMessage.unionTypeArgCount(), errorNode);
12162
12353
  }
@@ -12509,6 +12700,13 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
12509
12700
  }
12510
12701
  }
12511
12702
  function evaluateTypesForAssignmentStatement(node) {
12703
+ if (operationRouter?.route?.({
12704
+ kind: 'statement',
12705
+ node,
12706
+ evaluate: () => evaluateTypesForAssignmentStatement(node),
12707
+ })) {
12708
+ return;
12709
+ }
12512
12710
  const fileInfo = nodeInfo.getFileInfo(node);
12513
12711
  // If the entire statement has already been evaluated, don't
12514
12712
  // re-evaluate it.
@@ -14647,7 +14845,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
14647
14845
  return exceptionType;
14648
14846
  }
14649
14847
  if ((0, types_1.isInstantiableClass)(exceptionType)) {
14650
- if (types_1.ClassType.isBuiltIn(exceptionType, 'BaseException')) {
14848
+ if ((0, typeUtils_1.derivesFromStdlibClass)(exceptionType, 'BaseException') &&
14849
+ !(0, typeUtils_1.derivesFromStdlibClass)(exceptionType, 'Exception')) {
14651
14850
  includesBaseException = true;
14652
14851
  }
14653
14852
  return types_1.ClassType.cloneAsInstance(exceptionType);
@@ -15369,6 +15568,9 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
15369
15568
  // be evaluated to provide sufficient context for the type. Evaluated types
15370
15569
  // are written back to the type cache for later retrieval.
15371
15570
  function evaluateTypesForStatement(node) {
15571
+ if (evaluatorOptions.experimentalOverloadResult?.needsActivationBoundary()) {
15572
+ return runWithOverloadActivation(() => evaluateTypesForStatement(node));
15573
+ }
15372
15574
  initializePrefetchedTypes(node);
15373
15575
  let curNode = node;
15374
15576
  while (curNode) {
@@ -16183,8 +16385,13 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
16183
16385
  }
16184
16386
  // PEP 563 indicates that if a forward reference can be resolved in the module
16185
16387
  // scope (or, by implication, in the builtins scope), it should prefer that
16186
- // resolution over local resolutions.
16187
- if (symbolWithScope && preferGlobalScope) {
16388
+ // resolution over local resolutions. This doesn't apply to a PEP 695 "type"
16389
+ // statement's target, which binds synchronously in the scope where it appears
16390
+ // (including a class scope) rather than being deferred like other annotations.
16391
+ const isTypeAliasStatementTarget = symbolWithScope?.symbol
16392
+ .getDeclarations()
16393
+ .some((decl) => decl.type === 4 /* DeclarationType.TypeAlias */);
16394
+ if (symbolWithScope && preferGlobalScope && !isTypeAliasStatementTarget) {
16188
16395
  let curSymbolWithScope = symbolWithScope;
16189
16396
  while (curSymbolWithScope.scope.type !== 4 /* ScopeType.Module */ &&
16190
16397
  curSymbolWithScope.scope.type !== 5 /* ScopeType.Builtin */ &&
@@ -19321,6 +19528,26 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
19321
19528
  /* diag */ undefined,
19322
19529
  /* constraints */ undefined, 0 /* AssignTypeFlags.Default */, recursionCount));
19323
19530
  }
19531
+ // Types like "bytes", "bytearray" and "memoryview" support cross-type
19532
+ // content comparisons via "==" and "!=", even though they're otherwise
19533
+ // unrelated (non-overlapping) types. Use derivesFromStdlibClass to check
19534
+ // membership in this group across the MRO.
19535
+ function isBytesLikeType(type) {
19536
+ return ((0, typeUtils_1.derivesFromStdlibClass)(type, 'bytes') ||
19537
+ (0, typeUtils_1.derivesFromStdlibClass)(type, 'bytearray') ||
19538
+ (0, typeUtils_1.derivesFromStdlibClass)(type, 'memoryview'));
19539
+ }
19540
+ // Determines whether the two types are both members of the "bytes-like"
19541
+ // group of types ("bytes", "bytearray" and "memoryview"). Pyright models
19542
+ // this relationship as a "type promotion" (used elsewhere for
19543
+ // assignability), but that grouping is also useful for determining
19544
+ // whether two otherwise-disjoint built-in types can be compared with
19545
+ // "==" or "!=", since these types share compatible "__eq__" semantics
19546
+ // regardless of whether the "disableBytesTypePromotions" setting allows
19547
+ // the assignment.
19548
+ function isTypePromotionRelated(leftType, rightType) {
19549
+ return isBytesLikeType(leftType) && isBytesLikeType(rightType);
19550
+ }
19324
19551
  // Determines whether the two types are potentially comparable -- i.e.
19325
19552
  // their types overlap in such a way that it makes sense for them to
19326
19553
  // be compared with an == or != operator. The functional also supports
@@ -19411,6 +19638,14 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
19411
19638
  }
19412
19639
  return boolVal === (intVal === 1);
19413
19640
  }
19641
+ // Distinct bytes-like classes support cross-type equality regardless
19642
+ // of disableBytesTypePromotions. Don't apply this to the same class:
19643
+ // different bytes literals must remain disjoint.
19644
+ if (!assumeIsOperator &&
19645
+ !types_1.ClassType.isSameGenericClass(leftType, rightType) &&
19646
+ isTypePromotionRelated(leftType, rightType)) {
19647
+ return true;
19648
+ }
19414
19649
  return false;
19415
19650
  }
19416
19651
  }
@@ -19901,8 +20136,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
19901
20136
  destParamDetails.firstPositionOrKeywordIndex < srcParamDetails.positionOnlyParamCount &&
19902
20137
  !targetIncludesParamSpec) {
19903
20138
  diag?.createAddendum().addMessage(localize_1.LocAddendum.argsPositionOnly().format({
19904
- expected: srcParamDetails.positionOnlyParamCount,
19905
- received: destParamDetails.firstPositionOrKeywordIndex,
20139
+ expected: destParamDetails.firstPositionOrKeywordIndex,
20140
+ received: srcParamDetails.positionOnlyParamCount,
19906
20141
  }));
19907
20142
  canAssign = false;
19908
20143
  }
@@ -21400,6 +21635,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
21400
21635
  getNoneType,
21401
21636
  getUnionClassType,
21402
21637
  getTypeClassType,
21638
+ getFunctionClassType,
21403
21639
  getBuiltInObject,
21404
21640
  getTypingType,
21405
21641
  getTypeCheckerInternalsType,
@@ -21423,10 +21659,111 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
21423
21659
  useSpeculativeMode,
21424
21660
  isSpeculativeModeInUse,
21425
21661
  setTypeResultForNode,
21662
+ getMaxCodeComplexity,
21426
21663
  checkForCancellation,
21427
21664
  printControlFlowGraph,
21428
21665
  };
21429
21666
  const codeFlowEngine = (0, codeFlowEngine_1.getCodeFlowEngine)(evaluatorInterface, speculativeTypeTracker, nodeInfo);
21667
+ if (evaluatorOptions.testOnlyMemberAccess) {
21668
+ const { nodes, install } = evaluatorOptions.testOnlyMemberAccess;
21669
+ install((node, baseTypeResult) => {
21670
+ (0, debug_1.assert)(nodes.has(node));
21671
+ return getTypeOfMemberAccessWithBaseType(node, baseTypeResult, { method: 'get' }, 2 /* EvalFlags.NoSpecialize */);
21672
+ });
21673
+ }
21674
+ evaluatorOptions.experimentalOverloadResult?.installSelector(selectAutomaticOverloadResult);
21675
+ evaluatorOptions.experimentalOverloadResult?.installActivationBoundary(() => !returnTypeInferenceTypeCache && !isSpeculativeModeInUse(undefined), finishOverloadActivation);
21676
+ evaluatorOptions.experimentalOverloadResult?.installCheckerHandoff((root, expression, result, callback) => {
21677
+ const ids = evaluatorOptions.experimentalOverloadResult.roots.get(root);
21678
+ const isComplete = (value) => !value.isIncomplete &&
21679
+ !value.typeErrors &&
21680
+ !((0, types_1.isFunction)(value.type) && types_1.FunctionType.isPartiallyEvaluated(value.type)) &&
21681
+ !((0, types_1.isClass)(value.type) && types_1.ClassType.isPartiallyEvaluated(value.type));
21682
+ if (!ids ||
21683
+ returnTypeInferenceTypeCache ||
21684
+ isSpeculativeModeInUse(undefined) ||
21685
+ typeCache.get(expression.id)?.typeResult !== result ||
21686
+ typeCache.get(expression.id)?.flags !== 0 /* EvalFlags.None */ ||
21687
+ !isComplete(result)) {
21688
+ return false;
21689
+ }
21690
+ for (const id of ids) {
21691
+ const entry = typeCache.get(id);
21692
+ if ((entry && !isComplete(entry.typeResult)) || typeFormTypeCache.has(id)) {
21693
+ return false;
21694
+ }
21695
+ }
21696
+ // Continue synchronously before this candidate's isolation unwinds. No
21697
+ // saved cache set or result is restored, and the checker reads live entries.
21698
+ checkForCancellation();
21699
+ callback();
21700
+ return true;
21701
+ });
21702
+ evaluatorOptions.experimentalOverloadResult?.installQueryCache((root, node) => {
21703
+ const roots = evaluatorOptions.experimentalOverloadResult.roots;
21704
+ const ids = roots.get(root);
21705
+ const isOrdinaryContext = () => !returnTypeInferenceTypeCache && !isSpeculativeModeInUse(undefined);
21706
+ if (!ids || !isOrdinaryContext()) {
21707
+ return undefined;
21708
+ }
21709
+ const isComplete = (result) => !result.isIncomplete &&
21710
+ !((0, types_1.isFunction)(result.type) && types_1.FunctionType.isPartiallyEvaluated(result.type)) &&
21711
+ !((0, types_1.isClass)(result.type) && types_1.ClassType.isPartiallyEvaluated(result.type));
21712
+ const queryEntry = readContextualTypeCacheEntryForNode(node);
21713
+ if (!queryEntry || !isComplete(queryEntry.typeResult)) {
21714
+ return undefined;
21715
+ }
21716
+ const entries = [...ids].map((id) => ({
21717
+ id,
21718
+ runtime: typeCache.get(id),
21719
+ expected: expectedTypeCache.get(id),
21720
+ typeForm: typeFormTypeCache.get(id),
21721
+ }));
21722
+ const areComplete = () => entries.every((entry) => (!entry.runtime || isComplete(entry.runtime.typeResult)) &&
21723
+ (!entry.typeForm || entry.typeForm.every((e) => isComplete(e.typeResult))));
21724
+ if (!areComplete()) {
21725
+ return undefined;
21726
+ }
21727
+ // This is a validity guard, not a saved public answer. Reuse only while
21728
+ // the complete, privately restored cache set is still installed.
21729
+ return () => {
21730
+ const valid = isOrdinaryContext() &&
21731
+ roots.get(root) === ids &&
21732
+ readContextualTypeCacheEntryForNode(node) === queryEntry &&
21733
+ areComplete() &&
21734
+ entries.every((entry) => typeCache.get(entry.id) === entry.runtime &&
21735
+ expectedTypeCache.get(entry.id) === entry.expected &&
21736
+ typeFormTypeCache.get(entry.id) === entry.typeForm);
21737
+ if (valid) {
21738
+ checkForCancellation();
21739
+ }
21740
+ return valid;
21741
+ };
21742
+ });
21743
+ if (operationController) {
21744
+ const { roots } = operationController;
21745
+ operationController.installCacheIsolation({
21746
+ evict(root) {
21747
+ const ids = roots.get(root);
21748
+ (0, debug_1.assert)(ids && ids.size <= 256);
21749
+ (0, debug_1.assert)(!returnTypeInferenceTypeCache && !isSpeculativeModeInUse(undefined));
21750
+ ids.forEach((id) => {
21751
+ typeCache.delete(id);
21752
+ expectedTypeCache.delete(id);
21753
+ typeFormTypeCache.delete(id);
21754
+ });
21755
+ speculativeTypeTracker.evictCacheEntries(ids);
21756
+ },
21757
+ isolate(root, callback, retain = false) {
21758
+ const ids = roots.get(root);
21759
+ (0, debug_1.assert)(ids && ids.size <= 256);
21760
+ // Native argument speculation can query earlier, disjoint operations
21761
+ // through code flow. Never isolate a root that overlaps that context.
21762
+ (0, debug_1.assert)(!returnTypeInferenceTypeCache && speculativeTypeTracker.canUseNodeCacheIsolation(root));
21763
+ return (0, typeCacheUtils_1.useNodeCacheIsolation)(typeCache, ids, () => (0, typeCacheUtils_1.useNodeCacheIsolation)(expectedTypeCache, ids, () => (0, typeCacheUtils_1.useNodeCacheIsolation)(typeFormTypeCache, ids, () => speculativeTypeTracker.useNodeCacheIsolation(ids, callback, root), retain), retain), retain);
21764
+ },
21765
+ });
21766
+ }
21430
21767
  return evaluatorInterface;
21431
21768
  }
21432
21769
  //# sourceMappingURL=typeEvaluator.js.map