@zzzen/pyright-internal 1.2.0-dev.20230507 → 1.2.0-dev.20230521

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 (210) hide show
  1. package/dist/analyzer/analyzerFileInfo.d.ts +1 -0
  2. package/dist/analyzer/analyzerFileInfo.js +4 -3
  3. package/dist/analyzer/analyzerFileInfo.js.map +1 -1
  4. package/dist/analyzer/backgroundAnalysisProgram.d.ts +17 -15
  5. package/dist/analyzer/backgroundAnalysisProgram.js +43 -53
  6. package/dist/analyzer/backgroundAnalysisProgram.js.map +1 -1
  7. package/dist/analyzer/binder.d.ts +0 -2
  8. package/dist/analyzer/binder.js +2 -20
  9. package/dist/analyzer/binder.js.map +1 -1
  10. package/dist/analyzer/checker.d.ts +1 -1
  11. package/dist/analyzer/checker.js +97 -29
  12. package/dist/analyzer/checker.js.map +1 -1
  13. package/dist/analyzer/constraintSolver.js +14 -15
  14. package/dist/analyzer/constraintSolver.js.map +1 -1
  15. package/dist/analyzer/constructorTransform.js +5 -1
  16. package/dist/analyzer/constructorTransform.js.map +1 -1
  17. package/dist/analyzer/constructors.js +248 -189
  18. package/dist/analyzer/constructors.js.map +1 -1
  19. package/dist/analyzer/dataClasses.js +5 -2
  20. package/dist/analyzer/dataClasses.js.map +1 -1
  21. package/dist/analyzer/declarationUtils.js +1 -0
  22. package/dist/analyzer/declarationUtils.js.map +1 -1
  23. package/dist/analyzer/docStringConversion.js +1 -1
  24. package/dist/analyzer/docStringConversion.js.map +1 -1
  25. package/dist/analyzer/enums.js +8 -0
  26. package/dist/analyzer/enums.js.map +1 -1
  27. package/dist/analyzer/importResolver.d.ts +4 -4
  28. package/dist/analyzer/importResolver.js +93 -69
  29. package/dist/analyzer/importResolver.js.map +1 -1
  30. package/dist/analyzer/importResult.d.ts +2 -2
  31. package/dist/analyzer/importStatementUtils.js +2 -2
  32. package/dist/analyzer/importStatementUtils.js.map +1 -1
  33. package/dist/analyzer/namedTuples.js +2 -5
  34. package/dist/analyzer/namedTuples.js.map +1 -1
  35. package/dist/analyzer/packageTypeVerifier.js +1 -1
  36. package/dist/analyzer/packageTypeVerifier.js.map +1 -1
  37. package/dist/analyzer/parseTreeUtils.js +2 -34
  38. package/dist/analyzer/parseTreeUtils.js.map +1 -1
  39. package/dist/analyzer/parseTreeWalker.js +2 -2
  40. package/dist/analyzer/parseTreeWalker.js.map +1 -1
  41. package/dist/analyzer/patternMatching.js +1 -0
  42. package/dist/analyzer/patternMatching.js.map +1 -1
  43. package/dist/analyzer/program.d.ts +18 -34
  44. package/dist/analyzer/program.js +57 -259
  45. package/dist/analyzer/program.js.map +1 -1
  46. package/dist/analyzer/protocols.js +4 -2
  47. package/dist/analyzer/protocols.js.map +1 -1
  48. package/dist/analyzer/service.d.ts +8 -16
  49. package/dist/analyzer/service.js +33 -47
  50. package/dist/analyzer/service.js.map +1 -1
  51. package/dist/analyzer/sourceFile.d.ts +1 -15
  52. package/dist/analyzer/sourceFile.js +14 -96
  53. package/dist/analyzer/sourceFile.js.map +1 -1
  54. package/dist/analyzer/sourceMapper.js +1 -1
  55. package/dist/analyzer/sourceMapper.js.map +1 -1
  56. package/dist/analyzer/symbol.d.ts +3 -1
  57. package/dist/analyzer/symbol.js +5 -0
  58. package/dist/analyzer/symbol.js.map +1 -1
  59. package/dist/analyzer/typeDocStringUtils.js +1 -1
  60. package/dist/analyzer/typeDocStringUtils.js.map +1 -1
  61. package/dist/analyzer/typeEvaluator.d.ts +2 -2
  62. package/dist/analyzer/typeEvaluator.js +495 -196
  63. package/dist/analyzer/typeEvaluator.js.map +1 -1
  64. package/dist/analyzer/typeEvaluatorTypes.d.ts +7 -2
  65. package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
  66. package/dist/analyzer/typeGuards.js +1 -0
  67. package/dist/analyzer/typeGuards.js.map +1 -1
  68. package/dist/analyzer/typePrinter.d.ts +3 -3
  69. package/dist/analyzer/typePrinter.js +255 -101
  70. package/dist/analyzer/typePrinter.js.map +1 -1
  71. package/dist/analyzer/typeUtils.d.ts +12 -7
  72. package/dist/analyzer/typeUtils.js +174 -49
  73. package/dist/analyzer/typeUtils.js.map +1 -1
  74. package/dist/analyzer/typeVarContext.d.ts +1 -2
  75. package/dist/analyzer/typeVarContext.js +16 -34
  76. package/dist/analyzer/typeVarContext.js.map +1 -1
  77. package/dist/analyzer/typedDicts.js +138 -41
  78. package/dist/analyzer/typedDicts.js.map +1 -1
  79. package/dist/analyzer/types.d.ts +10 -3
  80. package/dist/analyzer/types.js +32 -16
  81. package/dist/analyzer/types.js.map +1 -1
  82. package/dist/backgroundAnalysisBase.d.ts +25 -19
  83. package/dist/backgroundAnalysisBase.js +161 -115
  84. package/dist/backgroundAnalysisBase.js.map +1 -1
  85. package/dist/backgroundThreadBase.d.ts +1 -1
  86. package/dist/backgroundThreadBase.js +1 -1
  87. package/dist/backgroundThreadBase.js.map +1 -1
  88. package/dist/commands/dumpFileDebugInfoCommand.js +3 -4
  89. package/dist/commands/dumpFileDebugInfoCommand.js.map +1 -1
  90. package/dist/common/configOptions.js +1 -1
  91. package/dist/common/configOptions.js.map +1 -1
  92. package/dist/common/extensibility.d.ts +26 -5
  93. package/dist/common/extensibility.js.map +1 -1
  94. package/dist/common/logTracker.d.ts +2 -0
  95. package/dist/common/logTracker.js +8 -1
  96. package/dist/common/logTracker.js.map +1 -1
  97. package/dist/common/lspUtils.d.ts +4 -1
  98. package/dist/common/lspUtils.js +38 -1
  99. package/dist/common/lspUtils.js.map +1 -1
  100. package/dist/common/pythonVersion.d.ts +2 -1
  101. package/dist/common/pythonVersion.js +1 -0
  102. package/dist/common/pythonVersion.js.map +1 -1
  103. package/dist/common/textRange.js +1 -1
  104. package/dist/common/textRange.js.map +1 -1
  105. package/dist/common/workspaceEditUtils.d.ts +3 -3
  106. package/dist/common/workspaceEditUtils.js +15 -17
  107. package/dist/common/workspaceEditUtils.js.map +1 -1
  108. package/dist/languageServerBase.d.ts +2 -5
  109. package/dist/languageServerBase.js +35 -62
  110. package/dist/languageServerBase.js.map +1 -1
  111. package/dist/languageService/autoImporter.d.ts +51 -52
  112. package/dist/languageService/autoImporter.js +126 -211
  113. package/dist/languageService/autoImporter.js.map +1 -1
  114. package/dist/languageService/callHierarchyProvider.js +8 -33
  115. package/dist/languageService/callHierarchyProvider.js.map +1 -1
  116. package/dist/languageService/completionProvider.d.ts +42 -81
  117. package/dist/languageService/completionProvider.js +608 -841
  118. package/dist/languageService/completionProvider.js.map +1 -1
  119. package/dist/languageService/documentSymbolCollector.d.ts +2 -2
  120. package/dist/languageService/documentSymbolCollector.js +40 -30
  121. package/dist/languageService/documentSymbolCollector.js.map +1 -1
  122. package/dist/languageService/documentSymbolProvider.d.ts +13 -35
  123. package/dist/languageService/documentSymbolProvider.js +52 -264
  124. package/dist/languageService/documentSymbolProvider.js.map +1 -1
  125. package/dist/languageService/hoverProvider.d.ts +1 -3
  126. package/dist/languageService/hoverProvider.js +11 -97
  127. package/dist/languageService/hoverProvider.js.map +1 -1
  128. package/dist/languageService/referencesProvider.d.ts +3 -3
  129. package/dist/languageService/referencesProvider.js +6 -8
  130. package/dist/languageService/referencesProvider.js.map +1 -1
  131. package/dist/languageService/renameProvider.d.ts +0 -1
  132. package/dist/languageService/renameProvider.js +2 -6
  133. package/dist/languageService/renameProvider.js.map +1 -1
  134. package/dist/languageService/signatureHelpProvider.js +1 -1
  135. package/dist/languageService/signatureHelpProvider.js.map +1 -1
  136. package/dist/languageService/symbolIndexer.d.ts +23 -0
  137. package/dist/languageService/symbolIndexer.js +105 -0
  138. package/dist/languageService/symbolIndexer.js.map +1 -0
  139. package/dist/languageService/tooltipUtils.d.ts +8 -1
  140. package/dist/languageService/tooltipUtils.js +102 -1
  141. package/dist/languageService/tooltipUtils.js.map +1 -1
  142. package/dist/languageService/workspaceSymbolProvider.d.ts +17 -0
  143. package/dist/languageService/workspaceSymbolProvider.js +133 -0
  144. package/dist/languageService/workspaceSymbolProvider.js.map +1 -0
  145. package/dist/localization/localize.d.ts +38 -4
  146. package/dist/localization/localize.js +21 -4
  147. package/dist/localization/localize.js.map +1 -1
  148. package/dist/localization/package.nls.en-us.json +23 -6
  149. package/dist/parser/parseNodes.d.ts +8 -8
  150. package/dist/parser/parseNodes.js +20 -10
  151. package/dist/parser/parseNodes.js.map +1 -1
  152. package/dist/parser/parser.d.ts +3 -3
  153. package/dist/parser/parser.js +136 -159
  154. package/dist/parser/parser.js.map +1 -1
  155. package/dist/parser/stringTokenUtils.d.ts +3 -13
  156. package/dist/parser/stringTokenUtils.js +8 -181
  157. package/dist/parser/stringTokenUtils.js.map +1 -1
  158. package/dist/parser/tokenizer.d.ts +3 -0
  159. package/dist/parser/tokenizer.js +211 -24
  160. package/dist/parser/tokenizer.js.map +1 -1
  161. package/dist/parser/tokenizerTypes.d.ts +31 -1
  162. package/dist/parser/tokenizerTypes.js +51 -1
  163. package/dist/parser/tokenizerTypes.js.map +1 -1
  164. package/dist/pyright.js +26 -4
  165. package/dist/pyright.js.map +1 -1
  166. package/dist/readonlyAugmentedFileSystem.js +1 -1
  167. package/dist/readonlyAugmentedFileSystem.js.map +1 -1
  168. package/dist/tests/chainedSourceFiles.test.js +15 -20
  169. package/dist/tests/chainedSourceFiles.test.js.map +1 -1
  170. package/dist/tests/checker.test.js +14 -0
  171. package/dist/tests/checker.test.js.map +1 -1
  172. package/dist/tests/completions.test.js +11 -236
  173. package/dist/tests/completions.test.js.map +1 -1
  174. package/dist/tests/docStringConversion.test.js +36 -2
  175. package/dist/tests/docStringConversion.test.js.map +1 -1
  176. package/dist/tests/fourslash/completions.override2.fourslash.js +1 -16
  177. package/dist/tests/fourslash/completions.override2.fourslash.js.map +1 -1
  178. package/dist/tests/harness/fourslash/testLanguageService.js +1 -1
  179. package/dist/tests/harness/fourslash/testLanguageService.js.map +1 -1
  180. package/dist/tests/harness/fourslash/testState.d.ts +14 -8
  181. package/dist/tests/harness/fourslash/testState.js +27 -37
  182. package/dist/tests/harness/fourslash/testState.js.map +1 -1
  183. package/dist/tests/importResolver.test.js +84 -4
  184. package/dist/tests/importResolver.test.js.map +1 -1
  185. package/dist/tests/textRange.test.js +45 -0
  186. package/dist/tests/textRange.test.js.map +1 -0
  187. package/dist/tests/tokenizer.test.js +272 -58
  188. package/dist/tests/tokenizer.test.js.map +1 -1
  189. package/dist/tests/typeEvaluator2.test.js +16 -0
  190. package/dist/tests/typeEvaluator2.test.js.map +1 -1
  191. package/dist/tests/typeEvaluator3.test.js +14 -0
  192. package/dist/tests/typeEvaluator3.test.js.map +1 -1
  193. package/dist/tests/typeEvaluator4.test.js +7 -2
  194. package/dist/tests/typeEvaluator4.test.js.map +1 -1
  195. package/dist/tests/typeEvaluator5.test.js +29 -9
  196. package/dist/tests/typeEvaluator5.test.js.map +1 -1
  197. package/dist/tests/workspaceEditUtils.test.js +15 -10
  198. package/dist/tests/workspaceEditUtils.test.js.map +1 -1
  199. package/dist/workspaceFactory.js +3 -5
  200. package/dist/workspaceFactory.js.map +1 -1
  201. package/package.json +1 -1
  202. package/dist/languageService/importAdder.d.ts +0 -40
  203. package/dist/languageService/importAdder.js +0 -388
  204. package/dist/languageService/importAdder.js.map +0 -1
  205. package/dist/tests/fourslash/completions.commitChars.fourslash.d.ts +0 -1
  206. package/dist/tests/fourslash/completions.commitChars.fourslash.js +0 -81
  207. package/dist/tests/fourslash/completions.commitChars.fourslash.js.map +0 -1
  208. package/dist/tests/importAdder.test.js +0 -1325
  209. package/dist/tests/importAdder.test.js.map +0 -1
  210. /package/dist/tests/{importAdder.test.d.ts → textRange.test.d.ts} +0 -0
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
34
34
  Object.defineProperty(exports, "__esModule", { value: true });
