@zzzen/pyright-internal 1.2.0-dev.20221204 → 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 (87) hide show
  1. package/dist/analyzer/aliasDeclarationUtils.js +23 -9
  2. package/dist/analyzer/aliasDeclarationUtils.js.map +1 -1
  3. package/dist/analyzer/analyzerFileInfo.d.ts +1 -0
  4. package/dist/analyzer/analyzerFileInfo.js.map +1 -1
  5. package/dist/analyzer/backgroundAnalysisProgram.d.ts +1 -0
  6. package/dist/analyzer/backgroundAnalysisProgram.js +3 -0
  7. package/dist/analyzer/backgroundAnalysisProgram.js.map +1 -1
  8. package/dist/analyzer/binder.js +2 -2
  9. package/dist/analyzer/binder.js.map +1 -1
  10. package/dist/analyzer/checker.js +63 -38
  11. package/dist/analyzer/checker.js.map +1 -1
  12. package/dist/analyzer/constraintSolver.js +5 -0
  13. package/dist/analyzer/constraintSolver.js.map +1 -1
  14. package/dist/analyzer/declarationUtils.d.ts +2 -1
  15. package/dist/analyzer/declarationUtils.js +7 -4
  16. package/dist/analyzer/declarationUtils.js.map +1 -1
  17. package/dist/analyzer/importResolver.js +2 -2
  18. package/dist/analyzer/importResolver.js.map +1 -1
  19. package/dist/analyzer/program.d.ts +1 -0
  20. package/dist/analyzer/program.js +15 -3
  21. package/dist/analyzer/program.js.map +1 -1
  22. package/dist/analyzer/service.js +8 -4
  23. package/dist/analyzer/service.js.map +1 -1
  24. package/dist/analyzer/sourceFile.js +5 -2
  25. package/dist/analyzer/sourceFile.js.map +1 -1
  26. package/dist/analyzer/typeDocStringUtils.d.ts +2 -0
  27. package/dist/analyzer/typeDocStringUtils.js +14 -13
  28. package/dist/analyzer/typeDocStringUtils.js.map +1 -1
  29. package/dist/analyzer/typeEvaluator.d.ts +0 -1
  30. package/dist/analyzer/typeEvaluator.js +182 -46
  31. package/dist/analyzer/typeEvaluator.js.map +1 -1
  32. package/dist/analyzer/typeEvaluatorTypes.d.ts +1 -0
  33. package/dist/analyzer/typeUtils.d.ts +1 -1
  34. package/dist/analyzer/typeUtils.js +2 -1
  35. package/dist/analyzer/typeUtils.js.map +1 -1
  36. package/dist/analyzer/types.d.ts +3 -1
  37. package/dist/analyzer/types.js +27 -4
  38. package/dist/analyzer/types.js.map +1 -1
  39. package/dist/backgroundAnalysisBase.d.ts +1 -1
  40. package/dist/common/commandLineOptions.d.ts +1 -1
  41. package/dist/common/commandLineOptions.js +0 -2
  42. package/dist/common/commandLineOptions.js.map +1 -1
  43. package/dist/common/configOptions.d.ts +1 -1
  44. package/dist/common/configOptions.js +4 -3
  45. package/dist/common/configOptions.js.map +1 -1
  46. package/dist/common/diagnosticRules.d.ts +1 -0
  47. package/dist/common/diagnosticRules.js +1 -0
  48. package/dist/common/diagnosticRules.js.map +1 -1
  49. package/dist/common/pathUtils.js +1 -1
  50. package/dist/common/pathUtils.js.map +1 -1
  51. package/dist/common/positionUtils.js +3 -9
  52. package/dist/common/positionUtils.js.map +1 -1
  53. package/dist/languageServerBase.js +2 -0
  54. package/dist/languageServerBase.js.map +1 -1
  55. package/dist/languageService/completionProvider.d.ts +1 -0
  56. package/dist/languageService/completionProvider.js +13 -1
  57. package/dist/languageService/completionProvider.js.map +1 -1
  58. package/dist/languageService/documentSymbolProvider.d.ts +1 -1
  59. package/dist/languageService/documentSymbolProvider.js +1 -1
  60. package/dist/languageService/documentSymbolProvider.js.map +1 -1
  61. package/dist/languageService/hoverProvider.d.ts +1 -0
  62. package/dist/languageService/hoverProvider.js +19 -3
  63. package/dist/languageService/hoverProvider.js.map +1 -1
  64. package/dist/localization/localize.d.ts +10 -2
  65. package/dist/localization/localize.js +5 -2
  66. package/dist/localization/localize.js.map +1 -1
  67. package/dist/localization/package.nls.en-us.json +5 -2
  68. package/dist/pyright.js +55 -13
  69. package/dist/pyright.js.map +1 -1
  70. package/dist/tests/fourslash/hover.docFromSrc.fourslash.js +9 -7
  71. package/dist/tests/fourslash/hover.docFromSrc.fourslash.js.map +1 -1
  72. package/dist/tests/fourslash/hover.docFromSrc.pkg-vs-module2.fourslash.js +4 -1
  73. package/dist/tests/fourslash/hover.docFromSrc.pkg-vs-module2.fourslash.js.map +1 -1
  74. package/dist/tests/fourslash/hover.docFromSrc.relativeImport2.fourslash.js +2 -1
  75. package/dist/tests/fourslash/hover.docFromSrc.relativeImport2.fourslash.js.map +1 -1
  76. package/dist/tests/fourslash/hover.docFromSrc.relativeImport3.fourslash.js +8 -1
  77. package/dist/tests/fourslash/hover.docFromSrc.relativeImport3.fourslash.js.map +1 -1
  78. package/dist/tests/fourslash/shadowedImports.fourslash.js +12 -0
  79. package/dist/tests/fourslash/shadowedImports.fourslash.js.map +1 -1
  80. package/dist/tests/pathUtils.test.js +20 -5
  81. package/dist/tests/pathUtils.test.js.map +1 -1
  82. package/dist/tests/typeEvaluator3.test.js +28 -2
  83. package/dist/tests/typeEvaluator3.test.js.map +1 -1
  84. package/dist/tests/typeEvaluator4.test.js +4 -0
  85. package/dist/tests/typeEvaluator4.test.js.map +1 -1
  86. package/dist/tests/typeEvaluator5.test.js +1 -1
  87. package/package.json +2 -2
