@zzzen/pyright-internal 1.2.0-dev.20230806 → 1.2.0-dev.20230820

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 (142) hide show
  1. package/dist/analyzer/backgroundAnalysisProgram.d.ts +6 -5
  2. package/dist/analyzer/backgroundAnalysisProgram.js +6 -5
  3. package/dist/analyzer/backgroundAnalysisProgram.js.map +1 -1
  4. package/dist/analyzer/binder.js +8 -2
  5. package/dist/analyzer/binder.js.map +1 -1
  6. package/dist/analyzer/checker.d.ts +1 -0
  7. package/dist/analyzer/checker.js +79 -8
  8. package/dist/analyzer/checker.js.map +1 -1
  9. package/dist/analyzer/codeFlowEngine.js +5 -5
  10. package/dist/analyzer/codeFlowEngine.js.map +1 -1
  11. package/dist/analyzer/constraintSolver.d.ts +1 -0
  12. package/dist/analyzer/constraintSolver.js +30 -23
  13. package/dist/analyzer/constraintSolver.js.map +1 -1
  14. package/dist/analyzer/dataClasses.js +242 -236
  15. package/dist/analyzer/dataClasses.js.map +1 -1
  16. package/dist/analyzer/decorators.js +8 -8
  17. package/dist/analyzer/decorators.js.map +1 -1
  18. package/dist/analyzer/enums.js +12 -0
  19. package/dist/analyzer/enums.js.map +1 -1
  20. package/dist/analyzer/importResolver.js +3 -1
  21. package/dist/analyzer/importResolver.js.map +1 -1
  22. package/dist/analyzer/namedTuples.js +6 -0
  23. package/dist/analyzer/namedTuples.js.map +1 -1
  24. package/dist/analyzer/operations.d.ts +1 -1
  25. package/dist/analyzer/operations.js +2 -2
  26. package/dist/analyzer/operations.js.map +1 -1
  27. package/dist/analyzer/packageTypeVerifier.js +4 -1
  28. package/dist/analyzer/packageTypeVerifier.js.map +1 -1
  29. package/dist/analyzer/parameterUtils.d.ts +2 -1
  30. package/dist/analyzer/parameterUtils.js +15 -0
  31. package/dist/analyzer/parameterUtils.js.map +1 -1
  32. package/dist/analyzer/patternMatching.js +3 -3
  33. package/dist/analyzer/patternMatching.js.map +1 -1
  34. package/dist/analyzer/program.d.ts +4 -1
  35. package/dist/analyzer/program.js +8 -10
  36. package/dist/analyzer/program.js.map +1 -1
  37. package/dist/analyzer/protocols.js +42 -20
  38. package/dist/analyzer/protocols.js.map +1 -1
  39. package/dist/analyzer/service.d.ts +3 -0
  40. package/dist/analyzer/service.js +37 -2
  41. package/dist/analyzer/service.js.map +1 -1
  42. package/dist/analyzer/typeEvaluator.js +279 -141
  43. package/dist/analyzer/typeEvaluator.js.map +1 -1
  44. package/dist/analyzer/typeEvaluatorTypes.d.ts +6 -2
  45. package/dist/analyzer/typeEvaluatorTypes.js +10 -2
  46. package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
  47. package/dist/analyzer/typeGuards.js +9 -6
  48. package/dist/analyzer/typeGuards.js.map +1 -1
  49. package/dist/analyzer/typePrinter.js +4 -1
  50. package/dist/analyzer/typePrinter.js.map +1 -1
  51. package/dist/analyzer/typeUtils.d.ts +1 -0
  52. package/dist/analyzer/typeUtils.js +47 -29
  53. package/dist/analyzer/typeUtils.js.map +1 -1
  54. package/dist/analyzer/types.d.ts +3 -1
  55. package/dist/analyzer/types.js +3 -1
  56. package/dist/analyzer/types.js.map +1 -1
  57. package/dist/backgroundAnalysis.d.ts +2 -1
  58. package/dist/backgroundAnalysis.js +2 -2
  59. package/dist/backgroundAnalysis.js.map +1 -1
  60. package/dist/backgroundAnalysisBase.d.ts +3 -3
  61. package/dist/backgroundAnalysisBase.js +3 -3
  62. package/dist/backgroundAnalysisBase.js.map +1 -1
  63. package/dist/backgroundThreadBase.d.ts +7 -6
  64. package/dist/backgroundThreadBase.js +20 -6
  65. package/dist/backgroundThreadBase.js.map +1 -1
  66. package/dist/common/console.js.map +1 -1
  67. package/dist/common/extensibility.d.ts +2 -18
  68. package/dist/common/extensibility.js.map +1 -1
  69. package/dist/common/fileSystem.d.ts +1 -1
  70. package/dist/common/pathUtils.d.ts +1 -0
  71. package/dist/common/pathUtils.js +19 -5
  72. package/dist/common/pathUtils.js.map +1 -1
  73. package/dist/common/realFileSystem.d.ts +1 -1
  74. package/dist/common/realFileSystem.js +12 -8
  75. package/dist/common/realFileSystem.js.map +1 -1
  76. package/dist/common/serviceProvider.d.ts +15 -0
  77. package/dist/common/serviceProvider.js +37 -0
  78. package/dist/common/serviceProvider.js.map +1 -0
  79. package/dist/common/serviceProviderExtensions.d.ts +16 -0
  80. package/dist/common/serviceProviderExtensions.js +27 -0
  81. package/dist/common/serviceProviderExtensions.js.map +1 -0
  82. package/dist/languageServerBase.d.ts +6 -5
  83. package/dist/languageServerBase.js +8 -6
  84. package/dist/languageServerBase.js.map +1 -1
  85. package/dist/languageService/navigationUtils.js +1 -1
  86. package/dist/languageService/navigationUtils.js.map +1 -1
  87. package/dist/localization/localize.d.ts +25 -4
  88. package/dist/localization/localize.js +8 -2
  89. package/dist/localization/localize.js.map +1 -1
  90. package/dist/localization/package.nls.cs.json +4 -3
  91. package/dist/localization/package.nls.de.json +4 -3
  92. package/dist/localization/package.nls.en-us.json +17 -11
  93. package/dist/localization/package.nls.es.json +4 -3
  94. package/dist/localization/package.nls.fr.json +4 -3
  95. package/dist/localization/package.nls.it.json +4 -3
  96. package/dist/localization/package.nls.ja.json +4 -3
  97. package/dist/localization/package.nls.ko.json +4 -3
  98. package/dist/localization/package.nls.pl.json +4 -3
  99. package/dist/localization/package.nls.pt-br.json +4 -3
  100. package/dist/localization/package.nls.qps-ploc.json +3 -2
  101. package/dist/localization/package.nls.ru.json +4 -3
  102. package/dist/localization/package.nls.tr.json +4 -3
  103. package/dist/localization/package.nls.zh-cn.json +4 -3
  104. package/dist/localization/package.nls.zh-tw.json +3 -2
  105. package/dist/nodeMain.js +2 -1
  106. package/dist/nodeMain.js.map +1 -1
  107. package/dist/parser/parser.d.ts +1 -0
  108. package/dist/parser/parser.js +80 -20
  109. package/dist/parser/parser.js.map +1 -1
  110. package/dist/pyrightFileSystem.d.ts +3 -1
  111. package/dist/pyrightFileSystem.js.map +1 -1
  112. package/dist/readonlyAugmentedFileSystem.d.ts +1 -1
  113. package/dist/readonlyAugmentedFileSystem.js +2 -2
  114. package/dist/readonlyAugmentedFileSystem.js.map +1 -1
  115. package/dist/server.js +8 -2
  116. package/dist/server.js.map +1 -1
  117. package/dist/tests/harness/fourslash/runner.js +1 -1
  118. package/dist/tests/harness/fourslash/runner.js.map +1 -1
  119. package/dist/tests/harness/fourslash/testLanguageService.js +1 -1
  120. package/dist/tests/harness/fourslash/testLanguageService.js.map +1 -1
  121. package/dist/tests/harness/fourslash/testState.js +6 -1
  122. package/dist/tests/harness/fourslash/testState.js.map +1 -1
  123. package/dist/tests/harness/vfs/filesystem.d.ts +2 -2
  124. package/dist/tests/harness/vfs/filesystem.js +1 -1
  125. package/dist/tests/harness/vfs/filesystem.js.map +1 -1
  126. package/dist/tests/service.test.js +65 -0
  127. package/dist/tests/service.test.js.map +1 -1
  128. package/dist/tests/testUtils.js +6 -1
  129. package/dist/tests/testUtils.js.map +1 -1
  130. package/dist/tests/typeEvaluator1.test.js +4 -4
  131. package/dist/tests/typeEvaluator1.test.js.map +1 -1
  132. package/dist/tests/typeEvaluator2.test.js +9 -1
  133. package/dist/tests/typeEvaluator2.test.js.map +1 -1
  134. package/dist/tests/typeEvaluator3.test.js +7 -3
  135. package/dist/tests/typeEvaluator3.test.js.map +1 -1
  136. package/dist/tests/typeEvaluator4.test.js +10 -2
  137. package/dist/tests/typeEvaluator4.test.js.map +1 -1
  138. package/dist/tests/typeEvaluator5.test.js +10 -2
  139. package/dist/tests/typeEvaluator5.test.js.map +1 -1
  140. package/dist/tests/zipfs.test.js +8 -5
  141. package/dist/tests/zipfs.test.js.map +1 -1
  142. package/package.json +1 -1
