@zzzen/pyright-internal 1.2.0-dev.20221211 → 1.2.0-dev.20221218

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 (45) hide show
  1. package/dist/analyzer/checker.js +47 -31
  2. package/dist/analyzer/checker.js.map +1 -1
  3. package/dist/analyzer/constraintSolver.js +5 -0
  4. package/dist/analyzer/constraintSolver.js.map +1 -1
  5. package/dist/analyzer/declarationUtils.d.ts +2 -1
  6. package/dist/analyzer/declarationUtils.js +7 -4
  7. package/dist/analyzer/declarationUtils.js.map +1 -1
  8. package/dist/analyzer/program.js +1 -1
  9. package/dist/analyzer/program.js.map +1 -1
  10. package/dist/analyzer/sourceFile.js +5 -2
  11. package/dist/analyzer/sourceFile.js.map +1 -1
  12. package/dist/analyzer/typeEvaluator.js +82 -5
  13. package/dist/analyzer/typeEvaluator.js.map +1 -1
  14. package/dist/analyzer/typeEvaluatorTypes.d.ts +1 -0
  15. package/dist/analyzer/types.d.ts +2 -0
  16. package/dist/analyzer/types.js +10 -0
  17. package/dist/analyzer/types.js.map +1 -1
  18. package/dist/common/pathUtils.js +1 -1
  19. package/dist/common/pathUtils.js.map +1 -1
  20. package/dist/languageService/completionProvider.js +9 -1
  21. package/dist/languageService/completionProvider.js.map +1 -1
  22. package/dist/localization/localize.d.ts +7 -1
  23. package/dist/localization/localize.js +4 -1
  24. package/dist/localization/localize.js.map +1 -1
  25. package/dist/localization/package.nls.en-us.json +4 -1
  26. package/dist/parser/parser.js +14 -6
  27. package/dist/parser/parser.js.map +1 -1
  28. package/dist/parser/tokenizer.js +20 -9
  29. package/dist/parser/tokenizer.js.map +1 -1
  30. package/dist/pyright.js +52 -12
  31. package/dist/pyright.js.map +1 -1
  32. package/dist/tests/checker.test.js +1 -1
  33. package/dist/tests/indentationUtils.ptvs.test.js +7 -3
  34. package/dist/tests/indentationUtils.ptvs.test.js.map +1 -1
  35. package/dist/tests/indentationUtils.test.js +4 -4
  36. package/dist/tests/parser.test.js +3 -3
  37. package/dist/tests/pathUtils.test.js +20 -5
  38. package/dist/tests/pathUtils.test.js.map +1 -1
  39. package/dist/tests/tokenizer.test.js +2 -2
  40. package/dist/tests/typeEvaluator3.test.js +14 -2
  41. package/dist/tests/typeEvaluator3.test.js.map +1 -1
  42. package/dist/tests/typeEvaluator4.test.js +4 -0
  43. package/dist/tests/typeEvaluator4.test.js.map +1 -1
  44. package/dist/tests/typeEvaluator5.test.js +1 -1
  45. package/package.json +2 -2
@@ -3398,7 +3398,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3398
3398
  return;
3399
3399
  }
3400
3400
  // Build maps of symbols for each of the base classes.
