@zzzen/pyright-internal 1.2.0-dev.20261101 → 1.2.0-dev.20261108

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/dist/analyzer/binder.js +9 -3
  2. package/dist/analyzer/binder.js.map +1 -1
  3. package/dist/analyzer/constructorTransform.js +12 -0
  4. package/dist/analyzer/constructorTransform.js.map +1 -1
  5. package/dist/analyzer/constructors.d.ts +1 -1
  6. package/dist/analyzer/constructors.js +1 -1
  7. package/dist/analyzer/constructors.js.map +1 -1
  8. package/dist/analyzer/decorators.d.ts +1 -1
  9. package/dist/analyzer/decorators.js.map +1 -1
  10. package/dist/analyzer/functionTransform.d.ts +5 -0
  11. package/dist/analyzer/functionTransform.js +6 -3
  12. package/dist/analyzer/functionTransform.js.map +1 -1
  13. package/dist/analyzer/missingBindingMetadata.d.ts +6 -0
  14. package/dist/analyzer/missingBindingMetadata.js +22 -0
  15. package/dist/analyzer/missingBindingMetadata.js.map +1 -0
  16. package/dist/analyzer/namedTuples.d.ts +4 -1
  17. package/dist/analyzer/namedTuples.js +1 -0
  18. package/dist/analyzer/namedTuples.js.map +1 -1
  19. package/dist/analyzer/patternMatching.d.ts +5 -1
  20. package/dist/analyzer/patternMatching.js +3 -0
  21. package/dist/analyzer/patternMatching.js.map +1 -1
  22. package/dist/analyzer/program.d.ts +3 -0
  23. package/dist/analyzer/program.js +71 -1
  24. package/dist/analyzer/program.js.map +1 -1
  25. package/dist/analyzer/tuples.d.ts +1 -1
  26. package/dist/analyzer/tuples.js.map +1 -1
  27. package/dist/analyzer/typeCacheUtils.d.ts +1 -0
  28. package/dist/analyzer/typeCacheUtils.js +10 -0
  29. package/dist/analyzer/typeCacheUtils.js.map +1 -1
  30. package/dist/analyzer/typeEvaluator/boundMethodSpecialization.d.ts +15 -0
  31. package/dist/analyzer/typeEvaluator/boundMethodSpecialization.js +98 -0
  32. package/dist/analyzer/typeEvaluator/boundMethodSpecialization.js.map +1 -0
  33. package/dist/analyzer/typeEvaluator/classConstruction.d.ts +25 -0
  34. package/dist/analyzer/typeEvaluator/classConstruction.js +251 -0
  35. package/dist/analyzer/typeEvaluator/classConstruction.js.map +1 -0
  36. package/dist/analyzer/typeEvaluator/collectionInference.d.ts +41 -0
  37. package/dist/analyzer/typeEvaluator/collectionInference.js +695 -0
  38. package/dist/analyzer/typeEvaluator/collectionInference.js.map +1 -0
  39. package/dist/analyzer/typeEvaluator/diagnostics.d.ts +33 -0
  40. package/dist/analyzer/typeEvaluator/diagnostics.js +198 -0
  41. package/dist/analyzer/typeEvaluator/diagnostics.js.map +1 -0
  42. package/dist/analyzer/typeEvaluator/evaluatorCore.d.ts +80 -0
  43. package/dist/analyzer/typeEvaluator/evaluatorCore.js +1126 -0
  44. package/dist/analyzer/typeEvaluator/evaluatorCore.js.map +1 -0
  45. package/dist/analyzer/typeEvaluator/evaluatorNarrowing.d.ts +17 -0
  46. package/dist/analyzer/typeEvaluator/evaluatorNarrowing.js +370 -0
  47. package/dist/analyzer/typeEvaluator/evaluatorNarrowing.js.map +1 -0
  48. package/dist/analyzer/typeEvaluator/expressionEvaluation.d.ts +81 -0
  49. package/dist/analyzer/typeEvaluator/expressionEvaluation.js +1802 -0
  50. package/dist/analyzer/typeEvaluator/expressionEvaluation.js.map +1 -0
  51. package/dist/analyzer/typeEvaluator/flowAnalysis.d.ts +33 -0
  52. package/dist/analyzer/typeEvaluator/flowAnalysis.js +217 -0
  53. package/dist/analyzer/typeEvaluator/flowAnalysis.js.map +1 -0
  54. package/dist/analyzer/typeEvaluator/internals.d.ts +137 -0
  55. package/dist/analyzer/typeEvaluator/internals.js +10 -0
  56. package/dist/analyzer/typeEvaluator/internals.js.map +1 -0
  57. package/dist/analyzer/typeEvaluator/literalTypes.d.ts +3 -0
  58. package/dist/analyzer/typeEvaluator/literalTypes.js +52 -0
  59. package/dist/analyzer/typeEvaluator/literalTypes.js.map +1 -0
  60. package/dist/analyzer/typeEvaluator/memberResolution.d.ts +79 -0
  61. package/dist/analyzer/typeEvaluator/memberResolution.js +1007 -0
  62. package/dist/analyzer/typeEvaluator/memberResolution.js.map +1 -0
  63. package/dist/analyzer/typeEvaluator/overrideValidation.d.ts +15 -0
  64. package/dist/analyzer/typeEvaluator/overrideValidation.js +422 -0
  65. package/dist/analyzer/typeEvaluator/overrideValidation.js.map +1 -0
  66. package/dist/analyzer/typeEvaluator/returnTypeInference.d.ts +33 -0
  67. package/dist/analyzer/typeEvaluator/returnTypeInference.js +226 -0
  68. package/dist/analyzer/typeEvaluator/returnTypeInference.js.map +1 -0
  69. package/dist/analyzer/typeEvaluator/specialFormCreation.d.ts +39 -0
  70. package/dist/analyzer/typeEvaluator/specialFormCreation.js +1728 -0
  71. package/dist/analyzer/typeEvaluator/specialFormCreation.js.map +1 -0
  72. package/dist/analyzer/typeEvaluator/tupleUnpacking.d.ts +2 -0
  73. package/dist/analyzer/typeEvaluator/tupleUnpacking.js +36 -0
  74. package/dist/analyzer/typeEvaluator/tupleUnpacking.js.map +1 -0
  75. package/dist/analyzer/typeEvaluator/typeCompatibility.d.ts +36 -0
  76. package/dist/analyzer/typeEvaluator/typeCompatibility.js +1320 -0
  77. package/dist/analyzer/typeEvaluator/typeCompatibility.js.map +1 -0
  78. package/dist/analyzer/typeEvaluator/typeGuardNarrowing.d.ts +186 -0
  79. package/dist/analyzer/typeEvaluator/typeGuardNarrowing.js +1683 -0
  80. package/dist/analyzer/typeEvaluator/typeGuardNarrowing.js.map +1 -0
  81. package/dist/analyzer/typeEvaluator/typeVarHandling.d.ts +48 -0
  82. package/dist/analyzer/typeEvaluator/typeVarHandling.js +756 -0
  83. package/dist/analyzer/typeEvaluator/typeVarHandling.js.map +1 -0
  84. package/dist/analyzer/typeEvaluator.d.ts +3 -31
  85. package/dist/analyzer/typeEvaluator.js +5033 -13761
  86. package/dist/analyzer/typeEvaluator.js.map +1 -1
  87. package/dist/analyzer/typeGuards.d.ts +2 -2
  88. package/dist/analyzer/typeGuards.js +212 -1567
  89. package/dist/analyzer/typeGuards.js.map +1 -1
  90. package/dist/analyzer/typeUtils.js +6 -2
  91. package/dist/analyzer/typeUtils.js.map +1 -1
  92. package/dist/analyzer/typedDicts.js +111 -0
  93. package/dist/analyzer/typedDicts.js.map +1 -1
  94. package/dist/browser/browserConnection.d.ts +12 -0
  95. package/dist/browser/browserConnection.js +23 -0
  96. package/dist/browser/browserConnection.js.map +1 -0
  97. package/dist/browser/browserFileSystem.d.ts +73 -0
  98. package/dist/browser/browserFileSystem.js +578 -0
  99. package/dist/browser/browserFileSystem.js.map +1 -0
  100. package/dist/browser/browserHost.d.ts +4 -0
  101. package/dist/browser/browserHost.js +10 -0
  102. package/dist/browser/browserHost.js.map +1 -0
  103. package/dist/browser/browserProcess.d.ts +1 -0
  104. package/dist/browser/browserProcess.js +17 -0
  105. package/dist/browser/browserProcess.js.map +1 -0
  106. package/dist/browser/browserServer.d.ts +8 -0
  107. package/dist/browser/browserServer.js +32 -0
  108. package/dist/browser/browserServer.js.map +1 -0
  109. package/dist/browser/cancellation/common.d.ts +10 -0
  110. package/dist/browser/cancellation/common.js +114 -0
  111. package/dist/browser/cancellation/common.js.map +1 -0
  112. package/dist/browser/cancellation/objectURLReceiverStrategy.d.ts +5 -0
  113. package/dist/browser/cancellation/objectURLReceiverStrategy.js +37 -0
  114. package/dist/browser/cancellation/objectURLReceiverStrategy.js.map +1 -0
  115. package/dist/browser/cancellation/objectURLSenderStrategy.d.ts +7 -0
  116. package/dist/browser/cancellation/objectURLSenderStrategy.js +32 -0
  117. package/dist/browser/cancellation/objectURLSenderStrategy.js.map +1 -0
  118. package/dist/browser/worker.d.ts +1 -0
  119. package/dist/browser/worker.js +33 -0
  120. package/dist/browser/worker.js.map +1 -0
  121. package/dist/pyrightServer.d.ts +34 -0
  122. package/dist/pyrightServer.js +239 -0
  123. package/dist/pyrightServer.js.map +1 -0
  124. package/dist/server.d.ts +3 -23
  125. package/dist/server.js +12 -232
  126. package/dist/server.js.map +1 -1
  127. package/dist/tests/benchmarks/typeInferenceComparison.d.ts +1 -0
  128. package/dist/tests/benchmarks/typeInferenceComparison.js +1235 -0
  129. package/dist/tests/benchmarks/typeInferenceComparison.js.map +1 -0
  130. package/dist/tests/benchmarks/typeInferencePyrightEntry.d.ts +1 -0
  131. package/dist/tests/benchmarks/typeInferencePyrightEntry.js +53 -0
  132. package/dist/tests/benchmarks/typeInferencePyrightEntry.js.map +1 -0
  133. package/dist/tests/browserCancellation.test.d.ts +1 -0
  134. package/dist/tests/browserCancellation.test.js +63 -0
  135. package/dist/tests/browserCancellation.test.js.map +1 -0
  136. package/dist/tests/browserServer.test.d.ts +1 -0
  137. package/dist/tests/browserServer.test.js +177 -0
  138. package/dist/tests/browserServer.test.js.map +1 -0
  139. package/dist/tests/constraintSolver.test.js +45 -0
  140. package/dist/tests/constraintSolver.test.js.map +1 -1
  141. package/dist/tests/mypyPrimerAnalysis.test.js +15 -1
  142. package/dist/tests/mypyPrimerAnalysis.test.js.map +1 -1
  143. package/dist/tests/typeCacheUtils.test.js +46 -0
  144. package/dist/tests/typeCacheUtils.test.js.map +1 -1
  145. package/dist/tests/typeEvaluator1.test.js +75 -0
  146. package/dist/tests/typeEvaluator1.test.js.map +1 -1
  147. package/dist/tests/typeEvaluator3.test.js +4 -0
  148. package/dist/tests/typeEvaluator3.test.js.map +1 -1
  149. package/dist/tests/typeEvaluator4.test.js +32 -0
  150. package/dist/tests/typeEvaluator4.test.js.map +1 -1
  151. package/dist/tests/typeEvaluator7.test.js +394 -0
  152. package/dist/tests/typeEvaluator7.test.js.map +1 -1
  153. package/dist/tests/typeUtils.test.js +28 -0
  154. package/dist/tests/typeUtils.test.js.map +1 -1
  155. package/dist/typeServer/stubGenerator.js +136 -3
  156. package/dist/typeServer/stubGenerator.js.map +1 -1
  157. package/dist/typeServer/typeServerConversionUtils.js +13 -0
  158. package/dist/typeServer/typeServerConversionUtils.js.map +1 -1
  159. package/package.json +3 -1