@@ -232,6 +232,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
232
232
  if (node.typeParameters) {
233
233
  this.walk(node.typeParameters);
234
234
  }
235
+ if (!this._fileInfo.diagnosticRuleSet.analyzeUnannotatedFunctions && !this._fileInfo.isStubFile) {
236
+ if (ParseTreeUtils.isUnannotatedFunction(node)) {
237
+ this._evaluator.addInformation(localize_1.Localizer.Diagnostic.unannotatedFunctionSkipped().format({ name: node.name.value }), node.name);
238
+ }
239
+ }
235
240
  const functionTypeResult = this._evaluator.getTypeOfFunction(node);
236
241
  const containingClassNode = ParseTreeUtils.getEnclosingClass(node, /* stopAtFunction */ true);
237
242
  if (functionTypeResult) {
@@ -295,13 +300,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
295
300
  }
296
301
  }
297
302
  }
298
- // If it's a stub file, report an issue of the default value expression is not "...".
299
- if (param.defaultValue && this._fileInfo.isStubFile) {
300
- const defaultValueType = this._evaluator.getType(param.defaultValue);
301
- if (!defaultValueType || !(0, typeUtils_1.isEllipsisType)(defaultValueType)) {
302
- this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportInvalidStubStatement, diagnosticRules_1.DiagnosticRule.reportInvalidStubStatement, localize_1.Localizer.Diagnostic.defaultValueNotEllipsis(), param.defaultValue);
303
- }
304
- }
305
303
  });
306
304
  // Check for invalid use of ParamSpec P.args and P.kwargs.
307
305
  const paramSpecParams = functionTypeResult.functionType.details.parameters.filter((param) => {
@@ -2554,9 +2552,20 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
2554
2552
  }
2555
2553
  }
2556
2554
  _conditionallyReportShadowedImport(node) {
2555
+ var _a, _b;
2557
2556
  if (this._fileInfo.diagnosticRuleSet.reportShadowedImports === 'none') {
2558
2557
  return;
2559
2558
  }
2559
+ // Skip this check for relative imports.
2560
+ const nodeModule = node.nodeType === 23 /* ImportFromAs */
2561
+ ? ((_a = node.parent) === null || _a === void 0 ? void 0 : _a.nodeType) === 22 /* ImportFrom */
2562
+ ? (_b = node.parent) === null || _b === void 0 ? void 0 : _b.module
2563
+ : undefined
2564
+ : node.module;
2565
+ if (nodeModule === null || nodeModule === void 0 ? void 0 : nodeModule.leadingDots) {
2566
+ return;
2567
+ }
2568
+ // Otherwise use the name to determine if a match for a stdlib module.
2560
2569
  const namePartNodes = node.nodeType === 21 /* ImportAs */
2561
2570
  ? node.module.nameParts
2562
2571
  : node.nodeType === 23 /* ImportFromAs */
@@ -3389,7 +3398,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3389
3398
  return;
3390
3399
  }
3391
3400
  // Build maps of symbols for each of the base classes.
