@zzzen/pyright-internal 1.2.0-dev.20231029 → 1.2.0-dev.20231112

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 (185) hide show
  1. package/dist/analyzer/analyzerFileInfo.d.ts +1 -0
  2. package/dist/analyzer/analyzerFileInfo.js.map +1 -1
  3. package/dist/analyzer/checker.js +99 -105
  4. package/dist/analyzer/checker.js.map +1 -1
  5. package/dist/analyzer/codeFlowEngine.js +12 -33
  6. package/dist/analyzer/codeFlowEngine.js.map +1 -1
  7. package/dist/analyzer/codeFlowUtils.js +4 -2
  8. package/dist/analyzer/codeFlowUtils.js.map +1 -1
  9. package/dist/analyzer/constraintSolver.js +21 -23
  10. package/dist/analyzer/constraintSolver.js.map +1 -1
  11. package/dist/analyzer/constructorTransform.js +4 -6
  12. package/dist/analyzer/constructorTransform.js.map +1 -1
  13. package/dist/analyzer/constructors.d.ts +6 -3
  14. package/dist/analyzer/constructors.js +66 -41
  15. package/dist/analyzer/constructors.js.map +1 -1
  16. package/dist/analyzer/dataClasses.js +13 -18
  17. package/dist/analyzer/dataClasses.js.map +1 -1
  18. package/dist/analyzer/declarationUtils.js +1 -1
  19. package/dist/analyzer/declarationUtils.js.map +1 -1
  20. package/dist/analyzer/decorators.js +1 -1
  21. package/dist/analyzer/decorators.js.map +1 -1
  22. package/dist/analyzer/enums.d.ts +2 -5
  23. package/dist/analyzer/enums.js +5 -3
  24. package/dist/analyzer/enums.js.map +1 -1
  25. package/dist/analyzer/functionTransform.js +1 -1
  26. package/dist/analyzer/functionTransform.js.map +1 -1
  27. package/dist/analyzer/importResolver.d.ts +4 -2
  28. package/dist/analyzer/importResolver.js +30 -10
  29. package/dist/analyzer/importResolver.js.map +1 -1
  30. package/dist/analyzer/importStatementUtils.d.ts +1 -1
  31. package/dist/analyzer/importStatementUtils.js +33 -5
  32. package/dist/analyzer/importStatementUtils.js.map +1 -1
  33. package/dist/analyzer/namedTuples.js +3 -2
  34. package/dist/analyzer/namedTuples.js.map +1 -1
  35. package/dist/analyzer/operations.js +34 -31
  36. package/dist/analyzer/operations.js.map +1 -1
  37. package/dist/analyzer/packageTypeVerifier.js +28 -26
  38. package/dist/analyzer/packageTypeVerifier.js.map +1 -1
  39. package/dist/analyzer/parseTreeUtils.d.ts +1 -0
  40. package/dist/analyzer/parseTreeUtils.js +17 -2
  41. package/dist/analyzer/parseTreeUtils.js.map +1 -1
  42. package/dist/analyzer/patternMatching.js +6 -6
  43. package/dist/analyzer/patternMatching.js.map +1 -1
  44. package/dist/analyzer/program.d.ts +1 -1
  45. package/dist/analyzer/program.js +34 -21
  46. package/dist/analyzer/program.js.map +1 -1
  47. package/dist/analyzer/properties.js +25 -28
  48. package/dist/analyzer/properties.js.map +1 -1
  49. package/dist/analyzer/protocols.d.ts +1 -1
  50. package/dist/analyzer/protocols.js +15 -19
  51. package/dist/analyzer/protocols.js.map +1 -1
  52. package/dist/analyzer/service.js +12 -6
  53. package/dist/analyzer/service.js.map +1 -1
  54. package/dist/analyzer/sourceFile.d.ts +1 -0
  55. package/dist/analyzer/sourceFile.js +36 -2
  56. package/dist/analyzer/sourceFile.js.map +1 -1
  57. package/dist/analyzer/sourceFileInfoUtils.d.ts +1 -1
  58. package/dist/analyzer/sourceFileInfoUtils.js +9 -3
  59. package/dist/analyzer/sourceFileInfoUtils.js.map +1 -1
  60. package/dist/analyzer/tracePrinter.js +11 -13
  61. package/dist/analyzer/tracePrinter.js.map +1 -1
  62. package/dist/analyzer/typeDocStringUtils.js +3 -3
  63. package/dist/analyzer/typeDocStringUtils.js.map +1 -1
  64. package/dist/analyzer/typeEvaluator.d.ts +3 -1
  65. package/dist/analyzer/typeEvaluator.js +1184 -1270
  66. package/dist/analyzer/typeEvaluator.js.map +1 -1
  67. package/dist/analyzer/typeEvaluatorTypes.d.ts +13 -26
  68. package/dist/analyzer/typeEvaluatorTypes.js +1 -36
  69. package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
  70. package/dist/analyzer/typeGuards.js +37 -32
  71. package/dist/analyzer/typeGuards.js.map +1 -1
  72. package/dist/analyzer/typePrinter.js +19 -18
  73. package/dist/analyzer/typePrinter.js.map +1 -1
  74. package/dist/analyzer/typeUtils.d.ts +17 -8
  75. package/dist/analyzer/typeUtils.js +149 -94
  76. package/dist/analyzer/typeUtils.js.map +1 -1
  77. package/dist/analyzer/typeVarContext.js +6 -7
  78. package/dist/analyzer/typeVarContext.js.map +1 -1
  79. package/dist/analyzer/typeWalker.d.ts +1 -2
  80. package/dist/analyzer/typeWalker.js +7 -13
  81. package/dist/analyzer/typeWalker.js.map +1 -1
  82. package/dist/analyzer/typedDicts.js +10 -10
  83. package/dist/analyzer/typedDicts.js.map +1 -1
  84. package/dist/analyzer/types.d.ts +11 -20
  85. package/dist/analyzer/types.js +45 -77
  86. package/dist/analyzer/types.js.map +1 -1
  87. package/dist/commands/dumpFileDebugInfoCommand.js +7 -9
  88. package/dist/commands/dumpFileDebugInfoCommand.js.map +1 -1
  89. package/dist/common/commandLineOptions.d.ts +2 -1
  90. package/dist/common/commandLineOptions.js +1 -1
  91. package/dist/common/commandLineOptions.js.map +1 -1
  92. package/dist/common/configOptions.d.ts +3 -2
  93. package/dist/common/configOptions.js +40 -25
  94. package/dist/common/configOptions.js.map +1 -1
  95. package/dist/common/extensibility.d.ts +3 -0
  96. package/dist/common/pathUtils.d.ts +1 -1
  97. package/dist/common/pathUtils.js +11 -10
  98. package/dist/common/pathUtils.js.map +1 -1
  99. package/dist/common/realFileSystem.js +4 -6
  100. package/dist/common/realFileSystem.js.map +1 -1
  101. package/dist/common/serviceProviderExtensions.d.ts +2 -1
  102. package/dist/common/serviceProviderExtensions.js +1 -0
  103. package/dist/common/serviceProviderExtensions.js.map +1 -1
  104. package/dist/common/textEditTracker.js +2 -2
  105. package/dist/common/textEditTracker.js.map +1 -1
  106. package/dist/languageServerBase.d.ts +3 -3
  107. package/dist/languageServerBase.js +18 -15
  108. package/dist/languageServerBase.js.map +1 -1
  109. package/dist/languageService/analyzerServiceExecutor.js +1 -1
  110. package/dist/languageService/analyzerServiceExecutor.js.map +1 -1
  111. package/dist/languageService/callHierarchyProvider.js +3 -3
  112. package/dist/languageService/callHierarchyProvider.js.map +1 -1
  113. package/dist/languageService/completionProvider.d.ts +2 -1
  114. package/dist/languageService/completionProvider.js +12 -10
  115. package/dist/languageService/completionProvider.js.map +1 -1
  116. package/dist/languageService/completionProviderUtils.js +1 -1
  117. package/dist/languageService/definitionProvider.js +1 -1
  118. package/dist/languageService/documentSymbolCollector.js +1 -1
  119. package/dist/languageService/hoverProvider.js +1 -1
  120. package/dist/languageService/signatureHelpProvider.js +0 -14
  121. package/dist/languageService/signatureHelpProvider.js.map +1 -1
  122. package/dist/languageService/tooltipUtils.js +4 -4
  123. package/dist/languageService/tooltipUtils.js.map +1 -1
  124. package/dist/localization/localize.d.ts +16 -0
  125. package/dist/localization/localize.js +6 -0
  126. package/dist/localization/localize.js.map +1 -1
  127. package/dist/localization/package.nls.cs.json +4 -1
  128. package/dist/localization/package.nls.de.json +4 -1
  129. package/dist/localization/package.nls.en-us.json +7 -1
  130. package/dist/localization/package.nls.es.json +4 -1
  131. package/dist/localization/package.nls.fr.json +4 -1
  132. package/dist/localization/package.nls.it.json +4 -1
  133. package/dist/localization/package.nls.ja.json +4 -1
  134. package/dist/localization/package.nls.ko.json +4 -1
  135. package/dist/localization/package.nls.pl.json +4 -1
  136. package/dist/localization/package.nls.pt-br.json +4 -1
  137. package/dist/localization/package.nls.qps-ploc.json +3 -0
  138. package/dist/localization/package.nls.ru.json +4 -1
  139. package/dist/localization/package.nls.tr.json +4 -1
  140. package/dist/localization/package.nls.zh-cn.json +4 -1
  141. package/dist/localization/package.nls.zh-tw.json +4 -1
  142. package/dist/pyright.js +3 -6
  143. package/dist/pyright.js.map +1 -1
  144. package/dist/server.d.ts +1 -0
  145. package/dist/server.js +10 -1
  146. package/dist/server.js.map +1 -1
  147. package/dist/tests/diagnosticOverrides.test.js +4 -2
  148. package/dist/tests/diagnosticOverrides.test.js.map +1 -1
  149. package/dist/tests/fourslash/{completions.importInterimFile.fourslash.js → completions.importInterimFile.fourslash.disabled.js} +2 -2
  150. package/dist/tests/fourslash/completions.importInterimFile.fourslash.disabled.js.map +1 -0
  151. package/dist/tests/fourslash/fourslash.d.ts +1 -1
  152. package/dist/tests/fourslash/signature.complicated.fourslash.js +6 -6
  153. package/dist/tests/fourslash/signature.complicated.fourslash.js.map +1 -1
  154. package/dist/tests/fourslash/signature.dunderNew.fourslash.js +1 -1
  155. package/dist/tests/fourslash/signature.dunderNew.fourslash.js.map +1 -1
  156. package/dist/tests/harness/fourslash/testState.d.ts +1 -1
  157. package/dist/tests/harness/fourslash/testState.js +4 -4
  158. package/dist/tests/harness/fourslash/testState.js.map +1 -1
  159. package/dist/tests/harness/vfs/filesystem.js +1 -1
  160. package/dist/tests/harness/vfs/filesystem.js.map +1 -1
  161. package/dist/tests/logger.test.js +0 -1
  162. package/dist/tests/logger.test.js.map +1 -1
  163. package/dist/tests/parseTreeUtils.test.js +15 -0
  164. package/dist/tests/parseTreeUtils.test.js.map +1 -1
  165. package/dist/tests/pathUtils.test.js +30 -1
  166. package/dist/tests/pathUtils.test.js.map +1 -1
  167. package/dist/tests/testUtils.js +2 -1
  168. package/dist/tests/testUtils.js.map +1 -1
  169. package/dist/tests/textEditUtil.test.js +25 -0
  170. package/dist/tests/textEditUtil.test.js.map +1 -1
  171. package/dist/tests/typeEvaluator1.test.js +7 -3
  172. package/dist/tests/typeEvaluator1.test.js.map +1 -1
  173. package/dist/tests/typeEvaluator2.test.js +5 -1
  174. package/dist/tests/typeEvaluator2.test.js.map +1 -1
  175. package/dist/tests/typeEvaluator3.test.js +10 -4
  176. package/dist/tests/typeEvaluator3.test.js.map +1 -1
  177. package/dist/tests/typeEvaluator4.test.js +11 -7
  178. package/dist/tests/typeEvaluator4.test.js.map +1 -1
  179. package/dist/tests/typePrinter.test.js +12 -16
  180. package/dist/tests/typePrinter.test.js.map +1 -1
  181. package/dist/tests/zipfs.test.js +2 -0
  182. package/dist/tests/zipfs.test.js.map +1 -1
  183. package/package.json +1 -1
  184. package/dist/tests/fourslash/completions.importInterimFile.fourslash.js.map +0 -1
  185. /package/dist/tests/fourslash/{completions.importInterimFile.fourslash.d.ts → completions.importInterimFile.fourslash.disabled.d.ts} +0 -0
