@zzzen/pyright-internal 1.2.0-dev.20231224 → 1.2.0-dev.20231231

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 (49) hide show
  1. package/dist/analyzer/binder.js +1 -3
  2. package/dist/analyzer/binder.js.map +1 -1
  3. package/dist/analyzer/checker.d.ts +1 -0
  4. package/dist/analyzer/checker.js +34 -14
  5. package/dist/analyzer/checker.js.map +1 -1
  6. package/dist/analyzer/codeFlowEngine.js +3 -0
  7. package/dist/analyzer/codeFlowEngine.js.map +1 -1
  8. package/dist/analyzer/constraintSolver.js +16 -16
  9. package/dist/analyzer/constraintSolver.js.map +1 -1
  10. package/dist/analyzer/dataClasses.js +2 -9
  11. package/dist/analyzer/dataClasses.js.map +1 -1
  12. package/dist/analyzer/enums.js +1 -1
  13. package/dist/analyzer/enums.js.map +1 -1
  14. package/dist/analyzer/namedTuples.js +1 -1
  15. package/dist/analyzer/namedTuples.js.map +1 -1
  16. package/dist/analyzer/protocols.js +3 -3
  17. package/dist/analyzer/protocols.js.map +1 -1
  18. package/dist/analyzer/typeEvaluator.js +165 -126
  19. package/dist/analyzer/typeEvaluator.js.map +1 -1
  20. package/dist/analyzer/typeEvaluatorTypes.d.ts +1 -1
  21. package/dist/analyzer/typeGuards.js +2 -2
  22. package/dist/analyzer/typeGuards.js.map +1 -1
  23. package/dist/analyzer/typeUtils.d.ts +10 -9
  24. package/dist/analyzer/typeUtils.js +14 -13
  25. package/dist/analyzer/typeUtils.js.map +1 -1
  26. package/dist/analyzer/typedDicts.js +24 -36
  27. package/dist/analyzer/typedDicts.js.map +1 -1
  28. package/dist/analyzer/types.d.ts +7 -1
  29. package/dist/analyzer/types.js +55 -5
  30. package/dist/analyzer/types.js.map +1 -1
  31. package/dist/common/diagnostic.d.ts +1 -0
  32. package/dist/common/diagnostic.js +18 -1
  33. package/dist/common/diagnostic.js.map +1 -1
  34. package/dist/localization/localize.d.ts +18 -0
  35. package/dist/localization/localize.js +10 -0
  36. package/dist/localization/localize.js.map +1 -1
  37. package/dist/localization/package.nls.en-us.json +11 -1
  38. package/dist/parser/parser.js +1 -1
  39. package/dist/parser/parser.js.map +1 -1
  40. package/dist/pyright.js +6 -3
  41. package/dist/pyright.js.map +1 -1
  42. package/dist/tests/typeEvaluator1.test.js +1 -1
  43. package/dist/tests/typeEvaluator2.test.js +7 -7
  44. package/dist/tests/typeEvaluator2.test.js.map +1 -1
  45. package/dist/tests/typeEvaluator4.test.js +2 -2
  46. package/dist/tests/typeEvaluator5.test.js +1 -1
  47. package/dist/tests/typePrinter.test.js +2 -10
  48. package/dist/tests/typePrinter.test.js.map +1 -1
  49. package/package.json +1 -1
@@ -386,6 +386,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
386
386
  this._validateFunctionTypeVarUsage(node, functionTypeResult);
387
387
  this._validateGeneratorReturnType(node, functionTypeResult.functionType);
388
388
  this._reportDeprecatedClassProperty(node, functionTypeResult);
389
+ // If this is not a method, @final is disallowed.
390
+ if (!containingClassNode && types_1.FunctionType.isFinal(functionTypeResult.functionType)) {
391
+ this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.finalNonMethod().format({ name: node.name.value }), node.name);
392
+ }
389
393
  }
390
394
  // If we're at the module level within a stub file, report a diagnostic
391
395
  // if there is a '__getattr__' function defined when in strict mode.