@@ -47,6 +47,7 @@ const parseNodes_1 = require("../parser/parseNodes");
47
47
  const stringTokenUtils_1 = require("../parser/stringTokenUtils");
48
48
  const AnalyzerNodeInfo = __importStar(require("./analyzerNodeInfo"));
49
49
  const declaration_1 = require("./declaration");
50
+ const declarationUtils_1 = require("./declarationUtils");
50
51
  const importResolver_1 = require("./importResolver");
51
52
  const importStatementUtils_1 = require("./importStatementUtils");
52
53
  const parameterUtils_1 = require("./parameterUtils");
@@ -211,6 +212,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
211
212
  this._validateBaseClassOverrides(classTypeResult.classType);
212
213
  this._validateSlotsClassVarConflict(classTypeResult.classType);
213
214
  }
215
+ this._validateMultipleInheritanceBaseClasses(classTypeResult.classType, node.name);
214
216
  this._validateMultipleInheritanceCompatibility(classTypeResult.classType, node.name);
215
217
  this._validateConstructorConsistency(classTypeResult.classType);
216
218
  this._validateFinalMemberOverrides(classTypeResult.classType);
@@ -339,12 +341,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
339
341
  if (param.typeAnnotationComment) {
340
342
  this.walk(param.typeAnnotationComment);
341
343
  }