35
35
  exports.Checker = void 0;
36
36
  const vscode_languageserver_1 = require("vscode-languageserver");
37
+ const collectionUtils_1 = require("../common/collectionUtils");
37
38
  const debug_1 = require("../common/debug");
38
39
  const diagnostic_1 = require("../common/diagnostic");
39
40
  const diagnosticRules_1 = require("../common/diagnosticRules");
@@ -61,9 +62,9 @@ const SymbolNameUtils = __importStar(require("./symbolNameUtils"));
61
62
  const symbolUtils_1 = require("./symbolUtils");
62
63
  const typeEvaluator_1 = require("./typeEvaluator");
63
64
  const typeGuards_1 = require("./typeGuards");
64
- const types_1 = require("./types");
65
65
  const typeUtils_1 = require("./typeUtils");
66
66
  const typeVarContext_1 = require("./typeVarContext");
67
+ const types_1 = require("./types");
67
68
  const deprecatedAliases = new Map([
68
69
  ['Tuple', { version: pythonVersion_1.PythonVersion.V3_9, fullName: 'builtins.tuple', replacementText: 'tuple' }],
69
70
  ['List', { version: pythonVersion_1.PythonVersion.V3_9, fullName: 'builtins.list', replacementText: 'list' }],
@@ -213,7 +214,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
213
214
  this._validateMultipleInheritanceCompatibility(classTypeResult.classType, node.name);
214
215
  this._validateConstructorConsistency(classTypeResult.classType);
215
216
  this._validateFinalMemberOverrides(classTypeResult.classType);
216
- this._validateInstanceVariableInitialization(classTypeResult.classType);
217
+ this._validateInstanceVariableInitialization(node, classTypeResult.classType);
217
218
  this._validateFinalClassNotAbstract(classTypeResult.classType, node);
218
219
  this._validateDataClassPostInit(classTypeResult.classType, node);
219
220
  this._validateProtocolCompatibility(classTypeResult.classType, node);
@@ -829,28 +830,47 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
829
830
  return true;
830
831
  }
831
832
  visitStringList(node) {
833
+ // If this is Python 3.11 or older, there are several restrictions
834
+ // associated with f-strings that we need to validate. Determine whether
835
+ // we're within an f-string (or multiple f-strings if nesting is used).
836
+ const fStringContainers = [];
837
+ if (this._fileInfo.executionEnvironment.pythonVersion < pythonVersion_1.PythonVersion.V3_12) {
838
+ let curNode = node;
839
+ while (curNode) {
840
+ if (curNode.nodeType === 27 /* FormatString */) {
841
+ fStringContainers.push(curNode);
842
+ }
843
+ curNode = curNode.parent;
844
+ }
845
+ }
832
846
  for (const stringNode of node.strings) {
833
- if (stringNode.hasUnescapeErrors) {
834
- const unescapedResult = (0, stringTokenUtils_1.getUnescapedString)(stringNode.token);
847
+ const stringTokens = stringNode.nodeType === 49 /* String */ ? [stringNode.token] : stringNode.middleTokens;
848
+ stringTokens.forEach((token) => {
849
+ const unescapedResult = (0, stringTokenUtils_1.getUnescapedString)(token);
850
+ let start = token.start;
851
+ if (token.type === 5 /* String */) {
852
+ start += token.prefixLength + token.quoteMarkLength;
853
+ }
835
854
  unescapedResult.unescapeErrors.forEach((error) => {
836
- const start = stringNode.token.start +
837
- stringNode.token.prefixLength +
838
- stringNode.token.quoteMarkLength +
839
- error.offset;
840
- const textRange = { start, length: error.length };
841
855
  if (error.errorType === 0 /* InvalidEscapeSequence */) {
842
- this._evaluator.addDiagnosticForTextRange(this._fileInfo, this._fileInfo.diagnosticRuleSet.reportInvalidStringEscapeSequence, diagnosticRules_1.DiagnosticRule.reportInvalidStringEscapeSequence, localize_1.Localizer.Diagnostic.stringUnsupportedEscape(), textRange);
843
- }
844
- else if (error.errorType === 1 /* EscapeWithinFormatExpression */) {
845
- this._evaluator.addDiagnosticForTextRange(this._fileInfo, 'error', '', localize_1.Localizer.Diagnostic.formatStringEscape(), textRange);
846
- }
847
- else if (error.errorType === 2 /* SingleCloseBraceWithinFormatLiteral */) {
848
- this._evaluator.addDiagnosticForTextRange(this._fileInfo, 'error', '', localize_1.Localizer.Diagnostic.formatStringBrace(), textRange);
849
- }
850
- else if (error.errorType === 3 /* UnterminatedFormatExpression */) {
851
- this._evaluator.addDiagnosticForTextRange(this._fileInfo, 'error', '', localize_1.Localizer.Diagnostic.formatStringUnterminated(), textRange);
856
+ this._evaluator.addDiagnosticForTextRange(this._fileInfo, this._fileInfo.diagnosticRuleSet.reportInvalidStringEscapeSequence, diagnosticRules_1.DiagnosticRule.reportInvalidStringEscapeSequence, localize_1.Localizer.Diagnostic.stringUnsupportedEscape(), { start: start + error.offset, length: error.length });
852
857
  }
853
858
  });
859
+ // Prior to Python 3.12, it was not allowed to include a slash in an f-string.
860
+ if (fStringContainers.length > 0) {
861
+ const escapeOffset = token.escapedValue.indexOf('\\');
862
+ if (escapeOffset >= 0) {
863
+ this._evaluator.addDiagnosticForTextRange(this._fileInfo, 'error', '', localize_1.Localizer.Diagnostic.formatStringEscape(), { start, length: 1 });
864
+ }
865
+ }
866
+ });
867
+ // Prior to Python 3.12, it was not allowed to nest strings that
868
+ // used the same quote scheme within an f-string.
869
+ if (fStringContainers.length > 0) {
870
+ const quoteTypeMask = 1 /* SingleQuote */ | 2 /* DoubleQuote */ | 4 /* Triplicate */;
871
+ if (fStringContainers.some((fStringContainer) => (fStringContainer.token.flags & quoteTypeMask) === (stringNode.token.flags & quoteTypeMask))) {
872
+ this._evaluator.addError(localize_1.Localizer.Diagnostic.formatStringNestedQuote(), stringNode);
873
+ }
854
874
  }
855
875
  }
856
876
  if (node.typeAnnotation) {
@@ -862,8 +882,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
862
882
  return true;
863
883
  }
864
884
  visitFormatString(node) {
865
- node.expressions.forEach((formatExpr) => {
866
- this._evaluator.getType(formatExpr);
885
+ node.fieldExpressions.forEach((expr) => {
886
+ this._evaluator.getType(expr);
887
+ });
888
+ node.formatExpressions.forEach((expr) => {
889
+ this._evaluator.getType(expr);
867
890
  });
868
891
  return true;
869
892
  }
@@ -2737,7 +2760,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
2737
2760
  const desc = {
2738
2761
  nameParts: moduleName.split('.'),
2739
2762
  leadingDots: 0,
2740
- importedSymbols: [],
2763
+ importedSymbols: new Set(),
2741
2764
  };
2742
2765
  const stdlibPath = this._importResolver.getTypeshedStdLibPath(this._fileInfo.executionEnvironment);
2743
2766
  if (stdlibPath &&
@@ -2783,7 +2806,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
2783
2806
  const module = {
2784
2807
  nameParts,
2785
2808
  leadingDots: 0,
2786
- importedSymbols: [],
2809
+ importedSymbols: new Set(),
2787
2810
  };
2788
2811
  // Make sure the module is a potential stdlib one so we don't spend the time
2789
2812
  // searching for the definition.
@@ -3297,7 +3320,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3297
3320
  }
3298
3321
  // Reports the case where an instance variable is not declared or initialized
3299
3322
  // within the class body or constructor method.
3300
- _validateInstanceVariableInitialization(classType) {
3323
+ _validateInstanceVariableInitialization(node, classType) {
3301
3324
  // This check doesn't apply to stub files.
3302
3325
  if (this._fileInfo.isStubFile) {
3303
3326
  return;
@@ -3313,7 +3336,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3313
3336
  (types_1.ClassType.supportsAbstractMethods(classType) && !types_1.ClassType.isFinal(classType))) {
3314
3337
  return;
3315
3338
  }
3339
+ // If the class is final, see if it has any abstract base classes that define
3340
+ // variables. We need to make sure these are initialized.
3341
+ const abstractSymbols = new Map();
3342
+ if (types_1.ClassType.isFinal(classType)) {
3343
+ (0, typeUtils_1.getProtocolSymbolsRecursive)(classType, abstractSymbols, 1024 /* SupportsAbstractMethods */);
3344
+ }
3316
3345
  classType.details.fields.forEach((localSymbol, name) => {
3346
+ abstractSymbols.delete(name);
3317
3347
  // This applies only to instance members.
3318
3348
  if (!localSymbol.isInstanceMember()) {
3319
3349
  return;
@@ -3365,6 +3395,31 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3365
3395
  // Report the variable as uninitialized only on the first decl.
3366
3396
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportUninitializedInstanceVariable, diagnosticRules_1.DiagnosticRule.reportUninitializedInstanceVariable, localize_1.Localizer.Diagnostic.uninitializedInstanceVariable().format({ name: name }), decls[0].node);
3367
3397
  });
3398
+ // See if there are any variables from abstract base classes
3399
+ // that are not initialized.
3400
+ const diagAddendum = new diagnostic_1.DiagnosticAddendum();
3401
+ abstractSymbols.forEach((member, name) => {
3402
+ const decls = member.symbol.getDeclarations();
3403
+ if (decls.length === 0 || !(0, types_1.isClass)(member.classType)) {
3404
+ return;
3405
+ }
3406
+ if (decls[0].type === 1 /* Variable */) {
3407
+ // If none of the declarations involve assignments, assume it's
3408
+ // not implemented in the protocol.
3409
+ if (!decls.some((decl) => decl.type === 1 /* Variable */ && !!decl.inferredTypeSource)) {
3410
+ // This is a variable declaration that is not implemented in the
3411
+ // protocol base class. Make sure it's implemented in the derived class.
3412
+ diagAddendum.addMessage(localize_1.Localizer.DiagnosticAddendum.uninitializedAbstractVariable().format({
3413
+ name,
3414
+ classType: member.classType.details.name,
3415
+ }));
3416
+ }
3417
+ }
3418
+ });
3419
+ if (!diagAddendum.isEmpty()) {
3420
+ this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportUninitializedInstanceVariable, diagnosticRules_1.DiagnosticRule.reportUninitializedInstanceVariable, localize_1.Localizer.Diagnostic.uninitializedAbstractVariables().format({ classType: classType.details.name }) +
3421
+ diagAddendum.getString(), node.name);
3422
+ }
3368
3423
  }
3369
3424
  // Validates that the type variables used in a generic protocol class have
3370
3425
  // the proper variance (invariant, covariant, contravariant). See PEP 544
@@ -3780,14 +3835,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3780
3835
  if (!firstOverride) {
3781
3836
  // If this is a method decorated with @override, validate that there
3782
3837
  // is a base class method of the same name.
3783
- this._validateOverrideDecoratorNotPresent(typeOfSymbol);
3838
+ this._validateOverrideDecoratorNotPresent(symbol, typeOfSymbol);
3784
3839
  }
3785
3840
  else {
3786
- this._validateOverrideDecoratorPresent(typeOfSymbol, firstOverride);
3841
+ this._validateOverrideDecoratorPresent(symbol, typeOfSymbol, firstOverride);
3787
3842
  }
3788
3843
  });
3789
3844
  }
3790
- _validateOverrideDecoratorPresent(overrideType, baseMember) {
3845
+ _validateOverrideDecoratorPresent(symbol, overrideType, baseMember) {
3791
3846
  var _a;
3792
3847
  // Skip this check if disabled.
3793
3848
  if (this._fileInfo.diagnosticRuleSet.reportImplicitOverride === 'none') {
@@ -3816,6 +3871,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3816
3871
  if (overrideFunction.details.name === '__init__' || overrideFunction.details.name === '__new__') {
3817
3872
  return;
3818
3873
  }
3874
+ // If the declaration for the override function is not the same as the
3875
+ // declaration for the symbol, the function was probably replaced by a decorator.
3876
+ if (!symbol.getDeclarations().some((decl) => decl === overrideFunction.details.declaration)) {
3877
+ return;
3878
+ }
3819
3879
  const funcNode = overrideFunction.details.declaration.node;
3820
3880
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportImplicitOverride, diagnosticRules_1.DiagnosticRule.reportImplicitOverride, localize_1.Localizer.Diagnostic.overrideDecoratorMissing().format({
3821
3881
  name: funcNode.name.value,
@@ -3825,7 +3885,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3825
3885
  // Determines whether the type is a function or overloaded function with an @override
3826
3886
  // decorator. In this case, an error is reported because no base class has declared
3827
3887
  // a method of the same name.
3828
- _validateOverrideDecoratorNotPresent(overrideType) {
3888
+ _validateOverrideDecoratorNotPresent(symbol, overrideType) {
3829
3889
  var _a;
3830
3890
  let overrideFunction;
3831
3891
  if ((0, types_1.isFunction)(overrideType)) {
@@ -3846,6 +3906,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3846
3906
  if (!(overrideFunction === null || overrideFunction === void 0 ? void 0 : overrideFunction.details.declaration) || !types_1.FunctionType.isOverridden(overrideFunction)) {
3847
3907
  return;
3848
3908
  }
3909
+ // If the declaration for the override function is not the same as the
3910
+ // declaration for the symbol, the function was probably replaced by a decorator.
3911
+ if (!symbol.getDeclarations().some((decl) => decl === overrideFunction.details.declaration)) {
3912
+ return;
3913
+ }
3849
3914
  const funcNode = overrideFunction.details.declaration.node;
3850
3915
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.overriddenMethodNotFound().format({ name: funcNode.name.value }), funcNode.name);
3851
3916
  }
@@ -3853,6 +3918,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3853
3918
  if (!(0, types_1.isInstantiableClass)(baseClassAndSymbol.classType)) {
3854
3919
  return;
3855
3920
  }
3921
+ if (baseClassAndSymbol.symbol.isIgnoredForOverrideChecks()) {
3922
+ return;
3923
+ }
3856
3924
  // If the base class doesn't provide a type declaration, we won't bother
3857
3925
  // proceeding with additional checks. Type inference is too inaccurate
3858
3926
  // in this case, plus it would be very slow.
@@ -4387,7 +4455,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4387
4455
  this._evaluator.addUnreachableCode(except, except.exceptSuite);
4388
4456
  }
4389
4457
  }
4390
- exceptionTypesSoFar.push(...typesOfThisExcept);
4458
+ (0, collectionUtils_1.appendArray)(exceptionTypesSoFar, typesOfThisExcept);
4391
4459
  });
4392
4460
  }
4393
4461
  _reportDuplicateImports() {