@zzzen/pyright-internal 1.2.0-dev.20220710 → 1.2.0-dev.20220731

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 (166) hide show
  1. package/dist/analyzer/analysis.js +1 -1
  2. package/dist/analyzer/analysis.js.map +1 -1
  3. package/dist/analyzer/binder.js +14 -0
  4. package/dist/analyzer/binder.js.map +1 -1
  5. package/dist/analyzer/checker.d.ts +1 -0
  6. package/dist/analyzer/checker.js +100 -46
  7. package/dist/analyzer/checker.js.map +1 -1
  8. package/dist/analyzer/codeFlowEngine.d.ts +0 -1
  9. package/dist/analyzer/codeFlowEngine.js +190 -196
  10. package/dist/analyzer/codeFlowEngine.js.map +1 -1
  11. package/dist/analyzer/codeFlowTypes.d.ts +1 -1
  12. package/dist/analyzer/codeFlowTypes.js.map +1 -1
  13. package/dist/analyzer/constraintSolver.js +5 -3
  14. package/dist/analyzer/constraintSolver.js.map +1 -1
  15. package/dist/analyzer/dataClasses.js +13 -4
  16. package/dist/analyzer/dataClasses.js.map +1 -1
  17. package/dist/analyzer/enums.d.ts +13 -0
  18. package/dist/analyzer/enums.js +207 -0
  19. package/dist/analyzer/enums.js.map +1 -0
  20. package/dist/analyzer/importResolver.js +5 -4
  21. package/dist/analyzer/importResolver.js.map +1 -1
  22. package/dist/analyzer/importStatementUtils.d.ts +3 -1
  23. package/dist/analyzer/importStatementUtils.js +96 -19
  24. package/dist/analyzer/importStatementUtils.js.map +1 -1
  25. package/dist/analyzer/parseTreeUtils.d.ts +5 -0
  26. package/dist/analyzer/parseTreeUtils.js +111 -3
  27. package/dist/analyzer/parseTreeUtils.js.map +1 -1
  28. package/dist/analyzer/patternMatching.js +3 -3
  29. package/dist/analyzer/patternMatching.js.map +1 -1
  30. package/dist/analyzer/properties.js +1 -1
  31. package/dist/analyzer/properties.js.map +1 -1
  32. package/dist/analyzer/service.d.ts +1 -1
  33. package/dist/analyzer/service.js +37 -37
  34. package/dist/analyzer/service.js.map +1 -1
  35. package/dist/analyzer/sourceFile.js +40 -9
  36. package/dist/analyzer/sourceFile.js.map +1 -1
  37. package/dist/analyzer/typeEvaluator.d.ts +1 -1
  38. package/dist/analyzer/typeEvaluator.js +733 -709
  39. package/dist/analyzer/typeEvaluator.js.map +1 -1
  40. package/dist/analyzer/typeEvaluatorTypes.d.ts +18 -16
  41. package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
  42. package/dist/analyzer/typeEvaluatorWithTracker.js +9 -7
  43. package/dist/analyzer/typeEvaluatorWithTracker.js.map +1 -1
  44. package/dist/analyzer/typeGuards.d.ts +2 -0
  45. package/dist/analyzer/typeGuards.js +43 -15
  46. package/dist/analyzer/typeGuards.js.map +1 -1
  47. package/dist/analyzer/typePrinter.js +7 -1
  48. package/dist/analyzer/typePrinter.js.map +1 -1
  49. package/dist/analyzer/typeUtils.d.ts +4 -3
  50. package/dist/analyzer/typeUtils.js +99 -38
  51. package/dist/analyzer/typeUtils.js.map +1 -1
  52. package/dist/analyzer/typedDicts.d.ts +1 -0
  53. package/dist/analyzer/typedDicts.js +24 -3
  54. package/dist/analyzer/typedDicts.js.map +1 -1
  55. package/dist/analyzer/types.d.ts +9 -0
  56. package/dist/analyzer/types.js +99 -0
  57. package/dist/analyzer/types.js.map +1 -1
  58. package/dist/backgroundAnalysisBase.d.ts +2 -1
  59. package/dist/backgroundAnalysisBase.js +7 -0
  60. package/dist/backgroundAnalysisBase.js.map +1 -1
  61. package/dist/backgroundThreadBase.js +1 -0
  62. package/dist/backgroundThreadBase.js.map +1 -1
  63. package/dist/commands/commandResult.js +1 -1
  64. package/dist/commands/commandResult.js.map +1 -1
  65. package/dist/common/chokidarFileWatcherProvider.d.ts +1 -2
  66. package/dist/common/chokidarFileWatcherProvider.js +0 -3
  67. package/dist/common/chokidarFileWatcherProvider.js.map +1 -1
  68. package/dist/common/configOptions.d.ts +1 -0
  69. package/dist/common/configOptions.js +4 -0
  70. package/dist/common/configOptions.js.map +1 -1
  71. package/dist/common/diagnostic.d.ts +2 -1
  72. package/dist/common/diagnostic.js +2 -1
  73. package/dist/common/diagnostic.js.map +1 -1
  74. package/dist/common/diagnosticRules.d.ts +1 -0
  75. package/dist/common/diagnosticRules.js +1 -0
  76. package/dist/common/diagnosticRules.js.map +1 -1
  77. package/dist/common/diagnosticSink.d.ts +3 -0
  78. package/dist/common/diagnosticSink.js +15 -2
  79. package/dist/common/diagnosticSink.js.map +1 -1
  80. package/dist/common/editAction.d.ts +6 -0
  81. package/dist/common/editAction.js +15 -0
  82. package/dist/common/editAction.js.map +1 -1
  83. package/dist/common/fileSystem.d.ts +4 -1
  84. package/dist/common/fileSystem.js +6 -4
  85. package/dist/common/fileSystem.js.map +1 -1
  86. package/dist/common/realFileSystem.d.ts +2 -2
  87. package/dist/common/realFileSystem.js.map +1 -1
  88. package/dist/common/textEditUtils.d.ts +22 -2
  89. package/dist/common/textEditUtils.js +138 -1
  90. package/dist/common/textEditUtils.js.map +1 -1
  91. package/dist/common/uriParser.d.ts +2 -0
  92. package/dist/common/uriParser.js +11 -0
  93. package/dist/common/uriParser.js.map +1 -1
  94. package/dist/common/workspaceEditUtils.d.ts +1 -0
  95. package/dist/common/workspaceEditUtils.js +10 -6
  96. package/dist/common/workspaceEditUtils.js.map +1 -1
  97. package/dist/languageServerBase.d.ts +17 -16
  98. package/dist/languageServerBase.js +73 -59
  99. package/dist/languageServerBase.js.map +1 -1
  100. package/dist/languageService/codeActionProvider.d.ts +2 -2
  101. package/dist/languageService/codeActionProvider.js +1 -1
  102. package/dist/languageService/codeActionProvider.js.map +1 -1
  103. package/dist/languageService/completionProvider.d.ts +15 -11
  104. package/dist/languageService/completionProvider.js +75 -5
  105. package/dist/languageService/completionProvider.js.map +1 -1
  106. package/dist/languageService/renameModuleProvider.d.ts +1 -4
  107. package/dist/languageService/renameModuleProvider.js +10 -46
  108. package/dist/languageService/renameModuleProvider.js.map +1 -1
  109. package/dist/languageService/tooltipUtils.js +1 -3
  110. package/dist/languageService/tooltipUtils.js.map +1 -1
  111. package/dist/localization/localize.d.ts +13 -0
  112. package/dist/localization/localize.js +4 -0
  113. package/dist/localization/localize.js.map +1 -1
  114. package/dist/localization/package.nls.en-us.json +4 -0
  115. package/dist/parser/parser.js +9 -1
  116. package/dist/parser/parser.js.map +1 -1
  117. package/dist/pyright.js +3 -1
  118. package/dist/pyright.js.map +1 -1
  119. package/dist/pyrightFileSystem.d.ts +20 -2
  120. package/dist/pyrightFileSystem.js +29 -2
  121. package/dist/pyrightFileSystem.js.map +1 -1
  122. package/dist/server.js +4 -4
  123. package/dist/server.js.map +1 -1
  124. package/dist/tests/chainedSourceFiles.test.js +2 -0
  125. package/dist/tests/chainedSourceFiles.test.js.map +1 -1
  126. package/dist/tests/checker.test.js +9 -0
  127. package/dist/tests/checker.test.js.map +1 -1
  128. package/dist/tests/fourslash/completions.commitChars.fourslash.d.ts +1 -0
  129. package/dist/tests/fourslash/completions.commitChars.fourslash.js +59 -0
  130. package/dist/tests/fourslash/completions.commitChars.fourslash.js.map +1 -0
  131. package/dist/tests/fourslash/completions.triggers.fourslash.d.ts +1 -0
  132. package/dist/tests/fourslash/completions.triggers.fourslash.js +29 -0
  133. package/dist/tests/fourslash/completions.triggers.fourslash.js.map +1 -0
  134. package/dist/tests/fourslash/fourslash.d.ts +1 -0
  135. package/dist/tests/fourslash/hover.init.fourslash.js +2 -2
  136. package/dist/tests/fourslash/hover.init.fourslash.js.map +1 -1
  137. package/dist/tests/harness/fourslash/fourSlashParser.js +5 -1
  138. package/dist/tests/harness/fourslash/fourSlashParser.js.map +1 -1
  139. package/dist/tests/harness/fourslash/testLanguageService.js +1 -1
  140. package/dist/tests/harness/fourslash/testLanguageService.js.map +1 -1
  141. package/dist/tests/harness/fourslash/testState.js +18 -9
  142. package/dist/tests/harness/fourslash/testState.js.map +1 -1
  143. package/dist/tests/pyrightFileSystem.test.js +28 -0
  144. package/dist/tests/pyrightFileSystem.test.js.map +1 -1
  145. package/dist/tests/renameModuleTestUtils.js +5 -87
  146. package/dist/tests/renameModuleTestUtils.js.map +1 -1
  147. package/dist/tests/testState.test.js +1 -1
  148. package/dist/tests/testState.test.js.map +1 -1
  149. package/dist/tests/testStateUtils.d.ts +8 -0
  150. package/dist/tests/testStateUtils.js +110 -0
  151. package/dist/tests/testStateUtils.js.map +1 -0
  152. package/dist/tests/testUtils.d.ts +2 -1
  153. package/dist/tests/testUtils.js +9 -6
  154. package/dist/tests/testUtils.js.map +1 -1
  155. package/dist/tests/typeEvaluator1.test.js +7 -7
  156. package/dist/tests/typeEvaluator1.test.js.map +1 -1
  157. package/dist/tests/typeEvaluator2.test.js +16 -4
  158. package/dist/tests/typeEvaluator2.test.js.map +1 -1
  159. package/dist/tests/typeEvaluator3.test.js +9 -1
  160. package/dist/tests/typeEvaluator3.test.js.map +1 -1
  161. package/dist/tests/typeEvaluator4.test.js +16 -0
  162. package/dist/tests/typeEvaluator4.test.js.map +1 -1
  163. package/dist/workspaceMap.d.ts +1 -0
  164. package/dist/workspaceMap.js +11 -1
  165. package/dist/workspaceMap.js.map +1 -1
  166. package/package.json +3 -3