@@ -564,7 +568,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
564
568
  let diagAddendum = new diagnostic_1.DiagnosticAddendum();
565
569
  let returnTypeMatches = false;
566
570
  if (this._evaluator.assignType(declaredReturnType, returnTypeResult.type, diagAddendum, new typeVarContext_1.TypeVarContext(),
567
- /* srcTypeVarContext */ undefined, 64 /* AssignTypeFlags.AllowBoolTypeGuard */)) {
571
+ /* srcTypeVarContext */ undefined, 128 /* AssignTypeFlags.AllowBoolTypeGuard */)) {
568
572
  returnTypeMatches = true;
569
573
  }
570
574
  else {
@@ -587,7 +591,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
587
591
  const adjustedReturnType = (0, typeUtils_1.applySolvedTypeVars)(declaredReturnType, typeVarContext);
588
592
  if (this._evaluator.assignType(adjustedReturnType, returnTypeResult.type, diagAddendum,
589
593
  /* destTypeVarContext */ undefined,
590
- /* srcTypeVarContext */ undefined, 64 /* AssignTypeFlags.AllowBoolTypeGuard */)) {
594
+ /* srcTypeVarContext */ undefined, 128 /* AssignTypeFlags.AllowBoolTypeGuard */)) {
591
595
  returnTypeMatches = true;
592
596
  }
593
597
  }