344
+ // Look for method parameters that are typed with TypeVars that have the wrong variance.
342
345
  if (functionTypeResult) {
343
346
  const annotationNode = param.typeAnnotation || param.typeAnnotationComment;
344
347
  if (annotationNode && index < functionTypeResult.functionType.details.parameters.length) {
345
348
  const paramType = functionTypeResult.functionType.details.parameters[index].type;
346
349
  const exemptMethods = ['__init__', '__new__'];
347
- if ((0, types_1.isTypeVar)(paramType) &&
350
+ if (containingClassNode &&
351
+ (0, types_1.isTypeVar)(paramType) &&
348
352
  paramType.details.declaredVariance === 3 /* Covariant */ &&
349
353
  !paramType.details.isSynthesized &&
350
354
  !exemptMethods.some((name) => name === functionTypeResult.functionType.details.name)) {
@@ -629,6 +633,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
629
633
  var _a, _b, _c, _d;
630
634
  const yieldFromType = this._evaluator.getType(node.expression) || types_1.UnknownType.create();
631
635
  let yieldType;
636
+ let sendType;
632
637
  if ((0, types_1.isClassInstance)(yieldFromType) && types_1.ClassType.isBuiltIn(yieldFromType, 'Coroutine')) {
633
638
  // Handle the case of old-style (pre-await) coroutines.
634
639
  yieldType = types_1.UnknownType.create();
@@ -642,13 +647,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
642
647
  const generatorTypeArgs = (0, typeUtils_1.getGeneratorTypeArgs)(yieldType);
643
648
  if (generatorTypeArgs) {
644
649
  yieldType = generatorTypeArgs.length >= 1 ? generatorTypeArgs[0] : types_1.UnknownType.create();
650
+ sendType = generatorTypeArgs.length >= 2 ? generatorTypeArgs[1] : undefined;
645
651
  }
646
652
  else {
647
653
  yieldType =
648
654
  (_d = (_c = this._evaluator.getTypeOfIterator({ type: yieldFromType }, /* isAsync */ false, node)) === null || _c === void 0 ? void 0 : _c.type) !== null && _d !== void 0 ? _d : types_1.UnknownType.create();
649
655
  }
650
656
  }
651
- this._validateYieldType(node, yieldType);
657
+ this._validateYieldType(node, yieldType, sendType);
652
658
  return true;
653
659
  }
654
660
  visitRaise(node) {
@@ -957,6 +963,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
957
963
  });
958
964
  }
959
965
  else {
966
+ this._evaluator.evaluateTypesForStatement(node);
960
967
  const importInfo = AnalyzerNodeInfo.getImportInfo(node.module);
961
968
  if (importInfo &&
962
969
  importInfo.isImportFound &&
@@ -1824,7 +1831,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1824
1831
  else if ((0, types_1.isClassInstance)(exceptionType)) {
1825
1832
  const iterableType = (_b = (_a = this._evaluator.getTypeOfIterator({ type: exceptionType }, /* isAsync */ false, errorNode)) === null || _a === void 0 ? void 0 : _a.type) !== null && _b !== void 0 ? _b : types_1.UnknownType.create();
1826
1833
  resultingExceptionType = (0, typeUtils_1.mapSubtypes)(iterableType, (subtype) => {
1827
- if ((0, types_1.isAnyOrUnknown)(subtype)) {
1834
+ if ((0, types_1.isAnyOrUnknown)(subtype) || (0, types_1.isNever)(subtype)) {
1828
1835
  return subtype;
1829
1836
  }
1830
1837
  if ((0, types_1.isInstantiableClass)(subtype)) {
@@ -3611,6 +3618,68 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3611
3618
  }
3612
3619
  }
3613
3620
  }
3621
+ // Verifies that classes that have more than one base class do not have
3622
+ // have conflicting type arguments.
3623
+ _validateMultipleInheritanceBaseClasses(classType, errorNode) {
3624
+ // Skip this check if the class has only one base class or one or more
3625
+ // of the base classes are Any.
3626
+ const filteredBaseClasses = [];
3627
+ for (const baseClass of classType.details.baseClasses) {
3628
+ if (!(0, types_1.isClass)(baseClass)) {
3629
+ return;
3630
+ }
3631
+ if (!types_1.ClassType.isBuiltIn(baseClass, ['Generic', 'Protocol', 'object'])) {
3632
+ filteredBaseClasses.push(baseClass);
3633
+ }
3634
+ }
3635
+ if (filteredBaseClasses.length < 2) {
3636
+ return;
3637
+ }
3638
+ const diagAddendum = new diagnostic_1.DiagnosticAddendum();
3639
+ for (const baseClass of filteredBaseClasses) {
3640
+ const typeVarContext = (0, typeUtils_1.buildTypeVarContextFromSpecializedClass)(baseClass);
3641
+ for (const baseClassMroClass of baseClass.details.mro) {
3642
+ // There's no need to check for conflicts if this class isn't generic.
3643
+ if ((0, types_1.isClass)(baseClassMroClass) && baseClassMroClass.details.typeParameters.length > 0) {
3644
+ const specializedBaseClassMroClass = (0, typeUtils_1.applySolvedTypeVars)(baseClassMroClass, typeVarContext);
3645
+ // Find the corresponding class in the derived class's MRO list.
3646
+ const matchingMroClass = classType.details.mro.find((mroClass) => (0, types_1.isClass)(mroClass) && types_1.ClassType.isSameGenericClass(mroClass, specializedBaseClassMroClass));
3647
+ if (matchingMroClass && (0, types_1.isInstantiableClass)(matchingMroClass)) {
3648
+ const matchingMroObject = types_1.ClassType.cloneAsInstance(matchingMroClass);
3649
+ const baseClassMroObject = types_1.ClassType.cloneAsInstance(specializedBaseClassMroClass);
3650
+ // If the types match exactly, we can shortcut the remainder of the MRO chain.
3651
+ // if (isTypeSame(matchingMroObject, baseClassMroObject)) {
3652
+ // break;
3653
+ // }
3654
+ if (!this._evaluator.assignType(matchingMroObject, baseClassMroObject)) {
3655
+ const diag = new diagnostic_1.DiagnosticAddendum();
3656
+ const baseClassObject = (0, typeUtils_1.convertToInstance)(baseClass);
3657
+ if ((0, types_1.isTypeSame)(baseClassObject, baseClassMroObject)) {
3658
+ diag.addMessage(localize_1.Localizer.DiagnosticAddendum.baseClassIncompatible().format({
3659
+ baseClass: this._evaluator.printType(baseClassObject),
3660
+ type: this._evaluator.printType(matchingMroObject),
3661
+ }));
3662
+ }
3663
+ else {
3664
+ diag.addMessage(localize_1.Localizer.DiagnosticAddendum.baseClassIncompatibleSubclass().format({
3665
+ baseClass: this._evaluator.printType(baseClassObject),
3666
+ subclass: this._evaluator.printType(baseClassMroObject),
3667
+ type: this._evaluator.printType(matchingMroObject),
3668
+ }));
3669
+ }
3670
+ diagAddendum.addAddendum(diag);
3671
+ // Break out of the inner loop so we don't report any redundant errors for this base class.
3672
+ break;
3673
+ }
3674
+ }
3675
+ }
3676
+ }
3677
+ }
3678
+ if (!diagAddendum.isEmpty()) {
3679
+ this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.baseClassIncompatible().format({ type: classType.details.name }) +
3680
+ diagAddendum.getString(), errorNode);
3681
+ }
3682
+ }
3614
3683
  // Validates that any methods and variables in multiple base classes are
3615
3684
  // compatible with each other.
3616
3685
  _validateMultipleInheritanceCompatibility(classType, errorNode) {
@@ -3888,6 +3957,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3888
3957
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.overriddenMethodNotFound().format({ name: funcNode.name.value }), funcNode.name);
3889
3958
  }
3890
3959
  _validateBaseClassOverride(baseClassAndSymbol, overrideSymbol, overrideType, childClassType, memberName) {
3960
+ var _a, _b;
3891
3961
  if (!(0, types_1.isInstantiableClass)(baseClassAndSymbol.classType)) {
3892
3962
  return;
3893
3963
  }
@@ -4051,7 +4121,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4051
4121
  const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleVariableOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleVariableOverride, localize_1.Localizer.Diagnostic.symbolOverridden().format({
4052
4122
  name: memberName,
4053
4123
  className: baseClassAndSymbol.classType.details.name,
4054
- }) + diagAddendum.getString(), lastDecl.node);
4124
+ }) + diagAddendum.getString(), (_a = (0, declarationUtils_1.getNameNodeForDeclaration)(lastDecl)) !== null && _a !== void 0 ? _a : lastDecl.node);
4055
4125
  const origDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(baseClassAndSymbol.symbol);