@@ -386,14 +386,19 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
386
386
  }
387
387
  this._scopedNodes.push(node);
388
388
  if (functionTypeResult && (0, types_1.isOverloadedFunction)(functionTypeResult.decoratedType)) {
389
- const overloads = functionTypeResult.decoratedType.overloads;
390
- if (overloads.length > 1) {
391
- const maxOverloadConsistencyCheckLength = 100;
392
- // The check is n^2 in time, so if the number of overloads
393
- // is very large (which can happen for some generated code),
394
- // skip this check to avoid quadratic analysis time.
395
- if (overloads.length < maxOverloadConsistencyCheckLength) {
396
- this._validateOverloadConsistency(node, overloads[overloads.length - 1], overloads.slice(0, overloads.length - 1));
389
+ // If this is the implementation for the overloaded function, skip
390
+ // overload consistency checks.
391
+ if (types_1.OverloadedFunctionType.getImplementation(functionTypeResult.decoratedType) !==
392
+ functionTypeResult.functionType) {
393
+ const overloads = types_1.OverloadedFunctionType.getOverloads(functionTypeResult.decoratedType);
394
+ if (overloads.length > 1) {
395
+ const maxOverloadConsistencyCheckLength = 100;
396
+ // The check is n^2 in time, so if the number of overloads
397
+ // is very large (which can happen for some generated code),
398
+ // skip this check to avoid quadratic analysis time.
399
+ if (overloads.length < maxOverloadConsistencyCheckLength) {
400
+ this._validateOverloadConsistency(node, overloads[overloads.length - 1], overloads.slice(0, overloads.length - 1));
401
+ }
397
402
  }
398
403
  }
399
404
  }
@@ -732,6 +737,12 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
732
737
  this._validateComparisonTypes(node);
733
738
  }
734
739
  }