@@ -0,0 +1,1802 @@
1
+ "use strict";
2
+ /*
3
+ * expressionEvaluation.ts
4
+ * Copyright (c) Microsoft Corporation.
5
+ * Licensed under the MIT license.
6
+ *
7
+ * expressionEvaluation implementation, using evaluator-owned dependencies and state.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.getIndexAccessMagicMethodName = getIndexAccessMagicMethodName;
44
+ exports.createExpressionEvaluation = createExpressionEvaluation;
45
+ const collectionUtils_1 = require("../../common/collectionUtils");
46
+ const debug_1 = require("../../common/debug");
47
+ const diagnostic_1 = require("../../common/diagnostic");
48
+ const diagnosticRules_1 = require("../../common/diagnosticRules");
49
+ const localize_1 = require("../../localization/localize");
50
+ const parser_1 = require("../../parser/parser");
51
+ const analyzerFileInfo_1 = require("../analyzerFileInfo");
52
+ const decorators_1 = require("../decorators");
53
+ const ParseTreeUtils = __importStar(require("../parseTreeUtils"));
54
+ const tuples_1 = require("../tuples");
55
+ const typedDicts_1 = require("../typedDicts");
56
+ const typeGuards_1 = require("../typeGuards");
57
+ const types_1 = require("../types");
58
+ const typeUtils_1 = require("../typeUtils");
59
+ function getIndexAccessMagicMethodName(usage) {
60
+ if (usage.method === 'get') {
61
+ return '__getitem__';
62
+ }
63
+ else if (usage.method === 'set') {
64
+ return '__setitem__';
65
+ }
66
+ else {
67
+ (0, debug_1.assert)(usage.method === 'del');
68
+ return '__delitem__';
69
+ }
70
+ }
71
+ // Evaluates expression forms and expands call arguments using evaluator-owned caches and callbacks.
72
+ function createExpressionEvaluation(context) {
73
+ const { addDiagnostic, addInformation, cloneBuiltinObjectWithLiteral, collectLiteralEnumClasses, convertNodeToArg, evaluatorInterface, expectedTypeWantsTypeForm, getBoundMagicMethod, getBuiltInObject, getBuiltInType, getDeclaredTypeOfSymbol, getEffectiveTypeOfSymbol, getNoneType, getObjectType, getScopeForNode, getTypeOfArgExpectingType, getTypeOfAwaitable, getTypeOfClass, getTypeOfExpression, getTypeOfFunction, getTypeVarScopesForNode, getTypingType, isSpeculativeModeInUse, lookUpSymbolRecursive, makeTopLevelTypeVarsConcrete, mapSubtypesExpandTypeVars, nodeInfo, normalizeEnumTypes, printSrcDestTypes, printType, resolveDeclaredMemberType, setTypeResultForNode, stripTypeGuard, useSpeculativeMode, validateCallArgs, maxSingleOverloadArgTypeExpansionCount, } = context;
74
+ function getTypeOfEllipsis(flags, typeResult, node) {
75
+ if ((flags & 1 /* EvalFlags.ConvertEllipsisToAny */) !== 0) {
76
+ typeResult = { type: types_1.AnyType.create(/* isEllipsis */ true) };
77
+ }
78
+ else {
79
+ if ((flags & 256 /* EvalFlags.TypeExpression */) !== 0 && (flags & 65536 /* EvalFlags.AllowEllipsis */) === 0) {
80
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportInvalidTypeForm, localize_1.LocMessage.ellipsisContext(), node);
81
+ typeResult = { type: types_1.UnknownType.create() };
82
+ }
83
+ else {
84
+ const ellipsisType = getBuiltInObject(node, 'EllipsisType') ?? getBuiltInObject(node, 'ellipsis') ?? types_1.AnyType.create();
85
+ typeResult = { type: ellipsisType };
86
+ }
87
+ }
88
+ return typeResult;
89
+ }
90
+ function getTypeOfUnpackOperator(node, flags, inferenceContext) {
91
+ let typeResult;
92
+ let iterExpectedType;
93
+ if (inferenceContext) {
94
+ const iterableType = getBuiltInType(node, 'Iterable');
95
+ if (iterableType && (0, types_1.isInstantiableClass)(iterableType)) {
96
+ iterExpectedType = types_1.ClassType.cloneAsInstance(types_1.ClassType.specialize(iterableType, [inferenceContext.expectedType]));
97
+ }
98
+ }
99
+ const iterTypeResult = getTypeOfExpression(node.d.expr, flags, (0, typeUtils_1.makeInferenceContext)(iterExpectedType));
100
+ const iterType = iterTypeResult.type;
101
+ if ((flags & 64 /* EvalFlags.NoTypeVarTuple */) === 0 && (0, types_1.isTypeVarTuple)(iterType) && !iterType.priv.isUnpacked) {
102
+ typeResult = { type: types_1.TypeVarType.cloneForUnpacked(iterType) };
103
+ }
104
+ else if ((flags & 4194304 /* EvalFlags.AllowUnpackedTuple */) !== 0 &&
105
+ (0, types_1.isInstantiableClass)(iterType) &&
106
+ types_1.ClassType.isBuiltIn(iterType, 'tuple')) {
107
+ typeResult = { type: types_1.ClassType.cloneForUnpacked(iterType) };
108
+ }
109
+ else if ((flags & 256 /* EvalFlags.TypeExpression */) !== 0) {
110
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportInvalidTypeForm, localize_1.LocMessage.unpackInAnnotation(), node, node.d.starToken);
111
+ typeResult = { type: types_1.UnknownType.create() };
112
+ }
113
+ else {
114
+ const iteratorTypeResult = getTypeOfIterator(iterTypeResult, /* isAsync */ false, node) ?? {
115
+ type: types_1.UnknownType.create(!!iterTypeResult.isIncomplete),
116
+ isIncomplete: iterTypeResult.isIncomplete,
117
+ };
118
+ typeResult = {
119
+ type: iteratorTypeResult.type,
120
+ typeErrors: iterTypeResult.typeErrors,
121
+ unpackedType: iterType,
122
+ isIncomplete: iteratorTypeResult.isIncomplete,
123
+ };
124
+ }
125
+ return typeResult;
126
+ }
127
+ // Calls back into the parser to parse the contents of a string literal.
128
+ // This is unfortunately needed in some cases — specifically where the
129
+ // parser couldn't determine that the string literal would be used in
130
+ // a context where it should be treated as a forward-declared type. This
131
+ // call produces an expression tree that is not attached to the main parse
132
+ // expression tree because we don't want to mutate the latter; the
133
+ // expression tree created by this function is therefore used only temporarily.
134
+ function parseStringAsTypeAnnotation(node, reportErrors) {
135
+ const fileInfo = nodeInfo.getFileInfo(node);
136
+ const parser = new parser_1.Parser();
137
+ const textValue = node.d.strings[0].d.value;
138
+ // Determine the offset within the file where the string
139
+ // literal's contents begin.
140
+ let valueOffset = node.d.strings[0].start;
141
+ if (node.d.strings[0].nodeType === 49 /* ParseNodeType.String */) {
142
+ valueOffset += node.d.strings[0].d.token.prefixLength + node.d.strings[0].d.token.quoteMarkLength;
143
+ }
144
+ // Construct a temporary dummy string with the text value at the appropriate
145
+ // offset so as to mimic the original file. This will keep all of the token
146
+ // and diagnostic offsets correct.
147
+ const dummyFileContents = ' '.repeat(valueOffset) + textValue;
148
+ const parseOptions = new parser_1.ParseOptions();
149
+ parseOptions.isStubFile = fileInfo.isStubFile;
150
+ parseOptions.pythonVersion = fileInfo.executionEnvironment.pythonVersion;
151
+ parseOptions.reportErrorsForParsedStringContents = true;
152
+ const parseResults = parser.parseTextExpression(dummyFileContents, valueOffset, textValue.length, parseOptions, 0 /* ParseTextMode.Expression */,
153
+ /* initialParenDepth */ undefined, fileInfo.typingSymbolAliases, node.a);
154
+ if (parseResults.parseTree) {
155
+ // If there are errors but we are not reporting them, return
156
+ // undefined to indicate that the parse failed.
157
+ if (!reportErrors && parseResults.diagnostics.length > 0) {
158
+ return undefined;
159
+ }
160
+ const fileInfo = nodeInfo.getFileInfo(node);
161
+ parseResults.diagnostics.forEach((diag) => {
162
+ fileInfo.diagnosticSink.addDiagnosticWithTextRange('error', diag.message, node);
163
+ });
164
+ parseResults.parseTree.parent = node;
165
+ // Optionally add the new subtree to the parse tree so it can
166
+ // participate in language server operations like find and replace.
167
+ if (reportErrors) {
168
+ nodeInfo.setStringAnnotation(node, parseResults.parseTree, parseResults.stringAnnotations);
169
+ }
170
+ return parseResults.parseTree;
171
+ }
172
+ return undefined;
173
+ }
174
+ function getTypeOfStringList(node, flags, inferenceContext) {
175
+ let typeResult;
176
+ if ((flags & 8 /* EvalFlags.StrLiteralAsType */) !== 0 &&
177
+ ((flags & 1073741824 /* EvalFlags.TypeFormArg */) === 0 || (flags & 33554432 /* EvalFlags.NoConvertSpecialForm */) !== 0)) {
178
+ return getTypeOfStringListAsType(node, flags);
179
+ }
180
+ const isBytesNode = (node) => (node.d.token.flags & 32 /* StringTokenFlags.Bytes */) !== 0;
181
+ const isTemplateNode = (node) => (node.d.token.flags & 128 /* StringTokenFlags.Template */) !== 0;
182
+ // Check for mixing of t-string literals with str, bytes, or f-string
183
+ // literals. CPython reports this as a SyntaxError (PEP 750).
184
+ const firstTemplateIndex = node.d.strings.findIndex(isTemplateNode);
185
+ const firstNonTemplateIndex = node.d.strings.findIndex((str) => !isTemplateNode(str));
186
+ if (firstTemplateIndex >= 0 && firstNonTemplateIndex >= 0) {
187
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.mixingTemplateAndStr(), node.d.strings[Math.max(firstTemplateIndex, firstNonTemplateIndex)]);
188
+ return { type: types_1.UnknownType.create() };
189
+ }
190
+ // Check for mixing of bytes and str, which is not allowed.
191
+ const firstStrIndex = node.d.strings.findIndex((str) => !isBytesNode(str));
192
+ const firstBytesIndex = node.d.strings.findIndex((str) => isBytesNode(str));
193
+ if (firstStrIndex >= 0 && firstBytesIndex >= 0) {
194
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.mixingBytesAndStr(), node.d.strings[Math.max(firstBytesIndex, firstStrIndex)]);
195
+ return { type: types_1.UnknownType.create() };
196
+ }
197
+ const isBytes = firstBytesIndex >= 0;
198
+ let isLiteralString = true;
199
+ let isIncomplete = false;
200
+ let isTemplate = false;
201
+ node.d.strings.forEach((expr) => {
202
+ // Handle implicit concatenation.
203
+ const typeResult = getTypeOfString(expr);
204
+ if (typeResult.isIncomplete) {
205
+ isIncomplete = true;
206
+ }
207
+ let isExprLiteralString = false;
208
+ if ((0, types_1.isClassInstance)(typeResult.type)) {
209
+ if (types_1.ClassType.isBuiltIn(typeResult.type, 'str') && typeResult.type.priv.literalValue !== undefined) {
210
+ isExprLiteralString = true;
211
+ }
212
+ else if (types_1.ClassType.isBuiltIn(typeResult?.type, 'LiteralString')) {
213
+ isExprLiteralString = true;
214
+ }
215
+ if (typeResult.type.shared.name === 'Template') {
216
+ isTemplate = true;
217
+ }
218
+ }
219
+ if (!isExprLiteralString) {
220
+ isLiteralString = false;
221
+ }
222
+ });
223
+ if (isTemplate) {
224
+ const templateType = context.prefetched?.templateClass && (0, types_1.isInstantiableClass)(context.prefetched?.templateClass)
225
+ ? types_1.ClassType.cloneAsInstance(context.prefetched.templateClass)
226
+ : types_1.UnknownType.create();
227
+ typeResult = { type: templateType, isIncomplete };
228
+ }
229
+ else if (node.d.strings.some((str) => str.nodeType === 30 /* ParseNodeType.FormatString */)) {
230
+ if (isLiteralString) {
231
+ const literalStringType = getTypingType(node, 'LiteralString');
232
+ if (literalStringType && (0, types_1.isInstantiableClass)(literalStringType)) {
233
+ typeResult = { type: types_1.ClassType.cloneAsInstance(literalStringType) };
234
+ }
235
+ }
236
+ if (!typeResult) {
237
+ typeResult = {
238
+ type: getBuiltInObject(node, isBytes ? 'bytes' : 'str'),
239
+ isIncomplete,
240
+ };
241
+ }
242
+ }
243
+ else {
244
+ typeResult = {
245
+ type: cloneBuiltinObjectWithLiteral(node, isBytes ? 'bytes' : 'str', node.d.strings.map((s) => s.d.value).join('')),
246
+ isIncomplete,
247
+ };
248
+ }
249
+ if (node.d.strings.length !== 1 || node.d.strings[0].nodeType !== 49 /* ParseNodeType.String */) {
250
+ return typeResult;
251
+ }
252
+ // Only attempt to interpret the string as a TypeForm forward reference when
253
+ // there's a signal that a TypeForm value is wanted in this context. Doing it
254
+ // unconditionally can trigger expensive (and recursion-prone) type lookups
255
+ // for plain string literals in non-type contexts.
256
+ const wantsTypeForm = (flags & 1073741824 /* EvalFlags.TypeFormArg */) !== 0 ||
257
+ (inferenceContext !== undefined && expectedTypeWantsTypeForm(inferenceContext.expectedType));
258
+ if (!wantsTypeForm) {
259
+ return typeResult;
260
+ }
261
+ // For performance reasons, do not attempt to treat the string literal
262
+ // as a TypeForm if it's going to fail anyway or is unlikely to be a
263
+ // TypeForm (really long, triple-quoted, etc.).
264
+ const stringNode = node.d.strings[0];
265
+ const tokenFlags = stringNode.d.token.flags;
266
+ const disallowedTokenFlags = 32 /* StringTokenFlags.Bytes */ |
267
+ 8 /* StringTokenFlags.Raw */ |
268
+ 64 /* StringTokenFlags.Format */ |
269
+ 128 /* StringTokenFlags.Template */ |
270
+ 4 /* StringTokenFlags.Triplicate */;
271
+ const maxTypeFormStringLength = 256;
272
+ if ((tokenFlags & disallowedTokenFlags) !== 0 ||
273
+ stringNode.d.token.escapedValue.length >= maxTypeFormStringLength) {
274
+ return typeResult;
275
+ }
276
+ const typeFormResult = getTypeOfStringListAsType(node, flags);
277
+ if (typeFormResult.type.props?.typeForm) {
278
+ typeResult.type = types_1.TypeBase.cloneWithTypeForm(typeResult.type, typeFormResult.type.props.typeForm);
279
+ }
280
+ return typeResult;
281
+ }
282
+ function getTypeOfStringListAsType(node, flags) {
283
+ const reportTypeErrors = (flags & 8 /* EvalFlags.StrLiteralAsType */) !== 0;
284
+ let updatedFlags = flags | 4 /* EvalFlags.ForwardRefs */ | 128 /* EvalFlags.InstantiableType */;
285
+ let typeResult;
286
+ // In most cases, annotations within a string are not parsed by the interpreter.
287
+ // There are a few exceptions (e.g. the "bound" value for a TypeVar constructor).
288
+ if ((flags & 16777216 /* EvalFlags.ParsesStringLiteral */) === 0) {
289
+ updatedFlags |= 524288 /* EvalFlags.NotParsed */;
290
+ }
291
+ const annotation = nodeInfo.getStringAnnotation(node);
292
+ if (annotation && (flags & 256 /* EvalFlags.TypeExpression */) !== 0) {
293
+ return getTypeOfExpression(annotation, updatedFlags);
294
+ }
295
+ if (node.d.strings.length === 1) {
296
+ const tokenFlags = node.d.strings[0].d.token.flags;
297
+ if (tokenFlags & 32 /* StringTokenFlags.Bytes */) {
298
+ if (reportTypeErrors) {
299
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.annotationBytesString(), node);
300
+ }
301
+ return { type: types_1.UnknownType.create() };
302
+ }
303
+ if (tokenFlags & 8 /* StringTokenFlags.Raw */) {
304
+ if (reportTypeErrors) {
305
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.annotationRawString(), node);
306
+ }
307
+ return { type: types_1.UnknownType.create() };
308
+ }
309
+ if (tokenFlags & 64 /* StringTokenFlags.Format */) {
310
+ if (reportTypeErrors) {
311
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.annotationFormatString(), node);
312
+ }
313
+ return { type: types_1.UnknownType.create() };
314
+ }
315
+ if (tokenFlags & 128 /* StringTokenFlags.Template */) {
316
+ if (reportTypeErrors) {
317
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.annotationTemplateString(), node);
318
+ }
319
+ return { type: types_1.UnknownType.create() };
320
+ }
321
+ // We didn't know at parse time that this string node was going
322
+ // to be evaluated as a forward-referenced type. We need
323
+ // to re-invoke the parser at this stage.
324
+ const expr = parseStringAsTypeAnnotation(node, reportTypeErrors);
325
+ if (expr) {
326
+ typeResult = useSpeculativeMode(reportTypeErrors ? undefined : node, () => {
327
+ return getTypeOfExpression(expr, updatedFlags);
328
+ });
329
+ }
330
+ }
331
+ if (!typeResult) {
332
+ if (reportTypeErrors) {
333
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.expectedTypeNotString(), node);
334
+ }
335
+ typeResult = { type: types_1.UnknownType.create() };
336
+ }
337
+ return typeResult;
338
+ }
339
+ function getTypeOfString(node) {
340
+ const isBytes = (node.d.token.flags & 32 /* StringTokenFlags.Bytes */) !== 0;
341
+ let typeResult;
342
+ let isIncomplete = false;
343
+ if (node.nodeType === 49 /* ParseNodeType.String */) {
344
+ typeResult = {
345
+ type: cloneBuiltinObjectWithLiteral(node, isBytes ? 'bytes' : 'str', node.d.value),
346
+ isIncomplete,
347
+ };
348
+ }
349
+ else {
350
+ const isTemplateString = (node.d.token.flags & 128 /* StringTokenFlags.Template */) !== 0;
351
+ let isLiteralString = true;
352
+ // If all of the format expressions are of type LiteralString, then
353
+ // the resulting formatted string is also LiteralString.
354
+ node.d.fieldExprs.forEach((expr) => {
355
+ const exprTypeResult = getTypeOfExpression(expr);
356
+ const exprType = exprTypeResult.type;
357
+ if (exprTypeResult.isIncomplete) {
358
+ isIncomplete = true;
359
+ }
360
+ (0, typeUtils_1.doForEachSubtype)(exprType, (exprSubtype) => {
361
+ if (!(0, types_1.isClassInstance)(exprSubtype)) {
362
+ isLiteralString = false;
363
+ return;
364
+ }
365
+ if (types_1.ClassType.isBuiltIn(exprSubtype, 'LiteralString')) {
366
+ return;
367
+ }
368
+ if (types_1.ClassType.isBuiltIn(exprSubtype, 'str') && exprSubtype.priv.literalValue !== undefined) {
369
+ return;
370
+ }
371
+ isLiteralString = false;
372
+ });
373
+ });
374
+ if (isTemplateString) {
375
+ const templateType = context.prefetched?.templateClass && (0, types_1.isInstantiableClass)(context.prefetched?.templateClass)
376
+ ? types_1.ClassType.cloneAsInstance(context.prefetched.templateClass)
377
+ : types_1.UnknownType.create();
378
+ typeResult = { type: templateType, isIncomplete };
379
+ }
380
+ else if (!isBytes && isLiteralString) {
381
+ const literalStringType = getTypingType(node, 'LiteralString');
382
+ if (literalStringType && (0, types_1.isInstantiableClass)(literalStringType)) {
383
+ typeResult = { type: types_1.ClassType.cloneAsInstance(literalStringType), isIncomplete };
384
+ }
385
+ }
386
+ if (!typeResult) {
387
+ typeResult = {
388
+ type: getBuiltInObject(node, isBytes ? 'bytes' : 'str'),
389
+ isIncomplete,
390
+ };
391
+ if ((0, types_1.isClass)(typeResult.type) && typeResult.type.priv.includePromotions) {
392
+ typeResult.type = types_1.ClassType.cloneRemoveTypePromotions(typeResult.type);
393
+ }
394
+ }
395
+ }
396
+ return typeResult;
397
+ }
398
+ function getDeclaredTypeForExpression(expression, usage) {
399
+ let symbol;
400
+ let selfType;
401
+ let classOrObjectBase;
402
+ let memberAccessClass;
403
+ let bindFunction = true;
404
+ let useDescriptorSetterType = false;
405
+ switch (expression.nodeType) {
406
+ case 38 /* ParseNodeType.Name */: {
407
+ const symbolWithScope = lookUpSymbolRecursive(expression, expression.d.value, /* honorCodeFlow */ true);
408
+ if (symbolWithScope) {
409
+ symbol = symbolWithScope.symbol;
410
+ // Handle the case where the symbol is a class-level variable
411
+ // where the type isn't declared in this class but is in
412
+ // a parent class.
413
+ if (!getDeclaredTypeOfSymbol(symbol, expression)?.type &&
414
+ symbolWithScope.scope.type === 3 /* ScopeType.Class */) {
415
+ const enclosingClass = ParseTreeUtils.getEnclosingClassOrFunction(expression);
416
+ if (enclosingClass && enclosingClass.nodeType === 10 /* ParseNodeType.Class */) {
417
+ const classTypeInfo = getTypeOfClass(enclosingClass);
418
+ if (classTypeInfo) {
419
+ const classMemberInfo = (0, typeUtils_1.lookUpClassMember)(classTypeInfo.classType, expression.d.value, 16 /* MemberAccessFlags.SkipInstanceMembers */ | 64 /* MemberAccessFlags.DeclaredTypesOnly */);
420
+ if (classMemberInfo) {
421
+ symbol = classMemberInfo.symbol;
422
+ }
423
+ }
424
+ }
425
+ }
426
+ }
427
+ break;
428
+ }
429
+ case 54 /* ParseNodeType.TypeAnnotation */: {
430
+ return getDeclaredTypeForExpression(expression.d.valueExpr, usage);
431
+ }
432
+ case 35 /* ParseNodeType.MemberAccess */: {
433
+ const baseType = getTypeOfExpression(expression.d.leftExpr, 2 /* EvalFlags.MemberAccessBaseDefaults */).type;
434
+ const baseTypeConcrete = makeTopLevelTypeVarsConcrete(baseType);
435
+ const memberName = expression.d.member.d.value;
436
+ if ((0, types_1.isTypeVar)(baseType)) {
437
+ selfType = baseType;
438
+ }
439
+ // Normally, baseType will not be a composite type (a union), but
440
+ // this can occur. In this case, we compute the declared type of the
441
+ // member for each subtype. If the subtypes declare the member with
442
+ // the same generic class but different (invariant) type arguments
443
+ // (e.g. "list[int]" vs. "list[str]"), there is no single declared
444
+ // type that can serve as the expected type for bidirectional
445
+ // inference of an assigned value. Committing to one subtype's
446
+ // declared type produces a false positive when assigning a value
447
+ // (such as an empty container) that is compatible with every
448
+ // subtype, so in that case we return undefined and let the value be
449
+ // evaluated without an expected type. We sort the subtypes for
450
+ // determinism.
451
+ //
452
+ // This is deliberately limited to the "same class, differing type
453
+ // arguments" case. When the subtypes declare the member with
454
+ // unrelated types, we retain the previous behavior (use one
455
+ // subtype's declared type) so that genuine assignment errors are
456
+ // still reported at the same location and downstream inference is
457
+ // unchanged.
458
+ //
459
+ // This handling is further limited to cases where the declared base
460
+ // type is itself a union. We intentionally don't apply it when the
461
+ // base is a type variable that merely concretizes to a union.
462
+ const isUnionBase = (0, types_1.isUnion)(baseType);
463
+ let firstMemberDeclaredType;
464
+ let sawMemberDeclaredType = false;
465
+ let hasDivergentMemberDeclaredTypes = false;
466
+ let divergesOnlyByTypeArgs = true;
467
+ (0, typeUtils_1.doForEachSubtype)(baseTypeConcrete, (baseSubtype) => {
468
+ if ((0, types_1.isClassInstance)(baseSubtype)) {
469
+ const classMemberInfo = (0, typeUtils_1.lookUpObjectMember)(baseSubtype, memberName, 64 /* MemberAccessFlags.DeclaredTypesOnly */);
470
+ classOrObjectBase = baseSubtype;
471
+ memberAccessClass = classMemberInfo?.classType;
472
+ symbol = classMemberInfo?.symbol;
473
+ useDescriptorSetterType = true;
474
+ // If this is an instance member (e.g. a dataclass field), don't
475
+ // bind it to the object if it's a function.
476
+ bindFunction = !classMemberInfo?.isInstanceMember;
477
+ }
478
+ else if ((0, types_1.isInstantiableClass)(baseSubtype)) {
479
+ const classMemberInfo = (0, typeUtils_1.lookUpClassMember)(baseSubtype, memberName, 16 /* MemberAccessFlags.SkipInstanceMembers */ | 64 /* MemberAccessFlags.DeclaredTypesOnly */);
480
+ classOrObjectBase = baseSubtype;
481
+ memberAccessClass = classMemberInfo?.classType;
482
+ symbol = classMemberInfo?.symbol;
483
+ useDescriptorSetterType = false;
484
+ bindFunction = true;
485
+ }
486
+ else if ((0, types_1.isModule)(baseSubtype)) {
487
+ classOrObjectBase = undefined;
488
+ memberAccessClass = undefined;
489
+ symbol = types_1.ModuleType.getField(baseSubtype, memberName);
490
+ if (symbol && !symbol.hasTypedDeclarations()) {
491
+ // Do not use inferred types for the declared type.
492
+ symbol = undefined;
493
+ }
494
+ useDescriptorSetterType = false;
495
+ bindFunction = false;
496
+ }
497
+ // If the base is a union, verify that the subtypes agree on a
498
+ // single declared type for the member.
499
+ if (isUnionBase) {
500
+ const subtypeDeclaredType = symbol
501
+ ? resolveDeclaredMemberType(symbol, classOrObjectBase, memberAccessClass, useDescriptorSetterType, bindFunction, selfType)
502
+ : undefined;
503
+ if (subtypeDeclaredType) {
504
+ if (!sawMemberDeclaredType) {
505
+ firstMemberDeclaredType = subtypeDeclaredType;
506
+ sawMemberDeclaredType = true;
507
+ }
508
+ else if (!firstMemberDeclaredType ||
509
+ !(0, types_1.isTypeSame)(firstMemberDeclaredType, subtypeDeclaredType)) {
510
+ hasDivergentMemberDeclaredTypes = true;
511
+ // The false positive we're addressing is specific
512
+ // to invariant type arguments of the same generic
513
+ // class. If the divergent types aren't instances of
514
+ // the same generic class, don't treat this as an
515
+ // ambiguous declared type.
516
+ if (!firstMemberDeclaredType ||
517
+ !(0, types_1.isClassInstance)(firstMemberDeclaredType) ||
518
+ !(0, types_1.isClassInstance)(subtypeDeclaredType) ||
519
+ !types_1.ClassType.isSameGenericClass(types_1.ClassType.cloneAsInstantiable(firstMemberDeclaredType), types_1.ClassType.cloneAsInstantiable(subtypeDeclaredType))) {
520
+ divergesOnlyByTypeArgs = false;
521
+ }
522
+ }
523
+ }
524
+ }
525
+ },
526
+ /* sortSubtypes */ true);
527
+ if (hasDivergentMemberDeclaredTypes && divergesOnlyByTypeArgs) {
528
+ return undefined;
529
+ }
530
+ break;
531
+ }
532
+ case 27 /* ParseNodeType.Index */: {
533
+ const baseType = makeTopLevelTypeVarsConcrete(getTypeOfExpression(expression.d.leftExpr, 2 /* EvalFlags.IndexBaseDefaults */).type);
534
+ if (baseType && (0, types_1.isClassInstance)(baseType)) {
535
+ if (types_1.ClassType.isTypedDictClass(baseType)) {
536
+ const typeFromTypedDict = (0, typedDicts_1.getTypeOfIndexedTypedDict)(evaluatorInterface, expression, baseType, usage || { method: 'get' });
537
+ if (typeFromTypedDict) {
538
+ return typeFromTypedDict.type;
539
+ }
540
+ }
541
+ let setItemType = getBoundMagicMethod(baseType, '__setitem__');
542
+ if (!setItemType) {
543
+ break;
544
+ }
545
+ if ((0, types_1.isOverloaded)(setItemType)) {
546
+ // Determine whether we need to use the slice overload.
547
+ const expectsSlice = expression.d.items.length === 1 &&
548
+ expression.d.items[0].d.valueExpr.nodeType === 46 /* ParseNodeType.Slice */;
549
+ const overloads = types_1.OverloadedType.getOverloads(setItemType);
550
+ setItemType = overloads.find((overload) => {
551
+ if (overload.shared.parameters.length < 2) {
552
+ return false;
553
+ }
554
+ const keyType = types_1.FunctionType.getParamType(overload, 0);
555
+ const isSlice = (0, types_1.isClassInstance)(keyType) && types_1.ClassType.isBuiltIn(keyType, 'slice');
556
+ return expectsSlice === isSlice;
557
+ });
558
+ if (!setItemType) {
559
+ break;
560
+ }
561
+ }
562
+ if ((0, types_1.isFunction)(setItemType) && setItemType.shared.parameters.length >= 2) {
563
+ const paramType = types_1.FunctionType.getParamType(setItemType, 1);
564
+ if (!(0, types_1.isAnyOrUnknown)(paramType)) {
565
+ return paramType;
566
+ }
567
+ }
568
+ }
569
+ break;
570
+ }
571
+ case 52 /* ParseNodeType.Tuple */: {
572
+ // If this is a tuple expression with at least one item and no
573
+ // unpacked items, and all of the items have declared types,
574
+ // we can assume a declared type for the resulting tuple. This
575
+ // is needed to enable bidirectional type inference when assigning
576
+ // to an unpacked tuple.
577
+ if (expression.d.items.length > 0 &&
578
+ !expression.d.items.some((item) => item.nodeType === 56 /* ParseNodeType.Unpack */)) {
579
+ const itemTypes = [];
580
+ expression.d.items.forEach((expr) => {
581
+ const itemType = getDeclaredTypeForExpression(expr, usage);
582
+ if (itemType) {
583
+ itemTypes.push(itemType);
584
+ }
585
+ });
586
+ if (itemTypes.length === expression.d.items.length) {
587
+ // If all items have a declared type, return a tuple of those types.
588
+ return (0, tuples_1.makeTupleObject)(evaluatorInterface, itemTypes.map((t) => {
589
+ return { type: t, isUnbounded: false };
590
+ }));
591
+ }
592
+ }
593
+ break;
594
+ }
595
+ }
596
+ if (symbol) {
597
+ return resolveDeclaredMemberType(symbol, classOrObjectBase, memberAccessClass, useDescriptorSetterType, bindFunction, selfType);
598
+ }
599
+ return undefined;
600
+ }
601
+ function getTypeOfIterator(typeResult, isAsync, errorNode, emitNotIterableError = true) {
602
+ const iterMethodName = isAsync ? '__aiter__' : '__iter__';
603
+ const nextMethodName = isAsync ? '__anext__' : '__next__';
604
+ let isValidIterator = true;
605
+ let isIncomplete = typeResult.isIncomplete;
606
+ let type = (0, typeUtils_1.transformPossibleRecursiveTypeAlias)(typeResult.type);
607
+ type = makeTopLevelTypeVarsConcrete(type);
608
+ type = (0, types_1.removeUnbound)(type);
609
+ if ((0, typeUtils_1.isOptionalType)(type) && emitNotIterableError) {
610
+ if (!typeResult.isIncomplete) {
611
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportOptionalIterable, localize_1.LocMessage.noneNotIterable(), errorNode);
612
+ }
613
+ type = (0, typeUtils_1.removeNoneFromUnion)(type);
614
+ }
615
+ const iterableType = (0, typeUtils_1.mapSubtypes)(type, (subtype) => {
616
+ subtype = makeTopLevelTypeVarsConcrete(subtype);
617
+ if ((0, types_1.isAnyOrUnknown)(subtype)) {
618
+ return subtype;
619
+ }
620
+ const diag = new diagnostic_1.DiagnosticAddendum();
621
+ if ((0, types_1.isClass)(subtype)) {
622
+ // Handle an empty tuple specially.
623
+ if (types_1.TypeBase.isInstance(subtype) &&
624
+ (0, typeUtils_1.isTupleClass)(subtype) &&
625
+ subtype.priv.tupleTypeArgs &&
626
+ subtype.priv.tupleTypeArgs.length === 0) {
627
+ return types_1.NeverType.createNever();
628
+ }
629
+ const iterReturnType = getTypeOfMagicMethodCall(subtype, iterMethodName, [], errorNode)?.type;
630
+ if (!iterReturnType) {
631
+ // There was no callable __iter__. The legacy sequence protocol
632
+ // falls back to __getitem__, but CPython does that only when
633
+ // __iter__ is missing. An explicit `__iter__ = None` (or any
634
+ // non-callable __iter__) makes the object not iterable.
635
+ let hasExplicitIterMember = false;
636
+ if (!isAsync && (0, types_1.isClassInstance)(subtype)) {
637
+ hasExplicitIterMember = !!(0, typeUtils_1.lookUpObjectMember)(subtype, iterMethodName, 16 /* MemberAccessFlags.SkipInstanceMembers */ |
638
+ 512 /* MemberAccessFlags.SkipAttributeAccessOverride */ |
639
+ 4 /* MemberAccessFlags.SkipObjectBaseClass */);
640
+ }
641
+ if (!isAsync && (0, types_1.isClassInstance)(subtype) && !hasExplicitIterMember) {
642
+ const getItemReturnType = getTypeOfMagicMethodCall(subtype, '__getitem__', [
643
+ {
644
+ type: context.prefetched?.intClass && (0, types_1.isInstantiableClass)(context.prefetched.intClass)
645
+ ? types_1.ClassType.cloneAsInstance(context.prefetched.intClass)
646
+ : types_1.UnknownType.create(),
647
+ },
648
+ ], errorNode)?.type;
649
+ if (getItemReturnType) {
650
+ return getItemReturnType;
651
+ }
652
+ }
653
+ diag.addMessage(localize_1.LocMessage.methodNotDefined().format({ name: iterMethodName }));
654
+ }
655
+ else {
656
+ const iterReturnTypeDiag = new diagnostic_1.DiagnosticAddendum();
657
+ const returnType = mapSubtypesExpandTypeVars(iterReturnType, /* options */ undefined, (subtype) => {
658
+ if ((0, types_1.isAnyOrUnknown)(subtype)) {
659
+ return subtype;
660
+ }
661
+ let nextReturnType = getTypeOfMagicMethodCall(subtype, nextMethodName, [], errorNode)?.type;
662
+ if (!nextReturnType) {
663
+ iterReturnTypeDiag.addMessage(localize_1.LocMessage.methodNotDefinedOnType().format({
664
+ name: nextMethodName,
665
+ type: printType(subtype),
666
+ }));
667
+ }
668
+ else {
669
+ // Convert any unpacked TypeVarTuples into object instances. We don't
670
+ // know anything more about them.
671
+ nextReturnType = (0, typeUtils_1.mapSubtypes)(nextReturnType, (returnSubtype) => {
672
+ if ((0, types_1.isTypeVar)(returnSubtype) && (0, types_1.isUnpackedTypeVarTuple)(returnSubtype)) {
673
+ return getObjectType();
674
+ }
675
+ return returnSubtype;
676
+ });
677
+ if (!isAsync) {
678
+ return nextReturnType;
679
+ }
680
+ // If it's an async iteration, there's an implicit
681
+ // 'await' operator applied.
682
+ const awaitableResult = getTypeOfAwaitable({ type: nextReturnType, isIncomplete: typeResult.isIncomplete }, errorNode);
683
+ if (awaitableResult.isIncomplete) {
684
+ isIncomplete = true;
685
+ }
686
+ return awaitableResult.type;
687
+ }
688
+ return undefined;
689
+ });
690
+ if (iterReturnTypeDiag.isEmpty()) {
691
+ return returnType;
692
+ }
693
+ diag.addAddendum(iterReturnTypeDiag);
694
+ }
695
+ }
696
+ if (!isIncomplete && emitNotIterableError) {
697
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.typeNotIterable().format({ type: printType(subtype) }) + diag.getString(), errorNode);
698
+ }
699
+ isValidIterator = false;
700
+ return undefined;
701
+ });
702
+ return isValidIterator ? { type: iterableType, isIncomplete } : undefined;
703
+ }
704
+ function getTypeOfIterable(typeResult, isAsync, errorNode, emitNotIterableError = true) {
705
+ const iterMethodName = isAsync ? '__aiter__' : '__iter__';
706
+ let isValidIterable = true;
707
+ let type = makeTopLevelTypeVarsConcrete(typeResult.type);
708
+ if ((0, typeUtils_1.isOptionalType)(type)) {
709
+ if (!typeResult.isIncomplete && emitNotIterableError) {
710
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportOptionalIterable, localize_1.LocMessage.noneNotIterable(), errorNode);
711
+ }
712
+ type = (0, typeUtils_1.removeNoneFromUnion)(type);
713
+ }
714
+ const iterableType = (0, typeUtils_1.mapSubtypes)(type, (subtype) => {
715
+ if ((0, types_1.isAnyOrUnknown)(subtype)) {
716
+ return subtype;
717
+ }
718
+ if ((0, types_1.isClass)(subtype)) {
719
+ const iterReturnType = getTypeOfMagicMethodCall(subtype, iterMethodName, [], errorNode)?.type;
720
+ if (iterReturnType) {
721
+ return makeTopLevelTypeVarsConcrete(iterReturnType);
722
+ }
723
+ }
724
+ if (emitNotIterableError) {
725
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.typeNotIterable().format({ type: printType(subtype) }), errorNode);
726
+ }
727
+ isValidIterable = false;
728
+ return undefined;
729
+ });
730
+ return isValidIterable ? { type: iterableType, isIncomplete: typeResult.isIncomplete } : undefined;
731
+ }
732
+ function getTypeOfIndexedObjectOrClass(node, baseType, selfType, usage) {
733
+ // Handle index operations for TypedDict classes specially.
734
+ if ((0, types_1.isClassInstance)(baseType) && types_1.ClassType.isTypedDictClass(baseType)) {
735
+ const typeFromTypedDict = (0, typedDicts_1.getTypeOfIndexedTypedDict)(evaluatorInterface, node, baseType, usage);
736
+ if (typeFromTypedDict) {
737
+ return typeFromTypedDict;
738
+ }
739
+ }
740
+ const magicMethodName = getIndexAccessMagicMethodName(usage);
741
+ // A full member lookup specializes tuple arguments even if a constant
742
+ // index can select its answer directly.
743
+ const nativeItemSymbol = usage.method === 'get' && !selfType && (0, types_1.isClassInstance)(baseType) && types_1.ClassType.isBuiltIn(baseType, 'tuple')
744
+ ? types_1.ClassType.getSymbolTable(baseType).get(magicMethodName)
745
+ : undefined;
746
+ const nativeItemType = nativeItemSymbol?.isClassMember()
747
+ ? getEffectiveTypeOfSymbol(nativeItemSymbol)
748
+ : undefined;
749
+ const nativeItemMethods = nativeItemType && (0, types_1.isFunctionOrOverloaded)(nativeItemType)
750
+ ? (0, types_1.isOverloaded)(nativeItemType)
751
+ ? types_1.OverloadedType.getOverloads(nativeItemType)
752
+ : [nativeItemType]
753
+ : [];
754
+ const canDeferBinding = nativeItemMethods.length > 0 &&
755
+ nativeItemMethods.every((method) => types_1.FunctionType.isInstanceMethod(method) &&
756
+ method.shared.parameters.length > 0 &&
757
+ !types_1.FunctionParam.isTypeDeclared(method.shared.parameters[0]));
758
+ let itemMethodType = canDeferBinding
759
+ ? undefined
760
+ : getBoundMagicMethod(baseType, magicMethodName, selfType, node.d.leftExpr);
761
+ // Handle the special case where the object is a tuple and
762
+ // the index is a constant number (integer) or a slice with integer
763
+ // start and end values. In these cases, we can determine
764
+ // the exact type by indexing into the tuple type array.
765
+ if ((canDeferBinding || itemMethodType) &&
766
+ node.d.items.length === 1 &&
767
+ !node.d.trailingComma &&
768
+ !node.d.items[0].d.name &&
769
+ node.d.items[0].d.argCategory === 0 /* ArgCategory.Simple */ &&
770
+ (0, types_1.isClassInstance)(baseType)) {
771
+ const index0Expr = node.d.items[0].d.valueExpr;
772
+ const valueType = getTypeOfExpression(index0Expr).type;
773
+ if ((0, types_1.isClassInstance)(valueType) &&
774
+ types_1.ClassType.isBuiltIn(valueType, 'int') &&
775
+ (0, typeUtils_1.isLiteralType)(valueType) &&
776
+ typeof valueType.priv.literalValue === 'number') {
777
+ const indexValue = valueType.priv.literalValue;
778
+ const tupleType = (0, typeUtils_1.getSpecializedTupleType)(baseType);
779
+ if (tupleType && tupleType.priv.tupleTypeArgs) {
780
+ if ((0, typeUtils_1.isTupleIndexUnambiguous)(tupleType, indexValue)) {
781
+ if (indexValue >= 0 && indexValue < tupleType.priv.tupleTypeArgs.length) {
782
+ return { type: tupleType.priv.tupleTypeArgs[indexValue].type };
783
+ }
784
+ else if (indexValue < 0 && tupleType.priv.tupleTypeArgs.length + indexValue >= 0) {
785
+ return {
786
+ type: tupleType.priv.tupleTypeArgs[tupleType.priv.tupleTypeArgs.length + indexValue]
787
+ .type,
788
+ };
789
+ }
790
+ }
791
+ }
792
+ }
793
+ else if (usage.method === 'get' &&
794
+ index0Expr.nodeType === 46 /* ParseNodeType.Slice */ &&
795
+ (0, types_1.isClassInstance)(valueType) &&
796
+ types_1.ClassType.isBuiltIn(valueType, 'slice')) {
797
+ const tupleType = (0, typeUtils_1.getSpecializedTupleType)(baseType);
798
+ if (tupleType) {
799
+ // Skip this if a subclass overrides the tuple's __getitem__ method.
800
+ const getItemMember = (0, typeUtils_1.lookUpObjectMember)(baseType, '__getitem__', 16 /* MemberAccessFlags.SkipInstanceMembers */);
801
+ const isTupleGetItem = !getItemMember ||
802
+ ((0, types_1.isInstantiableClass)(getItemMember.classType) &&
803
+ types_1.ClassType.isBuiltIn(getItemMember.classType, 'tuple'));
804
+ if (isTupleGetItem) {
805
+ const slicedTupleType = (0, tuples_1.getSlicedTupleType)(evaluatorInterface, tupleType, index0Expr);
806
+ if (slicedTupleType) {
807
+ return { type: slicedTupleType };
808
+ }
809
+ }
810
+ }
811
+ }
812
+ }
813
+ if (canDeferBinding) {
814
+ const inferredBase = (0, types_1.getInferredTupleLiteralBase)(baseType);
815
+ const tupleArgs = baseType.priv.tupleTypeArgs;
816
+ if (inferredBase !== baseType &&
817
+ (0, types_1.isClassInstance)(inferredBase) &&
818
+ types_1.ClassType.isBuiltIn(inferredBase, 'tuple') &&
819
+ tupleArgs &&
820
+ tupleArgs.length > 1 &&
821
+ tupleArgs.some((arg) => (0, types_1.isUnion)(arg.type) || ((0, types_1.isClassInstance)(arg.type) && types_1.ClassType.isBuiltIn(arg.type, 'tuple')))) {
822
+ // Avoid structural union work for optional literals before native method binding.
823
+ baseType = inferredBase;
824
+ }
825
+ itemMethodType = getBoundMagicMethod(baseType, magicMethodName, selfType, node.d.leftExpr);
826
+ }
827
+ if (!itemMethodType) {
828
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportIndexIssue, localize_1.LocMessage.methodNotDefinedOnType().format({
829
+ name: magicMethodName,
830
+ type: printType(baseType),
831
+ }), node.d.leftExpr);
832
+ return { type: types_1.UnknownType.create() };
833
+ }
834
+ const positionalArgs = node.d.items.filter((item) => item.d.argCategory === 0 /* ArgCategory.Simple */);
835
+ const unpackedListArgs = node.d.items.filter((item) => item.d.argCategory === 1 /* ArgCategory.UnpackedList */);
836
+ let positionalIndexType;
837
+ let isPositionalIndexTypeIncomplete = false;
838
+ if (positionalArgs.length === 1 && unpackedListArgs.length === 0 && !node.d.trailingComma) {
839
+ // Handle the common case where there is a single positional argument.
840
+ const typeResult = getTypeOfExpression(positionalArgs[0].d.valueExpr);
841
+ positionalIndexType = typeResult.type;
842
+ if (typeResult.isIncomplete) {
843
+ isPositionalIndexTypeIncomplete = true;
844
+ }
845
+ }
846
+ else {
847
+ // Package up all of the positionals into a tuple.
848
+ const tupleTypeArgs = [];
849
+ const getDeterministicTupleEntries = (type) => {
850
+ let aggregatedArgs;
851
+ let isDeterministic = true;
852
+ (0, typeUtils_1.doForEachSubtype)(type, (subtype) => {
853
+ if (!isDeterministic) {
854
+ return;
855
+ }
856
+ const tupleType = (0, typeUtils_1.getSpecializedTupleType)(subtype);
857
+ const tupleTypeArgs = tupleType?.priv.tupleTypeArgs;
858
+ if (!tupleTypeArgs ||
859
+ tupleTypeArgs.some((entry) => entry.isUnbounded || (0, types_1.isTypeVarTuple)(entry.type))) {
860
+ isDeterministic = false;
861
+ return;
862
+ }
863
+ if (!aggregatedArgs) {
864
+ aggregatedArgs = tupleTypeArgs.map((entry) => ({ type: entry.type, isUnbounded: false }));
865
+ return;
866
+ }
867
+ if (aggregatedArgs.length !== tupleTypeArgs.length) {
868
+ isDeterministic = false;
869
+ return;
870
+ }
871
+ for (let i = 0; i < aggregatedArgs.length; i++) {
872
+ aggregatedArgs[i] = {
873
+ type: (0, types_1.combineTypes)([aggregatedArgs[i].type, tupleTypeArgs[i].type]),
874
+ isUnbounded: false,
875
+ };
876
+ }
877
+ });
878
+ if (!isDeterministic || !aggregatedArgs) {
879
+ return undefined;
880
+ }
881
+ return aggregatedArgs;
882
+ };
883
+ node.d.items.forEach((arg) => {
884
+ if (arg.d.argCategory === 0 /* ArgCategory.Simple */) {
885
+ const typeResult = getTypeOfExpression(arg.d.valueExpr);
886
+ tupleTypeArgs.push({ type: typeResult.type, isUnbounded: false });
887
+ if (typeResult.isIncomplete) {
888
+ isPositionalIndexTypeIncomplete = true;
889
+ }
890
+ return;
891
+ }
892
+ if (arg.d.argCategory === 1 /* ArgCategory.UnpackedList */) {
893
+ const typeResult = getTypeOfExpression(arg.d.valueExpr);
894
+ if (typeResult.isIncomplete) {
895
+ isPositionalIndexTypeIncomplete = true;
896
+ }
897
+ const deterministicEntries = getDeterministicTupleEntries(typeResult.type);
898
+ if (deterministicEntries) {
899
+ (0, collectionUtils_1.appendArray)(tupleTypeArgs, deterministicEntries);
900
+ return;
901
+ }
902
+ const iterableType = getTypeOfIterator(typeResult, /* isAsync */ false, arg.d.valueExpr)?.type ??
903
+ types_1.UnknownType.create();
904
+ tupleTypeArgs.push({ type: iterableType, isUnbounded: true });
905
+ }
906
+ });
907
+ const unboundedCount = tupleTypeArgs.filter((typeArg) => typeArg.isUnbounded).length;
908
+ if (unboundedCount > 1) {
909
+ const firstUnboundedIndex = tupleTypeArgs.findIndex((typeArg) => typeArg.isUnbounded);
910
+ const removedEntries = tupleTypeArgs.splice(firstUnboundedIndex);
911
+ tupleTypeArgs.push({
912
+ type: (0, types_1.combineTypes)(removedEntries.map((entry) => entry.type)),
913
+ isUnbounded: true,
914
+ });
915
+ }
916
+ positionalIndexType = (0, tuples_1.makeTupleObject)(evaluatorInterface, tupleTypeArgs);
917
+ }
918
+ const argList = [
919
+ {
920
+ argCategory: 0 /* ArgCategory.Simple */,
921
+ typeResult: { type: positionalIndexType, isIncomplete: isPositionalIndexTypeIncomplete },
922
+ },
923
+ ];
924
+ if (usage.method === 'set') {
925
+ let setType = usage.setType?.type ?? types_1.AnyType.create();
926
+ // Expand constrained type variables.
927
+ if ((0, types_1.isTypeVar)(setType) && types_1.TypeVarType.hasConstraints(setType)) {
928
+ const conditionFilter = (0, types_1.isClassInstance)(baseType) ? baseType.props?.condition : undefined;
929
+ setType = makeTopLevelTypeVarsConcrete(setType,
930
+ /* makeParamSpecsConcrete */ undefined, conditionFilter);
931
+ }
932
+ argList.push({
933
+ argCategory: 0 /* ArgCategory.Simple */,
934
+ typeResult: {
935
+ type: setType,
936
+ isIncomplete: !!usage.setType?.isIncomplete,
937
+ },
938
+ });
939
+ }
940
+ const callResult = validateCallArgs(node, argList, { type: itemMethodType },
941
+ /* constraints */ undefined,
942
+ /* skipUnknownArgCheck */ true,
943
+ /* inferenceContext */ undefined);
944
+ return {
945
+ type: callResult.returnType ?? types_1.UnknownType.create(),
946
+ isIncomplete: !!callResult.isTypeIncomplete,
947
+ };
948
+ }
949
+ function getTypeArg(node, flags, supportsDictExpression) {
950
+ let typeResult;
951
+ let adjustedFlags = flags | 128 /* EvalFlags.InstantiableType */ | 1 /* EvalFlags.ConvertEllipsisToAny */ | 8 /* EvalFlags.StrLiteralAsType */;
952
+ const fileInfo = nodeInfo.getFileInfo(node);
953
+ if (fileInfo.isStubFile) {
954
+ adjustedFlags |= 4 /* EvalFlags.ForwardRefs */;
955
+ }
956
+ if (node.nodeType === 34 /* ParseNodeType.List */) {
957
+ typeResult = {
958
+ type: types_1.UnknownType.create(),
959
+ typeList: node.d.items.map((entry) => {
960
+ return { ...getTypeOfExpression(entry, adjustedFlags), node: entry };
961
+ }),
962
+ node,
963
+ };
964
+ // Set the node's type so it isn't reevaluated later.
965
+ setTypeResultForNode(node, { type: types_1.UnknownType.create() });
966
+ }
967
+ else if (node.nodeType === 18 /* ParseNodeType.Dictionary */ && supportsDictExpression) {
968
+ const inlinedTypeDict = context.prefetched?.typedDictClass && (0, types_1.isInstantiableClass)(context.prefetched.typedDictClass)
969
+ ? (0, typedDicts_1.createTypedDictTypeInlined)(evaluatorInterface, node, context.prefetched.typedDictClass, nodeInfo)
970
+ : undefined;
971
+ const keyTypeFallback = context.prefetched?.strClass && (0, types_1.isInstantiableClass)(context.prefetched.strClass)
972
+ ? context.prefetched.strClass
973
+ : types_1.UnknownType.create();
974
+ typeResult = {
975
+ type: keyTypeFallback,
976
+ inlinedTypeDict,
977
+ node,
978
+ };
979
+ }
980
+ else {
981
+ typeResult = { ...getTypeOfExpression(node, adjustedFlags), node };
982
+ if (node.nodeType === 18 /* ParseNodeType.Dictionary */) {
983
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportInvalidTypeForm, localize_1.LocMessage.dictInAnnotation(), node);
984
+ }
985
+ if ((flags & 131072 /* EvalFlags.NoClassVar */) !== 0) {
986
+ // "ClassVar" is not allowed as a type argument.
987
+ if ((0, types_1.isClass)(typeResult.type) && types_1.ClassType.isBuiltIn(typeResult.type, 'ClassVar')) {
988
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportInvalidTypeForm, localize_1.LocMessage.classVarNotAllowed(), node);
989
+ }
990
+ }
991
+ }
992
+ return typeResult;
993
+ }
994
+ function getTypeOfLambdaForCall(node, inferenceContext) {
995
+ (0, debug_1.assert)(node.d.leftExpr.nodeType === 33 /* ParseNodeType.Lambda */);
996
+ const expectedType = types_1.FunctionType.createSynthesizedInstance('');
997
+ expectedType.shared.declaredReturnType = inferenceContext
998
+ ? inferenceContext.expectedType
999
+ : types_1.UnknownType.create();
1000
+ let isArgTypeIncomplete = false;
1001
+ node.d.args.forEach((arg, index) => {
1002
+ const argTypeResult = getTypeOfExpression(arg.d.valueExpr);
1003
+ if (argTypeResult.isIncomplete) {
1004
+ isArgTypeIncomplete = true;
1005
+ }
1006
+ types_1.FunctionType.addParam(expectedType, types_1.FunctionParam.create(0 /* ParamCategory.Simple */, argTypeResult.type, types_1.FunctionParamFlags.NameSynthesized | types_1.FunctionParamFlags.TypeDeclared, `p${index.toString()}`));
1007
+ });
1008
+ // If the lambda's param list ends with a "/" positional parameter separator,
1009
+ // add a corresponding separator to the expected type.
1010
+ const lambdaParams = node.d.leftExpr.d.params;
1011
+ if (lambdaParams.length > 0) {
1012
+ const lastParam = lambdaParams[lambdaParams.length - 1];
1013
+ if (lastParam.d.category === 0 /* ParamCategory.Simple */ && !lastParam.d.name) {
1014
+ types_1.FunctionType.addPositionOnlyParamSeparator(expectedType);
1015
+ }
1016
+ }
1017
+ function getLambdaType() {
1018
+ return getTypeOfExpression(node.d.leftExpr, 2 /* EvalFlags.CallBaseDefaults */, (0, typeUtils_1.makeInferenceContext)(expectedType));
1019
+ }
1020
+ // If one or more of the arguments are incomplete, use speculative mode
1021
+ // for the lambda evaluation because it may need to be reevaluated once
1022
+ // the arg types are complete.
1023
+ let typeResult = isArgTypeIncomplete || isSpeculativeModeInUse(node) || inferenceContext?.isTypeIncomplete
1024
+ ? useSpeculativeMode(node.d.leftExpr, getLambdaType)
1025
+ : getLambdaType();
1026
+ // If bidirectional type inference failed, use normal type inference instead.
1027
+ if (typeResult.typeErrors) {
1028
+ typeResult = getTypeOfExpression(node.d.leftExpr, 2 /* EvalFlags.CallBaseDefaults */);
1029
+ }
1030
+ return typeResult;
1031
+ }
1032
+ function getTypeOfTypeForm(node, typeFormClass) {
1033
+ if (node.d.args.length !== 1 ||
1034
+ node.d.args[0].d.argCategory !== 0 /* ArgCategory.Simple */ ||
1035
+ node.d.args[0].d.name !== undefined) {
1036
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportCallIssue, localize_1.LocMessage.typeFormArgs(), node);
1037
+ return { type: types_1.UnknownType.create() };
1038
+ }
1039
+ const typeFormResult = getTypeOfArgExpectingType(convertNodeToArg(node.d.args[0]), {
1040
+ typeFormArg: true,
1041
+ noNonTypeSpecialForms: true,
1042
+ typeExpression: true,
1043
+ });
1044
+ if (!typeFormResult.typeErrors && typeFormResult.type.props?.typeForm) {
1045
+ typeFormResult.type = (0, typeUtils_1.convertToInstance)(types_1.ClassType.specialize(typeFormClass, [(0, typeUtils_1.convertToInstance)(typeFormResult.type.props.typeForm)]));
1046
+ }
1047
+ return typeFormResult;
1048
+ }
1049
+ function getTypeOfAssertType(node, inferenceContext) {
1050
+ if (node.d.args.length !== 2 ||
1051
+ node.d.args[0].d.argCategory !== 0 /* ArgCategory.Simple */ ||
1052
+ node.d.args[0].d.name !== undefined ||
1053
+ node.d.args[0].d.argCategory !== 0 /* ArgCategory.Simple */ ||
1054
+ node.d.args[1].d.name !== undefined) {
1055
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportCallIssue, localize_1.LocMessage.assertTypeArgs(), node);
1056
+ return { type: types_1.UnknownType.create() };
1057
+ }
1058
+ const arg0TypeResult = getTypeOfExpression(node.d.args[0].d.valueExpr, /* flags */ undefined, inferenceContext);
1059
+ if (arg0TypeResult.isIncomplete) {
1060
+ return { type: types_1.UnknownType.create(/* isIncomplete */ true), isIncomplete: true };
1061
+ }
1062
+ const assertedType = (0, typeUtils_1.convertToInstance)(getTypeOfArgExpectingType(convertNodeToArg(node.d.args[1]), {
1063
+ typeExpression: true,
1064
+ }).type);
1065
+ // We'll replace TypeGuard and TypeIs with bool for purposes of assert_type testing.
1066
+ // The spec is unclear on whether this is the correct behavior, but it seems to be
1067
+ // what mypy does -- and what various library authors expect.
1068
+ const arg0Type = stripTypeGuard(arg0TypeResult.type);
1069
+ const typeSameOptions = {
1070
+ treatAnySameAsUnknown: true,
1071
+ ignorePseudoGeneric: true,
1072
+ ignoreConditions: true,
1073
+ };
1074
+ let typesMatch = (0, types_1.isTypeSame)(assertedType, arg0Type, typeSameOptions);
1075
+ if (!typesMatch) {
1076
+ // Unlike assignType, assert_type requires exact structural identity, so
1077
+ // normalize both types recursively. Keep this equivalence relation aligned
1078
+ // with expandEnumTypeForLiteralComparison, which assignType applies as it recurses.
1079
+ const literalEnumClasses = collectLiteralEnumClasses(assertedType, [], /* recursively */ true);
1080
+ collectLiteralEnumClasses(arg0Type, literalEnumClasses, /* recursively */ true);
1081
+ const normalizedAssertedType = normalizeEnumTypes(assertedType, literalEnumClasses);
1082
+ const normalizedArg0Type = normalizeEnumTypes(arg0Type, literalEnumClasses);
1083
+ typesMatch = (0, types_1.isTypeSame)(normalizedAssertedType, normalizedArg0Type, typeSameOptions);
1084
+ }
1085
+ if (!typesMatch) {
1086
+ const srcDestTypes = printSrcDestTypes(arg0TypeResult.type, assertedType, { expandTypeAlias: true });
1087
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportAssertTypeFailure, localize_1.LocMessage.assertTypeTypeMismatch().format({
1088
+ expected: srcDestTypes.destType,
1089
+ received: srcDestTypes.sourceType,
1090
+ }), node.d.args[0].d.valueExpr);
1091
+ }
1092
+ return { type: arg0TypeResult.type };
1093
+ }
1094
+ function getTypeOfRevealLocals(node) {
1095
+ let curNode = node;
1096
+ let scope;
1097
+ while (curNode) {
1098
+ scope = getScopeForNode(curNode);
1099
+ // Stop when we get a valid scope that's not a list comprehension
1100
+ // scope. That includes lambdas, functions, classes, and modules.
1101
+ if (scope && scope.type !== 1 /* ScopeType.Comprehension */) {
1102
+ break;
1103
+ }
1104
+ curNode = curNode.parent;
1105
+ }
1106
+ const infoMessages = [];
1107
+ if (scope) {
1108
+ scope.symbolTable.forEach((symbol, name) => {
1109
+ if (!symbol.isIgnoredForProtocolMatch()) {
1110
+ const typeOfSymbol = getEffectiveTypeOfSymbol(symbol);
1111
+ infoMessages.push(localize_1.LocAddendum.typeOfSymbol().format({
1112
+ name,
1113
+ type: printType(typeOfSymbol, { expandTypeAlias: true }),
1114
+ }));
1115
+ }
1116
+ });
1117
+ }
1118
+ if (infoMessages.length > 0) {
1119
+ addInformation(infoMessages.join('\n'), node);
1120
+ }
1121
+ else {
1122
+ addInformation(localize_1.LocMessage.revealLocalsNone(), node);
1123
+ }
1124
+ return getNoneType();
1125
+ }
1126
+ function getTypeOfSuperCall(node) {
1127
+ if (node.d.args.length > 2) {
1128
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportCallIssue, localize_1.LocMessage.superCallArgCount(), node.d.args[2]);
1129
+ }
1130
+ const enclosingFunction = ParseTreeUtils.getEnclosingFunctionEvaluationScope(node, nodeInfo);
1131
+ const enclosingClass = enclosingFunction ? ParseTreeUtils.getEnclosingClass(enclosingFunction) : undefined;
1132
+ const enclosingClassType = enclosingClass ? getTypeOfClass(enclosingClass)?.classType : undefined;
1133
+ // Determine which class the "super" call is applied to. If
1134
+ // there is no first argument, then the class is implicit.
1135
+ let targetClassType;
1136
+ if (node.d.args.length > 0) {
1137
+ targetClassType = getTypeOfExpression(node.d.args[0].d.valueExpr).type;
1138
+ const concreteTargetClassType = makeTopLevelTypeVarsConcrete(targetClassType);
1139
+ if (!(0, types_1.isAnyOrUnknown)(concreteTargetClassType) &&
1140
+ !(0, types_1.isInstantiableClass)(concreteTargetClassType) &&
1141
+ !(0, typeUtils_1.isMetaclassInstance)(concreteTargetClassType)) {
1142
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportArgumentType, localize_1.LocMessage.superCallFirstArg().format({ type: printType(targetClassType) }), node.d.args[0].d.valueExpr);
1143
+ }
1144
+ }
1145
+ else {
1146
+ if (enclosingClassType) {
1147
+ targetClassType = enclosingClassType ?? types_1.UnknownType.create();
1148
+ const functionInfo = enclosingFunction
1149
+ ? (0, decorators_1.getFunctionInfoFromDecorators)(evaluatorInterface, enclosingFunction,
1150
+ /* isInClass */ true, nodeInfo)
1151
+ : undefined;
1152
+ // Zero-argument forms of super are not allowed within static methods.
1153
+ // This results in a runtime exception.
1154
+ if (functionInfo !== undefined && (functionInfo.flags & 4 /* FunctionTypeFlags.StaticMethod */) !== 0) {
1155
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.superCallZeroArgFormStaticMethod(), node.d.leftExpr);
1156
+ }
1157
+ else if (!ParseTreeUtils.isZeroArgSuperCallAllowed(node, nodeInfo.getFileInfo(node).executionEnvironment.pythonVersion, nodeInfo)) {
1158
+ // The evaluation scope cannot supply a first positional
1159
+ // argument for the zero-argument form.
1160
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.superCallZeroArgForm(), node.d.leftExpr);
1161
+ }
1162
+ }
1163
+ else {
1164
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.superCallZeroArgForm(), node.d.leftExpr);
1165
+ targetClassType = types_1.UnknownType.create();
1166
+ }
1167
+ }
1168
+ const concreteTargetClassType = makeTopLevelTypeVarsConcrete(targetClassType);
1169
+ // Determine whether to further narrow the type.
1170
+ let secondArgType;
1171
+ let bindToType;
1172
+ if (node.d.args.length > 1) {
1173
+ secondArgType = getTypeOfExpression(node.d.args[1].d.valueExpr).type;
1174
+ const secondArgConcreteType = makeTopLevelTypeVarsConcrete(secondArgType);
1175
+ let reportError = false;
1176
+ (0, typeUtils_1.doForEachSubtype)(secondArgConcreteType, (secondArgSubtype) => {
1177
+ if ((0, types_1.isAnyOrUnknown)(secondArgSubtype)) {
1178
+ // Ignore unknown or any types.
1179
+ }
1180
+ else if ((0, types_1.isClassInstance)(secondArgSubtype)) {
1181
+ if ((0, types_1.isInstantiableClass)(concreteTargetClassType)) {
1182
+ if (!(0, typeUtils_1.derivesFromClassRecursive)(types_1.ClassType.cloneAsInstantiable(secondArgSubtype), concreteTargetClassType,
1183
+ /* ignoreUnknown */ true)) {
1184
+ reportError = true;
1185
+ }
1186
+ }
1187
+ bindToType = secondArgSubtype;
1188
+ }
1189
+ else if ((0, types_1.isInstantiableClass)(secondArgSubtype)) {
1190
+ if ((0, types_1.isInstantiableClass)(concreteTargetClassType)) {
1191
+ if (!types_1.ClassType.isBuiltIn(concreteTargetClassType, 'type') &&
1192
+ !(0, typeUtils_1.derivesFromClassRecursive)(secondArgSubtype, concreteTargetClassType,
1193
+ /* ignoreUnknown */ true)) {
1194
+ reportError = true;
1195
+ }
1196
+ }
1197
+ bindToType = secondArgSubtype;
1198
+ }
1199
+ else {
1200
+ reportError = true;
1201
+ }
1202
+ });
1203
+ if (reportError) {
1204
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportArgumentType, localize_1.LocMessage.superCallSecondArg().format({ type: printType(targetClassType) }), node.d.args[1].d.valueExpr);
1205
+ return { type: types_1.UnknownType.create() };
1206
+ }
1207
+ }
1208
+ else if (enclosingClassType) {
1209
+ bindToType = types_1.ClassType.cloneAsInstance(enclosingClassType);
1210
+ // Get the type from the self or cls parameter if it is explicitly annotated.
1211
+ // If it's a TypeVar, change the bindToType into a conditional type.
1212
+ const enclosingMethod = ParseTreeUtils.getEnclosingFunction(node);
1213
+ let implicitBindToType;
1214
+ if (enclosingMethod) {
1215
+ const methodTypeInfo = getTypeOfFunction(enclosingMethod);
1216
+ if (methodTypeInfo) {
1217
+ const methodType = methodTypeInfo.functionType;
1218
+ if (types_1.FunctionType.isClassMethod(methodType) ||
1219
+ types_1.FunctionType.isConstructorMethod(methodType) ||
1220
+ types_1.FunctionType.isInstanceMethod(methodType)) {
1221
+ if (methodType.shared.parameters.length > 0 &&
1222
+ types_1.FunctionParam.isTypeDeclared(methodType.shared.parameters[0])) {
1223
+ let paramType = types_1.FunctionType.getParamType(methodType, 0);
1224
+ const liveScopeIds = getTypeVarScopesForNode(node);
1225
+ paramType = (0, typeUtils_1.makeTypeVarsBound)(paramType, liveScopeIds);
1226
+ implicitBindToType = makeTopLevelTypeVarsConcrete(paramType);
1227
+ }
1228
+ }
1229
+ }
1230
+ }
1231
+ if (bindToType && implicitBindToType) {
1232
+ const typeCondition = (0, typeUtils_1.getTypeCondition)(implicitBindToType);
1233
+ if (typeCondition) {
1234
+ bindToType = (0, typeUtils_1.addConditionToType)(bindToType, typeCondition);
1235
+ }
1236
+ else if ((0, types_1.isClass)(implicitBindToType)) {
1237
+ bindToType = implicitBindToType;
1238
+ }
1239
+ }
1240
+ }
1241
+ // Determine whether super() should return an instance of the class or
1242
+ // the class itself. It depends on whether the super() call is located
1243
+ // within an instance method or not.
1244
+ let resultIsInstance = true;
1245
+ if (node.d.args.length <= 1) {
1246
+ const enclosingMethod = ParseTreeUtils.getEnclosingFunction(node);
1247
+ if (enclosingMethod) {
1248
+ const methodType = getTypeOfFunction(enclosingMethod);
1249
+ if (methodType) {
1250
+ if (types_1.FunctionType.isStaticMethod(methodType.functionType) ||
1251
+ types_1.FunctionType.isConstructorMethod(methodType.functionType) ||
1252
+ types_1.FunctionType.isClassMethod(methodType.functionType)) {
1253
+ resultIsInstance = false;
1254
+ }
1255
+ }
1256
+ }
1257
+ }
1258
+ // Python docs indicate that super() isn't valid for
1259
+ // operations other than member accesses or attribute lookups.
1260
+ const parentNode = node.parent;
1261
+ if (parentNode?.nodeType === 35 /* ParseNodeType.MemberAccess */) {
1262
+ const memberName = parentNode.d.member.d.value;
1263
+ let effectiveTargetClass = (0, types_1.isClass)(concreteTargetClassType) ? concreteTargetClassType : undefined;
1264
+ // If the bind-to type is a protocol, don't use the effective target class.
1265
+ // This pattern is used for mixins, where the mixin type is a protocol class
1266
+ // that is used to decorate the "self" or "cls" parameter.
1267
+ let isProtocolClass = false;
1268
+ if (bindToType &&
1269
+ types_1.ClassType.isProtocolClass(bindToType) &&
1270
+ effectiveTargetClass &&
1271
+ !types_1.ClassType.isSameGenericClass(types_1.TypeBase.isInstance(bindToType) ? types_1.ClassType.cloneAsInstantiable(bindToType) : bindToType, effectiveTargetClass)) {
1272
+ isProtocolClass = true;
1273
+ effectiveTargetClass = undefined;
1274
+ }
1275
+ if (bindToType) {
1276
+ bindToType = (0, typeUtils_1.selfSpecializeClass)(bindToType, { useBoundTypeVars: true });
1277
+ }
1278
+ const lookupResults = bindToType
1279
+ ? (0, typeUtils_1.lookUpClassMember)(bindToType, memberName, 0 /* MemberAccessFlags.Default */, effectiveTargetClass)
1280
+ : undefined;
1281
+ let resultType;
1282
+ if (lookupResults && (0, types_1.isInstantiableClass)(lookupResults.classType)) {
1283
+ resultType = lookupResults.classType;
1284
+ if (isProtocolClass) {
1285
+ // If the bindToType is a protocol class, set the "include subclasses" flag
1286
+ // so we don't enforce that called methods are implemented within the protocol.
1287
+ resultType = types_1.ClassType.cloneIncludeSubclasses(resultType);
1288
+ }
1289
+ }
1290
+ else if (effectiveTargetClass &&
1291
+ !(0, types_1.isAnyOrUnknown)(effectiveTargetClass) &&
1292
+ !(0, typeUtils_1.derivesFromAnyOrUnknown)(effectiveTargetClass)) {
1293
+ resultType = context.prefetched?.objectClass ?? types_1.UnknownType.create();
1294
+ }
1295
+ else {
1296
+ resultType = types_1.UnknownType.create();
1297
+ }
1298
+ let bindToSelfType;
1299
+ if (bindToType) {
1300
+ if (secondArgType) {
1301
+ // If a TypeVar was passed as the second argument, use it
1302
+ // to derive the the self type.
1303
+ if ((0, types_1.isTypeVar)(secondArgType)) {
1304
+ bindToSelfType = (0, typeUtils_1.convertToInstance)(secondArgType);
1305
+ }
1306
+ }
1307
+ else {
1308
+ // If this is a zero-argument form of super(), synthesize
1309
+ // a Self type to bind to.
1310
+ bindToSelfType = types_1.TypeBase.cloneForCondition(types_1.TypeVarType.cloneAsBound((0, typeUtils_1.synthesizeTypeVarForSelfCls)(types_1.ClassType.cloneIncludeSubclasses(bindToType, /* includeSubclasses */ false),
1311
+ /* isClsParam */ false)), bindToType.props?.condition);
1312
+ }
1313
+ }
1314
+ const type = resultIsInstance ? (0, typeUtils_1.convertToInstance)(resultType, /* includeSubclasses */ false) : resultType;
1315
+ return { type, bindToSelfType };
1316
+ }
1317
+ // Handle the super() call when used outside of a member access expression.
1318
+ if ((0, types_1.isInstantiableClass)(concreteTargetClassType)) {
1319
+ // We don't know which member is going to be accessed, so we cannot
1320
+ // deterministically determine the correct type in this case. We'll
1321
+ // use a heuristic that produces the "correct" (desired) behavior in
1322
+ // most cases. If there's a bindToType and the targetClassType is one
1323
+ // of the base classes of the bindToType, we'll return the next base
1324
+ // class.
1325
+ if (bindToType) {
1326
+ let nextBaseClassType;
1327
+ if (types_1.ClassType.isSameGenericClass(types_1.TypeBase.isInstance(bindToType) ? types_1.ClassType.cloneAsInstantiable(bindToType) : bindToType, concreteTargetClassType)) {
1328
+ if (bindToType.shared.baseClasses.length > 0) {
1329
+ nextBaseClassType = bindToType.shared.baseClasses[0];
1330
+ }
1331
+ }
1332
+ else {
1333
+ const baseClassIndex = bindToType.shared.baseClasses.findIndex((baseClass) => (0, types_1.isClass)(baseClass) &&
1334
+ types_1.ClassType.isSameGenericClass(baseClass, concreteTargetClassType));
1335
+ if (baseClassIndex >= 0 && baseClassIndex < bindToType.shared.baseClasses.length - 1) {
1336
+ nextBaseClassType = bindToType.shared.baseClasses[baseClassIndex + 1];
1337
+ }
1338
+ }
1339
+ if (nextBaseClassType) {
1340
+ if ((0, types_1.isInstantiableClass)(nextBaseClassType)) {
1341
+ nextBaseClassType = (0, typeUtils_1.specializeForBaseClass)(bindToType, nextBaseClassType);
1342
+ }
1343
+ return { type: resultIsInstance ? (0, typeUtils_1.convertToInstance)(nextBaseClassType) : nextBaseClassType };
1344
+ }
1345
+ // There's not much we can say about the type. Simply return object or type.
1346
+ if (context.prefetched?.typeClass && (0, types_1.isInstantiableClass)(context.prefetched.typeClass)) {
1347
+ return {
1348
+ type: resultIsInstance ? getObjectType() : (0, typeUtils_1.convertToInstance)(context.prefetched.typeClass),
1349
+ };
1350
+ }
1351
+ }
1352
+ else {
1353
+ // If the class derives from one or more unknown classes,
1354
+ // return unknown here to prevent spurious errors.
1355
+ if (concreteTargetClassType.shared.mro.some((mroBase) => (0, types_1.isAnyOrUnknown)(mroBase))) {
1356
+ return { type: types_1.UnknownType.create() };
1357
+ }
1358
+ const baseClasses = concreteTargetClassType.shared.baseClasses;
1359
+ if (baseClasses.length > 0) {
1360
+ const baseClassType = baseClasses[0];
1361
+ if ((0, types_1.isInstantiableClass)(baseClassType)) {
1362
+ return {
1363
+ type: resultIsInstance ? types_1.ClassType.cloneAsInstance(baseClassType) : baseClassType,
1364
+ };
1365
+ }
1366
+ }
1367
+ }
1368
+ }
1369
+ return { type: types_1.UnknownType.create() };
1370
+ }
1371
+ function evaluateCastCall(argList, errorNode) {
1372
+ if (argList[0].argCategory !== 0 /* ArgCategory.Simple */ && argList[0].valueExpression) {
1373
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportInvalidTypeForm, localize_1.LocMessage.unpackInAnnotation(), argList[0].valueExpression);
1374
+ }
1375
+ // Verify that the cast is necessary.
1376
+ let castToType = getTypeOfArgExpectingType(argList[0], { typeExpression: true }).type;
1377
+ const liveScopeIds = getTypeVarScopesForNode(errorNode);
1378
+ castToType = (0, typeUtils_1.makeTypeVarsBound)(castToType, liveScopeIds);
1379
+ let castFromType = getTypeOfArg(argList[1], /* inferenceContext */ undefined).type;
1380
+ if (castFromType.props?.specialForm) {
1381
+ castFromType = castFromType.props.specialForm;
1382
+ }
1383
+ if (types_1.TypeBase.isInstantiable(castToType) && !(0, types_1.isUnknown)(castToType)) {
1384
+ if ((0, types_1.isTypeSame)((0, typeUtils_1.convertToInstance)(castToType), castFromType, {
1385
+ ignorePseudoGeneric: true,
1386
+ })) {
1387
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportUnnecessaryCast, localize_1.LocMessage.unnecessaryCast().format({
1388
+ type: printType(castFromType),
1389
+ }), errorNode);
1390
+ }
1391
+ }
1392
+ return (0, typeUtils_1.convertToInstance)(castToType);
1393
+ }
1394
+ function getTypeOfConstant(node, flags) {
1395
+ let type;
1396
+ if (node.d.constType === 27 /* KeywordType.None */) {
1397
+ if (context.prefetched?.noneTypeClass) {
1398
+ type =
1399
+ (flags & 128 /* EvalFlags.InstantiableType */) !== 0
1400
+ ? context.prefetched.noneTypeClass
1401
+ : (0, typeUtils_1.convertToInstance)(context.prefetched.noneTypeClass);
1402
+ type = types_1.TypeBase.cloneWithTypeForm(type, (0, typeUtils_1.convertToInstance)(type));
1403
+ }
1404
+ }
1405
+ else if (node.d.constType === 34 /* KeywordType.True */ ||
1406
+ node.d.constType === 15 /* KeywordType.False */ ||
1407
+ node.d.constType === 9 /* KeywordType.Debug */) {
1408
+ type = getBuiltInObject(node, 'bool');
1409
+ // For True and False, we can create truthy and falsy
1410
+ // versions of 'bool'.
1411
+ if (type && (0, types_1.isClassInstance)(type)) {
1412
+ if (node.d.constType === 34 /* KeywordType.True */) {
1413
+ type = types_1.ClassType.cloneWithLiteral(type, /* value */ true);
1414
+ }
1415
+ else if (node.d.constType === 15 /* KeywordType.False */) {
1416
+ type = types_1.ClassType.cloneWithLiteral(type, /* value */ false);
1417
+ }
1418
+ }
1419
+ }
1420
+ return { type: type ?? types_1.UnknownType.create() };
1421
+ }
1422
+ function getTypeOfMagicMethodCall(objType, methodName, argList, errorNode, inferenceContext, diag) {
1423
+ let magicMethodSupported = true;
1424
+ let isIncomplete = false;
1425
+ let deprecationInfo;
1426
+ const overloadsUsedForCall = [];
1427
+ // Create a helper lambda for object subtypes.
1428
+ const handleSubtype = (subtype) => {
1429
+ let magicMethodType;
1430
+ const concreteSubtype = makeTopLevelTypeVarsConcrete(subtype);
1431
+ if ((0, types_1.isClass)(concreteSubtype)) {
1432
+ magicMethodType = getBoundMagicMethod(concreteSubtype, methodName, subtype, errorNode, diag);
1433
+ }
1434
+ if (magicMethodType) {
1435
+ const functionArgs = argList.map((arg) => {
1436
+ return {
1437
+ argCategory: 0 /* ArgCategory.Simple */,
1438
+ typeResult: arg,
1439
+ };
1440
+ });
1441
+ let callResult;
1442
+ callResult = useSpeculativeMode(errorNode, () => {
1443
+ (0, debug_1.assert)(magicMethodType !== undefined);
1444
+ return validateCallArgs(errorNode, functionArgs, { type: magicMethodType },
1445
+ /* constraints */ undefined,
1446
+ /* skipUnknownArgCheck */ true, inferenceContext);
1447
+ });
1448
+ // If there were errors with the expected type, try
1449
+ // to evaluate without the expected type.
1450
+ if (callResult.argumentErrors && inferenceContext) {
1451
+ callResult = useSpeculativeMode(errorNode, () => {
1452
+ (0, debug_1.assert)(magicMethodType !== undefined);
1453
+ return validateCallArgs(errorNode, functionArgs, { type: magicMethodType },
1454
+ /* constraints */ undefined,
1455
+ /* skipUnknownArgCheck */ true,
1456
+ /* inferenceContext */ undefined);
1457
+ });
1458
+ }
1459
+ if (callResult.argumentErrors) {
1460
+ magicMethodSupported = false;
1461
+ }
1462
+ else if (callResult.overloadsUsedForCall) {
1463
+ callResult.overloadsUsedForCall.forEach((overload) => {
1464
+ overloadsUsedForCall.push(overload);
1465
+ // If one of the overloads is deprecated, note the message.
1466
+ if (overload.shared.deprecatedMessage && (0, types_1.isClass)(concreteSubtype)) {
1467
+ deprecationInfo = {
1468
+ deprecatedMessage: overload.shared.deprecatedMessage,
1469
+ className: concreteSubtype.shared.name,
1470
+ methodName,
1471
+ };
1472
+ }
1473
+ });
1474
+ }
1475
+ if (callResult.isTypeIncomplete) {
1476
+ isIncomplete = true;
1477
+ }
1478
+ return callResult.returnType;
1479
+ }
1480
+ magicMethodSupported = false;
1481
+ return undefined;
1482
+ };
1483
+ const returnType = (0, typeUtils_1.mapSubtypes)(objType, (subtype) => {
1484
+ if ((0, types_1.isAnyOrUnknown)(subtype)) {
1485
+ return subtype;
1486
+ }
1487
+ if ((0, types_1.isClassInstance)(subtype) || (0, types_1.isInstantiableClass)(subtype) || (0, types_1.isTypeVar)(subtype)) {
1488
+ return handleSubtype(subtype);
1489
+ }
1490
+ if ((0, typeUtils_1.isNoneInstance)(subtype)) {
1491
+ if (context.prefetched?.objectClass && (0, types_1.isInstantiableClass)(context.prefetched.objectClass)) {
1492
+ // Use 'object' for 'None'.
1493
+ return handleSubtype(types_1.ClassType.cloneAsInstance(context.prefetched.objectClass));
1494
+ }
1495
+ }
1496
+ if ((0, typeUtils_1.isNoneTypeClass)(subtype)) {
1497
+ if (context.prefetched?.typeClass && (0, types_1.isInstantiableClass)(context.prefetched.typeClass)) {
1498
+ // Use 'type' for 'type[None]'.
1499
+ return handleSubtype(types_1.ClassType.cloneAsInstance(context.prefetched.typeClass));
1500
+ }
1501
+ }
1502
+ magicMethodSupported = false;
1503
+ return undefined;
1504
+ });
1505
+ if (!magicMethodSupported) {
1506
+ return undefined;
1507
+ }
1508
+ return { type: returnType, isIncomplete, magicMethodDeprecationInfo: deprecationInfo, overloadsUsedForCall };
1509
+ }
1510
+ function getTypeOfYield(node) {
1511
+ let expectedYieldType;
1512
+ let sentType;
1513
+ let isIncomplete = false;
1514
+ const enclosingFunction = ParseTreeUtils.getEnclosingFunction(node);
1515
+ if (enclosingFunction) {
1516
+ const functionTypeInfo = getTypeOfFunction(enclosingFunction);
1517
+ if (functionTypeInfo) {
1518
+ let returnType = types_1.FunctionType.getEffectiveReturnType(functionTypeInfo.functionType);
1519
+ if (returnType) {
1520
+ const liveScopeIds = getTypeVarScopesForNode(node);
1521
+ returnType = (0, typeUtils_1.makeTypeVarsBound)(returnType, liveScopeIds);
1522
+ expectedYieldType = (0, typeUtils_1.getGeneratorYieldType)(returnType, !!enclosingFunction.d.isAsync);
1523
+ const generatorTypeArgs = (0, typeUtils_1.getGeneratorTypeArgs)(returnType);
1524
+ if (generatorTypeArgs && generatorTypeArgs.length >= 2) {
1525
+ sentType = (0, typeUtils_1.makeTypeVarsBound)(generatorTypeArgs[1], liveScopeIds);
1526
+ }
1527
+ }
1528
+ }
1529
+ }
1530
+ if (node.d.expr) {
1531
+ const exprResult = getTypeOfExpression(node.d.expr,
1532
+ /* flags */ undefined, (0, typeUtils_1.makeInferenceContext)(expectedYieldType));
1533
+ if (exprResult.isIncomplete) {
1534
+ isIncomplete = true;
1535
+ }
1536
+ }
1537
+ return { type: sentType || types_1.UnknownType.create(), isIncomplete };
1538
+ }
1539
+ function getTypeOfYieldFrom(node) {
1540
+ const yieldFromTypeResult = getTypeOfExpression(node.d.expr);
1541
+ const yieldFromType = yieldFromTypeResult.type;
1542
+ const returnedType = (0, typeUtils_1.mapSubtypes)(yieldFromType, (yieldFromSubtype) => {
1543
+ // Is the expression a Generator type?
1544
+ let generatorTypeArgs = (0, typeUtils_1.getGeneratorTypeArgs)(yieldFromSubtype);
1545
+ if (generatorTypeArgs) {
1546
+ return generatorTypeArgs.length >= 2 ? generatorTypeArgs[2] : types_1.UnknownType.create();
1547
+ }
1548
+ // Handle old-style (pre-await) Coroutines as a special case.
1549
+ if ((0, types_1.isClassInstance)(yieldFromSubtype) &&
1550
+ types_1.ClassType.isBuiltIn(yieldFromSubtype, ['Coroutine', 'CoroutineType'])) {
1551
+ return types_1.UnknownType.create();
1552
+ }
1553
+ // Handle simple iterables.
1554
+ const iterableType = getTypeOfIterable(yieldFromTypeResult, /* isAsync */ false, node)?.type ?? types_1.UnknownType.create();
1555
+ // Does the iterable return a Generator?
1556
+ generatorTypeArgs = (0, typeUtils_1.getGeneratorTypeArgs)(iterableType);
1557
+ return generatorTypeArgs && generatorTypeArgs.length >= 2 ? generatorTypeArgs[2] : types_1.UnknownType.create();
1558
+ });
1559
+ return { type: returnedType };
1560
+ }
1561
+ function getTypeOfSlice(node) {
1562
+ const noneType = getNoneType();
1563
+ let startType = noneType;
1564
+ let endType = noneType;
1565
+ let stepType = noneType;
1566
+ let isIncomplete = false;
1567
+ // Evaluate the expressions to report errors and record symbol
1568
+ // references.
1569
+ if (node.d.startValue) {
1570
+ const startTypeResult = getTypeOfExpression(node.d.startValue);
1571
+ startType = startTypeResult.type;
1572
+ if (startTypeResult.isIncomplete) {
1573
+ isIncomplete = true;
1574
+ }
1575
+ }
1576
+ if (node.d.endValue) {
1577
+ const endTypeResult = getTypeOfExpression(node.d.endValue);
1578
+ endType = endTypeResult.type;
1579
+ if (endTypeResult.isIncomplete) {
1580
+ isIncomplete = true;
1581
+ }
1582
+ }
1583
+ if (node.d.stepValue) {
1584
+ const stepTypeResult = getTypeOfExpression(node.d.stepValue);
1585
+ stepType = stepTypeResult.type;
1586
+ if (stepTypeResult.isIncomplete) {
1587
+ isIncomplete = true;
1588
+ }
1589
+ }
1590
+ const sliceType = getBuiltInObject(node, 'slice');
1591
+ if (!(0, types_1.isClassInstance)(sliceType)) {
1592
+ return { type: sliceType };
1593
+ }
1594
+ return { type: types_1.ClassType.specialize(sliceType, [startType, endType, stepType]), isIncomplete };
1595
+ }
1596
+ function getTypeOfArg(arg, inferenceContext) {
1597
+ if (arg.typeResult) {
1598
+ const type = arg.typeResult.type;
1599
+ return { type: type?.props?.specialForm ?? type, isIncomplete: arg.typeResult.isIncomplete };
1600
+ }
1601
+ if (!arg.valueExpression) {
1602
+ // We shouldn't ever get here, but just in case.
1603
+ return { type: types_1.UnknownType.create() };
1604
+ }
1605
+ // If there was no defined type provided, there should always
1606
+ // be a value expression from which we can retrieve the type.
1607
+ return getTypeOfExpression(arg.valueExpression, /* flags */ undefined, inferenceContext);
1608
+ }
1609
+ function getTypeOfExpressionExpectingType(node, options) {
1610
+ let flags = 128 /* EvalFlags.InstantiableType */ | 8 /* EvalFlags.StrLiteralAsType */;
1611
+ if (options?.allowTypeVarsWithoutScopeId) {
1612
+ flags |= 4096 /* EvalFlags.AllowTypeVarWithoutScopeId */;
1613
+ }
1614
+ if (options?.typeVarGetsCurScope) {
1615
+ flags |= 8192 /* EvalFlags.TypeVarGetsCurScope */;
1616
+ }
1617
+ if (options?.enforceClassTypeVarScope) {
1618
+ flags |= -2147483648 /* EvalFlags.EnforceClassTypeVarScope */;
1619
+ }
1620
+ const fileInfo = nodeInfo.getFileInfo(node);
1621
+ if (((0, analyzerFileInfo_1.isAnnotationEvaluationPostponed)(fileInfo) || options?.forwardRefs) && !options?.runtimeTypeExpression) {
1622
+ flags |= 4 /* EvalFlags.ForwardRefs */;
1623
+ }
1624
+ else if (options?.parsesStringLiteral) {
1625
+ flags |= 16777216 /* EvalFlags.ParsesStringLiteral */;
1626
+ }
1627
+ if (!options?.allowFinal) {
1628
+ flags |= 16 /* EvalFlags.NoFinal */;
1629
+ }
1630
+ if (options?.allowRequired) {
1631
+ flags |= 1048576 /* EvalFlags.AllowRequired */ | 256 /* EvalFlags.TypeExpression */;
1632
+ }
1633
+ if (options?.allowReadOnly) {
1634
+ flags |= 2097152 /* EvalFlags.AllowReadOnly */ | 256 /* EvalFlags.TypeExpression */;
1635
+ }
1636
+ if (options?.allowUnpackedTuple) {
1637
+ flags |= 4194304 /* EvalFlags.AllowUnpackedTuple */;
1638
+ }
1639
+ else {
1640
+ flags |= 64 /* EvalFlags.NoTypeVarTuple */;
1641
+ }
1642
+ if (options?.allowUnpackedTypedDict) {
1643
+ flags |= 8388608 /* EvalFlags.AllowUnpackedTypedDict */;
1644
+ }
1645
+ if (!options?.allowParamSpec) {
1646
+ flags |= 32 /* EvalFlags.NoParamSpec */;
1647
+ }
1648
+ if (options?.typeExpression) {
1649
+ flags |= 256 /* EvalFlags.TypeExpression */;
1650
+ }
1651
+ if (options?.convertEllipsisToAny) {
1652
+ flags |= 1 /* EvalFlags.ConvertEllipsisToAny */;
1653
+ }
1654
+ if (options?.allowEllipsis) {
1655
+ flags |= 65536 /* EvalFlags.AllowEllipsis */;
1656
+ }
1657
+ if (options?.noNonTypeSpecialForms) {
1658
+ flags |= 67108864 /* EvalFlags.NoNonTypeSpecialForms */;
1659
+ }
1660
+ if (!options?.allowClassVar) {
1661
+ flags |= 131072 /* EvalFlags.NoClassVar */;
1662
+ }
1663
+ if (options?.varTypeAnnotation) {
1664
+ flags |= 32768 /* EvalFlags.VarTypeAnnotation */;
1665
+ }
1666
+ if (options?.notParsed) {
1667
+ flags |= 524288 /* EvalFlags.NotParsed */;
1668
+ }
1669
+ if (options?.typeFormArg) {
1670
+ flags |= 1073741824 /* EvalFlags.TypeFormArg */;
1671
+ }
1672
+ return getTypeOfExpression(node, flags);
1673
+ }
1674
+ function expandArgTypes(contextFreeArgTypes, expandedArgTypes) {
1675
+ // Find the rightmost already-expanded argument.
1676
+ let indexToExpand = contextFreeArgTypes.length - 1;
1677
+ while (indexToExpand >= 0 && !expandedArgTypes[0][indexToExpand]) {
1678
+ indexToExpand--;
1679
+ }
1680
+ // Move to the next candidate for expansion.
1681
+ indexToExpand++;
1682
+ if (indexToExpand >= contextFreeArgTypes.length) {
1683
+ return undefined;
1684
+ }
1685
+ let expandedTypes;
1686
+ while (indexToExpand < contextFreeArgTypes.length) {
1687
+ // Is this a union type? If so, we can expand it.
1688
+ const argType = contextFreeArgTypes[indexToExpand];
1689
+ expandedTypes = expandArgType(argType);
1690
+ if (expandedTypes) {
1691
+ break;
1692
+ }
1693
+ indexToExpand++;
1694
+ }
1695
+ // We have nothing left to expand.
1696
+ if (!expandedTypes) {
1697
+ return undefined;
1698
+ }
1699
+ // Expand entry indexToExpand.
1700
+ const newExpandedArgTypes = [];
1701
+ expandedArgTypes.forEach((preExpandedTypes) => {
1702
+ expandedTypes.forEach((subtype) => {
1703
+ const expandedTypes = [...preExpandedTypes];
1704
+ expandedTypes[indexToExpand] = subtype;
1705
+ newExpandedArgTypes.push(expandedTypes);
1706
+ });
1707
+ });
1708
+ return newExpandedArgTypes;
1709
+ }
1710
+ function expandArgList(argList) {
1711
+ const expandedArgList = [];
1712
+ for (const arg of argList) {
1713
+ if (arg.argCategory === 1 /* ArgCategory.UnpackedList */) {
1714
+ const argType = getTypeOfArg(arg, /* inferenceContext */ undefined).type;
1715
+ // If this is a tuple with specified element types, use those
1716
+ // specified types rather than using the more generic iterator
1717
+ // type which will be a union of all element types.
1718
+ const combinedArgType = (0, typeUtils_1.combineSameSizedTuples)(makeTopLevelTypeVarsConcrete(argType), context.prefetched?.tupleClass);
1719
+ if ((0, types_1.isClassInstance)(combinedArgType) && (0, typeUtils_1.isTupleClass)(combinedArgType)) {
1720
+ const tupleTypeArgs = combinedArgType.priv.tupleTypeArgs ?? [];
1721
+ if (tupleTypeArgs.length !== 1 || !tupleTypeArgs[0].isUnbounded) {
1722
+ for (const tupleTypeArg of tupleTypeArgs) {
1723
+ if (tupleTypeArg.isUnbounded) {
1724
+ expandedArgList.push({
1725
+ ...arg,
1726
+ argCategory: 1 /* ArgCategory.UnpackedList */,
1727
+ valueExpression: undefined,
1728
+ typeResult: {
1729
+ type: (0, tuples_1.makeTupleObject)(evaluatorInterface, [tupleTypeArg]),
1730
+ },
1731
+ });
1732
+ }
1733
+ else {
1734
+ expandedArgList.push({
1735
+ ...arg,
1736
+ argCategory: 0 /* ArgCategory.Simple */,
1737
+ valueExpression: undefined,
1738
+ typeResult: {
1739
+ type: tupleTypeArg.type,
1740
+ },
1741
+ });
1742
+ }
1743
+ }
1744
+ continue;
1745
+ }
1746
+ }
1747
+ }
1748
+ expandedArgList.push(arg);
1749
+ }
1750
+ return expandedArgList;
1751
+ }
1752
+ function expandArgType(type) {
1753
+ const expandedTypes = [];
1754
+ // Expand any top-level type variables with constraints.
1755
+ type = makeTopLevelTypeVarsConcrete(type);
1756
+ (0, typeUtils_1.doForEachSubtype)(type, (subtype) => {
1757
+ if ((0, types_1.isClassInstance)(subtype)) {
1758
+ // Expand any bool or Enum literals.
1759
+ const expandedLiteralTypes = (0, typeGuards_1.enumerateLiteralsForType)(evaluatorInterface, subtype);
1760
+ if (expandedLiteralTypes && expandedLiteralTypes.length <= maxSingleOverloadArgTypeExpansionCount) {
1761
+ (0, collectionUtils_1.appendArray)(expandedTypes, expandedLiteralTypes);
1762
+ return;
1763
+ }
1764
+ // Expand any fixed-size tuples.
1765
+ const expandedTuples = (0, tuples_1.expandTuple)(subtype, maxSingleOverloadArgTypeExpansionCount);
1766
+ if (expandedTuples) {
1767
+ (0, collectionUtils_1.appendArray)(expandedTypes, expandedTuples);
1768
+ return;
1769
+ }
1770
+ }
1771
+ expandedTypes.push(subtype);
1772
+ });
1773
+ return expandedTypes.length > 1 ? expandedTypes : undefined;
1774
+ }
1775
+ return {
1776
+ getTypeOfEllipsis,
1777
+ getTypeOfUnpackOperator,
1778
+ getTypeOfString,
1779
+ getDeclaredTypeForExpression,
1780
+ getTypeOfIterator,
1781
+ getTypeOfIterable,
1782
+ getTypeOfIndexedObjectOrClass,
1783
+ getTypeArg,
1784
+ getTypeOfLambdaForCall,
1785
+ getTypeOfTypeForm,
1786
+ getTypeOfAssertType,
1787
+ getTypeOfRevealLocals,
1788
+ getTypeOfSuperCall,
1789
+ evaluateCastCall,
1790
+ getTypeOfConstant,
1791
+ getTypeOfMagicMethodCall,
1792
+ getTypeOfYield,
1793
+ getTypeOfYieldFrom,
1794
+ getTypeOfSlice,
1795
+ getTypeOfArg,
1796
+ getTypeOfExpressionExpectingType,
1797
+ getTypeOfStringList,
1798
+ expandArgTypes,
1799
+ expandArgList,
1800
+ };
1801
+ }
1802
+ //# sourceMappingURL=expressionEvaluation.js.map