4056
4126
  if (diag && origDecl) {
4057
4127
  diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.overriddenSymbol(), origDecl.path, origDecl.range);
@@ -4093,7 +4163,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4093
4163
  const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleVariableOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleVariableOverride, unformattedMessage.format({
4094
4164
  name: memberName,
4095
4165
  className: baseClassAndSymbol.classType.details.name,
4096
- }), lastDecl.node);
4166
+ }), (_b = (0, declarationUtils_1.getNameNodeForDeclaration)(lastDecl)) !== null && _b !== void 0 ? _b : lastDecl.node);
4097
4167
  const origDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(baseClassAndSymbol.symbol);
4098
4168
  if (diag && origDecl) {
4099
4169
  diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.overriddenSymbol(), origDecl.path, origDecl.range);
@@ -4336,7 +4406,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4336
4406
  }
4337
4407
  // Determines whether a yield or yield from node is compatible with the
4338
4408
  // return type annotation of the containing function.
4339
- _validateYieldType(node, yieldType) {
4409
+ _validateYieldType(node, yieldType, sendType) {
4340
4410
  var _a;
4341
4411
  const enclosingFunctionNode = ParseTreeUtils.getEnclosingFunction(node);
4342
4412
  if (!enclosingFunctionNode || !enclosingFunctionNode.returnTypeAnnotation) {
@@ -4371,7 +4441,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4371
4441
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.noReturnContainsYield(), node);
4372
4442
  return;
4373
4443
  }
4374
- const specializedGenerator = types_1.ClassType.cloneAsInstance(types_1.ClassType.cloneForSpecialization(generatorType, [yieldType], /* isTypeArgumentExplicit */ true));
4444
+ const generatorTypeArgs = [yieldType, sendType !== null && sendType !== void 0 ? sendType : types_1.UnknownType.create(), types_1.UnknownType.create()];
4445
+ const specializedGenerator = types_1.ClassType.cloneAsInstance(types_1.ClassType.cloneForSpecialization(generatorType, generatorTypeArgs, /* isTypeArgumentExplicit */ true));
4375
4446
  const diagAddendum = new diagnostic_1.DiagnosticAddendum();
4376
4447
  if (!this._evaluator.assignType(declaredReturnType, specializedGenerator, diagAddendum)) {
4377
4448
  const errorMessage = enclosingFunctionNode.isAsync
@@ -4441,7 +4512,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4441
4512
  }
4442
4513
  });
4443
4514
  // Were all of the exception types overridden?
4444
- if (typesOfThisExcept.length === overriddenExceptionCount) {
4515
+ if (typesOfThisExcept.length > 0 && typesOfThisExcept.length === overriddenExceptionCount) {
4445
4516
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.unreachableExcept() + diagAddendum.getString(), except.typeExpression);
4446
4517
  this._evaluator.addUnreachableCode(except, except.exceptSuite);
4447
4518
  }