3401
- const symbolMaps = baseClasses.map((baseClass) => {
3401
+ const baseClassSymbolMaps = baseClasses.map((baseClass) => {
3402
3402
  const specializedBaseClass = classType.details.mro.find((c) => (0, types_1.isClass)(c) && types_1.ClassType.isSameGenericClass(c, baseClass));
3403
3403
  if (!specializedBaseClass || !(0, types_1.isClass)(specializedBaseClass)) {
3404
3404
  return new Map();
@@ -3406,30 +3406,37 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3406
3406
  // Retrieve all of the specialized symbols from the base class and its ancestors.
3407
3407
  return (0, typeUtils_1.getClassFieldsRecursive)(specializedBaseClass);
3408
3408
  });
3409
- for (let symbolMapBaseIndex = 1; symbolMapBaseIndex < symbolMaps.length; symbolMapBaseIndex++) {
3410
- const baseSymbolMap = symbolMaps[symbolMapBaseIndex];
3411
- for (const [name, baseClassAndSymbol] of baseSymbolMap) {
3409
+ const childClassSymbolMap = (0, typeUtils_1.getClassFieldsRecursive)(classType);
3410
+ for (let symbolMapBaseIndex = 1; symbolMapBaseIndex < baseClassSymbolMaps.length; symbolMapBaseIndex++) {
3411
+ const baseSymbolMap = baseClassSymbolMaps[symbolMapBaseIndex];
3412
+ for (const [name, overriddenClassAndSymbol] of baseSymbolMap) {
3412
3413
  // Special-case dundered methods, which can differ in signature. Also
3413
3414
  // exempt private symbols.
3414
3415
  if (SymbolNameUtils.isDunderName(name) || SymbolNameUtils.isPrivateName(name)) {
3415
3416
  continue;
3416
3417
  }
3417
- const baseClassType = baseClassAndSymbol.classType;
3418
- if (!(0, types_1.isClass)(baseClassType)) {
3418
+ const overriddenClassType = overriddenClassAndSymbol.classType;
3419
+ if (!(0, types_1.isClass)(overriddenClassType)) {
3419
3420
  continue;
3420
3421
  }
3421
- for (let overrideIndex = 0; overrideIndex < symbolMapBaseIndex; overrideIndex++) {
3422
- const overrideSymbolMap = symbolMaps[overrideIndex];
3423
- const overrideClassAndSymbol = overrideSymbolMap.get(name);
3424
- if (overrideClassAndSymbol) {
3425
- this._validateMultipleInheritanceOverride(baseClassAndSymbol, overrideClassAndSymbol, classType, name, baseClasses[symbolMapBaseIndex], baseClasses[overrideIndex], errorNode);
3422
+ const overrideClassAndSymbol = childClassSymbolMap.get(name);
3423
+ if (overrideClassAndSymbol) {
3424
+ const overrideClassType = overrideClassAndSymbol.classType;
3425
+ // If the override is the same as the overridden, then there's nothing
3426
+ // to check. If the override is the child class, then we can also skip
3427
+ // the check because the normal override checks will report the error.
3428
+ if (!(0, types_1.isClass)(overrideClassType) ||
3429
+ types_1.ClassType.isSameGenericClass(overrideClassType, overriddenClassType) ||
3430
+ types_1.ClassType.isSameGenericClass(overrideClassType, classType)) {
3431
+ continue;
3426
3432
  }
3433
+ this._validateMultipleInheritanceOverride(overriddenClassAndSymbol, overrideClassAndSymbol, classType, name, errorNode);
3427
3434
  }
3428
3435
  }
3429
3436
  }
3430
3437
  }
3431
- _validateMultipleInheritanceOverride(baseClassAndSymbol, overrideClassAndSymbol, childClassType, memberName, baseClass1, baseClass2, errorNode) {
3432
- if (!(0, types_1.isClass)(baseClassAndSymbol.classType) || !(0, types_1.isClass)(overrideClassAndSymbol.classType)) {
3438
+ _validateMultipleInheritanceOverride(overriddenClassAndSymbol, overrideClassAndSymbol, childClassType, memberName, errorNode) {
3439
+ if (!(0, types_1.isClass)(overriddenClassAndSymbol.classType) || !(0, types_1.isClass)(overrideClassAndSymbol.classType)) {
3433
3440
  return;
3434
3441
  }
3435
3442
  // Special case the '_' symbol, which is used in single dispatch
@@ -3437,15 +3444,19 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3437
3444
  if (memberName === '_') {
3438
3445
  return;
3439
3446
  }
3440
- let baseType = this._evaluator.getEffectiveTypeOfSymbol(baseClassAndSymbol.symbol);
3441
- baseType = (0, typeUtils_1.partiallySpecializeType)(baseType, baseClassAndSymbol.classType);
3447
+ let overriddenType = this._evaluator.getEffectiveTypeOfSymbol(overriddenClassAndSymbol.symbol);
3448
+ overriddenType = (0, typeUtils_1.partiallySpecializeType)(overriddenType, overriddenClassAndSymbol.classType);
3442
3449
  const overrideSymbol = overrideClassAndSymbol.symbol;
3443
3450
  let overrideType = this._evaluator.getEffectiveTypeOfSymbol(overrideSymbol);
3444
3451
  overrideType = (0, typeUtils_1.partiallySpecializeType)(overrideType, overrideClassAndSymbol.classType);
3452
+ const childOverrideSymbol = childClassType.details.fields.get(memberName);
3453
+ const childOverrideType = childOverrideSymbol
3454
+ ? this._evaluator.getEffectiveTypeOfSymbol(childOverrideSymbol)
3455
+ : undefined;
3445
3456
  let diag;
3446
3457
  const overrideDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(overrideClassAndSymbol.symbol);
3447
- const baseDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(baseClassAndSymbol.symbol);
3448
- if ((0, types_1.isFunction)(baseType) || (0, types_1.isOverloadedFunction)(baseType)) {
3458
+ const overriddenDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(overriddenClassAndSymbol.symbol);
3459
+ if ((0, types_1.isFunction)(overriddenType) || (0, types_1.isOverloadedFunction)(overriddenType)) {
3449
3460
  const diagAddendum = new diagnostic_1.DiagnosticAddendum();
3450
3461
  let overrideFunction;
3451
3462
  if ((0, types_1.isFunction)(overrideType)) {
@@ -3460,7 +3471,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3460
3471
  }
3461
3472
  }
3462
3473
  if (overrideFunction) {
3463
- if (!this._evaluator.validateOverrideMethod(baseType, overrideFunction, diagAddendum,
3474
+ if (!this._evaluator.validateOverrideMethod(overriddenType, overrideFunction, diagAddendum,
3464
3475
  /* enforceParamNameMatch */ true)) {
3465
3476
  const decl = overrideFunction.details.declaration;
3466
3477
  if (decl && decl.type === 5 /* Function */) {
@@ -3472,7 +3483,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3472
3483
  }
3473
3484
  }
3474
3485
  }
3475
- else if ((0, typeUtils_1.isProperty)(baseType)) {
3486
+ else if ((0, typeUtils_1.isProperty)(overriddenType)) {
3476
3487
  // Handle properties specially.
3477
3488
  if (!(0, typeUtils_1.isProperty)(overrideType) && !(0, types_1.isAnyOrUnknown)(overrideType)) {
3478
3489
  const decls = overrideSymbol.getDeclarations();
@@ -3491,23 +3502,28 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3491
3502
  // This check can be expensive, so don't perform it if the corresponding
3492
3503
  // rule is disabled.
3493
3504
  if (this._fileInfo.diagnosticRuleSet.reportIncompatibleVariableOverride !== 'none') {
3494
- if (!(0, types_1.isAnyOrUnknown)(baseType) && !(0, types_1.isAnyOrUnknown)(overrideType) && !(0, types_1.isTypeSame)(baseType, overrideType)) {
3495
- diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleVariableOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleVariableOverride, localize_1.Localizer.Diagnostic.baseClassVariableTypeIncompatible().format({
3496
- classType: childClassType.details.name,
3497
- name: memberName,
3498
- }), errorNode);
3505
+ if (!(0, types_1.isAnyOrUnknown)(overriddenType) && !(0, types_1.isAnyOrUnknown)(overrideType)) {
3506
+ // If the child class overrides this symbol with its own type, make sure
3507
+ // the override is compatible with the overridden symbol. Otherwise use the
3508
+ // override type.
3509
+ if (!this._evaluator.assignType(overriddenType, childOverrideType !== null && childOverrideType !== void 0 ? childOverrideType : overrideType)) {
3510
+ diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleVariableOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleVariableOverride, localize_1.Localizer.Diagnostic.baseClassVariableTypeIncompatible().format({
3511
+ classType: childClassType.details.name,
3512
+ name: memberName,
3513
+ }), errorNode);
3514
+ }
3499
3515
  }
3500
3516
  }
3501
3517
  }
3502
- if (diag && overrideDecl && baseDecl) {
3503
- diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.baseClassProvidesType().format({
3504
- baseClass: this._evaluator.printType((0, typeUtils_1.convertToInstance)(baseClass1)),
3518
+ if (diag && overrideDecl && overriddenDecl) {
3519
+ diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.baseClassOverriddenType().format({
3520
+ baseClass: this._evaluator.printType((0, typeUtils_1.convertToInstance)(overriddenClassAndSymbol.classType)),
3521
+ type: this._evaluator.printType(overriddenType),
3522
+ }), overriddenDecl.path, overriddenDecl.range);
3523
+ diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.baseClassOverridesType().format({
3524
+ baseClass: this._evaluator.printType((0, typeUtils_1.convertToInstance)(overrideClassAndSymbol.classType)),
3505
3525
  type: this._evaluator.printType(overrideType),
3506
3526
  }), overrideDecl.path, overrideDecl.range);
3507
- diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.baseClassProvidesType().format({
3508
- baseClass: this._evaluator.printType((0, typeUtils_1.convertToInstance)(baseClass2)),
3509
- type: this._evaluator.printType(baseType),
3510
- }), baseDecl.path, baseDecl.range);
3511
3527
  }
3512
3528
  }
3513
3529
  // Validates that any overridden methods or variables contain the same