@@ -1731,7 +1735,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1731
1735
  _validateOverloadConsistency(node, functionType, prevOverloads) {
1732
1736
  for (let i = 0; i < prevOverloads.length; i++) {
1733
1737
  const prevOverload = prevOverloads[i];
1734
- if (this._isOverlappingOverload(functionType, prevOverload)) {
1738
+ if (this._isOverlappingOverload(functionType, prevOverload, /* partialOverlap */ false)) {
1735
1739
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportOverlappingOverload, diagnosticRules_1.DiagnosticRule.reportOverlappingOverload, localize_1.Localizer.Diagnostic.overlappingOverload().format({
1736
1740
  name: node.name.value,
1737
1741
  obscured: prevOverloads.length + 1,
@@ -1742,14 +1746,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1742
1746
  }
1743
1747
  for (let i = 0; i < prevOverloads.length; i++) {
1744
1748
  const prevOverload = prevOverloads[i];
1745
- if (this._isOverlappingOverload(prevOverload, functionType)) {
1749
+ if (this._isOverlappingOverload(prevOverload, functionType, /* partialOverlap */ true)) {
1746
1750
  const prevReturnType = types_1.FunctionType.getSpecializedReturnType(prevOverload);
1747
1751
  const returnType = types_1.FunctionType.getSpecializedReturnType(functionType);
1748
1752
  if (prevReturnType &&
1749
1753
  returnType &&
1750
1754
  !this._evaluator.assignType(returnType, prevReturnType,
1751
1755
  /* diag */ undefined, new typeVarContext_1.TypeVarContext(),
1752
- /* srcTypeVarContext */ undefined, 8 /* AssignTypeFlags.SkipSolveTypeVars */ | 512 /* AssignTypeFlags.IgnoreTypeVarScope */)) {
1756
+ /* srcTypeVarContext */ undefined, 8 /* AssignTypeFlags.SkipSolveTypeVars */ | 1024 /* AssignTypeFlags.IgnoreTypeVarScope */)) {
1753
1757
  const altNode = this._findNodeForOverload(node, prevOverload);
1754
1758
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportOverlappingOverload, diagnosticRules_1.DiagnosticRule.reportOverlappingOverload, localize_1.Localizer.Diagnostic.overloadReturnTypeMismatch().format({
1755
1759
  name: node.name.value,
@@ -1779,7 +1783,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1779
1783
  }
1780
1784
  return undefined;
1781
1785
  }
1782
- _isOverlappingOverload(functionType, prevOverload) {
1786
+ _isOverlappingOverload(functionType, prevOverload, partialOverlap) {
1783
1787
  // According to precedent, the __get__ method is special-cased and is
1784
1788
  // exempt from overlapping overload checks. It's not clear why this is
1785
1789
  // the case, but for consistency with other type checkers, we'll honor
@@ -1788,18 +1792,22 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1788
1792
  if (types_1.FunctionType.isInstanceMethod(functionType) && functionType.details.name === '__get__') {
1789
1793
  return false;
1790
1794
  }
1795
+ let flags = 64 /* AssignTypeFlags.SkipFunctionReturnTypeCheck */ | 16 /* AssignTypeFlags.OverloadOverlapCheck */;
1796
+ if (partialOverlap) {
1797
+ flags |= 32 /* AssignTypeFlags.PartialOverloadOverlapCheck */;
1798
+ }
1791
1799
  return this._evaluator.assignType(functionType, prevOverload,
1792
1800
  /* diag */ undefined, new typeVarContext_1.TypeVarContext((0, typeUtils_1.getTypeVarScopeId)(functionType)),
1793
- /* srcTypeVarContext */ undefined, 32 /* AssignTypeFlags.SkipFunctionReturnTypeCheck */ | 16 /* AssignTypeFlags.OverloadOverlapCheck */);
1801
+ /* srcTypeVarContext */ undefined, flags);
1794
1802
  }
1795
1803
  _isLegalOverloadImplementation(overload, implementation, diag) {
1796
1804
  var _a;
1797
1805
  const implTypeVarContext = new typeVarContext_1.TypeVarContext((0, typeUtils_1.getTypeVarScopeId)(implementation));
1798
1806
  const overloadTypeVarContext = new typeVarContext_1.TypeVarContext((0, typeUtils_1.getTypeVarScopeId)(overload));
1799
1807
  // First check the parameters to see if they are assignable.
1800
- let isLegal = this._evaluator.assignType(overload, implementation, diag, overloadTypeVarContext, implTypeVarContext, 32 /* AssignTypeFlags.SkipFunctionReturnTypeCheck */ |
1808
+ let isLegal = this._evaluator.assignType(overload, implementation, diag, overloadTypeVarContext, implTypeVarContext, 64 /* AssignTypeFlags.SkipFunctionReturnTypeCheck */ |
1801
1809
  2 /* AssignTypeFlags.ReverseTypeVarMatching */ |
1802
- 256 /* AssignTypeFlags.SkipSelfClsTypeCheck */);
1810
+ 512 /* AssignTypeFlags.SkipSelfClsTypeCheck */);
1803
1811
  // Now check the return types.
1804
1812
  const overloadReturnType = (_a = overload.details.declaredReturnType) !== null && _a !== void 0 ? _a : this._evaluator.getFunctionInferredReturnType(overload);
1805
1813
  const implementationReturnType = (0, typeUtils_1.applySolvedTypeVars)(implementation.details.declaredReturnType || this._evaluator.getFunctionInferredReturnType(implementation), implTypeVarContext);
@@ -2715,6 +2723,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
2715
2723
  diag.addMessage(localize_1.Localizer.DiagnosticAddendum.noneNotAllowed());
2716
2724
  isSupported = false;
2717
2725
  }
2726
+ else if (types_1.ClassType.isTypedDictClass(subtype)) {
2727
+ diag.addMessage(localize_1.Localizer.DiagnosticAddendum.typedDictClassNotAllowed());
2728
+ isSupported = false;
2729
+ }
2718
2730
  else if (subtype.isTypeArgumentExplicit && !subtype.includeSubclasses) {
2719
2731
  // If it's a class, make sure that it has not been given explicit
2720
2732
  // type arguments. This will result in a TypeError exception.
@@ -2730,6 +2742,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
2730
2742
  diag.addMessage(localize_1.Localizer.DiagnosticAddendum.protocolRequiresRuntimeCheckable());
2731
2743
  isSupported = false;
2732
2744
  }
2745
+ else if (types_1.ClassType.isNewTypeClass(subtype)) {
2746
+ diag.addMessage(localize_1.Localizer.DiagnosticAddendum.newTypeClassNotAllowed());
2747
+ isSupported = false;
2748
+ }
2733
2749
  break;
2734
2750
  case 4 /* TypeCategory.Function */:
2735
2751
  if (!types_1.TypeBase.isInstantiable(subtype) || subtype.isCallableWithTypeArgs) {
@@ -3782,11 +3798,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3782
3798
  if (!this._evaluator.assignType(newMemberType, initMemberType,
3783
3799
  /* diag */ undefined,
3784
3800
  /* destTypeVarContext */ undefined,
3785
- /* srcTypeVarContext */ undefined, 32 /* AssignTypeFlags.SkipFunctionReturnTypeCheck */) ||
3801
+ /* srcTypeVarContext */ undefined, 64 /* AssignTypeFlags.SkipFunctionReturnTypeCheck */) ||
3786
3802
  !this._evaluator.assignType(initMemberType, newMemberType,
3787
3803
  /* diag */ undefined,
3788
3804
  /* destTypeVarContext */ undefined,
3789
- /* srcTypeVarContext */ undefined, 32 /* AssignTypeFlags.SkipFunctionReturnTypeCheck */)) {
3805
+ /* srcTypeVarContext */ undefined, 64 /* AssignTypeFlags.SkipFunctionReturnTypeCheck */)) {
3790
3806
  const displayOnInit = types_1.ClassType.isSameGenericClass(initMethodResult.classType, classType);
3791
3807
  const initDecl = initMemberType.details.declaration;
3792
3808
  const newDecl = newMemberType.details.declaration;
@@ -4150,7 +4166,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4150
4166
  return;
4151
4167
  }
4152
4168
  // Constructors are exempt.
4153
- if (overrideFunction.details.name === '__init__' || overrideFunction.details.name === '__new__') {
4169
+ if (this._isMethodExemptFromLsp(overrideFunction.details.name)) {
4154
4170
  return;
4155
4171
  }
4156
4172
  // If the declaration for the override function is not the same as the
@@ -4164,6 +4180,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4164
4180
  className: this._evaluator.printType((0, typeUtils_1.convertToInstance)(baseMember.classType)),
4165
4181
  }), funcNode.name);
4166
4182
  }
4183
+ // Determines whether the name is exempt from Liskov Substitution Principle rules.
4184
+ _isMethodExemptFromLsp(name) {
4185
+ const exemptMethods = ['__init__', '__new__', '__init_subclass__', '__post_init__'];
4186
+ return exemptMethods.some((n) => n === name);
4187
+ }
4167
4188
  // Determines whether the type is a function or overloaded function with an @override
4168
4189
  // decorator. In this case, an error is reported because no base class has declared
4169
4190
  // a method of the same name.
@@ -4217,7 +4238,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4217
4238
  if ((0, types_1.isFunction)(baseType) || (0, types_1.isOverloadedFunction)(baseType)) {
4218
4239
  const diagAddendum = new diagnostic_1.DiagnosticAddendum();
4219
4240
  if ((0, types_1.isFunction)(overrideType) || (0, types_1.isOverloadedFunction)(overrideType)) {
4220
- const exemptMethods = ['__init__', '__new__', '__init_subclass__'];
4221
4241
  // Don't enforce parameter names for dundered methods. Many of them
4222
4242
  // are misnamed in typeshed stubs, so this would result in many
4223
4243
  // false positives.
@@ -4226,7 +4246,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4226
4246
  // Also, skip this check if the class is a TypedDict. The methods for a TypedDict
4227
4247
  // are synthesized, and they can result in many overloads. We assume they
4228
4248
  // are correct and will not produce any errors.
4229
- if (!exemptMethods.some((exempt) => exempt === memberName) &&
4249
+ if (!this._isMethodExemptFromLsp(memberName) &&
4230
4250
  !SymbolNameUtils.isPrivateName(memberName) &&
4231
4251
  !types_1.ClassType.isTypedDictClass(childClassType)) {
4232
4252
  if (!this._evaluator.validateOverrideMethod(baseType, overrideType, childClassType, diagAddendum, enforceParamNameMatch)) {