@@ -37,6 +37,7 @@ export interface AnalyzerFileInfo {
37
37
  isStubFile: boolean;
38
38
  isTypingStubFile: boolean;
39
39
  isTypingExtensionsStubFile: boolean;
40
+ isTypeshedStubFile: boolean;
40
41
  isBuiltInStubFile: boolean;
41
42
  isInPyTypedPackage: boolean;
42
43
  ipythonMode: IPythonMode;
@@ -1 +1 @@
1
- {"version":3,"file":"analyzerFileInfo.js","sourceRoot":"","sources":["../../../src/analyzer/analyzerFileInfo.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAIH,2DAAwD;AAqDxD,SAAgB,+BAA+B,CAAC,QAA0B;IACtE,IAAI,QAAQ,CAAC,UAAU,EAAE;QACrB,OAAO,IAAI,CAAC;KACf;IAED,IAAI,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;QAC3C,OAAO,IAAI,CAAC;KACf;IAED,oFAAoF;IACpF,iFAAiF;IACjF,8BAA8B;IAC9B,qGAAqG;IACrG,IAAI,QAAQ,CAAC,oBAAoB,CAAC,aAAa,IAAI,6BAAa,CAAC,KAAK,EAAE;QACpE,OAAO,IAAI,CAAC;KACf;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAlBD,0EAkBC"}
1
+ {"version":3,"file":"analyzerFileInfo.js","sourceRoot":"","sources":["../../../src/analyzer/analyzerFileInfo.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAIH,2DAAwD;AAsDxD,SAAgB,+BAA+B,CAAC,QAA0B;IACtE,IAAI,QAAQ,CAAC,UAAU,EAAE;QACrB,OAAO,IAAI,CAAC;KACf;IAED,IAAI,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;QAC3C,OAAO,IAAI,CAAC;KACf;IAED,oFAAoF;IACpF,iFAAiF;IACjF,8BAA8B;IAC9B,qGAAqG;IACrG,IAAI,QAAQ,CAAC,oBAAoB,CAAC,aAAa,IAAI,6BAAa,CAAC,KAAK,EAAE;QACpE,OAAO,IAAI,CAAC;KACf;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAlBD,0EAkBC"}
@@ -46,6 +46,7 @@ const localize_1 = require("../localization/localize");
46
46
  const parseNodes_1 = require("../parser/parseNodes");
47
47
  const stringTokenUtils_1 = require("../parser/stringTokenUtils");
48
48
  const AnalyzerNodeInfo = __importStar(require("./analyzerNodeInfo"));
49
+ const constructors_1 = require("./constructors");
49
50
  const declaration_1 = require("./declaration");
50
51
  const declarationUtils_1 = require("./declarationUtils");
51
52
  const deprecatedSymbols_1 = require("./deprecatedSymbols");
@@ -176,7 +177,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
176
177
  this._validateBaseClassOverrides(classTypeResult.classType);
177
178
  this._validateMultipleInheritanceBaseClasses(classTypeResult.classType, node.name);
178
179
  this._validateMultipleInheritanceCompatibility(classTypeResult.classType, node.name);
179
- this._validateConstructorConsistency(classTypeResult.classType);
180
+ this._validateConstructorConsistency(classTypeResult.classType, node.name);
180
181
  this._validateFinalMemberOverrides(classTypeResult.classType);
181
182
  this._validateInstanceVariableInitialization(node, classTypeResult.classType);
182
183
  this._validateFinalClassNotAbstract(classTypeResult.classType, node);
@@ -195,7 +196,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
195
196
  return false;
196
197
  }
197
198
  visitFunction(node) {
198
- var _a;
199
+ var _a, _b;
199
200
  if (node.typeParameters) {
200
201
  this.walk(node.typeParameters);
201
202
  }
@@ -210,9 +211,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
210
211
  // Track whether we have seen a *args: P.args parameter. Named
211
212
  // parameters after this need to be flagged as an error.
212
213
  let sawParamSpecArgs = false;
214
+ const keywordNames = new Set();
215
+ const paramDetails = (0, parameterUtils_1.getParameterListDetails)(functionTypeResult.functionType);
213
216
  // Report any unknown or missing parameter types.
214
217
  node.parameters.forEach((param, index) => {
215
218
  if (param.name) {
219
+ if (param.category === 0 /* Simple */ && index >= paramDetails.positionOnlyParamCount) {
220
+ keywordNames.add(param.name.value);
221
+ }
216
222
  // Determine whether this is a P.args parameter.
217
223
  if (param.category === 1 /* ArgsList */) {
218
224
  const annotationExpr = param.typeAnnotation || param.typeAnnotationComment;
@@ -270,6 +276,24 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
270
276
  }
271
277
  }
272
278
  });
279
+ // Verify that an unpacked TypedDict doesn't overlap any keyword parameters.
280
+ if (paramDetails.hasUnpackedTypedDict) {
281
+ const kwargsIndex = functionTypeResult.functionType.details.parameters.length - 1;
282
+ const kwargsType = types_1.FunctionType.getEffectiveParameterType(functionTypeResult.functionType, kwargsIndex);
283
+ if ((0, types_1.isClass)(kwargsType) && kwargsType.details.typedDictEntries) {
284
+ const overlappingEntries = new Set();
285
+ kwargsType.details.typedDictEntries.forEach((_, name) => {
286
+ if (keywordNames.has(name)) {
287
+ overlappingEntries.add(name);
288
+ }
289
+ });
290
+ if (overlappingEntries.size > 0) {
291
+ this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.overlappingKeywordArgs().format({
292
+ names: [...overlappingEntries.values()].join(', '),
293
+ }), (_a = node.parameters[kwargsIndex].typeAnnotation) !== null && _a !== void 0 ? _a : node.parameters[kwargsIndex]);
294
+ }
295
+ }
296
+ }
273
297
  // Check for invalid use of ParamSpec P.args and P.kwargs.
274
298
  const paramSpecParams = functionTypeResult.functionType.details.parameters.filter((param) => {
275
299
  if (param.typeAnnotation && (0, types_1.isTypeVar)(param.type) && (0, types_1.isParamSpec)(param.type)) {
@@ -284,7 +308,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
284
308
  }
285
309
  // If this is a stub, ensure that the return type is specified.
286
310
  if (this._fileInfo.isStubFile) {
287
- const returnAnnotation = node.returnTypeAnnotation || ((_a = node.functionAnnotationComment) === null || _a === void 0 ? void 0 : _a.returnTypeAnnotation);
311
+ const returnAnnotation = node.returnTypeAnnotation || ((_b = node.functionAnnotationComment) === null || _b === void 0 ? void 0 : _b.returnTypeAnnotation);
288
312
  if (!returnAnnotation) {
289
313
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportUnknownParameterType, diagnosticRules_1.DiagnosticRule.reportUnknownParameterType, localize_1.Localizer.Diagnostic.returnTypeUnknown(), node.name);
290
314
  }
@@ -514,7 +538,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
514
538
  }
515
539
  else {
516
540
  // There is no return expression, so "None" is assumed.
517
- returnTypeResult = { type: types_1.NoneType.createInstance() };
541
+ returnTypeResult = { type: this._evaluator.getNoneType() };
518
542
  }
519
543
  // If the enclosing function is async and a generator, the return
520
544
  // statement is not allowed to have an argument. A syntax error occurs
@@ -591,7 +615,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
591
615
  var _a;
592
616
  const yieldTypeResult = node.expression
593
617
  ? this._evaluator.getTypeResult(node.expression)
594
- : { type: types_1.NoneType.createInstance() };
618
+ : { type: this._evaluator.getNoneType() };
595
619
  this._validateYieldType(node, (_a = yieldTypeResult === null || yieldTypeResult === void 0 ? void 0 : yieldTypeResult.type) !== null && _a !== void 0 ? _a : types_1.UnknownType.create(), yieldTypeResult === null || yieldTypeResult === void 0 ? void 0 : yieldTypeResult.expectedTypeDiagAddendum);
596
620
  return true;
597
621
  }
@@ -633,7 +657,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
633
657
  const diagAddendum = new diagnostic_1.DiagnosticAddendum();
634
658
  (0, typeUtils_1.doForEachSubtype)(exceptionType, (subtype) => {
635
659
  subtype = this._evaluator.makeTopLevelTypeVarsConcrete(subtype);
636
- if (!(0, types_1.isAnyOrUnknown)(subtype) && !(0, types_1.isNoneInstance)(subtype)) {
660
+ if (!(0, types_1.isAnyOrUnknown)(subtype) && !(0, typeUtils_1.isNoneInstance)(subtype)) {
637
661
  if ((0, types_1.isClass)(subtype)) {
638
662
  if (!(0, typeUtils_1.derivesFromClassRecursive)(subtype, baseExceptionType, /* ignoreUnknown */ false)) {
639
663
  diagAddendum.addMessage(localize_1.Localizer.Diagnostic.exceptionTypeIncorrect().format({
@@ -1077,7 +1101,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1077
1101
  return undefined;
1078
1102
  }
1079
1103
  // Invoke the __bool__ method on the type.
1080
- const boolReturnType = this._evaluator.getTypeOfMagicMethodReturn(expandedSubtype, [], '__bool__', node,
1104
+ const boolReturnType = this._evaluator.getTypeOfMagicMethodCall(expandedSubtype, '__bool__', [], node,
1081
1105
  /* inferenceContext */ undefined);
1082
1106
  if (!boolReturnType || (0, types_1.isAnyOrUnknown)(boolReturnType)) {
1083
1107
  return undefined;
@@ -1252,7 +1276,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1252
1276
  // operation have overlapping types.
1253
1277
  _validateComparisonTypesForIsOperator(node) {
1254
1278
  const rightType = this._evaluator.getType(node.rightExpression);
1255
- if (!rightType || !(0, types_1.isNoneInstance)(rightType)) {
1279
+ if (!rightType || !(0, typeUtils_1.isNoneInstance)(rightType)) {
1256
1280
  return;
1257
1281
  }
1258
1282
  const leftType = this._evaluator.getType(node.leftExpression);
@@ -1262,7 +1286,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1262
1286
  let foundMatchForNone = false;
1263
1287
  (0, typeUtils_1.doForEachSubtype)(leftType, (subtype) => {
1264
1288
  subtype = this._evaluator.makeTopLevelTypeVarsConcrete(subtype);
1265
- if (this._evaluator.assignType(subtype, types_1.NoneType.createInstance())) {
1289
+ if (this._evaluator.assignType(subtype, this._evaluator.getNoneType())) {
1266
1290
  foundMatchForNone = true;
1267
1291
  }
1268
1292
  });
@@ -1359,7 +1383,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1359
1383
  if ((0, types_1.isModule)(leftType) || (0, types_1.isModule)(rightType)) {
1360
1384
  return (0, types_1.isTypeSame)(leftType, rightType);
1361
1385
  }
1362
- if ((0, types_1.isNoneInstance)(leftType) || (0, types_1.isNoneInstance)(rightType)) {
1386
+ if ((0, typeUtils_1.isNoneInstance)(leftType) || (0, typeUtils_1.isNoneInstance)(rightType)) {
1363
1387
  return (0, types_1.isTypeSame)(leftType, rightType);
1364
1388
  }
1365
1389
  const isLeftCallable = (0, types_1.isFunction)(leftType) || (0, types_1.isOverloadedFunction)(leftType);
@@ -1468,7 +1492,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1468
1492
  // Determines whether the specified type is one that should trigger
1469
1493
  // an "unused" value diagnostic.
1470
1494
  _isTypeValidForUnusedValueTest(type) {
1471
- return !(0, types_1.isNoneInstance)(type) && !(0, types_1.isNever)(type) && !(0, types_1.isAnyOrUnknown)(type);
1495
+ return !(0, typeUtils_1.isNoneInstance)(type) && !(0, types_1.isNever)(type) && !(0, types_1.isAnyOrUnknown)(type);
1472
1496
  }
1473
1497
  // Verifies that each local type variable is used more than once.
1474
1498
  _validateFunctionTypeVarUsage(node, functionTypeResult) {
@@ -2638,22 +2662,22 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
2638
2662
  case 1 /* Unknown */:
2639
2663
  case 0 /* Unbound */:
2640
2664
  break;
2641
- case 7 /* Class */:
2642
- // If it's a class, make sure that it has not been given explicit
2643
- // type arguments. This will result in a TypeError exception.
2644
- if (subtype.isTypeArgumentExplicit && !subtype.includeSubclasses) {
2665
+ case 6 /* Class */:
2666
+ if ((0, typeUtils_1.isNoneInstance)(subtype)) {
2667
+ isSupported = false;
2668
+ }
2669
+ else if (subtype.isTypeArgumentExplicit && !subtype.includeSubclasses) {
2670
+ // If it's a class, make sure that it has not been given explicit
2671
+ // type arguments. This will result in a TypeError exception.
2645
2672
  isSupported = false;
2646
2673
  }
2647
2674
  break;
2648
- case 3 /* None */:
2649
- isSupported = types_1.TypeBase.isInstantiable(subtype);
2650
- break;
2651
- case 5 /* Function */:
2675
+ case 4 /* Function */:
2652
2676
  if (!types_1.TypeBase.isInstantiable(subtype) || subtype.isCallableWithTypeArgs) {
2653
2677
  isSupported = false;
2654
2678
  }
2655
2679
  break;
2656
- case 9 /* Union */:
2680
+ case 8 /* Union */:
2657
2681
  isSupported = this._isTypeSupportedTypeForIsInstance(subtype, isInstanceCheck);
2658
2682
  break;
2659
2683
  default:
@@ -3105,14 +3129,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3105
3129
  const returnAnnotation = node.returnTypeAnnotation || ((_a = node.functionAnnotationComment) === null || _a === void 0 ? void 0 : _a.returnTypeAnnotation);
3106
3130
  const declaredReturnType = functionType.details.declaredReturnType;
3107
3131
  if (returnAnnotation && declaredReturnType) {
3108
- if (!(0, types_1.isNoneInstance)(declaredReturnType) && !(0, types_1.isNever)(declaredReturnType)) {
3132
+ if (!(0, typeUtils_1.isNoneInstance)(declaredReturnType) && !(0, types_1.isNever)(declaredReturnType)) {
3109
3133
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.initMustReturnNone(), returnAnnotation);
3110
3134
  }
3111
3135
  }
3112
3136
  else {
3113
3137
  const inferredReturnType = this._evaluator.getFunctionInferredReturnType(functionType);
3114
3138
  if (!(0, types_1.isNever)(inferredReturnType) &&
3115
- !(0, types_1.isNoneInstance)(inferredReturnType) &&
3139
+ !(0, typeUtils_1.isNoneInstance)(inferredReturnType) &&
3116
3140
  !(0, types_1.isAnyOrUnknown)(inferredReturnType)) {
3117
3141
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.initMustReturnNone(), node.name);
3118
3142
  }
@@ -3161,7 +3185,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3161
3185
  // type doesn't allow it. Skip this check for abstract methods.
3162
3186
  const diagAddendum = new diagnostic_1.DiagnosticAddendum();
3163
3187
  // If the declared type isn't compatible with 'None', flag an error.
3164
- if (!this._evaluator.assignType(declaredReturnType, types_1.NoneType.createInstance(), diagAddendum)) {
3188
+ if (!this._evaluator.assignType(declaredReturnType, this._evaluator.getNoneType(), diagAddendum)) {
3165
3189
  // If the function consists entirely of "...", assume that it's
3166
3190
  // an abstract method or a protocol method and don't require that
3167
3191
  // the return type matches. This check can also be skipped for an overload.
@@ -3289,7 +3313,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3289
3313
  if (!types_1.ClassType.isDataClass(classType)) {
3290
3314
  return;
3291
3315
  }
3292
- const postInitMember = (0, typeUtils_1.lookUpClassMember)(classType, '__post_init__', 2 /* SkipBaseClasses */ | 32 /* DeclaredTypesOnly */);
3316
+ const postInitMember = (0, typeUtils_1.lookUpClassMember)(classType, '__post_init__', 2 /* SkipBaseClasses */ | 64 /* DeclaredTypesOnly */);
3293
3317
  // If there's no __post_init__ method, there's nothing to check.
3294
3318
  if (!postInitMember) {
3295
3319
  return;
@@ -3603,35 +3627,34 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3603
3627
  });
3604
3628
  }
3605
3629
  // Validates that the __init__ and __new__ method signatures are consistent.
3606
- _validateConstructorConsistency(classType) {
3607
- const initMember = (0, typeUtils_1.lookUpClassMember)(classType, '__init__', 4 /* SkipObjectBaseClass */ | 8 /* SkipInstanceVariables */);
3608
- const newMember = (0, typeUtils_1.lookUpClassMember)(classType, '__new__', 4 /* SkipObjectBaseClass */ | 8 /* SkipInstanceVariables */);
3609
- if (!initMember || !newMember || !(0, types_1.isClass)(initMember.classType) || !(0, types_1.isClass)(newMember.classType)) {
3630
+ _validateConstructorConsistency(classType, errorNode) {
3631
+ // If the class has a custom metaclass with a __call__ method, skip this check.
3632
+ const callMethodResult = (0, constructors_1.getBoundCallMethod)(this._evaluator, errorNode, classType);
3633
+ if (callMethodResult) {
3610
3634
  return;
3611
3635
  }
3612
- // If both the __new__ and __init__ come from subclasses, don't bother
3613
- // checking for this class.
3614
- if (!types_1.ClassType.isSameGenericClass(newMember.classType, classType) &&
3615
- !types_1.ClassType.isSameGenericClass(initMember.classType, classType)) {
3636
+ const newMethodResult = (0, constructors_1.getBoundNewMethod)(this._evaluator, errorNode, classType);
3637
+ if (!newMethodResult ||
3638
+ newMethodResult.typeErrors ||
3639
+ !newMethodResult.classType ||
3640
+ !(0, types_1.isClass)(newMethodResult.classType)) {
3616
3641
  return;
3617
3642
  }
3618
- // If the class that provides the __new__ method has a custom metaclass with a
3619
- // __call__ method, skip this check.
3620
- const metaclass = newMember.classType.details.effectiveMetaclass;
3621
- if (metaclass && (0, types_1.isClass)(metaclass) && !types_1.ClassType.isBuiltIn(metaclass, 'type')) {
3622
- const callMethod = (0, typeUtils_1.lookUpClassMember)(metaclass, '__call__', 64 /* SkipTypeBaseClass */ | 8 /* SkipInstanceVariables */);
3623
- if (callMethod) {
3624
- return;
3625
- }
3643
+ const initMethodResult = (0, constructors_1.getBoundInitMethod)(this._evaluator, errorNode, types_1.ClassType.cloneAsInstance(classType));
3644
+ if (!initMethodResult ||
3645
+ initMethodResult.typeErrors ||
3646
+ !initMethodResult.classType ||
3647
+ !(0, types_1.isClass)(initMethodResult.classType)) {
3648
+ return;
3626
3649
  }
3627
- let newMemberType = this._evaluator.getTypeOfMember(newMember);
3628
- if (!(0, types_1.isFunction)(newMemberType) && !(0, types_1.isOverloadedFunction)(newMemberType)) {
3650
+ // If both the __new__ and __init__ come from subclasses, don't bother
3651
+ // checking for this class.
3652
+ if (!types_1.ClassType.isSameGenericClass(initMethodResult.classType, classType) &&
3653
+ !types_1.ClassType.isSameGenericClass(newMethodResult.classType, classType)) {
3629
3654
  return;
3630
3655
  }
3631
- newMemberType = this._evaluator.bindFunctionToClassOrObject(classType, newMemberType,
3632
- /* memberClass */ undefined,
3633
- /* treatConstructorAsClassMember */ true);
3634
- if (!newMemberType) {
3656
+ let newMemberType = newMethodResult.type;
3657
+ if (!(0, types_1.isFunction)(newMemberType) && !(0, types_1.isOverloadedFunction)(newMemberType)) {
3635
3658
  return;
3636
3659
  }
3637
3660
  if ((0, types_1.isOverloadedFunction)(newMemberType)) {
@@ -3641,14 +3664,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3641
3664
  return;
3642
3665
  }
3643
3666
  }
3644
- let initMemberType = this._evaluator.getTypeOfMember(initMember);
3667
+ let initMemberType = initMethodResult.type;
3645
3668
  if (!(0, types_1.isFunction)(initMemberType) && !(0, types_1.isOverloadedFunction)(initMemberType)) {
3646
3669
  return;
3647
3670
  }
3648
- initMemberType = this._evaluator.bindFunctionToClassOrObject(types_1.ClassType.cloneAsInstance(classType), initMemberType);
3649
- if (!initMemberType) {
3650
- return;
3651
- }
3652
3671
  if ((0, types_1.isOverloadedFunction)(initMemberType)) {
3653
3672
  // Find the implementation, not the overloaded signatures.
3654
3673
  initMemberType = types_1.OverloadedFunctionType.getImplementation(initMemberType);
@@ -3656,9 +3675,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3656
3675
  return;
3657
3676
  }
3658
3677
  }
3659
- if (!(0, types_1.isFunction)(initMemberType) || !(0, types_1.isFunction)(newMemberType)) {
3660
- return;
3661
- }
3662
3678
  // If either of the functions has a default parameter signature
3663
3679
  // (* args: Any, ** kwargs: Any), don't proceed with the check.
3664
3680
  if (types_1.FunctionType.hasDefaultParameters(initMemberType) || types_1.FunctionType.hasDefaultParameters(newMemberType)) {
@@ -3681,9 +3697,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3681
3697
  /* diag */ undefined,
3682
3698
  /* destTypeVarContext */ undefined,
3683
3699
  /* srcTypeVarContext */ undefined, 32 /* SkipFunctionReturnTypeCheck */)) {
3684
- const displayOnInit = types_1.ClassType.isSameGenericClass(initMember.classType, classType);
3685
- const initDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(initMember.symbol);
3686
- const newDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(newMember.symbol);
3700
+ const displayOnInit = types_1.ClassType.isSameGenericClass(initMethodResult.classType, classType);
3701
+ const initDecl = initMemberType.details.declaration;
3702
+ const newDecl = newMemberType.details.declaration;
3687
3703
  if (initDecl && newDecl) {
3688
3704
  const mainDecl = displayOnInit ? initDecl : newDecl;
3689
3705
  const mainDeclNode = mainDecl.node.nodeType === 28 /* Function */ ? mainDecl.node.name : mainDecl.node;
@@ -3697,14 +3713,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3697
3713
  type: newSignature,
3698
3714
  }));
3699
3715
  const diagnostic = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportInconsistentConstructor, diagnosticRules_1.DiagnosticRule.reportInconsistentConstructor, localize_1.Localizer.Diagnostic.constructorParametersMismatch().format({
3700
- classType: this._evaluator.printType(types_1.ClassType.cloneAsInstance(displayOnInit ? initMember.classType : newMember.classType)),
3716
+ classType: this._evaluator.printType(types_1.ClassType.cloneAsInstance(displayOnInit ? initMethodResult.classType : newMethodResult.classType)),
3701
3717
  }) + diagAddendum.getString(), mainDeclNode);
3702
3718
  if (diagnostic) {
3703
3719
  const secondaryDecl = displayOnInit ? newDecl : initDecl;
3704
3720
  diagnostic.addRelatedInfo((displayOnInit
3705
3721
  ? localize_1.Localizer.DiagnosticAddendum.newMethodLocation()
3706
3722
  : localize_1.Localizer.DiagnosticAddendum.initMethodLocation()).format({
3707
- type: this._evaluator.printType(types_1.ClassType.cloneAsInstance(displayOnInit ? newMember.classType : initMember.classType)),
3723
+ type: this._evaluator.printType(types_1.ClassType.cloneAsInstance(displayOnInit ? newMethodResult.classType : initMethodResult.classType)),
3708
3724
  }), secondaryDecl.path, secondaryDecl.range);
3709
3725
  }
3710
3726
  }
@@ -3973,7 +3989,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3973
3989
  });
3974
3990
  }
3975
3991
  _validateOverrideDecoratorPresent(symbol, overrideType, baseMember) {
3976
- var _a;
3977
3992
  // Skip this check if disabled.
3978
3993
  if (this._fileInfo.diagnosticRuleSet.reportImplicitOverride === 'none') {
3979
3994
  return;
@@ -3986,12 +4001,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3986
4001
  overrideFunction = types_1.OverloadedFunctionType.getImplementation(overrideType);
3987
4002
  }
3988
4003
  else if ((0, types_1.isClassInstance)(overrideType) && types_1.ClassType.isPropertyClass(overrideType)) {
3989
- const fgetSymbol = overrideType.details.fields.get('fget');
3990
- if (fgetSymbol) {
3991
- const fgetType = (_a = this._evaluator.getDeclaredTypeOfSymbol(fgetSymbol)) === null || _a === void 0 ? void 0 : _a.type;
3992
- if (fgetType && (0, types_1.isFunction)(fgetType)) {
3993
- overrideFunction = fgetType;
3994
- }
4004
+ if (overrideType.fgetFunction) {
4005
+ overrideFunction = overrideType.fgetFunction;
3995
4006
  }
3996
4007
  }
3997
4008
  if (!(overrideFunction === null || overrideFunction === void 0 ? void 0 : overrideFunction.details.declaration) || types_1.FunctionType.isOverridden(overrideFunction)) {
@@ -4016,7 +4027,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4016
4027
  // decorator. In this case, an error is reported because no base class has declared
4017
4028
  // a method of the same name.
4018
4029
  _validateOverrideDecoratorNotPresent(symbol, overrideType) {
4019
- var _a;
4020
4030
  let overrideFunction;
4021
4031
  if ((0, types_1.isFunction)(overrideType)) {
4022
4032
  overrideFunction = overrideType;
@@ -4025,12 +4035,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4025
4035
  overrideFunction = types_1.OverloadedFunctionType.getImplementation(overrideType);
4026
4036
  }
4027
4037
  else if ((0, types_1.isClassInstance)(overrideType) && types_1.ClassType.isPropertyClass(overrideType)) {
4028
- const fgetSymbol = overrideType.details.fields.get('fget');
4029
- if (fgetSymbol) {
4030
- const fgetType = (_a = this._evaluator.getDeclaredTypeOfSymbol(fgetSymbol)) === null || _a === void 0 ? void 0 : _a.type;
4031
- if (fgetType && (0, types_1.isFunction)(fgetType)) {
4032
- overrideFunction = fgetType;
4033
- }
4038
+ if (overrideType.fgetFunction) {
4039
+ overrideFunction = overrideType.fgetFunction;
4034
4040
  }
4035
4041
  }
4036
4042
  if (!(overrideFunction === null || overrideFunction === void 0 ? void 0 : overrideFunction.details.declaration) || !types_1.FunctionType.isOverridden(overrideFunction)) {
@@ -4064,8 +4070,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4064
4070
  return;
4065
4071
  }
4066
4072
  const baseClass = baseClassAndSymbol.classType;
4067
- const childClassSelf = (0, typeUtils_1.selfSpecializeClass)(childClassType);
4068
- const baseType = (0, typeUtils_1.partiallySpecializeType)(this._evaluator.getEffectiveTypeOfSymbol(baseClassAndSymbol.symbol), baseClass, types_1.ClassType.cloneAsInstance(childClassSelf));
4073
+ const childClassSelf = types_1.ClassType.cloneAsInstance((0, typeUtils_1.selfSpecializeClass)(childClassType));
4074
+ const baseType = (0, typeUtils_1.partiallySpecializeType)(this._evaluator.getEffectiveTypeOfSymbol(baseClassAndSymbol.symbol), baseClass, childClassSelf);
4075
+ overrideType = (0, typeUtils_1.partiallySpecializeType)(overrideType, childClassType, childClassSelf);
4069
4076
  if ((0, types_1.isFunction)(baseType) || (0, types_1.isOverloadedFunction)(baseType)) {
4070
4077
  const diagAddendum = new diagnostic_1.DiagnosticAddendum();
4071
4078
  if ((0, types_1.isFunction)(overrideType) || (0, types_1.isOverloadedFunction)(overrideType)) {
@@ -4147,16 +4154,20 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4147
4154
  }
4148
4155
  }
4149
4156
  else {
4150
- const basePropFields = baseType.details.fields;
4151
- const subclassPropFields = overrideType.details.fields;
4152
4157
  const baseClassType = baseClass;
4153
- ['fget', 'fset', 'fdel'].forEach((methodName) => {
4158
+ const propMethodInfo = [
4159
+ ['fget', (c) => c.fgetFunction],
4160
+ ['fset', (c) => c.fsetFunction],
4161
+ ['fdel', (c) => c.fdelFunction],
4162
+ ];
4163
+ propMethodInfo.forEach((info) => {
4154
4164
  const diagAddendum = new diagnostic_1.DiagnosticAddendum();
4155
- const baseClassPropMethod = basePropFields.get(methodName);
4156
- const subclassPropMethod = subclassPropFields.get(methodName);
4165
+ const [methodName, methodAccessor] = info;
4166
+ const baseClassPropMethod = methodAccessor(baseType);
4167
+ const subclassPropMethod = methodAccessor(overrideType);
4157
4168
  // Is the method present on the base class but missing in the subclass?
4158
4169
  if (baseClassPropMethod) {
4159
- const baseClassMethodType = (0, typeUtils_1.partiallySpecializeType)(this._evaluator.getEffectiveTypeOfSymbol(baseClassPropMethod), baseClassType);
4170
+ const baseClassMethodType = (0, typeUtils_1.partiallySpecializeType)(baseClassPropMethod, baseClassType);
4160
4171
  if ((0, types_1.isFunction)(baseClassMethodType)) {
4161
4172
  if (!subclassPropMethod) {
4162
4173
  // The method is missing.
@@ -4176,7 +4187,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4176
4187
  }
4177
4188
  }
4178
4189
  else {
4179
- const subclassMethodType = (0, typeUtils_1.partiallySpecializeType)(this._evaluator.getEffectiveTypeOfSymbol(subclassPropMethod), childClassType);
4190
+ const subclassMethodType = (0, typeUtils_1.partiallySpecializeType)(subclassPropMethod, childClassType);
4180
4191
  if ((0, types_1.isFunction)(subclassMethodType)) {
4181
4192
  if (!this._evaluator.validateOverrideMethod(baseClassMethodType, subclassMethodType, childClassType, diagAddendum.createAddendum())) {
4182
4193
  diagAddendum.addMessage(localize_1.Localizer.DiagnosticAddendum.propertyMethodIncompatible().format({
@@ -4290,7 +4301,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4290
4301
  // Performs checks on a function that is located within a class
4291
4302
  // and has been determined not to be a property accessor.
4292
4303
  _validateMethod(node, functionType, classNode) {
4293
- var _a, _b, _c, _d;
4304
+ var _a, _b;
4294
4305
  const classTypeInfo = this._evaluator.getTypeOfClass(classNode);
4295
4306
  const classType = classTypeInfo === null || classTypeInfo === void 0 ? void 0 : classTypeInfo.classType;
4296
4307
  if (node.name && classType) {
@@ -4307,32 +4318,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4307
4318
  // __new__ overrides should have a "cls" parameter.
4308
4319
  if (node.parameters.length === 0 ||
4309
4320
  !node.parameters[0].name ||
4310
- !['cls', '_cls', '__cls', '__mcls', 'mcls', 'mcs'].some((name) => node.parameters[0].name.value === name)) {
4321
+ !['cls', '_cls', '__cls', '__mcls', 'mcls', 'mcs', 'metacls'].some((name) => node.parameters[0].name.value === name)) {
4311
4322
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportSelfClsParameterName, diagnosticRules_1.DiagnosticRule.reportSelfClsParameterName, localize_1.Localizer.Diagnostic.newClsParam(), node.parameters.length > 0 ? node.parameters[0] : node.name);
4312
4323
  }
4313
4324
  if (classType) {
4314
4325
  this._validateClsSelfParameterType(functionType, classType, /* isCls */ true);
4315
4326
  }
4316
4327
  }
4317
- else if (((_b = node.name) === null || _b === void 0 ? void 0 : _b.value) === '__init_subclass__') {
4318
- // __init_subclass__ overrides should have a "cls" parameter.
4319
- if (node.parameters.length === 0 || !node.parameters[0].name || node.parameters[0].name.value !== 'cls') {
4320
- this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportSelfClsParameterName, diagnosticRules_1.DiagnosticRule.reportSelfClsParameterName, localize_1.Localizer.Diagnostic.initSubclassClsParam(), node.parameters.length > 0 ? node.parameters[0] : node.name);
4321
- }
4322
- if (classType) {
4323
- this._validateClsSelfParameterType(functionType, classType, /* isCls */ true);
4324
- }
4325
- }
4326
- else if (((_c = node.name) === null || _c === void 0 ? void 0 : _c.value) === '__class_getitem__') {
4327
- // __class_getitem__ overrides should have a "cls" parameter.
4328
- if (node.parameters.length === 0 || !node.parameters[0].name || node.parameters[0].name.value !== 'cls') {
4329
- this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportSelfClsParameterName, diagnosticRules_1.DiagnosticRule.reportSelfClsParameterName, localize_1.Localizer.Diagnostic.classGetItemClsParam(), node.parameters.length > 0 ? node.parameters[0] : node.name);
4330
- }
4331
- if (classType) {
4332
- this._validateClsSelfParameterType(functionType, classType, /* isCls */ true);
4333
- }
4334
- }
4335
- else if (((_d = node.name) === null || _d === void 0 ? void 0 : _d.value) === '_generate_next_value_') {
4328
+ else if (((_b = node.name) === null || _b === void 0 ? void 0 : _b.value) === '_generate_next_value_') {
4336
4329
  // Skip this check for _generate_next_value_.
4337
4330
  }
4338
4331
  else if (types_1.FunctionType.isStaticMethod(functionType)) {
@@ -4420,7 +4413,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4420
4413
  // it could be combined with other classes in a multi-inheritance
4421
4414
  // situation that effectively adds new superclasses that we don't know
4422
4415
  // about statically.
4423
- let effectiveFlags = 8 /* SkipInstanceVariables */ | 1 /* SkipOriginalClass */;
4416
+ let effectiveFlags = 16 /* SkipInstanceMembers */ | 1 /* SkipOriginalClass */;
4424
4417
  if (types_1.ClassType.isFinal(classType)) {
4425
4418
  effectiveFlags |= 4 /* SkipObjectBaseClass */;
4426
4419
  }
@@ -4593,7 +4586,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4593
4586
  else if ((0, types_1.isClassInstance)(exceptionType)) {
4594
4587
  const iterableType = (_b = (_a = this._evaluator.getTypeOfIterator({ type: exceptionType },
4595
4588
  /* isAsync */ false,
4596
- /* errorNode */ undefined)) === null || _a === void 0 ? void 0 : _a.type) !== null && _b !== void 0 ? _b : types_1.UnknownType.create();
4589
+ /* errorNode */ except.typeExpression,
4590
+ /* emitNotIterableError */ false)) === null || _a === void 0 ? void 0 : _a.type) !== null && _b !== void 0 ? _b : types_1.UnknownType.create();
4597
4591
  (0, typeUtils_1.doForEachSubtype)(iterableType, (subtype) => {
4598
4592
  if ((0, types_1.isAnyOrUnknown)(subtype)) {
4599
4593
  sawUnknownExceptionType = true;