@zzzen/pyright-internal 1.2.0-dev.20260802 → 1.2.0-dev.20260816

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 (56) hide show
  1. package/dist/analyzer/analyzerNodeInfo.d.ts +4 -1
  2. package/dist/analyzer/analyzerNodeInfo.js +13 -0
  3. package/dist/analyzer/analyzerNodeInfo.js.map +1 -1
  4. package/dist/analyzer/binder.js +88 -1
  5. package/dist/analyzer/binder.js.map +1 -1
  6. package/dist/analyzer/checker.d.ts +1 -0
  7. package/dist/analyzer/checker.js +71 -15
  8. package/dist/analyzer/checker.js.map +1 -1
  9. package/dist/analyzer/constraintSolver.js +47 -7
  10. package/dist/analyzer/constraintSolver.js.map +1 -1
  11. package/dist/analyzer/constructors.js +18 -8
  12. package/dist/analyzer/constructors.js.map +1 -1
  13. package/dist/analyzer/dataClasses.d.ts +1 -0
  14. package/dist/analyzer/dataClasses.js +98 -19
  15. package/dist/analyzer/dataClasses.js.map +1 -1
  16. package/dist/analyzer/decorators.js +18 -0
  17. package/dist/analyzer/decorators.js.map +1 -1
  18. package/dist/analyzer/scope.d.ts +3 -0
  19. package/dist/analyzer/scope.js +10 -0
  20. package/dist/analyzer/scope.js.map +1 -1
  21. package/dist/analyzer/symbol.d.ts +4 -1
  22. package/dist/analyzer/symbol.js +8 -0
  23. package/dist/analyzer/symbol.js.map +1 -1
  24. package/dist/analyzer/typeCacheUtils.d.ts +6 -2
  25. package/dist/analyzer/typeCacheUtils.js +16 -37
  26. package/dist/analyzer/typeCacheUtils.js.map +1 -1
  27. package/dist/analyzer/typeEvaluator.js +955 -105
  28. package/dist/analyzer/typeEvaluator.js.map +1 -1
  29. package/dist/analyzer/typeGuards.js +11 -8
  30. package/dist/analyzer/typeGuards.js.map +1 -1
  31. package/dist/analyzer/types.d.ts +11 -1
  32. package/dist/analyzer/types.js +48 -0
  33. package/dist/analyzer/types.js.map +1 -1
  34. package/dist/localization/localize.d.ts +6 -0
  35. package/dist/localization/localize.js +4 -0
  36. package/dist/localization/localize.js.map +1 -1
  37. package/dist/localization/package.nls.en-us.json +13 -0
  38. package/dist/tests/typeCacheUtils.test.d.ts +1 -0
  39. package/dist/tests/typeCacheUtils.test.js +69 -0
  40. package/dist/tests/typeCacheUtils.test.js.map +1 -0
  41. package/dist/tests/typeEvaluator3.test.js +8 -0
  42. package/dist/tests/typeEvaluator3.test.js.map +1 -1
  43. package/dist/tests/typeEvaluator5.test.js +12 -0
  44. package/dist/tests/typeEvaluator5.test.js.map +1 -1
  45. package/dist/tests/typeEvaluator6.test.js +33 -1
  46. package/dist/tests/typeEvaluator6.test.js.map +1 -1
  47. package/dist/tests/typeEvaluator7.test.js +37 -0
  48. package/dist/tests/typeEvaluator7.test.js.map +1 -1
  49. package/dist/tests/typeEvaluator8.test.js +318 -4
  50. package/dist/tests/typeEvaluator8.test.js.map +1 -1
  51. package/dist/tests/types.test.d.ts +1 -0
  52. package/dist/tests/types.test.js +63 -0
  53. package/dist/tests/types.test.js.map +1 -0
  54. package/dist/typeServer/typeGuards.js +4 -3
  55. package/dist/typeServer/typeGuards.js.map +1 -1
  56. package/package.json +1 -1
@@ -132,6 +132,7 @@ export declare class Checker extends ParseTreeWalker {
132
132
  private _validateProtocolTypeParamVariance;
133
133
  private _validateSlotsClassVarConflict;
134
134
  private _validateConstructorConsistency;
135
+ private _validateDisjointBaseClass;
135
136
  private _validateMultipleInheritanceBaseClasses;
136
137
  private _validateMultipleInheritanceCompatibility;
137
138
  private _validateMultipleInheritanceOverride;
@@ -192,6 +192,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
192
192
  this._validateBaseClassOverrides(classTypeResult.classType);
193
193
  this._validateTypedDictOverrides(classTypeResult.classType);
194
194
  this._validateOverloadDecoratorConsistency(classTypeResult.classType);
195
+ this._validateDisjointBaseClass(classTypeResult.classType, node.d.name);
195
196
  this._validateMultipleInheritanceBaseClasses(classTypeResult.classType, node.d.name);
196
197
  this._validateMultipleInheritanceCompatibility(classTypeResult.classType, node.d.name);
197
198
  this._validateConstructorConsistency(classTypeResult.classType, node.d.name);
@@ -3247,30 +3248,49 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3247
3248
  }
3248
3249
  });
3249
3250
  }