3392
- const symbolMaps = baseClasses.map((baseClass) => {
3401
+ const baseClassSymbolMaps = baseClasses.map((baseClass) => {
3393
3402
  const specializedBaseClass = classType.details.mro.find((c) => (0, types_1.isClass)(c) && types_1.ClassType.isSameGenericClass(c, baseClass));
3394
3403
  if (!specializedBaseClass || !(0, types_1.isClass)(specializedBaseClass)) {
3395
3404
  return new Map();
@@ -3397,30 +3406,37 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3397
3406
  // Retrieve all of the specialized symbols from the base class and its ancestors.
3398
3407
  return (0, typeUtils_1.getClassFieldsRecursive)(specializedBaseClass);
3399
3408
  });
3400
- for (let symbolMapBaseIndex = 1; symbolMapBaseIndex < symbolMaps.length; symbolMapBaseIndex++) {
3401
- const baseSymbolMap = symbolMaps[symbolMapBaseIndex];
3402
- 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) {
3403
3413
  // Special-case dundered methods, which can differ in signature. Also
3404
3414
  // exempt private symbols.
3405
3415
  if (SymbolNameUtils.isDunderName(name) || SymbolNameUtils.isPrivateName(name)) {
3406
3416
  continue;
3407
3417
  }
3408
- const baseClassType = baseClassAndSymbol.classType;
3409
- if (!(0, types_1.isClass)(baseClassType)) {
3418
+ const overriddenClassType = overriddenClassAndSymbol.classType;
3419
+ if (!(0, types_1.isClass)(overriddenClassType)) {
3410
3420
  continue;
3411
3421
  }
3412
- for (let overrideIndex = 0; overrideIndex < symbolMapBaseIndex; overrideIndex++) {
3413
- const overrideSymbolMap = symbolMaps[overrideIndex];
3414
- const overrideClassAndSymbol = overrideSymbolMap.get(name);
3415
- if (overrideClassAndSymbol) {
3416
- 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;
3417
3432
  }
3433
+ this._validateMultipleInheritanceOverride(overriddenClassAndSymbol, overrideClassAndSymbol, classType, name, errorNode);
3418
3434
  }
3419
3435
  }
3420
3436
  }
3421
3437
  }
3422
- _validateMultipleInheritanceOverride(baseClassAndSymbol, overrideClassAndSymbol, childClassType, memberName, baseClass1, baseClass2, errorNode) {
3423
- 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)) {
3424
3440
  return;
3425
3441
  }
3426
3442
  // Special case the '_' symbol, which is used in single dispatch
@@ -3428,15 +3444,19 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3428
3444
  if (memberName === '_') {
3429
3445
  return;
3430
3446
  }
3431
- let baseType = this._evaluator.getEffectiveTypeOfSymbol(baseClassAndSymbol.symbol);
3432
- 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);
3433
3449
  const overrideSymbol = overrideClassAndSymbol.symbol;
3434
3450
  let overrideType = this._evaluator.getEffectiveTypeOfSymbol(overrideSymbol);
3435
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;
3436
3456
  let diag;
3437
3457
  const overrideDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(overrideClassAndSymbol.symbol);
3438
- const baseDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(baseClassAndSymbol.symbol);
3439
- 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)) {
3440
3460
  const diagAddendum = new diagnostic_1.DiagnosticAddendum();
3441
3461
  let overrideFunction;
3442
3462
  if ((0, types_1.isFunction)(overrideType)) {
@@ -3451,7 +3471,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3451
3471
  }
3452
3472
  }
3453
3473
  if (overrideFunction) {
3454
- if (!this._evaluator.validateOverrideMethod(baseType, overrideFunction, diagAddendum,
3474
+ if (!this._evaluator.validateOverrideMethod(overriddenType, overrideFunction, diagAddendum,
3455
3475
  /* enforceParamNameMatch */ true)) {
3456
3476
  const decl = overrideFunction.details.declaration;
3457
3477
  if (decl && decl.type === 5 /* Function */) {
@@ -3463,7 +3483,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3463
3483
  }
3464
3484
  }
3465
3485
  }
3466
- else if ((0, typeUtils_1.isProperty)(baseType)) {
3486
+ else if ((0, typeUtils_1.isProperty)(overriddenType)) {
3467
3487
  // Handle properties specially.
3468
3488
  if (!(0, typeUtils_1.isProperty)(overrideType) && !(0, types_1.isAnyOrUnknown)(overrideType)) {
3469
3489
  const decls = overrideSymbol.getDeclarations();
@@ -3482,23 +3502,28 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3482
3502
  // This check can be expensive, so don't perform it if the corresponding
3483
3503
  // rule is disabled.
3484
3504
  if (this._fileInfo.diagnosticRuleSet.reportIncompatibleVariableOverride !== 'none') {
3485
- if (!(0, types_1.isAnyOrUnknown)(baseType) && !(0, types_1.isAnyOrUnknown)(overrideType) && !(0, types_1.isTypeSame)(baseType, overrideType)) {
3486
- diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleVariableOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleVariableOverride, localize_1.Localizer.Diagnostic.baseClassVariableTypeIncompatible().format({
3487
- classType: childClassType.details.name,
3488
- name: memberName,
3489
- }), 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
+ }
3490
3515
  }
3491
3516
  }
3492
3517
  }
3493
- if (diag && overrideDecl && baseDecl) {
3494
- diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.baseClassProvidesType().format({
3495
- 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)),
3496
3525
  type: this._evaluator.printType(overrideType),
3497
3526
  }), overrideDecl.path, overrideDecl.range);
3498
- diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.baseClassProvidesType().format({
3499
- baseClass: this._evaluator.printType((0, typeUtils_1.convertToInstance)(baseClass2)),
3500
- type: this._evaluator.printType(baseType),
3501
- }), baseDecl.path, baseDecl.range);
3502
3527
  }
3503
3528
  }
3504
3529
  // Validates that any overridden methods or variables contain the same