740
+ else if (node.operator === 41 /* In */ || node.operator === 42 /* NotIn */) {
741
+ // Don't apply this rule if it's within an assert.
742
+ if (!ParseTreeUtils.isWithinAssertExpression(node)) {
743
+ this._validateContainmentTypes(node);
744
+ }
745
+ }
735
746
  this._evaluator.getType(node);
736
747
  return true;
737
748
  }
@@ -977,11 +988,46 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
977
988
  }
978
989
  }
979
990
  }
991
+ _validateContainmentTypes(node) {
992
+ const leftType = this._evaluator.getType(node.leftExpression);
993
+ const containerType = this._evaluator.getType(node.rightExpression);
994
+ if (!leftType || !containerType) {
995
+ return;
996
+ }
997
+ if ((0, types_1.isNever)(leftType) || (0, types_1.isNever)(containerType)) {
998
+ return;
999
+ }
1000
+ // Use the common narrowing logic for containment.
1001
+ const elementType = (0, typeGuards_1.getElementTypeForContainerNarrowing)(containerType);
1002
+ if (!elementType) {
1003
+ return;
1004
+ }
1005
+ const narrowedType = (0, typeGuards_1.narrowTypeForContainerElementType)(this._evaluator, leftType, this._evaluator.makeTopLevelTypeVarsConcrete(elementType));
1006
+ if ((0, types_1.isNever)(narrowedType)) {
1007
+ const getMessage = () => {
1008
+ return node.operator === 41 /* In */
1009
+ ? localize_1.Localizer.Diagnostic.containmentAlwaysFalse()
1010
+ : localize_1.Localizer.Diagnostic.containmentAlwaysTrue();
1011
+ };
1012
+ this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportUnnecessaryContains, diagnosticRules_1.DiagnosticRule.reportUnnecessaryContains, getMessage().format({
1013
+ leftType: this._evaluator.printType(leftType, /* expandTypeAlias */ true),
1014
+ rightType: this._evaluator.printType(elementType, /* expandTypeAlias */ true),
1015
+ }), node);
1016
+ }
1017
+ }
980
1018
  // Determines whether the types of the two operands for an == or != operation
