@zzzen/pyright-internal 1.2.0-dev.20250413 → 1.2.0-dev.20250802
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/analyzerFileInfo.d.ts +0 -1
- package/dist/analyzer/analyzerFileInfo.js.map +1 -1
- package/dist/analyzer/analyzerNodeInfo.js +1 -1
- package/dist/analyzer/analyzerNodeInfo.js.map +1 -1
- package/dist/analyzer/binder.d.ts +2 -1
- package/dist/analyzer/binder.js +45 -38
- package/dist/analyzer/binder.js.map +1 -1
- package/dist/analyzer/checker.js +81 -44
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/codeFlowEngine.js +19 -7
- package/dist/analyzer/codeFlowEngine.js.map +1 -1
- package/dist/analyzer/codeFlowTypes.d.ts +9 -8
- package/dist/analyzer/codeFlowTypes.js +9 -8
- package/dist/analyzer/codeFlowTypes.js.map +1 -1
- package/dist/analyzer/codeFlowUtils.js +4 -2
- package/dist/analyzer/codeFlowUtils.js.map +1 -1
- package/dist/analyzer/dataClasses.js +7 -2
- package/dist/analyzer/dataClasses.js.map +1 -1
- package/dist/analyzer/docStringUtils.js +3 -1
- package/dist/analyzer/docStringUtils.js.map +1 -1
- package/dist/analyzer/importResolver.d.ts +0 -1
- package/dist/analyzer/importResolver.js +2 -25
- package/dist/analyzer/importResolver.js.map +1 -1
- package/dist/analyzer/importResult.d.ts +0 -1
- package/dist/analyzer/importStatementUtils.js +5 -3
- package/dist/analyzer/importStatementUtils.js.map +1 -1
- package/dist/analyzer/namedTuples.js +10 -0
- package/dist/analyzer/namedTuples.js.map +1 -1
- package/dist/analyzer/operations.js +1 -1
- package/dist/analyzer/operations.js.map +1 -1
- package/dist/analyzer/packageTypeVerifier.js +5 -3
- package/dist/analyzer/packageTypeVerifier.js.map +1 -1
- package/dist/analyzer/parameterUtils.js +10 -3
- package/dist/analyzer/parameterUtils.js.map +1 -1
- package/dist/analyzer/parseTreeUtils.d.ts +3 -4
- package/dist/analyzer/parseTreeUtils.js +19 -225
- package/dist/analyzer/parseTreeUtils.js.map +1 -1
- package/dist/analyzer/patternMatching.js +4 -0
- package/dist/analyzer/patternMatching.js.map +1 -1
- package/dist/analyzer/program.d.ts +12 -2
- package/dist/analyzer/program.js +78 -75
- package/dist/analyzer/program.js.map +1 -1
- package/dist/analyzer/programTypes.d.ts +2 -2
- package/dist/analyzer/programTypes.js.map +1 -1
- package/dist/analyzer/properties.js +3 -5
- package/dist/analyzer/properties.js.map +1 -1
- package/dist/analyzer/protocols.js +13 -3
- package/dist/analyzer/protocols.js.map +1 -1
- package/dist/analyzer/sentinel.d.ts +4 -0
- package/dist/analyzer/sentinel.js +51 -0
- package/dist/analyzer/sentinel.js.map +1 -0
- package/dist/analyzer/service.d.ts +2 -2
- package/dist/analyzer/service.js +7 -6
- package/dist/analyzer/service.js.map +1 -1
- package/dist/analyzer/sourceFile.d.ts +5 -2
- package/dist/analyzer/sourceFile.js +53 -15
- package/dist/analyzer/sourceFile.js.map +1 -1
- package/dist/analyzer/sourceFileInfo.d.ts +10 -1
- package/dist/analyzer/sourceFileInfo.js +28 -0
- package/dist/analyzer/sourceFileInfo.js.map +1 -1
- package/dist/analyzer/sourceFileInfoUtils.js +4 -4
- package/dist/analyzer/sourceFileInfoUtils.js.map +1 -1
- package/dist/analyzer/sourceMapper.d.ts +1 -1
- package/dist/analyzer/sourceMapper.js +20 -20
- package/dist/analyzer/sourceMapper.js.map +1 -1
- package/dist/analyzer/symbol.d.ts +3 -0
- package/dist/analyzer/symbol.js +11 -0
- package/dist/analyzer/symbol.js.map +1 -1
- package/dist/analyzer/testWalker.js +2 -13
- package/dist/analyzer/testWalker.js.map +1 -1
- package/dist/analyzer/tracePrinter.js +1 -1
- package/dist/analyzer/tracePrinter.js.map +1 -1
- package/dist/analyzer/typeEvaluator.js +278 -147
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +8 -4
- package/dist/analyzer/typeEvaluatorTypes.js +15 -2
- package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
- package/dist/analyzer/typeGuards.js +47 -13
- package/dist/analyzer/typeGuards.js.map +1 -1
- package/dist/analyzer/typePrinter.js +10 -2
- package/dist/analyzer/typePrinter.js.map +1 -1
- package/dist/analyzer/typePrinterUtils.js +2 -2
- package/dist/analyzer/typePrinterUtils.js.map +1 -1
- package/dist/analyzer/typeUtils.d.ts +2 -0
- package/dist/analyzer/typeUtils.js +14 -3
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/analyzer/typedDicts.js +9 -5
- package/dist/analyzer/typedDicts.js.map +1 -1
- package/dist/analyzer/types.d.ts +9 -2
- package/dist/analyzer/types.js +39 -1
- package/dist/analyzer/types.js.map +1 -1
- package/dist/commands/dumpFileDebugInfoCommand.d.ts +96 -0
- package/dist/commands/dumpFileDebugInfoCommand.js +13 -2
- package/dist/commands/dumpFileDebugInfoCommand.js.map +1 -1
- package/dist/common/cancellationUtils.d.ts +1 -1
- package/dist/common/cancellationUtils.js +2 -2
- package/dist/common/cancellationUtils.js.map +1 -1
- package/dist/common/charCodes.d.ts +1 -1
- package/dist/common/charCodes.js +1 -1
- package/dist/common/charCodes.js.map +1 -1
- package/dist/common/configOptions.d.ts +1 -0
- package/dist/common/configOptions.js +5 -0
- package/dist/common/configOptions.js.map +1 -1
- package/dist/common/core.d.ts +1 -3
- package/dist/common/core.js +3 -4
- package/dist/common/core.js.map +1 -1
- package/dist/common/diagnostic.d.ts +1 -1
- package/dist/common/diagnosticRules.d.ts +1 -0
- package/dist/common/diagnosticRules.js +1 -0
- package/dist/common/diagnosticRules.js.map +1 -1
- package/dist/common/docRange.d.ts +6 -0
- package/dist/common/docRange.js +10 -0
- package/dist/common/docRange.js.map +1 -0
- package/dist/common/envVarUtils.js +1 -6
- package/dist/common/envVarUtils.js.map +1 -1
- package/dist/common/extensibility.d.ts +11 -2
- package/dist/common/extensibility.js.map +1 -1
- package/dist/common/fileBasedCancellationUtils.d.ts +1 -0
- package/dist/common/fileBasedCancellationUtils.js +1 -0
- package/dist/common/fileBasedCancellationUtils.js.map +1 -1
- package/dist/common/logTracker.d.ts +5 -1
- package/dist/common/logTracker.js +43 -26
- package/dist/common/logTracker.js.map +1 -1
- package/dist/common/pathUtils.d.ts +1 -1
- package/dist/common/pathUtils.js +3 -2
- package/dist/common/pathUtils.js.map +1 -1
- package/dist/common/realFileSystem.d.ts +1 -1
- package/dist/common/realFileSystem.js +2 -1
- package/dist/common/realFileSystem.js.map +1 -1
- package/dist/common/serviceProviderExtensions.js +2 -2
- package/dist/common/serviceProviderExtensions.js.map +1 -1
- package/dist/common/stringUtils.d.ts +0 -1
- package/dist/common/stringUtils.js +0 -42
- package/dist/common/stringUtils.js.map +1 -1
- package/dist/common/textEditTracker.js +5 -3
- package/dist/common/textEditTracker.js.map +1 -1
- package/dist/common/textRange.d.ts +5 -11
- package/dist/common/textRange.js +31 -56
- package/dist/common/textRange.js.map +1 -1
- package/dist/common/textRangeCollection.js +3 -2
- package/dist/common/textRangeCollection.js.map +1 -1
- package/dist/common/uri/baseUri.js +2 -1
- package/dist/common/uri/baseUri.js.map +1 -1
- package/dist/common/uri/uri.d.ts +5 -2
- package/dist/common/uri/uri.js +21 -5
- package/dist/common/uri/uri.js.map +1 -1
- package/dist/common/uri/uriUtils.d.ts +2 -2
- package/dist/common/uri/uriUtils.js +4 -3
- package/dist/common/uri/uriUtils.js.map +1 -1
- package/dist/common/workspaceEditUtils.js +9 -9
- package/dist/common/workspaceEditUtils.js.map +1 -1
- package/dist/languageServerBase.d.ts +5 -3
- package/dist/languageServerBase.js +44 -37
- package/dist/languageServerBase.js.map +1 -1
- package/dist/languageService/analyzerServiceExecutor.d.ts +3 -0
- package/dist/languageService/analyzerServiceExecutor.js +1 -0
- package/dist/languageService/analyzerServiceExecutor.js.map +1 -1
- package/dist/languageService/autoImporter.d.ts +2 -2
- package/dist/languageService/autoImporter.js +3 -3
- package/dist/languageService/autoImporter.js.map +1 -1
- package/dist/languageService/callHierarchyProvider.js +2 -3
- package/dist/languageService/callHierarchyProvider.js.map +1 -1
- package/dist/languageService/completionProvider.js +16 -13
- package/dist/languageService/completionProvider.js.map +1 -1
- package/dist/languageService/definitionProvider.d.ts +2 -1
- package/dist/languageService/definitionProvider.js.map +1 -1
- package/dist/languageService/documentSymbolCollector.d.ts +4 -1
- package/dist/languageService/documentSymbolCollector.js +9 -7
- package/dist/languageService/documentSymbolCollector.js.map +1 -1
- package/dist/languageService/hoverProvider.js +1 -9
- package/dist/languageService/hoverProvider.js.map +1 -1
- package/dist/languageService/importSorter.js +1 -0
- package/dist/languageService/importSorter.js.map +1 -1
- package/dist/languageService/navigationUtils.d.ts +1 -1
- package/dist/languageService/referencesProvider.d.ts +2 -1
- package/dist/languageService/referencesProvider.js +8 -7
- package/dist/languageService/referencesProvider.js.map +1 -1
- package/dist/languageService/renameProvider.js +4 -19
- package/dist/languageService/renameProvider.js.map +1 -1
- package/dist/languageService/tooltipUtils.d.ts +2 -0
- package/dist/languageService/tooltipUtils.js +2 -0
- package/dist/languageService/tooltipUtils.js.map +1 -1
- package/dist/languageService/workspaceSymbolProvider.js +1 -1
- package/dist/languageService/workspaceSymbolProvider.js.map +1 -1
- package/dist/localization/localize.d.ts +16 -2
- package/dist/localization/localize.js +16 -2
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.cs.json +23 -9
- package/dist/localization/package.nls.de.json +18 -4
- package/dist/localization/package.nls.en-us.json +53 -3
- package/dist/localization/package.nls.es.json +18 -4
- package/dist/localization/package.nls.fr.json +22 -8
- package/dist/localization/package.nls.it.json +23 -9
- package/dist/localization/package.nls.ja.json +18 -4
- package/dist/localization/package.nls.ko.json +23 -9
- package/dist/localization/package.nls.pl.json +18 -4
- package/dist/localization/package.nls.pt-br.json +18 -4
- package/dist/localization/package.nls.qps-ploc.json +17 -3
- package/dist/localization/package.nls.ru.json +18 -4
- package/dist/localization/package.nls.tr.json +23 -9
- package/dist/localization/package.nls.zh-cn.json +18 -4
- package/dist/localization/package.nls.zh-tw.json +18 -4
- package/dist/parser/characters.d.ts +1 -8
- package/dist/parser/characters.js +6 -3
- package/dist/parser/characters.js.map +1 -1
- package/dist/parser/parseNodeUtils.d.ts +12 -0
- package/dist/parser/parseNodeUtils.js +136 -0
- package/dist/parser/parseNodeUtils.js.map +1 -0
- package/dist/parser/parseNodes.d.ts +12 -2
- package/dist/parser/parseNodes.js +17 -2
- package/dist/parser/parseNodes.js.map +1 -1
- package/dist/parser/parser.d.ts +5 -2
- package/dist/parser/parser.js +83 -47
- package/dist/parser/parser.js.map +1 -1
- package/dist/parser/tokenizer.d.ts +3 -3
- package/dist/parser/tokenizer.js +58 -38
- package/dist/parser/tokenizer.js.map +1 -1
- package/dist/parser/tokenizerTypes.d.ts +4 -3
- package/dist/parser/tokenizerTypes.js +4 -3
- package/dist/parser/tokenizerTypes.js.map +1 -1
- package/dist/pyright.js +1 -1
- package/dist/pyright.js.map +1 -1
- package/dist/server.js +3 -3
- package/dist/server.js.map +1 -1
- package/dist/tests/checker.test.js +2 -2
- package/dist/tests/common.test.js +6 -6
- package/dist/tests/common.test.js.map +1 -1
- package/dist/tests/fourslash/completions.autoimport.unicode.fourslash.js +29 -0
- package/dist/tests/fourslash/completions.autoimport.unicode.fourslash.js.map +1 -0
- package/dist/tests/fourslash/completions.declNames.method.fourslash.js +8 -8
- package/dist/tests/fourslash/import.pytyped.privateSymbols.fourslash.js +0 -18
- package/dist/tests/fourslash/import.pytyped.privateSymbols.fourslash.js.map +1 -1
- package/dist/tests/harness/fourslash/testState.d.ts +3 -2
- package/dist/tests/harness/fourslash/testState.js +9 -3
- package/dist/tests/harness/fourslash/testState.js.map +1 -1
- package/dist/tests/lsp/languageServer.js +1 -1
- package/dist/tests/lsp/languageServer.js.map +1 -1
- package/dist/tests/lsp/languageServerTestUtils.d.ts +1 -2
- package/dist/tests/lsp/languageServerTestUtils.js +2 -2
- package/dist/tests/lsp/languageServerTestUtils.js.map +1 -1
- package/dist/tests/parser.test.js +17 -0
- package/dist/tests/parser.test.js.map +1 -1
- package/dist/tests/positionUtils.test.js +1 -1
- package/dist/tests/service.test.js +4 -4
- package/dist/tests/service.test.js.map +1 -1
- package/dist/tests/sourceFile.test.js +21 -4
- package/dist/tests/sourceFile.test.js.map +1 -1
- package/dist/tests/stringUtils.test.js +0 -12
- package/dist/tests/stringUtils.test.js.map +1 -1
- package/dist/tests/testStateUtils.js +8 -3
- package/dist/tests/testStateUtils.js.map +1 -1
- package/dist/tests/testUtils.js +1 -1
- package/dist/tests/testUtils.js.map +1 -1
- package/dist/tests/tokenizer.test.js +5 -5
- package/dist/tests/tokenizer.test.js.map +1 -1
- package/dist/tests/typeEvaluator1.test.js +11 -13
- package/dist/tests/typeEvaluator1.test.js.map +1 -1
- package/dist/tests/typeEvaluator2.test.js +15 -1
- package/dist/tests/typeEvaluator2.test.js.map +1 -1
- package/dist/tests/typeEvaluator4.test.js +16 -1
- package/dist/tests/typeEvaluator4.test.js.map +1 -1
- package/dist/tests/typeEvaluator5.test.js +10 -4
- package/dist/tests/typeEvaluator5.test.js.map +1 -1
- package/dist/tests/typeEvaluator6.test.js +1 -1
- package/dist/tests/typeEvaluator7.test.js +9 -0
- package/dist/tests/typeEvaluator7.test.js.map +1 -1
- package/dist/tests/typeEvaluator8.test.js +8 -0
- package/dist/tests/typeEvaluator8.test.js.map +1 -1
- package/dist/tests/workspaceEditUtils.test.js +7 -9
- package/dist/tests/workspaceEditUtils.test.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/workspaceFactory.d.ts +12 -1
- package/dist/workspaceFactory.js.map +1 -1
- package/package.json +2 -3
- package/dist/tests/fourslash/rename.args.fourslash.js +0 -72
- package/dist/tests/fourslash/rename.args.fourslash.js.map +0 -1
- /package/dist/tests/fourslash/{rename.args.fourslash.d.ts → completions.autoimport.unicode.fourslash.d.ts} +0 -0
|
@@ -75,6 +75,7 @@ const patternMatching_1 = require("./patternMatching");
|
|
|
75
75
|
const properties_1 = require("./properties");
|
|
76
76
|
const protocols_1 = require("./protocols");
|
|
77
77
|
const ScopeUtils = __importStar(require("./scopeUtils"));
|
|
78
|
+
const sentinel_1 = require("./sentinel");
|
|
78
79
|
const staticExpressions_1 = require("./staticExpressions");
|
|
79
80
|
const symbol_1 = require("./symbol");
|
|
80
81
|
const symbolNameUtils_1 = require("./symbolNameUtils");
|
|
@@ -487,7 +488,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
487
488
|
prefetched = {};
|
|
488
489
|
prefetched.objectClass = getBuiltInType(node, 'object');
|
|
489
490
|
prefetched.typeClass = getBuiltInType(node, 'type');
|
|
490
|
-
prefetched.functionClass = getBuiltInType(node, 'function');
|
|
491
|
+
prefetched.functionClass = getTypesType(node, 'FunctionType') ?? getBuiltInType(node, 'function');
|
|
492
|
+
prefetched.methodClass = getTypesType(node, 'MethodType');
|
|
491
493
|
prefetched.unionTypeClass = getTypesType(node, 'UnionType');
|
|
492
494
|
if (prefetched.unionTypeClass && (0, types_1.isClass)(prefetched.unionTypeClass)) {
|
|
493
495
|
prefetched.unionTypeClass.shared.flags |= 8388608 /* ClassTypeFlags.SpecialFormClass */;
|
|
@@ -503,9 +505,11 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
503
505
|
prefetched.dictClass = getBuiltInType(node, 'dict');
|
|
504
506
|
prefetched.moduleTypeClass = getTypingType(node, 'ModuleType');
|
|
505
507
|
prefetched.typedDictClass = getTypingType(node, 'TypedDict');
|
|
506
|
-
prefetched.typedDictPrivateClass =
|
|
508
|
+
prefetched.typedDictPrivateClass =
|
|
509
|
+
getTypeCheckerInternalsType(node, 'TypedDictFallback') ?? getTypingType(node, '_TypedDict');
|
|
507
510
|
prefetched.awaitableClass = getTypingType(node, 'Awaitable');
|
|
508
511
|
prefetched.mappingClass = getTypingType(node, 'Mapping');
|
|
512
|
+
prefetched.templateClass = getTypeOfModule(node, 'Template', ['string', 'templatelib']);
|
|
509
513
|
prefetched.supportsKeysAndGetItemClass = getTypeshedType(node, 'SupportsKeysAndGetItem');
|
|
510
514
|
if (!prefetched.supportsKeysAndGetItemClass) {
|
|
511
515
|
// Fall back on 'Mapping' if 'SupportsKeysAndGetItem' is not available.
|
|
@@ -943,7 +947,9 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
943
947
|
const isBytes = firstBytesIndex >= 0;
|
|
944
948
|
let isLiteralString = true;
|
|
945
949
|
let isIncomplete = false;
|
|
950
|
+
let isTemplate = false;
|
|
946
951
|
node.d.strings.forEach((expr) => {
|
|
952
|
+
// Handle implicit concatenation.
|
|
947
953
|
const typeResult = getTypeOfString(expr);
|
|
948
954
|
if (typeResult.isIncomplete) {
|
|
949
955
|
isIncomplete = true;
|
|
@@ -956,13 +962,21 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
956
962
|
else if (types_1.ClassType.isBuiltIn(typeResult?.type, 'LiteralString')) {
|
|
957
963
|
isExprLiteralString = true;
|
|
958
964
|
}
|
|
965
|
+
if (typeResult.type.shared.name === 'Template') {
|
|
966
|
+
isTemplate = true;
|
|
967
|
+
}
|
|
959
968
|
}
|
|
960
969
|
if (!isExprLiteralString) {
|
|
961
970
|
isLiteralString = false;
|
|
962
971
|
}
|
|
963
972
|
});
|
|
964
|
-
|
|
965
|
-
|
|
973
|
+
if (isTemplate) {
|
|
974
|
+
const templateType = prefetched?.templateClass && (0, types_1.isInstantiableClass)(prefetched?.templateClass)
|
|
975
|
+
? types_1.ClassType.cloneAsInstance(prefetched.templateClass)
|
|
976
|
+
: types_1.UnknownType.create();
|
|
977
|
+
typeResult = { type: templateType, isIncomplete };
|
|
978
|
+
}
|
|
979
|
+
else if (node.d.strings.some((str) => str.nodeType === 30 /* ParseNodeType.FormatString */)) {
|
|
966
980
|
if (isLiteralString) {
|
|
967
981
|
const literalStringType = getTypingType(node, 'LiteralString');
|
|
968
982
|
if (literalStringType && (0, types_1.isInstantiableClass)(literalStringType)) {
|
|
@@ -992,7 +1006,11 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
992
1006
|
// TypeForm (really long, triple-quoted, etc.).
|
|
993
1007
|
const stringNode = node.d.strings[0];
|
|
994
1008
|
const tokenFlags = stringNode.d.token.flags;
|
|
995
|
-
const disallowedTokenFlags = 32 /* StringTokenFlags.Bytes */ |
|
|
1009
|
+
const disallowedTokenFlags = 32 /* StringTokenFlags.Bytes */ |
|
|
1010
|
+
8 /* StringTokenFlags.Raw */ |
|
|
1011
|
+
64 /* StringTokenFlags.Format */ |
|
|
1012
|
+
128 /* StringTokenFlags.Template */ |
|
|
1013
|
+
4 /* StringTokenFlags.Triplicate */;
|
|
996
1014
|
const maxTypeFormStringLength = 256;
|
|
997
1015
|
if ((tokenFlags & disallowedTokenFlags) !== 0 ||
|
|
998
1016
|
stringNode.d.token.escapedValue.length >= maxTypeFormStringLength) {
|
|
@@ -1037,6 +1055,12 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
1037
1055
|
}
|
|
1038
1056
|
return { type: types_1.UnknownType.create() };
|
|
1039
1057
|
}
|
|
1058
|
+
if (tokenFlags & 128 /* StringTokenFlags.Template */) {
|
|
1059
|
+
if (reportTypeErrors) {
|
|
1060
|
+
addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.annotationTemplateString(), node);
|
|
1061
|
+
}
|
|
1062
|
+
return { type: types_1.UnknownType.create() };
|
|
1063
|
+
}
|
|
1040
1064
|
// We didn't know at parse time that this string node was going
|
|
1041
1065
|
// to be evaluated as a forward-referenced type. We need
|
|
1042
1066
|
// to re-invoke the parser at this stage.
|
|
@@ -1059,8 +1083,14 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
1059
1083
|
const isBytes = (node.d.token.flags & 32 /* StringTokenFlags.Bytes */) !== 0;
|
|
1060
1084
|
let typeResult;
|
|
1061
1085
|
let isIncomplete = false;
|
|
1062
|
-
|
|
1063
|
-
|
|
1086
|
+
if (node.nodeType === 49 /* ParseNodeType.String */) {
|
|
1087
|
+
typeResult = {
|
|
1088
|
+
type: cloneBuiltinObjectWithLiteral(node, isBytes ? 'bytes' : 'str', node.d.value),
|
|
1089
|
+
isIncomplete,
|
|
1090
|
+
};
|
|
1091
|
+
}
|
|
1092
|
+
else {
|
|
1093
|
+
const isTemplateString = (node.d.token.flags & 128 /* StringTokenFlags.Template */) !== 0;
|
|
1064
1094
|
let isLiteralString = true;
|
|
1065
1095
|
// If all of the format expressions are of type LiteralString, then
|
|
1066
1096
|
// the resulting formatted string is also LiteralString.
|
|
@@ -1084,7 +1114,13 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
1084
1114
|
isLiteralString = false;
|
|
1085
1115
|
});
|
|
1086
1116
|
});
|
|
1087
|
-
if (
|
|
1117
|
+
if (isTemplateString) {
|
|
1118
|
+
const templateType = prefetched?.templateClass && (0, types_1.isInstantiableClass)(prefetched?.templateClass)
|
|
1119
|
+
? types_1.ClassType.cloneAsInstance(prefetched.templateClass)
|
|
1120
|
+
: types_1.UnknownType.create();
|
|
1121
|
+
typeResult = { type: templateType, isIncomplete };
|
|
1122
|
+
}
|
|
1123
|
+
else if (!isBytes && isLiteralString) {
|
|
1088
1124
|
const literalStringType = getTypingType(node, 'LiteralString');
|
|
1089
1125
|
if (literalStringType && (0, types_1.isInstantiableClass)(literalStringType)) {
|
|
1090
1126
|
typeResult = { type: types_1.ClassType.cloneAsInstance(literalStringType), isIncomplete };
|
|
@@ -1100,12 +1136,6 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
1100
1136
|
}
|
|
1101
1137
|
}
|
|
1102
1138
|
}
|
|
1103
|
-
else {
|
|
1104
|
-
typeResult = {
|
|
1105
|
-
type: cloneBuiltinObjectWithLiteral(node, isBytes ? 'bytes' : 'str', node.d.value),
|
|
1106
|
-
isIncomplete,
|
|
1107
|
-
};
|
|
1108
|
-
}
|
|
1109
1139
|
return typeResult;
|
|
1110
1140
|
}
|
|
1111
1141
|
function stripLiteralValue(type) {
|
|
@@ -1205,6 +1235,10 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
1205
1235
|
if (types_1.TypeBase.isInstantiable(type)) {
|
|
1206
1236
|
return false;
|
|
1207
1237
|
}
|
|
1238
|
+
// Sentinels are always truthy.
|
|
1239
|
+
if ((0, typeUtils_1.isSentinelLiteral)(type)) {
|
|
1240
|
+
return false;
|
|
1241
|
+
}
|
|
1208
1242
|
// Handle tuples specially.
|
|
1209
1243
|
if ((0, typeUtils_1.isTupleClass)(type) && type.priv.tupleTypeArgs) {
|
|
1210
1244
|
return (0, typeUtils_1.isUnboundedTupleClass)(type) || type.priv.tupleTypeArgs.length === 0;
|
|
@@ -1363,6 +1397,10 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
1363
1397
|
// include, otherwise it should be removed.
|
|
1364
1398
|
return isLiteralFalsy ? subtype : undefined;
|
|
1365
1399
|
}
|
|
1400
|
+
// If the object is a sentinel, we can eliminate it.
|
|
1401
|
+
if ((0, typeUtils_1.isSentinelLiteral)(concreteSubtype)) {
|
|
1402
|
+
return undefined;
|
|
1403
|
+
}
|
|
1366
1404
|
// If the object is a bool, make it "false", since
|
|
1367
1405
|
// "true" is a truthy value.
|
|
1368
1406
|
if (types_1.ClassType.isBuiltIn(concreteSubtype, 'bool')) {
|
|
@@ -1399,6 +1437,9 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
1399
1437
|
if (concreteSubtype.priv.literalValue instanceof types_1.EnumLiteral) {
|
|
1400
1438
|
isLiteralTruthy = !canBeFalsy(concreteSubtype);
|
|
1401
1439
|
}
|
|
1440
|
+
else if (concreteSubtype.priv.literalValue instanceof types_1.SentinelLiteral) {
|
|
1441
|
+
isLiteralTruthy = true;
|
|
1442
|
+
}
|
|
1402
1443
|
else {
|
|
1403
1444
|
isLiteralTruthy = !!concreteSubtype.priv.literalValue;
|
|
1404
1445
|
}
|
|
@@ -1786,29 +1827,46 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
1786
1827
|
case 35 /* ParseNodeType.MemberAccess */: {
|
|
1787
1828
|
const baseType = getTypeOfExpression(expression.d.leftExpr, 2 /* EvalFlags.MemberAccessBaseDefaults */).type;
|
|
1788
1829
|
const baseTypeConcrete = makeTopLevelTypeVarsConcrete(baseType);
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1830
|
+
const memberName = expression.d.member.d.value;
|
|
1831
|
+
// Normally, baseTypeConcrete will not be a composite type (a union),
|
|
1832
|
+
// but this can occur. In this case, it's not clear how to handle this
|
|
1833
|
+
// correctly. For now, we'll just loop through the subtypes and
|
|
1834
|
+
// use one of them. We'll sort the subtypes for determinism.
|
|
1835
|
+
(0, typeUtils_1.doForEachSubtype)(baseTypeConcrete, (baseSubtype) => {
|
|
1836
|
+
if ((0, types_1.isClassInstance)(baseSubtype)) {
|
|
1837
|
+
const classMemberInfo = (0, typeUtils_1.lookUpObjectMember)(baseSubtype, memberName, 64 /* MemberAccessFlags.DeclaredTypesOnly */);
|
|
1838
|
+
classOrObjectBase = baseSubtype;
|
|
1839
|
+
memberAccessClass = classMemberInfo?.classType;
|
|
1840
|
+
symbol = classMemberInfo?.symbol;
|
|
1841
|
+
useDescriptorSetterType = true;
|
|
1842
|
+
// If this is an instance member (e.g. a dataclass field), don't
|
|
1843
|
+
// bind it to the object if it's a function.
|
|
1844
|
+
bindFunction = !classMemberInfo?.isInstanceMember;
|
|
1845
|
+
}
|
|
1846
|
+
else if ((0, types_1.isInstantiableClass)(baseSubtype)) {
|
|
1847
|
+
const classMemberInfo = (0, typeUtils_1.lookUpClassMember)(baseSubtype, memberName, 16 /* MemberAccessFlags.SkipInstanceMembers */ | 64 /* MemberAccessFlags.DeclaredTypesOnly */);
|
|
1848
|
+
classOrObjectBase = baseSubtype;
|
|
1849
|
+
memberAccessClass = classMemberInfo?.classType;
|
|
1850
|
+
symbol = classMemberInfo?.symbol;
|
|
1851
|
+
useDescriptorSetterType = false;
|
|
1852
|
+
bindFunction = true;
|
|
1853
|
+
}
|
|
1854
|
+
else if ((0, types_1.isModule)(baseSubtype)) {
|
|
1855
|
+
classOrObjectBase = undefined;
|
|
1856
|
+
memberAccessClass = undefined;
|
|
1857
|
+
symbol = types_1.ModuleType.getField(baseSubtype, memberName);
|
|
1858
|
+
if (symbol && !symbol.hasTypedDeclarations()) {
|
|
1859
|
+
// Do not use inferred types for the declared type.
|
|
1860
|
+
symbol = undefined;
|
|
1861
|
+
}
|
|
1862
|
+
useDescriptorSetterType = false;
|
|
1797
1863
|
bindFunction = false;
|
|
1798
1864
|
}
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
else if ((0, types_1.isInstantiableClass)(baseTypeConcrete)) {
|
|
1802
|
-
classMemberInfo = (0, typeUtils_1.lookUpClassMember)(baseTypeConcrete, expression.d.member.d.value, 16 /* MemberAccessFlags.SkipInstanceMembers */ | 64 /* MemberAccessFlags.DeclaredTypesOnly */);
|
|
1803
|
-
classOrObjectBase = baseTypeConcrete;
|
|
1804
|
-
memberAccessClass = classMemberInfo?.classType;
|
|
1805
|
-
}
|
|
1865
|
+
},
|
|
1866
|
+
/* sortSubtypes */ true);
|
|
1806
1867
|
if ((0, types_1.isTypeVar)(baseType)) {
|
|
1807
1868
|
selfType = baseType;
|
|
1808
1869
|
}
|
|
1809
|
-
if (classMemberInfo) {
|
|
1810
|
-
symbol = classMemberInfo.symbol;
|
|
1811
|
-
}
|
|
1812
1870
|
break;
|
|
1813
1871
|
}
|
|
1814
1872
|
case 27 /* ParseNodeType.Index */: {
|
|
@@ -1850,6 +1908,30 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
1850
1908
|
}
|
|
1851
1909
|
break;
|
|
1852
1910
|
}
|
|
1911
|
+
case 52 /* ParseNodeType.Tuple */: {
|
|
1912
|
+
// If this is a tuple expression with at least one item and no
|
|
1913
|
+
// unpacked items, and all of the items have declared types,
|
|
1914
|
+
// we can assume a declared type for the resulting tuple. This
|
|
1915
|
+
// is needed to enable bidirectional type inference when assigning
|
|
1916
|
+
// to an unpacked tuple.
|
|
1917
|
+
if (expression.d.items.length > 0 &&
|
|
1918
|
+
!expression.d.items.some((item) => item.nodeType === 56 /* ParseNodeType.Unpack */)) {
|
|
1919
|
+
const itemTypes = [];
|
|
1920
|
+
expression.d.items.forEach((expr) => {
|
|
1921
|
+
const itemType = getDeclaredTypeForExpression(expr, usage);
|
|
1922
|
+
if (itemType) {
|
|
1923
|
+
itemTypes.push(itemType);
|
|
1924
|
+
}
|
|
1925
|
+
});
|
|
1926
|
+
if (itemTypes.length === expression.d.items.length) {
|
|
1927
|
+
// If all items have a declared type, return a tuple of those types.
|
|
1928
|
+
return (0, tuples_1.makeTupleObject)(evaluatorInterface, itemTypes.map((t) => {
|
|
1929
|
+
return { type: t, isUnbounded: false };
|
|
1930
|
+
}));
|
|
1931
|
+
}
|
|
1932
|
+
}
|
|
1933
|
+
break;
|
|
1934
|
+
}
|
|
1853
1935
|
}
|
|
1854
1936
|
if (symbol) {
|
|
1855
1937
|
let declaredType = getDeclaredTypeOfSymbol(symbol)?.type;
|
|
@@ -2116,6 +2198,9 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
2116
2198
|
function getTypingType(node, symbolName) {
|
|
2117
2199
|
return (getTypeOfModule(node, symbolName, ['typing']) ?? getTypeOfModule(node, symbolName, ['typing_extensions']));
|
|
2118
2200
|
}
|
|
2201
|
+
function getTypeCheckerInternalsType(node, symbolName) {
|
|
2202
|
+
return getTypeOfModule(node, symbolName, ['_typeshed', '_type_checker_internals']);
|
|
2203
|
+
}
|
|
2119
2204
|
function getTypesType(node, symbolName) {
|
|
2120
2205
|
return getTypeOfModule(node, symbolName, ['types']);
|
|
2121
2206
|
}
|
|
@@ -2166,7 +2251,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
2166
2251
|
if (node.parent) {
|
|
2167
2252
|
return getNodeReachability(node.parent, sourceNode);
|
|
2168
2253
|
}
|
|
2169
|
-
return typeEvaluatorTypes_1.Reachability.
|
|
2254
|
+
return typeEvaluatorTypes_1.Reachability.UnreachableStructural;
|
|
2170
2255
|
}
|
|
2171
2256
|
const sourceFlowNode = sourceNode ? AnalyzerNodeInfo.getFlowNode(sourceNode) : undefined;
|
|
2172
2257
|
return codeFlowEngine.getFlowNodeReachability(flowNode, sourceFlowNode);
|
|
@@ -2174,7 +2259,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
2174
2259
|
function getAfterNodeReachability(node) {
|
|
2175
2260
|
const returnFlowNode = AnalyzerNodeInfo.getAfterFlowNode(node);
|
|
2176
2261
|
if (!returnFlowNode) {
|
|
2177
|
-
return typeEvaluatorTypes_1.Reachability.
|
|
2262
|
+
return typeEvaluatorTypes_1.Reachability.UnreachableStructural;
|
|
2178
2263
|
}
|
|
2179
2264
|
if (checkCodeFlowTooComplex(node)) {
|
|
2180
2265
|
return typeEvaluatorTypes_1.Reachability.Reachable;
|
|
@@ -2183,7 +2268,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
2183
2268
|
if (reachability !== typeEvaluatorTypes_1.Reachability.Reachable) {
|
|
2184
2269
|
return reachability;
|
|
2185
2270
|
}
|
|
2186
|
-
|
|
2271
|
+
const executionScopeNode = ParseTreeUtils.getExecutionScopeNode(node);
|
|
2272
|
+
if (!isFlowNodeReachableUsingNeverNarrowing(executionScopeNode, returnFlowNode)) {
|
|
2187
2273
|
return typeEvaluatorTypes_1.Reachability.UnreachableByAnalysis;
|
|
2188
2274
|
}
|
|
2189
2275
|
return typeEvaluatorTypes_1.Reachability.Reachable;
|
|
@@ -2191,7 +2277,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
2191
2277
|
// Although isFlowNodeReachable indicates that the node is reachable, it
|
|
2192
2278
|
// may not be reachable if we apply "never narrowing".
|
|
2193
2279
|
function isFlowNodeReachableUsingNeverNarrowing(node, flowNode) {
|
|
2194
|
-
const analyzer = getCodeFlowAnalyzerForNode(node
|
|
2280
|
+
const analyzer = getCodeFlowAnalyzerForNode(node, /* typeAtStart */ undefined);
|
|
2195
2281
|
if (checkCodeFlowTooComplex(node)) {
|
|
2196
2282
|
return true;
|
|
2197
2283
|
}
|
|
@@ -2219,12 +2305,6 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
2219
2305
|
function addInformation(message, node, range) {
|
|
2220
2306
|
return addDiagnosticWithSuppressionCheck('information', message, node, range);
|
|
2221
2307
|
}
|
|
2222
|
-
function addUnusedCode(node, textRange) {
|
|
2223
|
-
if (!isDiagnosticSuppressedForNode(node)) {
|
|
2224
|
-
const fileInfo = AnalyzerNodeInfo.getFileInfo(node);
|
|
2225
|
-
fileInfo.diagnosticSink.addUnusedCodeWithTextRange(localize_1.LocMessage.unreachableCode(), textRange);
|
|
2226
|
-
}
|
|
2227
|
-
}
|
|
2228
2308
|
function addUnreachableCode(node, reachability, textRange) {
|
|
2229
2309
|
if (reachability === typeEvaluatorTypes_1.Reachability.Reachable) {
|
|
2230
2310
|
return;
|
|
@@ -2232,10 +2312,14 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
2232
2312
|
if (!isDiagnosticSuppressedForNode(node)) {
|
|
2233
2313
|
const fileInfo = AnalyzerNodeInfo.getFileInfo(node);
|
|
2234
2314
|
const reportTypeReachability = fileInfo.diagnosticRuleSet.enableReachabilityAnalysis;
|
|
2235
|
-
if (reachability === typeEvaluatorTypes_1.Reachability.
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2315
|
+
if (reachability === typeEvaluatorTypes_1.Reachability.UnreachableStructural ||
|
|
2316
|
+
reachability === typeEvaluatorTypes_1.Reachability.UnreachableStaticCondition ||
|
|
2317
|
+
reportTypeReachability) {
|
|
2318
|
+
fileInfo.diagnosticSink.addUnreachableCodeWithTextRange(reachability === typeEvaluatorTypes_1.Reachability.UnreachableStructural
|
|
2319
|
+
? localize_1.LocMessage.unreachableCodeStructure()
|
|
2320
|
+
: reachability === typeEvaluatorTypes_1.Reachability.UnreachableStaticCondition
|
|
2321
|
+
? localize_1.LocMessage.unreachableCodeCondition()
|
|
2322
|
+
: localize_1.LocMessage.unreachableCodeType(), textRange);
|
|
2239
2323
|
}
|
|
2240
2324
|
}
|
|
2241
2325
|
}
|
|
@@ -2652,7 +2736,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
2652
2736
|
// If the type includes promotion types, expand these to their constituent types.
|
|
2653
2737
|
function expandPromotionTypes(node, type, excludeBytes = false) {
|
|
2654
2738
|
return (0, typeUtils_1.mapSubtypes)(type, (subtype) => {
|
|
2655
|
-
if (!(0, types_1.isClass)(subtype) || !subtype.priv.includePromotions) {
|
|
2739
|
+
if (!(0, types_1.isClass)(subtype) || !subtype.priv.includePromotions || subtype.priv.literalValue !== undefined) {
|
|
2656
2740
|
return subtype;
|
|
2657
2741
|
}
|
|
2658
2742
|
if (excludeBytes && types_1.ClassType.isBuiltIn(subtype, 'bytes')) {
|
|
@@ -3226,6 +3310,12 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
3226
3310
|
type = types_1.UnknownType.create();
|
|
3227
3311
|
}
|
|
3228
3312
|
}
|
|
3313
|
+
// If we're expecting a type expression and got a sentinel literal instance,
|
|
3314
|
+
// treat it as its instantiable counterpart. This is similar to how None
|
|
3315
|
+
// is treated in a type expression context.
|
|
3316
|
+
if ((flags & 128 /* EvalFlags.InstantiableType */) !== 0 && (0, types_1.isClassInstance)(type) && (0, typeUtils_1.isSentinelLiteral)(type)) {
|
|
3317
|
+
type = types_1.ClassType.cloneAsInstantiable(type);
|
|
3318
|
+
}
|
|
3229
3319
|
type = convertSpecialFormToRuntimeValue(type, flags);
|
|
3230
3320
|
if ((flags & 256 /* EvalFlags.TypeExpression */) === 0) {
|
|
3231
3321
|
reportUseOfTypeCheckOnly(type, node);
|
|
@@ -3299,6 +3389,9 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
3299
3389
|
if ((0, types_1.isClass)(type) && !type.priv.includeSubclasses && types_1.ClassType.isValidTypeAliasClass(type)) {
|
|
3300
3390
|
return true;
|
|
3301
3391
|
}
|
|
3392
|
+
if ((0, typeUtils_1.isSentinelLiteral)(type)) {
|
|
3393
|
+
return true;
|
|
3394
|
+
}
|
|
3302
3395
|
return false;
|
|
3303
3396
|
}
|
|
3304
3397
|
// Reports diagnostics if type isn't valid within a type expression.
|
|
@@ -3332,7 +3425,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
3332
3425
|
// Isinstance treats traditional (non-PEP 695) type aliases that are unions
|
|
3333
3426
|
// as tuples of classes rather than unions.
|
|
3334
3427
|
if ((flags & 536870912 /* EvalFlags.IsinstanceArg */) !== 0) {
|
|
3335
|
-
if ((0, types_1.isUnion)(type) && type.props?.typeAliasInfo && !type.props.typeAliasInfo.shared.
|
|
3428
|
+
if ((0, types_1.isUnion)(type) && type.props?.typeAliasInfo && !type.props.typeAliasInfo.shared.isTypeAliasType) {
|
|
3336
3429
|
return type;
|
|
3337
3430
|
}
|
|
3338
3431
|
}
|
|
@@ -3861,6 +3954,14 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
3861
3954
|
}
|
|
3862
3955
|
case 6 /* TypeCategory.Class */: {
|
|
3863
3956
|
let typeResult;
|
|
3957
|
+
// If this is a class-like function created via NewType, treat
|
|
3958
|
+
// it like a function for purposes of member accesses.
|
|
3959
|
+
if (types_1.ClassType.isNewTypeClass(baseType) &&
|
|
3960
|
+
!baseType.priv.includeSubclasses &&
|
|
3961
|
+
prefetched?.functionClass &&
|
|
3962
|
+
(0, types_1.isClass)(prefetched.functionClass)) {
|
|
3963
|
+
baseType = types_1.ClassType.cloneAsInstance(prefetched.functionClass);
|
|
3964
|
+
}
|
|
3864
3965
|
const enumMemberResult = (0, enums_1.getTypeOfEnumMember)(evaluatorInterface, node, baseType, memberName, isIncomplete);
|
|
3865
3966
|
if (enumMemberResult) {
|
|
3866
3967
|
if (usage.method === 'get') {
|
|
@@ -4019,9 +4120,10 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
4019
4120
|
}
|
|
4020
4121
|
case 4 /* TypeCategory.Function */:
|
|
4021
4122
|
case 5 /* TypeCategory.Overloaded */: {
|
|
4022
|
-
|
|
4023
|
-
|
|
4024
|
-
//
|
|
4123
|
+
const hasSelf = (0, types_1.isMethodType)(baseType);
|
|
4124
|
+
if (memberName === '__self__' && hasSelf) {
|
|
4125
|
+
// Handle "__self__" specially because MethodType defines
|
|
4126
|
+
// it simply as "object". We can do better here.
|
|
4025
4127
|
let functionType;
|
|
4026
4128
|
if ((0, types_1.isFunction)(baseType)) {
|
|
4027
4129
|
functionType = baseType;
|
|
@@ -4032,18 +4134,11 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
4032
4134
|
functionType = overloads[0];
|
|
4033
4135
|
}
|
|
4034
4136
|
}
|
|
4035
|
-
|
|
4036
|
-
functionType.priv.preBoundFlags !== undefined &&
|
|
4037
|
-
(functionType.priv.preBoundFlags & 4 /* FunctionTypeFlags.StaticMethod */) === 0) {
|
|
4038
|
-
type = functionType.priv.boundToType;
|
|
4039
|
-
}
|
|
4137
|
+
type = functionType?.priv.boundToType;
|
|
4040
4138
|
}
|
|
4041
4139
|
else {
|
|
4042
|
-
|
|
4043
|
-
|
|
4044
|
-
? (0, typeUtils_1.convertToInstance)(prefetched.functionClass)
|
|
4045
|
-
: types_1.UnknownType.create(),
|
|
4046
|
-
}, usage, flags).type;
|
|
4140
|
+
const altType = hasSelf ? prefetched?.methodClass : prefetched?.functionClass;
|
|
4141
|
+
type = getTypeOfMemberAccessWithBaseType(node, { type: altType ? (0, typeUtils_1.convertToInstance)(altType) : types_1.UnknownType.create() }, usage, flags).type;
|
|
4047
4142
|
}
|
|
4048
4143
|
break;
|
|
4049
4144
|
}
|
|
@@ -4054,7 +4149,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
4054
4149
|
// member could not be accessed.
|
|
4055
4150
|
if (!type) {
|
|
4056
4151
|
const isFunctionRule = (0, types_1.isFunctionOrOverloaded)(baseType) ||
|
|
4057
|
-
((0, types_1.isClassInstance)(baseType) && types_1.ClassType.isBuiltIn(baseType, 'function'));
|
|
4152
|
+
((0, types_1.isClassInstance)(baseType) && types_1.ClassType.isBuiltIn(baseType, ['function', 'FunctionType']));
|
|
4058
4153
|
if (!baseTypeResult.isIncomplete) {
|
|
4059
4154
|
let diagMessage = localize_1.LocMessage.memberAccess();
|
|
4060
4155
|
if (usage.method === 'set') {
|
|
@@ -4066,7 +4161,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
4066
4161
|
// If there is an expected type diagnostic addendum (used for assignments),
|
|
4067
4162
|
// use that rather than the local diagnostic addendum because it will be
|
|
4068
4163
|
// more informative.
|
|
4069
|
-
if (usage.setExpectedTypeDiag) {
|
|
4164
|
+
if (usage.setExpectedTypeDiag && !usage.setExpectedTypeDiag.isEmpty()) {
|
|
4070
4165
|
diag = usage.setExpectedTypeDiag;
|
|
4071
4166
|
}
|
|
4072
4167
|
// If the class is a TypedDict, and there's a key with the same name,
|
|
@@ -4229,7 +4324,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
4229
4324
|
let memberAccessDeprecationInfo;
|
|
4230
4325
|
type = (0, typeUtils_1.mapSubtypes)(type, (subtype) => {
|
|
4231
4326
|
const concreteSubtype = makeTopLevelTypeVarsConcrete(subtype);
|
|
4232
|
-
const isClassMember = !memberInfo || memberInfo.isClassMember;
|
|
4327
|
+
const isClassMember = !memberInfo || (memberInfo.isClassMember && !memberInfo.isSlotsMember);
|
|
4233
4328
|
let resultType;
|
|
4234
4329
|
if ((0, types_1.isClass)(concreteSubtype) && isClassMember && errorNode) {
|
|
4235
4330
|
const descResult = applyDescriptorAccessMethod(subtype, concreteSubtype, memberInfo, classType, selfType, flags, errorNode, memberName, usage, diag);
|
|
@@ -4294,7 +4389,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
4294
4389
|
isDescriptorError = true;
|
|
4295
4390
|
}
|
|
4296
4391
|
return resultType;
|
|
4297
|
-
});
|
|
4392
|
+
}, { retainTypeAlias: true });
|
|
4298
4393
|
if (!isDescriptorError && usage.method === 'set' && usage.setType) {
|
|
4299
4394
|
if (errorNode && memberInfo.symbol.hasTypedDeclarations()) {
|
|
4300
4395
|
// This is an assignment to a member with a declared type. Apply
|
|
@@ -6182,31 +6277,33 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
6182
6277
|
secondArgType = getTypeOfExpression(node.d.args[1].d.valueExpr).type;
|
|
6183
6278
|
const secondArgConcreteType = makeTopLevelTypeVarsConcrete(secondArgType);
|
|
6184
6279
|
let reportError = false;
|
|
6185
|
-
|
|
6186
|
-
|
|
6187
|
-
|
|
6188
|
-
else if ((0, types_1.isClassInstance)(secondArgConcreteType)) {
|
|
6189
|
-
if ((0, types_1.isInstantiableClass)(concreteTargetClassType)) {
|
|
6190
|
-
if (!(0, typeUtils_1.derivesFromClassRecursive)(types_1.ClassType.cloneAsInstantiable(secondArgConcreteType), concreteTargetClassType,
|
|
6191
|
-
/* ignoreUnknown */ true)) {
|
|
6192
|
-
reportError = true;
|
|
6193
|
-
}
|
|
6280
|
+
(0, typeUtils_1.doForEachSubtype)(secondArgConcreteType, (secondArgSubtype) => {
|
|
6281
|
+
if ((0, types_1.isAnyOrUnknown)(secondArgSubtype)) {
|
|
6282
|
+
// Ignore unknown or any types.
|
|
6194
6283
|
}
|
|
6195
|
-
|
|
6196
|
-
|
|
6197
|
-
|
|
6198
|
-
if ((0, types_1.isInstantiableClass)(concreteTargetClassType)) {
|
|
6199
|
-
if (!types_1.ClassType.isBuiltIn(concreteTargetClassType, 'type') &&
|
|
6200
|
-
!(0, typeUtils_1.derivesFromClassRecursive)(secondArgConcreteType, concreteTargetClassType,
|
|
6284
|
+
else if ((0, types_1.isClassInstance)(secondArgSubtype)) {
|
|
6285
|
+
if ((0, types_1.isInstantiableClass)(concreteTargetClassType)) {
|
|
6286
|
+
if (!(0, typeUtils_1.derivesFromClassRecursive)(types_1.ClassType.cloneAsInstantiable(secondArgSubtype), concreteTargetClassType,
|
|
6201
6287
|
/* ignoreUnknown */ true)) {
|
|
6202
|
-
|
|
6288
|
+
reportError = true;
|
|
6289
|
+
}
|
|
6203
6290
|
}
|
|
6291
|
+
bindToType = secondArgSubtype;
|
|
6204
6292
|
}
|
|
6205
|
-
|
|
6206
|
-
|
|
6207
|
-
|
|
6208
|
-
|
|
6209
|
-
|
|
6293
|
+
else if ((0, types_1.isInstantiableClass)(secondArgSubtype)) {
|
|
6294
|
+
if ((0, types_1.isInstantiableClass)(concreteTargetClassType)) {
|
|
6295
|
+
if (!types_1.ClassType.isBuiltIn(concreteTargetClassType, 'type') &&
|
|
6296
|
+
!(0, typeUtils_1.derivesFromClassRecursive)(secondArgSubtype, concreteTargetClassType,
|
|
6297
|
+
/* ignoreUnknown */ true)) {
|
|
6298
|
+
reportError = true;
|
|
6299
|
+
}
|
|
6300
|
+
}
|
|
6301
|
+
bindToType = secondArgSubtype;
|
|
6302
|
+
}
|
|
6303
|
+
else {
|
|
6304
|
+
reportError = true;
|
|
6305
|
+
}
|
|
6306
|
+
});
|
|
6210
6307
|
if (reportError) {
|
|
6211
6308
|
addDiagnostic(diagnosticRules_1.DiagnosticRule.reportArgumentType, localize_1.LocMessage.superCallSecondArg().format({ type: printType(targetClassType) }), node.d.args[1].d.valueExpr);
|
|
6212
6309
|
return { type: types_1.UnknownType.create() };
|
|
@@ -7137,6 +7234,16 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
7137
7234
|
return subtype;
|
|
7138
7235
|
}
|
|
7139
7236
|
if ((0, types_1.isClass)(subtype)) {
|
|
7237
|
+
// Specifically handle the case where the subtype is a class-like
|
|
7238
|
+
// object created by calling NewType. At runtime, it's actually
|
|
7239
|
+
// a FunctionType object.
|
|
7240
|
+
if ((0, types_1.isClassInstance)(subtype) &&
|
|
7241
|
+
types_1.ClassType.isNewTypeClass(subtype) &&
|
|
7242
|
+
!subtype.priv.includeSubclasses) {
|
|
7243
|
+
if (prefetched?.functionClass) {
|
|
7244
|
+
return prefetched.functionClass;
|
|
7245
|
+
}
|
|
7246
|
+
}
|
|
7140
7247
|
return (0, typeUtils_1.convertToInstantiable)(stripLiteralValue(subtype));
|
|
7141
7248
|
}
|
|
7142
7249
|
if (types_1.TypeBase.isInstance(subtype)) {
|
|
@@ -7198,6 +7305,12 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
7198
7305
|
if (className === 'NewType') {
|
|
7199
7306
|
return { returnType: createNewType(errorNode, argList) };
|
|
7200
7307
|
}
|
|
7308
|
+
// Handle the Sentinel call specially.
|
|
7309
|
+
if (className === 'Sentinel') {
|
|
7310
|
+
if (AnalyzerNodeInfo.getFileInfo(errorNode).diagnosticRuleSet.enableExperimentalFeatures) {
|
|
7311
|
+
return { returnType: (0, sentinel_1.createSentinelType)(evaluatorInterface, errorNode, argList) };
|
|
7312
|
+
}
|
|
7313
|
+
}
|
|
7201
7314
|
if (types_1.ClassType.isSpecialFormClass(expandedCallType)) {
|
|
7202
7315
|
addDiagnostic(diagnosticRules_1.DiagnosticRule.reportCallIssue, localize_1.LocMessage.typeNotIntantiable().format({ type: className }), errorNode);
|
|
7203
7316
|
return { returnType: types_1.UnknownType.create(), argumentErrors: true };
|
|
@@ -9348,7 +9461,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
9348
9461
|
}
|
|
9349
9462
|
}
|
|
9350
9463
|
return getTypeOfTypeAliasCommon(nameNode, nameNode, valueExpr,
|
|
9351
|
-
/* isPep695Syntax */
|
|
9464
|
+
/* isPep695Syntax */ false,
|
|
9352
9465
|
/* typeParamNodes */ undefined, () => typeParams);
|
|
9353
9466
|
}
|
|
9354
9467
|
function getBooleanValue(node) {
|
|
@@ -9433,13 +9546,13 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
9433
9546
|
if (!isBaseClassAny) {
|
|
9434
9547
|
// Synthesize an __init__ method that accepts only the specified type.
|
|
9435
9548
|
const initType = types_1.FunctionType.createSynthesizedInstance('__init__');
|
|
9436
|
-
types_1.FunctionType.addParam(initType, types_1.FunctionParam.create(0 /* ParamCategory.Simple */, types_1.
|
|
9549
|
+
types_1.FunctionType.addParam(initType, types_1.FunctionParam.create(0 /* ParamCategory.Simple */, types_1.AnyType.create(), types_1.FunctionParamFlags.TypeDeclared, 'self'));
|
|
9437
9550
|
types_1.FunctionType.addParam(initType, types_1.FunctionParam.create(0 /* ParamCategory.Simple */, types_1.ClassType.cloneAsInstance(baseClass), types_1.FunctionParamFlags.TypeDeclared, '_x'));
|
|
9438
9551
|
initType.shared.declaredReturnType = getNoneType();
|
|
9439
9552
|
types_1.ClassType.getSymbolTable(classType).set('__init__', symbol_1.Symbol.createWithType(4 /* SymbolFlags.ClassMember */, initType));
|
|
9440
9553
|
// Synthesize a trivial __new__ method.
|
|
9441
9554
|
const newType = types_1.FunctionType.createSynthesizedInstance('__new__', 1 /* FunctionTypeFlags.ConstructorMethod */);
|
|
9442
|
-
types_1.FunctionType.addParam(newType, types_1.FunctionParam.create(0 /* ParamCategory.Simple */,
|
|
9555
|
+
types_1.FunctionType.addParam(newType, types_1.FunctionParam.create(0 /* ParamCategory.Simple */, types_1.AnyType.create(), types_1.FunctionParamFlags.TypeDeclared, 'cls'));
|
|
9443
9556
|
types_1.FunctionType.addDefaultParams(newType);
|
|
9444
9557
|
newType.shared.declaredReturnType = types_1.ClassType.cloneAsInstance(classType);
|
|
9445
9558
|
newType.priv.constructorTypeVarScopeId = (0, typeUtils_1.getTypeVarScopeId)(classType);
|
|
@@ -10876,7 +10989,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
10876
10989
|
}
|
|
10877
10990
|
if ((flags & 256 /* EvalFlags.TypeExpression */) !== 0) {
|
|
10878
10991
|
itemExpr.d.strings.forEach((stringNode) => {
|
|
10879
|
-
if ((stringNode.d.token.flags &
|
|
10992
|
+
if ((stringNode.d.token.flags & 1024 /* StringTokenFlags.NamedUnicodeEscape */) !== 0) {
|
|
10880
10993
|
addDiagnostic(diagnosticRules_1.DiagnosticRule.reportInvalidTypeForm, localize_1.LocMessage.literalNamedUnicodeEscape(), stringNode);
|
|
10881
10994
|
isValidTypeForm = false;
|
|
10882
10995
|
}
|
|
@@ -11545,7 +11658,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
11545
11658
|
names: variadics.map((v) => `"${v.shared.name}"`).join(', '),
|
|
11546
11659
|
}), errorNode);
|
|
11547
11660
|
}
|
|
11548
|
-
if (!sharedInfo.
|
|
11661
|
+
if (!sharedInfo.isTypeAliasType && !isPep695TypeVarType) {
|
|
11549
11662
|
const boundTypeVars = typeParams.filter((typeVar) => typeVar.priv.scopeId !== sharedInfo.typeVarScopeId &&
|
|
11550
11663
|
typeVar.priv.scopeType === 0 /* TypeVarScopeType.Class */);
|
|
11551
11664
|
if (boundTypeVars.length > 0) {
|
|
@@ -11564,7 +11677,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
11564
11677
|
});
|
|
11565
11678
|
// All PEP 695 type aliases are special forms because they are
|
|
11566
11679
|
// TypeAliasType objects at runtime.
|
|
11567
|
-
if (sharedInfo.
|
|
11680
|
+
if (sharedInfo.isTypeAliasType || isPep695TypeVarType) {
|
|
11568
11681
|
const typeAliasTypeClass = getTypingType(errorNode, 'TypeAliasType');
|
|
11569
11682
|
if (typeAliasTypeClass && (0, types_1.isInstantiableClass)(typeAliasTypeClass)) {
|
|
11570
11683
|
typeAlias = types_1.TypeBase.cloneAsSpecialForm(typeAlias, types_1.ClassType.cloneAsInstance(typeAliasTypeClass));
|
|
@@ -11618,7 +11731,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
11618
11731
|
// The _TypedDict class is marked as abstract, but the
|
|
11619
11732
|
// methods that are abstract are overridden and shouldn't
|
|
11620
11733
|
// cause the TypedDict to be marked as abstract.
|
|
11621
|
-
if ((0, types_1.isInstantiableClass)(baseClass) &&
|
|
11734
|
+
if ((0, types_1.isInstantiableClass)(baseClass) &&
|
|
11735
|
+
types_1.ClassType.isBuiltIn(baseClass, ['_TypedDict', 'TypedDictFallback'])) {
|
|
11622
11736
|
baseClass = types_1.ClassType.cloneWithNewFlags(baseClass, baseClass.shared.flags &
|
|
11623
11737
|
~(64 /* ClassTypeFlags.SupportsAbstractMethods */ | 1048576 /* ClassTypeFlags.TypeCheckOnly */));
|
|
11624
11738
|
}
|
|
@@ -11840,7 +11954,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
11840
11954
|
}
|
|
11841
11955
|
}
|
|
11842
11956
|
if (typeAliasNameNode) {
|
|
11843
|
-
typeAliasPlaceholder = synthesizeTypeAliasPlaceholder(typeAliasNameNode
|
|
11957
|
+
typeAliasPlaceholder = synthesizeTypeAliasPlaceholder(typeAliasNameNode);
|
|
11844
11958
|
writeTypeCache(node, { type: typeAliasPlaceholder }, /* flags */ undefined);
|
|
11845
11959
|
writeTypeCache(node.d.leftExpr, { type: typeAliasPlaceholder }, /* flags */ undefined);
|
|
11846
11960
|
if (node.d.leftExpr.nodeType === 54 /* ParseNodeType.TypeAnnotation */) {
|
|
@@ -11900,7 +12014,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
11900
12014
|
}
|
|
11901
12015
|
// Synthesize a TypeVar that acts as a placeholder for a type alias. This allows
|
|
11902
12016
|
// the type alias definition to refer to itself.
|
|
11903
|
-
function synthesizeTypeAliasPlaceholder(nameNode,
|
|
12017
|
+
function synthesizeTypeAliasPlaceholder(nameNode, isTypeAliasType = false) {
|
|
11904
12018
|
const placeholder = types_1.TypeVarType.createInstantiable(`__type_alias_${nameNode.d.value}`);
|
|
11905
12019
|
placeholder.shared.isSynthesized = true;
|
|
11906
12020
|
const typeVarScopeId = ParseTreeUtils.getScopeIdForNode(nameNode);
|
|
@@ -11911,7 +12025,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
11911
12025
|
moduleName: fileInfo.moduleName,
|
|
11912
12026
|
fileUri: fileInfo.fileUri,
|
|
11913
12027
|
typeVarScopeId,
|
|
11914
|
-
|
|
12028
|
+
isTypeAliasType,
|
|
11915
12029
|
typeParams: undefined,
|
|
11916
12030
|
computedVariance: undefined,
|
|
11917
12031
|
};
|
|
@@ -11939,7 +12053,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
11939
12053
|
}
|
|
11940
12054
|
// Synthesize a type variable that represents the type alias while we're
|
|
11941
12055
|
// evaluating it. This allows us to handle recursive definitions.
|
|
11942
|
-
const typeAliasTypeVar = synthesizeTypeAliasPlaceholder(nameNode,
|
|
12056
|
+
const typeAliasTypeVar = synthesizeTypeAliasPlaceholder(nameNode, /* isTypeAliasType */ true);
|
|
11943
12057
|
// Write the type to the type cache to support recursive type alias definitions.
|
|
11944
12058
|
writeTypeCache(nameNode, { type: typeAliasTypeVar }, /* flags */ undefined);
|
|
11945
12059
|
// Set a partial type to handle recursive (self-referential) type aliases.
|
|
@@ -11953,10 +12067,22 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
11953
12067
|
if (typeAliasTypeVar.shared.recursiveAlias) {
|
|
11954
12068
|
typeAliasTypeVar.shared.recursiveAlias.typeParams = typeParams ?? [];
|
|
11955
12069
|
}
|
|
11956
|
-
|
|
11957
|
-
|
|
11958
|
-
|
|
11959
|
-
|
|
12070
|
+
let aliasTypeResult;
|
|
12071
|
+
if (isPep695Syntax) {
|
|
12072
|
+
aliasTypeResult = getTypeOfExpressionExpectingType(valueNode, {
|
|
12073
|
+
forwardRefs: true,
|
|
12074
|
+
typeExpression: true,
|
|
12075
|
+
});
|
|
12076
|
+
}
|
|
12077
|
+
else {
|
|
12078
|
+
const flags = 128 /* EvalFlags.InstantiableType */ |
|
|
12079
|
+
256 /* EvalFlags.TypeExpression */ |
|
|
12080
|
+
8 /* EvalFlags.StrLiteralAsType */ |
|
|
12081
|
+
32 /* EvalFlags.NoParamSpec */ |
|
|
12082
|
+
64 /* EvalFlags.NoTypeVarTuple */ |
|
|
12083
|
+
131072 /* EvalFlags.NoClassVar */;
|
|
12084
|
+
aliasTypeResult = getTypeOfExpression(valueNode, flags);
|
|
12085
|
+
}
|
|
11960
12086
|
let isIncomplete = false;
|
|
11961
12087
|
let aliasType = aliasTypeResult.type;
|
|
11962
12088
|
if (aliasTypeResult.isIncomplete) {
|
|
@@ -12058,8 +12184,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
12058
12184
|
if (fileInfo.isStubFile) {
|
|
12059
12185
|
classFlags |= 262144 /* ClassTypeFlags.DefinedInStub */;
|
|
12060
12186
|
}
|
|
12061
|
-
const classType = types_1.ClassType.createInstantiable(node.d.name.d.value, ParseTreeUtils.getClassFullName(node, fileInfo.moduleName, node.d.name.d.value), fileInfo.moduleName, fileInfo.fileUri, classFlags,
|
|
12062
|
-
/* typeSourceId */ 0,
|
|
12187
|
+
const classType = types_1.ClassType.createInstantiable(node.d.name.d.value, ParseTreeUtils.getClassFullName(node, fileInfo.moduleName, node.d.name.d.value), fileInfo.moduleName, fileInfo.fileUri, classFlags, ParseTreeUtils.getTypeSourceId(node),
|
|
12063
12188
|
/* declaredMetaclass */ undefined,
|
|
12064
12189
|
/* effectiveMetaclass */ undefined, ParseTreeUtils.getDocString(node.d.suite.d.statements));
|
|
12065
12190
|
classType.shared.typeVarScopeId = ParseTreeUtils.getScopeIdForNode(node);
|
|
@@ -12231,11 +12356,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
12231
12356
|
}
|
|
12232
12357
|
// Determine if the class is abstract. Protocol classes support abstract methods
|
|
12233
12358
|
// because they are constructed by the _ProtocolMeta metaclass, which derives
|
|
12234
|
-
// from ABCMeta.
|
|
12235
|
-
|
|
12236
|
-
// because of dependencies on some of these built-in protocol classes.
|
|
12237
|
-
if (types_1.ClassType.supportsAbstractMethods(argType) ||
|
|
12238
|
-
(types_1.ClassType.isProtocolClass(argType) && !types_1.ClassType.isBuiltIn(argType))) {
|
|
12359
|
+
// from ABCMeta.
|
|
12360
|
+
if (types_1.ClassType.supportsAbstractMethods(argType) || types_1.ClassType.isProtocolClass(argType)) {
|
|
12239
12361
|
classType.shared.flags |= 64 /* ClassTypeFlags.SupportsAbstractMethods */;
|
|
12240
12362
|
}
|
|
12241
12363
|
if (types_1.ClassType.isPropertyClass(argType)) {
|
|
@@ -12386,8 +12508,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
12386
12508
|
}
|
|
12387
12509
|
else if (variadics.length > 0) {
|
|
12388
12510
|
// Make sure a TypeVar with a default doesn't come after a TypeVarTuple.
|
|
12389
|
-
const firstVariadicIndex =
|
|
12390
|
-
const typeVarWithDefaultIndex =
|
|
12511
|
+
const firstVariadicIndex = typeParams.findIndex((param) => (0, types_1.isTypeVarTuple)(param));
|
|
12512
|
+
const typeVarWithDefaultIndex = typeParams.findIndex((param, index) => index > firstVariadicIndex && !(0, types_1.isParamSpec)(param) && param.shared.isDefaultExplicit);
|
|
12391
12513
|
if (typeVarWithDefaultIndex >= 0) {
|
|
12392
12514
|
addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.typeVarWithDefaultFollowsVariadic().format({
|
|
12393
12515
|
typeVarName: typeParams[typeVarWithDefaultIndex].shared.name,
|
|
@@ -12551,7 +12673,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
12551
12673
|
classType.shared.baseClasses.forEach((baseClass) => {
|
|
12552
12674
|
if ((0, types_1.isClass)(baseClass) &&
|
|
12553
12675
|
!types_1.ClassType.isTypedDictClass(baseClass) &&
|
|
12554
|
-
!types_1.ClassType.isBuiltIn(baseClass, ['_TypedDict', 'Generic'])) {
|
|
12676
|
+
!types_1.ClassType.isBuiltIn(baseClass, ['_TypedDict', 'TypedDictFallback', 'Generic'])) {
|
|
12555
12677
|
foundInvalidBaseClass = true;
|
|
12556
12678
|
diag.addMessage(localize_1.LocAddendum.typedDictBaseClass().format({ type: baseClass.shared.name }));
|
|
12557
12679
|
}
|
|
@@ -13472,11 +13594,12 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
13472
13594
|
function inferParamTypeFromDefaultValue(paramValueExpr) {
|
|
13473
13595
|
const defaultValueType = getTypeOfExpression(paramValueExpr, 1 /* EvalFlags.ConvertEllipsisToAny */).type;
|
|
13474
13596
|
let inferredParamType;
|
|
13475
|
-
// Is the default value a "None" or an instance of some private
|
|
13476
|
-
// whose name starts with an underscore)? If so, we will assume
|
|
13477
|
-
// value is a singleton sentinel. The actual supported type is
|
|
13478
|
-
// a union of this type and Unknown.
|
|
13597
|
+
// Is the default value a "None", a sentinel, or an instance of some private
|
|
13598
|
+
// class (one whose name starts with an underscore)? If so, we will assume
|
|
13599
|
+
// that the value is a singleton sentinel. The actual supported type is
|
|
13600
|
+
// going to be a union of this type and Unknown.
|
|
13479
13601
|
if ((0, typeUtils_1.isNoneInstance)(defaultValueType) ||
|
|
13602
|
+
(0, typeUtils_1.isSentinelLiteral)(defaultValueType) ||
|
|
13480
13603
|
((0, types_1.isClassInstance)(defaultValueType) && (0, symbolNameUtils_1.isPrivateOrProtectedName)(defaultValueType.shared.name))) {
|
|
13481
13604
|
inferredParamType = (0, types_1.combineTypes)([defaultValueType, types_1.UnknownType.create()]);
|
|
13482
13605
|
}
|
|
@@ -13748,7 +13871,10 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
13748
13871
|
const inferredYieldType = (0, types_1.combineTypes)(inferredYieldTypes);
|
|
13749
13872
|
// Inferred yield types need to be wrapped in a Generator or
|
|
13750
13873
|
// AwaitableGenerator to produce the final result.
|
|
13751
|
-
const generatorType =
|
|
13874
|
+
const generatorType = useAwaitableGenerator
|
|
13875
|
+
? getTypeCheckerInternalsType(node, 'AwaitableGenerator') ??
|
|
13876
|
+
getTypingType(node, 'AwaitableGenerator')
|
|
13877
|
+
: getTypingType(node, 'Generator');
|
|
13752
13878
|
if (generatorType && (0, types_1.isInstantiableClass)(generatorType)) {
|
|
13753
13879
|
const typeArgs = [];
|
|
13754
13880
|
// The "send type" for the generator (the second type argument) is
|
|
@@ -14688,8 +14814,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
14688
14814
|
}
|
|
14689
14815
|
return undefined;
|
|
14690
14816
|
}
|
|
14691
|
-
function getCodeFlowAnalyzerForNode(
|
|
14692
|
-
let entries = codeFlowAnalyzerCache.get(
|
|
14817
|
+
function getCodeFlowAnalyzerForNode(node, typeAtStart) {
|
|
14818
|
+
let entries = codeFlowAnalyzerCache.get(node.id);
|
|
14693
14819
|
if (entries) {
|
|
14694
14820
|
const cachedEntry = entries.find((entry) => {
|
|
14695
14821
|
if (!typeAtStart || !entry.typeAtStart) {
|
|
@@ -14711,7 +14837,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
14711
14837
|
}
|
|
14712
14838
|
else {
|
|
14713
14839
|
entries = [{ typeAtStart, codeFlowAnalyzer: analyzer }];
|
|
14714
|
-
codeFlowAnalyzerCache.set(
|
|
14840
|
+
codeFlowAnalyzerCache.set(node.id, entries);
|
|
14715
14841
|
}
|
|
14716
14842
|
return analyzer;
|
|
14717
14843
|
}
|
|
@@ -14747,7 +14873,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
14747
14873
|
analyzer = getCodeFlowAnalyzerForReturnTypeInferenceContext();
|
|
14748
14874
|
}
|
|
14749
14875
|
else {
|
|
14750
|
-
analyzer = getCodeFlowAnalyzerForNode(executionNode
|
|
14876
|
+
analyzer = getCodeFlowAnalyzerForNode(executionNode, options?.typeAtStart);
|
|
14751
14877
|
}
|
|
14752
14878
|
const flowNode = AnalyzerNodeInfo.getFlowNode(startNode ?? reference);
|
|
14753
14879
|
if (flowNode === undefined) {
|
|
@@ -15737,7 +15863,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
15737
15863
|
const classTypeInfo = getTypeOfClass(classNode);
|
|
15738
15864
|
return {
|
|
15739
15865
|
type: classTypeInfo
|
|
15740
|
-
? (0, typeUtils_1.synthesizeTypeVarForSelfCls)(classTypeInfo.classType, /* isClsParam */ true)
|
|
15866
|
+
? types_1.TypeVarType.cloneAsBound((0, typeUtils_1.synthesizeTypeVarForSelfCls)(classTypeInfo.classType, /* isClsParam */ true))
|
|
15741
15867
|
: types_1.UnknownType.create(),
|
|
15742
15868
|
};
|
|
15743
15869
|
}
|
|
@@ -16157,8 +16283,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
16157
16283
|
// in the event that its inferred type is instantiable or explicitly Any
|
|
16158
16284
|
// (but not an ellipsis).
|
|
16159
16285
|
if (isLegalImplicitTypeAliasType(inferredType)) {
|
|
16160
|
-
const typeAliasTypeVar = synthesizeTypeAliasPlaceholder(resolvedDecl.typeAliasName
|
|
16161
|
-
/* isPep695Syntax */ false);
|
|
16286
|
+
const typeAliasTypeVar = synthesizeTypeAliasPlaceholder(resolvedDecl.typeAliasName);
|
|
16162
16287
|
inferredType = transformTypeForTypeAlias(inferredType, resolvedDecl.node, typeAliasTypeVar,
|
|
16163
16288
|
/* isPep695TypeVarType */ false);
|
|
16164
16289
|
isUnambiguousType = true;
|
|
@@ -16952,7 +17077,6 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
16952
17077
|
if (errorNode &&
|
|
16953
17078
|
selfClass &&
|
|
16954
17079
|
(0, types_1.isClass)(selfClass) &&
|
|
16955
|
-
!selfClass.priv.includeSubclasses &&
|
|
16956
17080
|
member.isInstanceMember &&
|
|
16957
17081
|
(0, types_1.isClass)(member.unspecializedClassType) &&
|
|
16958
17082
|
(flags & 1024 /* MemberAccessFlags.DisallowGenericInstanceVariableAccess */) !== 0 &&
|
|
@@ -17421,6 +17545,14 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
17421
17545
|
}
|
|
17422
17546
|
}
|
|
17423
17547
|
}
|
|
17548
|
+
// If the source is a class-like type created by a call to NewType, treat it
|
|
17549
|
+
// as a FunctionClass instance rather than an instantiable class for
|
|
17550
|
+
// purposes of assignability. This reflects its actual runtime type.
|
|
17551
|
+
if ((0, types_1.isInstantiableClass)(srcType) && types_1.ClassType.isNewTypeClass(srcType) && !srcType.priv.includeSubclasses) {
|
|
17552
|
+
if (prefetched?.functionClass && (0, types_1.isInstantiableClass)(prefetched?.functionClass)) {
|
|
17553
|
+
srcType = types_1.ClassType.cloneAsInstance(prefetched.functionClass);
|
|
17554
|
+
}
|
|
17555
|
+
}
|
|
17424
17556
|
if (recursionCount > types_1.maxTypeRecursionCount) {
|
|
17425
17557
|
return true;
|
|
17426
17558
|
}
|
|
@@ -17748,16 +17880,6 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
17748
17880
|
concreteSrcType.priv.tupleTypeArgs) {
|
|
17749
17881
|
return assignType(destType, (0, typeUtils_1.combineTupleTypeArgs)(concreteSrcType.priv.tupleTypeArgs), diag, constraints, flags, recursionCount);
|
|
17750
17882
|
}
|
|
17751
|
-
// Handle enum literals that are assignable to another (non-Enum) literal.
|
|
17752
|
-
// This can happen for IntEnum and StrEnum members.
|
|
17753
|
-
if (types_1.ClassType.isEnumClass(concreteSrcType) &&
|
|
17754
|
-
concreteSrcType.priv.literalValue instanceof types_1.EnumLiteral &&
|
|
17755
|
-
concreteSrcType.shared.mro.some((base) => (0, types_1.isClass)(base) && types_1.ClassType.isBuiltIn(base, ['int', 'str', 'bytes'])) &&
|
|
17756
|
-
(0, types_1.isClassInstance)(concreteSrcType.priv.literalValue.itemType) &&
|
|
17757
|
-
(0, typeUtils_1.isLiteralType)(concreteSrcType.priv.literalValue.itemType) &&
|
|
17758
|
-
assignType(destType, concreteSrcType.priv.literalValue.itemType)) {
|
|
17759
|
-
return true;
|
|
17760
|
-
}
|
|
17761
17883
|
if (destType.priv.literalValue !== undefined &&
|
|
17762
17884
|
types_1.ClassType.isSameGenericClass(destType, concreteSrcType)) {
|
|
17763
17885
|
const srcLiteral = concreteSrcType.priv.literalValue;
|
|
@@ -17797,9 +17919,10 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
17797
17919
|
if (destCallbackType) {
|
|
17798
17920
|
return assignType(destCallbackType, concreteSrcType, diag, constraints, flags, recursionCount);
|
|
17799
17921
|
}
|
|
17800
|
-
// All functions are considered instances of "
|
|
17801
|
-
|
|
17802
|
-
|
|
17922
|
+
// All functions are considered instances of "types.FunctionType" or "types.MethodType".
|
|
17923
|
+
const altClass = (0, types_1.isMethodType)(concreteSrcType) ? prefetched?.methodClass : prefetched?.functionClass;
|
|
17924
|
+
if (altClass) {
|
|
17925
|
+
return assignType(destType, (0, typeUtils_1.convertToInstance)(altClass), diag, constraints, flags, recursionCount);
|
|
17803
17926
|
}
|
|
17804
17927
|
}
|
|
17805
17928
|
else if ((0, types_1.isModule)(concreteSrcType)) {
|
|
@@ -18742,8 +18865,12 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
18742
18865
|
if (srcParamSpec) {
|
|
18743
18866
|
srcType = types_1.FunctionType.cloneRemoveParamSpecArgsKwargs(srcType);
|
|
18744
18867
|
}
|
|
18745
|
-
const destParamDetails = (0, parameterUtils_1.getParamListDetails)(destType
|
|
18746
|
-
|
|
18868
|
+
const destParamDetails = (0, parameterUtils_1.getParamListDetails)(destType, {
|
|
18869
|
+
disallowExtraKwargsForTd: (flags & 131072 /* AssignTypeFlags.DisallowExtraKwargsForTd */) !== 0,
|
|
18870
|
+
});
|
|
18871
|
+
const srcParamDetails = (0, parameterUtils_1.getParamListDetails)(srcType, {
|
|
18872
|
+
disallowExtraKwargsForTd: (flags & 131072 /* AssignTypeFlags.DisallowExtraKwargsForTd */) !== 0,
|
|
18873
|
+
});
|
|
18747
18874
|
adjustSourceParamDetailsForDestVariadic(isContra ? destParamDetails : srcParamDetails, isContra ? srcParamDetails : destParamDetails);
|
|
18748
18875
|
const targetIncludesParamSpec = isContra ? !!srcParamSpec : !!destParamSpec;
|
|
18749
18876
|
const destPositionalCount = destParamDetails.firstKeywordOnlyIndex ?? destParamDetails.params.length;
|
|
@@ -19125,12 +19252,16 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
19125
19252
|
canAssign = false;
|
|
19126
19253
|
}
|
|
19127
19254
|
}
|
|
19128
|
-
|
|
19129
|
-
|
|
19130
|
-
|
|
19131
|
-
types_1.FunctionType.isGradualCallableForm(srcType) &&
|
|
19132
|
-
|
|
19133
|
-
|
|
19255
|
+
if ((flags & 16 /* AssignTypeFlags.OverloadOverlap */) !== 0) {
|
|
19256
|
+
// If we're checking for full overlapping overloads and the source is
|
|
19257
|
+
// a gradual form, the dest must also be a gradual form.
|
|
19258
|
+
if (types_1.FunctionType.isGradualCallableForm(srcType) && !types_1.FunctionType.isGradualCallableForm(destType)) {
|
|
19259
|
+
canAssign = false;
|
|
19260
|
+
}
|
|
19261
|
+
// If the src contains a ParamSpec the dest must also.
|
|
19262
|
+
if (srcParamSpec && !destParamSpec) {
|
|
19263
|
+
canAssign = false;
|
|
19264
|
+
}
|
|
19134
19265
|
}
|
|
19135
19266
|
// If the source and the dest are using the same ParamSpec, any additional
|
|
19136
19267
|
// concatenated parameters must match.
|
|
@@ -20295,7 +20426,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
20295
20426
|
getTypeClassType,
|
|
20296
20427
|
getBuiltInObject,
|
|
20297
20428
|
getTypingType,
|
|
20298
|
-
|
|
20429
|
+
getTypeCheckerInternalsType,
|
|
20430
|
+
assignTypeArgs,
|
|
20299
20431
|
reportMissingTypeArgs,
|
|
20300
20432
|
inferReturnTypeIfNecessary,
|
|
20301
20433
|
inferVarianceForClass,
|
|
@@ -20303,7 +20435,6 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
|
20303
20435
|
isFinalVariableDeclaration,
|
|
20304
20436
|
isExplicitTypeAliasDeclaration,
|
|
20305
20437
|
addInformation,
|
|
20306
|
-
addUnusedCode,
|
|
20307
20438
|
addUnreachableCode,
|
|
20308
20439
|
addDeprecated,
|
|
20309
20440
|
addDiagnostic,
|