@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.
- package/dist/analyzer/checker.d.ts +2 -1
- package/dist/analyzer/checker.js +17 -4
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/codeFlowEngine.js +9 -3
- package/dist/analyzer/codeFlowEngine.js.map +1 -1
- package/dist/analyzer/operations.js +1 -1
- package/dist/analyzer/operations.js.map +1 -1
- package/dist/analyzer/overloadResult.d.ts +15 -0
- package/dist/analyzer/overloadResult.js +233 -0
- package/dist/analyzer/overloadResult.js.map +1 -0
- package/dist/analyzer/overloadResultAdmission.d.ts +20 -0
- package/dist/analyzer/overloadResultAdmission.js +448 -0
- package/dist/analyzer/overloadResultAdmission.js.map +1 -0
- package/dist/analyzer/overloadResultController.d.ts +227 -0
- package/dist/analyzer/overloadResultController.js +904 -0
- package/dist/analyzer/overloadResultController.js.map +1 -0
- package/dist/analyzer/overloadResultSelector.d.ts +24 -0
- package/dist/analyzer/overloadResultSelector.js +131 -0
- package/dist/analyzer/overloadResultSelector.js.map +1 -0
- package/dist/analyzer/parseTreeUtils.d.ts +1 -0
- package/dist/analyzer/parseTreeUtils.js +4 -0
- package/dist/analyzer/parseTreeUtils.js.map +1 -1
- package/dist/analyzer/program.d.ts +13 -2
- package/dist/analyzer/program.js +99 -46
- package/dist/analyzer/program.js.map +1 -1
- package/dist/analyzer/protocols.d.ts +1 -0
- package/dist/analyzer/protocols.js +286 -6
- package/dist/analyzer/protocols.js.map +1 -1
- package/dist/analyzer/sourceFile.d.ts +6 -2
- package/dist/analyzer/sourceFile.js +9 -3
- package/dist/analyzer/sourceFile.js.map +1 -1
- package/dist/analyzer/tracePrinter.js +4 -0
- package/dist/analyzer/tracePrinter.js.map +1 -1
- package/dist/analyzer/typeCacheUtils.d.ts +5 -0
- package/dist/analyzer/typeCacheUtils.js +64 -1
- package/dist/analyzer/typeCacheUtils.js.map +1 -1
- package/dist/analyzer/typeComplexity.js +2 -0
- package/dist/analyzer/typeComplexity.js.map +1 -1
- package/dist/analyzer/typeEvaluator.d.ts +11 -2
- package/dist/analyzer/typeEvaluator.js +358 -21
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +31 -1
- package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
- package/dist/analyzer/typeGuards.d.ts +1 -1
- package/dist/analyzer/typePrinter.js +8 -0
- package/dist/analyzer/typePrinter.js.map +1 -1
- package/dist/analyzer/typeUtils.d.ts +1 -1
- package/dist/analyzer/typeUtils.js +29 -26
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/analyzer/typeWalker.d.ts +2 -1
- package/dist/analyzer/typeWalker.js +12 -0
- package/dist/analyzer/typeWalker.js.map +1 -1
- package/dist/analyzer/typedDicts.js +4 -7
- package/dist/analyzer/typedDicts.js.map +1 -1
- package/dist/analyzer/types.d.ts +16 -2
- package/dist/analyzer/types.js +101 -2
- package/dist/analyzer/types.js.map +1 -1
- package/dist/common/configOptions.d.ts +2 -0
- package/dist/common/configOptions.js +18 -0
- package/dist/common/configOptions.js.map +1 -1
- package/dist/common/envVarUtils.js +3 -3
- package/dist/common/envVarUtils.js.map +1 -1
- package/dist/languageServerBase.js +2 -2
- package/dist/languageServerBase.js.map +1 -1
- package/dist/languageService/callHierarchyProvider.js +3 -2
- package/dist/languageService/callHierarchyProvider.js.map +1 -1
- package/dist/languageService/completionProvider.js +4 -1
- package/dist/languageService/completionProvider.js.map +1 -1
- package/dist/tests/config.test.js +48 -0
- package/dist/tests/config.test.js.map +1 -1
- package/dist/tests/envVarUtils.test.js +16 -0
- package/dist/tests/envVarUtils.test.js.map +1 -1
- package/dist/tests/evaluationTrace.integration.test.d.ts +1 -0
- package/dist/tests/evaluationTrace.integration.test.js +266 -0
- package/dist/tests/evaluationTrace.integration.test.js.map +1 -0
- package/dist/tests/evaluationTrace.test.d.ts +1 -0
- package/dist/tests/evaluationTrace.test.js +422 -0
- package/dist/tests/evaluationTrace.test.js.map +1 -0
- package/dist/tests/evaluationTrace.viewer.test.d.ts +1 -0
- package/dist/tests/evaluationTrace.viewer.test.js +529 -0
- package/dist/tests/evaluationTrace.viewer.test.js.map +1 -0
- package/dist/tests/fourslash/showcallhierarchy.incomingCalls.aliasedFunction.fourslash.js +10 -6
- package/dist/tests/fourslash/showcallhierarchy.incomingCalls.aliasedFunction.fourslash.js.map +1 -1
- package/dist/tests/fourslash/showcallhierarchy.incomingCalls.function.fourslash.js +16 -10
- package/dist/tests/fourslash/showcallhierarchy.incomingCalls.function.fourslash.js.map +1 -1
- package/dist/tests/harness/fourslash/testState.js +10 -9
- package/dist/tests/harness/fourslash/testState.js.map +1 -1
- package/dist/tests/languageServer.test.js +129 -0
- package/dist/tests/languageServer.test.js.map +1 -1
- package/dist/tests/mypyPrimerAnalysis.test.js +1193 -47
- package/dist/tests/mypyPrimerAnalysis.test.js.map +1 -1
- package/dist/tests/mypyPrimerMcp.test.d.ts +1 -0
- package/dist/tests/mypyPrimerMcp.test.js +186 -0
- package/dist/tests/mypyPrimerMcp.test.js.map +1 -0
- package/dist/tests/overloadResult.test.d.ts +1 -0
- package/dist/tests/overloadResult.test.js +182 -0
- package/dist/tests/overloadResult.test.js.map +1 -0
- package/dist/tests/overloadResultController.test.d.ts +1 -0
- package/dist/tests/overloadResultController.test.js +2146 -0
- package/dist/tests/overloadResultController.test.js.map +1 -0
- package/dist/tests/protocolRequirement.test.d.ts +1 -0
- package/dist/tests/protocolRequirement.test.js +122 -0
- package/dist/tests/protocolRequirement.test.js.map +1 -0
- package/dist/tests/protocolRequirementAdversarial.test.d.ts +1 -0
- package/dist/tests/protocolRequirementAdversarial.test.js +92 -0
- package/dist/tests/protocolRequirementAdversarial.test.js.map +1 -0
- package/dist/tests/protocolRequirementBoundary.test.d.ts +1 -0
- package/dist/tests/protocolRequirementBoundary.test.js +119 -0
- package/dist/tests/protocolRequirementBoundary.test.js.map +1 -0
- package/dist/tests/protocolRequirementComplexity.test.d.ts +1 -0
- package/dist/tests/protocolRequirementComplexity.test.js +159 -0
- package/dist/tests/protocolRequirementComplexity.test.js.map +1 -0
- package/dist/tests/protocolRequirementCycles.test.d.ts +1 -0
- package/dist/tests/protocolRequirementCycles.test.js +160 -0
- package/dist/tests/protocolRequirementCycles.test.js.map +1 -0
- package/dist/tests/protocolRequirementGeneral.test.d.ts +1 -0
- package/dist/tests/protocolRequirementGeneral.test.js +120 -0
- package/dist/tests/protocolRequirementGeneral.test.js.map +1 -0
- package/dist/tests/protocolRequirementInstances.test.d.ts +1 -0
- package/dist/tests/protocolRequirementInstances.test.js +164 -0
- package/dist/tests/protocolRequirementInstances.test.js.map +1 -0
- package/dist/tests/protocolRequirementListStub.test.d.ts +1 -0
- package/dist/tests/protocolRequirementListStub.test.js +244 -0
- package/dist/tests/protocolRequirementListStub.test.js.map +1 -0
- package/dist/tests/protocolRequirementPopulated.test.d.ts +1 -0
- package/dist/tests/protocolRequirementPopulated.test.js +172 -0
- package/dist/tests/protocolRequirementPopulated.test.js.map +1 -0
- package/dist/tests/protocolRequirementRecursive.test.d.ts +1 -0
- package/dist/tests/protocolRequirementRecursive.test.js +118 -0
- package/dist/tests/protocolRequirementRecursive.test.js.map +1 -0
- package/dist/tests/protocolRequirementSpeculative.test.d.ts +1 -0
- package/dist/tests/protocolRequirementSpeculative.test.js +200 -0
- package/dist/tests/protocolRequirementSpeculative.test.js.map +1 -0
- package/dist/tests/protocolRequirementState.test.d.ts +1 -0
- package/dist/tests/protocolRequirementState.test.js +161 -0
- package/dist/tests/protocolRequirementState.test.js.map +1 -0
- package/dist/tests/testState.test.js +64 -0
- package/dist/tests/testState.test.js.map +1 -1
- package/dist/tests/testUtils.d.ts +6 -1
- package/dist/tests/testUtils.js +11 -6
- package/dist/tests/testUtils.js.map +1 -1
- package/dist/tests/typeCacheIsolation.test.d.ts +1 -0
- package/dist/tests/typeCacheIsolation.test.js +109 -0
- package/dist/tests/typeCacheIsolation.test.js.map +1 -0
- package/dist/tests/typeCacheUtils.test.js +74 -0
- package/dist/tests/typeCacheUtils.test.js.map +1 -1
- package/dist/tests/typeEvaluator1.test.js +5 -1
- package/dist/tests/typeEvaluator1.test.js.map +1 -1
- package/dist/tests/typeEvaluator4.test.js +6 -2
- package/dist/tests/typeEvaluator4.test.js.map +1 -1
- package/dist/tests/typeEvaluator5.test.js +25 -0
- package/dist/tests/typeEvaluator5.test.js.map +1 -1
- package/dist/tests/typeEvaluator6.test.js +7 -23
- package/dist/tests/typeEvaluator6.test.js.map +1 -1
- package/dist/tests/typeEvaluator7.test.js +241 -2
- package/dist/tests/typeEvaluator7.test.js.map +1 -1
- package/dist/tests/typeServer/typeServer.inProc.test.js +86 -0
- package/dist/tests/typeServer/typeServer.inProc.test.js.map +1 -1
- package/dist/tests/typeUtils.test.js +36 -0
- package/dist/tests/typeUtils.test.js.map +1 -1
- package/dist/trace/capture.d.ts +31 -0
- package/dist/trace/capture.js +272 -0
- package/dist/trace/capture.js.map +1 -0
- package/dist/trace/cli.d.ts +1 -0
- package/dist/trace/cli.js +196 -0
- package/dist/trace/cli.js.map +1 -0
- package/dist/trace/nativeAdapter.d.ts +16 -0
- package/dist/trace/nativeAdapter.js +418 -0
- package/dist/trace/nativeAdapter.js.map +1 -0
- package/dist/trace/nativeBridge.d.ts +46 -0
- package/dist/trace/nativeBridge.js +416 -0
- package/dist/trace/nativeBridge.js.map +1 -0
- package/dist/trace/reader.d.ts +83 -0
- package/dist/trace/reader.js +296 -0
- package/dist/trace/reader.js.map +1 -0
- package/dist/trace/recorder.d.ts +59 -0
- package/dist/trace/recorder.js +303 -0
- package/dist/trace/recorder.js.map +1 -0
- package/dist/trace/runtimeLoader.d.ts +23 -0
- package/dist/trace/runtimeLoader.js +172 -0
- package/dist/trace/runtimeLoader.js.map +1 -0
- package/dist/trace/viewerAssets.d.ts +2 -0
- package/dist/trace/viewerAssets.js +76 -0
- package/dist/trace/viewerAssets.js.map +1 -0
- package/dist/trace/viewerClient.d.ts +1 -0
- package/dist/trace/viewerClient.js +485 -0
- package/dist/trace/viewerClient.js.map +1 -0
- package/dist/trace/viewerModel.d.ts +308 -0
- package/dist/trace/viewerModel.js +524 -0
- package/dist/trace/viewerModel.js.map +1 -0
- package/dist/trace/viewerServer.d.ts +7 -0
- package/dist/trace/viewerServer.js +185 -0
- package/dist/trace/viewerServer.js.map +1 -0
- package/dist/typeServer/protocol/typeServerProtocol.d.ts +8 -2
- package/dist/typeServer/protocol/typeServerProtocol.js +1 -0
- package/dist/typeServer/protocol/typeServerProtocol.js.map +1 -1
- package/dist/typeServer/typeServerConversionUtils.js +9 -0
- package/dist/typeServer/typeServerConversionUtils.js.map +1 -1
- 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 >
|
|
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
|
-
|
|
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 (
|
|
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
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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:
|
|
19905
|
-
received:
|
|
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
|