981
1019
  // have overlapping types.
982
1020
  _validateComparisonTypes(node) {
1021
+ let rightExpression = node.rightExpression;
1022
+ // Check for chained comparisons.
1023
+ if (rightExpression.nodeType === 7 /* BinaryOperation */ &&
1024
+ !rightExpression.parenthesized &&
1025
+ ParseTreeUtils.operatorSupportsChaining(rightExpression.operator)) {
1026
+ // Use the left side of the right expression for comparison purposes.
1027
+ rightExpression = rightExpression.leftExpression;
1028
+ }
983
1029
  const leftType = this._evaluator.getType(node.leftExpression);
984
- const rightType = this._evaluator.getType(node.rightExpression);
1030
+ const rightType = this._evaluator.getType(rightExpression);
985
1031
  if (!leftType || !rightType) {
986
1032
  return;
987
1033
  }
@@ -1285,9 +1331,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1285
1331
  _validateOverloadConsistency(node, functionType, prevOverloads) {
1286
1332
  for (let i = 0; i < prevOverloads.length; i++) {
1287
1333
  const prevOverload = prevOverloads[i];
1288
- if (types_1.FunctionType.isOverloaded(functionType) &&
1289
- types_1.FunctionType.isOverloaded(prevOverload) &&
1290
- this._isOverlappingOverload(functionType, prevOverload)) {
1334
+ if (this._isOverlappingOverload(functionType, prevOverload)) {
1291
1335
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportOverlappingOverload, diagnosticRules_1.DiagnosticRule.reportOverlappingOverload, localize_1.Localizer.Diagnostic.overlappingOverload().format({
1292
1336
  name: node.name.value,
1293
1337
  obscured: prevOverloads.length + 1,
@@ -1298,9 +1342,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1298
1342
  }
1299
1343
  for (let i = 0; i < prevOverloads.length; i++) {
1300
1344
  const prevOverload = prevOverloads[i];
1301
- if (types_1.FunctionType.isOverloaded(functionType) &&
1302
- types_1.FunctionType.isOverloaded(prevOverload) &&
1303
- this._isOverlappingOverload(prevOverload, functionType)) {
1345
+ if (this._isOverlappingOverload(prevOverload, functionType)) {
1304
1346
  const prevReturnType = types_1.FunctionType.getSpecializedReturnType(prevOverload);
1305
1347
  const returnType = types_1.FunctionType.getSpecializedReturnType(functionType);
1306
1348
  if (prevReturnType &&
@@ -1388,7 +1430,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1388
1430
  const start = statement.start;
1389
1431
  const lastStatement = statements[statements.length - 1];
1390
1432
  const end = textRange_1.TextRange.getEnd(lastStatement);
1391
- this._evaluator.addUnusedCode(statement, { start, length: end - start });
1433
+ this._evaluator.addUnreachableCode(statement, { start, length: end - start });
1392
1434
  reportedUnreachable = true;
1393
1435
  }
1394
1436
  }
@@ -1578,8 +1620,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1578
1620
  const primaryDecl = typedDecls[0];
1579
1621
  if (primaryDecl.type === 5 /* Function */) {
1580
1622
  const type = this._evaluator.getEffectiveTypeOfSymbol(symbol);
1581
- const functions = (0, types_1.isOverloadedFunction)(type) ? type.overloads : (0, types_1.isFunction)(type) ? [type] : [];
1582
- const overloadedFunctions = functions.filter((func) => types_1.FunctionType.isOverloaded(func));
1623
+ const overloadedFunctions = (0, types_1.isOverloadedFunction)(type)
1624
+ ? types_1.OverloadedFunctionType.getOverloads(type)
1625
+ : (0, types_1.isFunction)(type) && types_1.FunctionType.isOverloaded(type)
1626
+ ? [type]
1627
+ : [];
1583
1628
  if (overloadedFunctions.length === 1) {
1584
1629
  // There should never be a single overload.
1585
1630
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.singleOverload().format({ name }), primaryDecl.node.name);
@@ -1596,9 +1641,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1596
1641
  // verify that there is an implementation.
1597
1642
  if (!this._fileInfo.isStubFile && overloadedFunctions.length > 0) {
1598
1643
  let implementationFunction;
1599
- if ((0, types_1.isOverloadedFunction)(type) &&
1600
- !types_1.FunctionType.isOverloaded(type.overloads[type.overloads.length - 1])) {
1601
- implementationFunction = type.overloads[type.overloads.length - 1];
1644
+ if ((0, types_1.isOverloadedFunction)(type) && types_1.OverloadedFunctionType.getImplementation(type)) {
1645
+ implementationFunction = types_1.OverloadedFunctionType.getImplementation(type);
1602
1646
  }
1603
1647
  else if ((0, types_1.isFunction)(type) && !types_1.FunctionType.isOverloaded(type)) {
1604
1648
  implementationFunction = type;
@@ -1622,11 +1666,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1622
1666
  }
1623
1667
  else if ((0, types_1.isOverloadedFunction)(type)) {
1624
1668
  // Verify that all overload signatures are assignable to implementation signature.
1625
- type.overloads.forEach((overload, index) => {
1669
+ types_1.OverloadedFunctionType.getOverloads(type).forEach((overload, index) => {
1626
1670
  var _a, _b, _c, _d;
1627
- if (overload === implementationFunction || !types_1.FunctionType.isOverloaded(overload)) {
1628
- return;
1629
- }
1630
1671
  const diag = new diagnostic_1.DiagnosticAddendum();
1631
1672
  if (!this._isLegalOverloadImplementation(overload, implementationFunction, diag)) {
1632
1673
  if (implementationFunction.details.declaration) {
@@ -2814,6 +2855,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
2814
2855
  if (this._fileInfo.diagnosticRuleSet.reportUninitializedInstanceVariable === 'none') {
2815
2856
  return;
2816
2857
  }
2858
+ // Protocol classes are exempted from this check.
2859
+ if (types_1.ClassType.isProtocolClass(classType)) {
2860
+ return;
2861
+ }
2817
2862
  classType.details.fields.forEach((localSymbol, name) => {
2818
2863
  // This applies only to instance members.
2819
2864
  if (!localSymbol.isInstanceMember()) {
@@ -3012,7 +3057,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3012
3057
  }
3013
3058
  if ((0, types_1.isOverloadedFunction)(newMemberType)) {
3014
3059
  // Find the implementation, not the overloaded signatures.
3015
- newMemberType = newMemberType.overloads.find((func) => !types_1.FunctionType.isOverloaded(func));
3060
+ newMemberType = types_1.OverloadedFunctionType.getImplementation(newMemberType);
3016
3061
  if (!newMemberType) {
3017
3062
  return;
3018
3063
  }
@@ -3027,7 +3072,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3027
3072
  }
3028
3073
  if ((0, types_1.isOverloadedFunction)(initMemberType)) {
3029
3074
  // Find the implementation, not the overloaded signatures.
3030
- initMemberType = initMemberType.overloads.find((func) => !types_1.FunctionType.isOverloaded(func));
3075
+ initMemberType = types_1.OverloadedFunctionType.getImplementation(initMemberType);
3031
3076
  if (!initMemberType) {
3032
3077
  return;
3033
3078
  }
@@ -3165,9 +3210,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3165
3210
  }
3166
3211
  else if ((0, types_1.isOverloadedFunction)(overrideType)) {
3167
3212
  // Use the last overload.
3168
- overrideFunction = overrideType.overloads[overrideType.overloads.length - 1];
3213
+ overrideFunction = types_1.OverloadedFunctionType.getImplementation(overrideType);
3169
3214
  // If the last overload isn't an implementation, skip the check for this symbol.
3170
- if (types_1.FunctionType.isOverloaded(overrideFunction)) {
3215
+ if (!overrideFunction) {
3171
3216
  return;
3172
3217
  }
3173
3218
  }
@@ -3235,7 +3280,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3235
3280
  }
3236
3281
  // If the symbol has no declaration, and the type is inferred,
3237
3282
  // skip this check.
3238
- if (!symbol.hasTypedDeclarations()) {
3283
+ if (!symbol.hasTypedDeclarations() && !(0, symbolUtils_1.isFinalVariable)(symbol)) {
3239
3284
  return;
3240
3285
  }
3241
3286
  // Get the symbol type defined in this class.
@@ -3263,7 +3308,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3263
3308
  });
3264
3309
  }
3265
3310
  _validateBaseClassOverride(baseClassAndSymbol, overrideSymbol, overrideType, childClassType, memberName) {
3266
- var _a;
3267
3311
  if (!(0, types_1.isInstantiableClass)(baseClassAndSymbol.classType)) {
3268
3312
  return;
3269
3313
  }
@@ -3281,15 +3325,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3281
3325
  const baseType = (0, typeUtils_1.partiallySpecializeType)(this._evaluator.getEffectiveTypeOfSymbol(baseClassAndSymbol.symbol), baseClassAndSymbol.classType);
3282
3326
  if ((0, types_1.isFunction)(baseType) || (0, types_1.isOverloadedFunction)(baseType)) {
3283
3327
  const diagAddendum = new diagnostic_1.DiagnosticAddendum();
3284
- let overrideFunction;
3285
- if ((0, types_1.isFunction)(overrideType)) {
3286
- overrideFunction = overrideType;
3287
- }
3288
- else if ((0, types_1.isOverloadedFunction)(overrideType)) {
3289
- // Use the last overload.
3290
- overrideFunction = overrideType.overloads[overrideType.overloads.length - 1];
3291
- }
3292
- if (overrideFunction) {
3328
+ if ((0, types_1.isFunction)(overrideType) || (0, types_1.isOverloadedFunction)(overrideType)) {
3293
3329
  const exemptMethods = ['__init__', '__new__', '__init_subclass__'];
3294
3330
  // Don't enforce parameter names for dundered methods. Many of them
3295
3331
  // are misnamed in typeshed stubs, so this would result in many
@@ -3298,8 +3334,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3298
3334
  // Don't check certain magic functions or private symbols.
3299
3335
  if (!exemptMethods.some((exempt) => exempt === memberName) &&
3300
3336
  !SymbolNameUtils.isPrivateName(memberName)) {
3301
- if (!this._evaluator.validateOverrideMethod(baseType, overrideFunction, diagAddendum, enforceParamNameMatch)) {
3302
- const decl = (_a = overrideFunction.details.declaration) !== null && _a !== void 0 ? _a : (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(overrideSymbol);
3337
+ if (!this._evaluator.validateOverrideMethod(baseType, overrideType, diagAddendum, enforceParamNameMatch)) {
3338
+ const decl = (0, types_1.isFunction)(overrideType) && overrideType.details.declaration
3339
+ ? overrideType.details.declaration
3340
+ : (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(overrideSymbol);
3303
3341
  if (decl) {
3304
3342
  const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleMethodOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleMethodOverride, localize_1.Localizer.Diagnostic.incompatibleMethodOverride().format({
3305
3343
  name: memberName,
@@ -3436,6 +3474,18 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3436
3474
  diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.overriddenSymbol(), origDecl.path, origDecl.range);
3437
3475
  }
3438
3476
  }
3477
+ // Verify that there is not a Final mismatch.
3478
+ const isBaseVarFinal = (0, symbolUtils_1.isFinalVariable)(baseClassAndSymbol.symbol);
3479
+ const overrideFinalVarDecl = decls.find((d) => (0, declarationUtils_1.isFinalVariableDeclaration)(d));
3480
+ if (!isBaseVarFinal && overrideFinalVarDecl) {
3481
+ const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleVariableOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleVariableOverride, localize_1.Localizer.Diagnostic.variableFinalOverride().format({
3482
+ name: memberName,
3483
+ className: baseClassAndSymbol.classType.details.name,
3484
+ }), lastDecl.node);
3485
+ if (diag) {
3486
+ diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.overriddenSymbol(), overrideFinalVarDecl.path, overrideFinalVarDecl.range);
3487
+ }
3488
+ }
3439
3489
  // Verify that a class variable isn't overriding an instance
3440
3490
  // variable or vice versa.
3441
3491
  const isBaseClassVar = baseClassAndSymbol.symbol.isClassVar();
@@ -3473,6 +3523,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3473
3523
  // Performs checks on a function that is located within a class
3474
3524
  // and has been determined not to be a property accessor.
3475
3525
  _validateMethod(node, functionType, classNode) {
3526
+ var _a, _b, _c, _d;
3476
3527
  const classTypeInfo = this._evaluator.getTypeOfClass(classNode);
3477
3528
  const classType = classTypeInfo === null || classTypeInfo === void 0 ? void 0 : classTypeInfo.classType;
3478
3529
  if (node.name && classType) {
@@ -3485,7 +3536,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3485
3536
  }
3486
3537
  }
3487
3538
  }
3488
- if (node.name && node.name.value === '__new__') {
3539
+ if (((_a = node.name) === null || _a === void 0 ? void 0 : _a.value) === '__new__') {
3489
3540
  // __new__ overrides should have a "cls" parameter.
3490
3541
  if (node.parameters.length === 0 ||
3491
3542
  !node.parameters[0].name ||
@@ -3496,7 +3547,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3496
3547
  this._validateClsSelfParameterType(functionType, classType, /* isCls */ true);
3497
3548
  }
3498
3549
  }
3499
- else if (node.name && node.name.value === '__init_subclass__') {
3550
+ else if (((_b = node.name) === null || _b === void 0 ? void 0 : _b.value) === '__init_subclass__') {
3500
3551
  // __init_subclass__ overrides should have a "cls" parameter.
3501
3552
  if (node.parameters.length === 0 || !node.parameters[0].name || node.parameters[0].name.value !== 'cls') {
3502
3553
  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);
@@ -3505,7 +3556,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3505
3556
  this._validateClsSelfParameterType(functionType, classType, /* isCls */ true);
3506
3557
  }
3507
3558
  }
3508
- else if (node.name && node.name.value === '__class_getitem__') {
3559
+ else if (((_c = node.name) === null || _c === void 0 ? void 0 : _c.value) === '__class_getitem__') {
3509
3560
  // __class_getitem__ overrides should have a "cls" parameter.
3510
3561
  if (node.parameters.length === 0 || !node.parameters[0].name || node.parameters[0].name.value !== 'cls') {
3511
3562
  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);
@@ -3514,6 +3565,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3514
3565
  this._validateClsSelfParameterType(functionType, classType, /* isCls */ true);
3515
3566
  }
3516
3567
  }
3568
+ else if (((_d = node.name) === null || _d === void 0 ? void 0 : _d.value) === '_generate_next_value_') {
3569
+ // Skip this check for _generate_next_value_.
3570
+ }
3517
3571
  else if (types_1.FunctionType.isStaticMethod(functionType)) {
3518
3572
  // Static methods should not have "self" or "cls" parameters.
3519
3573
  if (node.parameters.length > 0 && node.parameters[0].name) {
@@ -3770,7 +3824,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3770
3824
  // Were all of the exception types overridden?
3771
3825
  if (typesOfThisExcept.length === overriddenExceptionCount) {
3772
3826
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.unreachableExcept() + diagAddendum.getString(), except.typeExpression);
3773
- this._evaluator.addUnusedCode(except, except.exceptSuite);
3827
+ this._evaluator.addUnreachableCode(except, except.exceptSuite);
3774
3828
  }
3775
3829
  }
3776
3830
  exceptionTypesSoFar.push(...typesOfThisExcept);