3250
- // Verifies the rules specified in PEP 589 about TypedDict classes.
3251
- // They cannot have statements other than type annotations, doc
3252
- // strings, and "pass" statements or ellipses.
3251
+ // Verifies the rules specified for TypedDict class bodies.
3252
+ // They cannot have statements other than type annotations, doc strings,
3253
+ // "pass" statements, ellipses, and statically evaluable if statements.
3253
3254
  _validateTypedDictClassSuite(suiteNode) {
3254
3255
  const emitBadStatementError = (node) => {
3255
3256
  this._evaluator.addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.typedDictBadVar(), node);
3256
3257
  };
3257
- suiteNode.d.statements.forEach((statement) => {
3258
- if (!AnalyzerNodeInfo.isCodeUnreachable(statement)) {
3259
- if (statement.nodeType === 47 /* ParseNodeType.StatementList */) {
3260
- for (const substatement of statement.d.statements) {
3261
- if (substatement.nodeType !== 54 /* ParseNodeType.TypeAnnotation */ &&
3262
- substatement.nodeType !== 21 /* ParseNodeType.Ellipsis */ &&
3263
- substatement.nodeType !== 48 /* ParseNodeType.StringList */ &&
3264
- substatement.nodeType !== 42 /* ParseNodeType.Pass */) {
3265
- emitBadStatementError(substatement);
3266
- }
3258
+ function validateStatement(statement) {
3259
+ if (AnalyzerNodeInfo.isCodeUnreachable(statement)) {
3260
+ return;
3261
+ }
3262
+ if (statement.nodeType === 47 /* ParseNodeType.StatementList */) {
3263
+ for (const substatement of statement.d.statements) {
3264
+ if (substatement.nodeType !== 54 /* ParseNodeType.TypeAnnotation */ &&
3265
+ substatement.nodeType !== 21 /* ParseNodeType.Ellipsis */ &&
3266
+ substatement.nodeType !== 48 /* ParseNodeType.StringList */ &&
3267
+ substatement.nodeType !== 42 /* ParseNodeType.Pass */) {
3268
+ emitBadStatementError(substatement);
3267
3269
  }
3268
3270
  }
3269
- else {
3271
+ return;
3272
+ }
3273
+ if (statement.nodeType === 22 /* ParseNodeType.If */) {
3274
+ const conditionValue = AnalyzerNodeInfo.getStaticConditionValue(statement);
3275
+ if (conditionValue === undefined) {
3270
3276
  emitBadStatementError(statement);
3277
+ return;
3278
+ }
3279
+ const reachableSuite = conditionValue ? statement.d.ifSuite : statement.d.elseSuite;
3280
+ if (reachableSuite?.nodeType === 22 /* ParseNodeType.If */) {
3281
+ validateStatement(reachableSuite);
3282
+ }
3283
+ else if (reachableSuite) {
3284
+ validateSuite(reachableSuite);
3271
3285
  }
3286
+ return;
3272
3287
  }
3273
- });
3288
+ emitBadStatementError(statement);
3289
+ }
3290
+ function validateSuite(suite) {
3291
+ suite.d.statements.forEach((statement) => validateStatement(statement));
3292
+ }
3293
+ validateSuite(suiteNode);
3274
3294
  }
3275
3295
  _validateTypeGuardFunction(node, functionType, isMethod) {
3276
3296
  const returnType = functionType.shared.declaredReturnType;
@@ -3978,6 +3998,42 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3978
3998
  }
3979
3999
  }
3980
4000
  }
4001
+ // Verifies that a class has a unique most-derived disjoint base.
4002
+ _validateDisjointBaseClass(classType, errorNode) {
4003
+ if (classType.shared.baseClasses.length < 2) {
4004
+ return;
4005
+ }
4006
+ const candidates = [];
4007
+ for (const baseClass of classType.shared.baseClasses) {
4008
+ if (!(0, types_1.isInstantiableClass)(baseClass)) {
4009
+ // An unknown base may introduce an unknown disjoint base, but it
4010
+ // cannot make two already-incompatible known bases compatible,
4011
+ // so keep collecting the known candidates.
4012
+ continue;
4013
+ }
4014
+ const candidate = types_1.ClassType.getDisjointBase(baseClass);
4015
+ if (!candidate) {
4016
+ // The base class is invalid or its disjoint base is unknown; an
4017
+ // unknown disjoint base cannot relate two otherwise-incompatible
4018
+ // known candidates, so keep collecting the known candidates.
4019
+ continue;
4020
+ }
4021
+ if (!candidates.some((existingCandidate) => types_1.ClassType.isSameGenericClass(existingCandidate, candidate))) {
4022
+ candidates.push(candidate);
4023
+ }
4024
+ }
4025
+ if (candidates.length > 1 && !types_1.ClassType.getMostDerivedDisjointBase(candidates)) {
4026
+ this._evaluator.addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.disjointBaseIncompatible().format({
4027
+ // `object` is a disjoint base but is compatible with every
4028
+ // other disjoint base, so including it in the reported names
4029
+ // would be misleading. Filter it out.
4030
+ bases: candidates
4031
+ .filter((candidate) => !types_1.ClassType.isBuiltIn(candidate, 'object'))
4032
+ .map((candidate) => `"${candidate.shared.name}"`)
4033
+ .join(', '),
4034
+ }), errorNode);
4035
+ }
4036
+ }
3981
4037
  // Verifies that classes that have more than one base class do not have
3982
4038
  // have conflicting type arguments.
3983
4039
  _validateMultipleInheritanceBaseClasses(classType, errorNode) {