@zzzen/pyright-internal 1.2.0-dev.20231105 → 1.2.0-dev.20231112

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 (110) hide show
  1. package/dist/analyzer/checker.js +45 -58
  2. package/dist/analyzer/checker.js.map +1 -1
  3. package/dist/analyzer/codeFlowEngine.js +12 -33
  4. package/dist/analyzer/codeFlowEngine.js.map +1 -1
  5. package/dist/analyzer/constraintSolver.js +20 -21
  6. package/dist/analyzer/constraintSolver.js.map +1 -1
  7. package/dist/analyzer/constructorTransform.js +3 -5
  8. package/dist/analyzer/constructorTransform.js.map +1 -1
  9. package/dist/analyzer/constructors.d.ts +6 -3
  10. package/dist/analyzer/constructors.js +43 -23
  11. package/dist/analyzer/constructors.js.map +1 -1
  12. package/dist/analyzer/dataClasses.js +10 -15
  13. package/dist/analyzer/dataClasses.js.map +1 -1
  14. package/dist/analyzer/declarationUtils.js +1 -1
  15. package/dist/analyzer/declarationUtils.js.map +1 -1
  16. package/dist/analyzer/decorators.js +1 -1
  17. package/dist/analyzer/decorators.js.map +1 -1
  18. package/dist/analyzer/enums.js +1 -1
  19. package/dist/analyzer/enums.js.map +1 -1
  20. package/dist/analyzer/importResolver.d.ts +2 -1
  21. package/dist/analyzer/importResolver.js +17 -5
  22. package/dist/analyzer/importResolver.js.map +1 -1
  23. package/dist/analyzer/importStatementUtils.d.ts +1 -1
  24. package/dist/analyzer/importStatementUtils.js +33 -5
  25. package/dist/analyzer/importStatementUtils.js.map +1 -1
  26. package/dist/analyzer/operations.js +12 -6
  27. package/dist/analyzer/operations.js.map +1 -1
  28. package/dist/analyzer/packageTypeVerifier.js +9 -5
  29. package/dist/analyzer/packageTypeVerifier.js.map +1 -1
  30. package/dist/analyzer/parseTreeUtils.d.ts +1 -0
  31. package/dist/analyzer/parseTreeUtils.js +17 -2
  32. package/dist/analyzer/parseTreeUtils.js.map +1 -1
  33. package/dist/analyzer/patternMatching.js +1 -1
  34. package/dist/analyzer/patternMatching.js.map +1 -1
  35. package/dist/analyzer/program.js +17 -9
  36. package/dist/analyzer/program.js.map +1 -1
  37. package/dist/analyzer/properties.js +20 -23
  38. package/dist/analyzer/properties.js.map +1 -1
  39. package/dist/analyzer/protocols.d.ts +1 -1
  40. package/dist/analyzer/protocols.js +14 -18
  41. package/dist/analyzer/protocols.js.map +1 -1
  42. package/dist/analyzer/service.js +1 -2
  43. package/dist/analyzer/service.js.map +1 -1
  44. package/dist/analyzer/sourceFile.js +33 -2
  45. package/dist/analyzer/sourceFile.js.map +1 -1
  46. package/dist/analyzer/sourceFileInfoUtils.d.ts +1 -1
  47. package/dist/analyzer/sourceFileInfoUtils.js +9 -3
  48. package/dist/analyzer/sourceFileInfoUtils.js.map +1 -1
  49. package/dist/analyzer/typeEvaluator.d.ts +3 -1
  50. package/dist/analyzer/typeEvaluator.js +551 -580
  51. package/dist/analyzer/typeEvaluator.js.map +1 -1
  52. package/dist/analyzer/typeEvaluatorTypes.d.ts +2 -2
  53. package/dist/analyzer/typeGuards.js +10 -9
  54. package/dist/analyzer/typeGuards.js.map +1 -1
  55. package/dist/analyzer/typeUtils.js +3 -1
  56. package/dist/analyzer/typeUtils.js.map +1 -1
  57. package/dist/analyzer/types.d.ts +3 -1
  58. package/dist/analyzer/types.js +1 -1
  59. package/dist/analyzer/types.js.map +1 -1
  60. package/dist/common/configOptions.d.ts +2 -1
  61. package/dist/common/configOptions.js +18 -1
  62. package/dist/common/configOptions.js.map +1 -1
  63. package/dist/common/extensibility.d.ts +3 -0
  64. package/dist/common/serviceProviderExtensions.d.ts +2 -1
  65. package/dist/common/serviceProviderExtensions.js +1 -0
  66. package/dist/common/serviceProviderExtensions.js.map +1 -1
  67. package/dist/common/textEditTracker.js +2 -2
  68. package/dist/common/textEditTracker.js.map +1 -1
  69. package/dist/languageServerBase.d.ts +1 -1
  70. package/dist/languageServerBase.js +4 -1
  71. package/dist/languageServerBase.js.map +1 -1
  72. package/dist/languageService/completionProvider.d.ts +2 -1
  73. package/dist/languageService/completionProvider.js +4 -2
  74. package/dist/languageService/completionProvider.js.map +1 -1
  75. package/dist/localization/localize.d.ts +4 -0
  76. package/dist/localization/localize.js +2 -0
  77. package/dist/localization/localize.js.map +1 -1
  78. package/dist/localization/package.nls.cs.json +3 -0
  79. package/dist/localization/package.nls.de.json +3 -0
  80. package/dist/localization/package.nls.en-us.json +3 -1
  81. package/dist/localization/package.nls.es.json +3 -0
  82. package/dist/localization/package.nls.fr.json +3 -0
  83. package/dist/localization/package.nls.it.json +3 -0
  84. package/dist/localization/package.nls.ja.json +3 -0
  85. package/dist/localization/package.nls.ko.json +3 -0
  86. package/dist/localization/package.nls.pl.json +3 -0
  87. package/dist/localization/package.nls.pt-br.json +3 -0
  88. package/dist/localization/package.nls.qps-ploc.json +3 -0
  89. package/dist/localization/package.nls.ru.json +3 -0
  90. package/dist/localization/package.nls.tr.json +3 -0
  91. package/dist/localization/package.nls.zh-cn.json +3 -0
  92. package/dist/localization/package.nls.zh-tw.json +3 -0
  93. package/dist/server.js.map +1 -1
  94. package/dist/tests/diagnosticOverrides.test.js +4 -2
  95. package/dist/tests/diagnosticOverrides.test.js.map +1 -1
  96. package/dist/tests/fourslash/signature.dunderNew.fourslash.js +1 -1
  97. package/dist/tests/fourslash/signature.dunderNew.fourslash.js.map +1 -1
  98. package/dist/tests/harness/fourslash/testState.js +3 -3
  99. package/dist/tests/harness/fourslash/testState.js.map +1 -1
  100. package/dist/tests/parseTreeUtils.test.js +15 -0
  101. package/dist/tests/parseTreeUtils.test.js.map +1 -1
  102. package/dist/tests/textEditUtil.test.js +25 -0
  103. package/dist/tests/textEditUtil.test.js.map +1 -1
  104. package/dist/tests/typeEvaluator1.test.js +4 -0
  105. package/dist/tests/typeEvaluator1.test.js.map +1 -1
  106. package/dist/tests/typeEvaluator2.test.js +4 -0
  107. package/dist/tests/typeEvaluator2.test.js.map +1 -1
  108. package/dist/tests/typeEvaluator3.test.js +3 -3
  109. package/dist/tests/typeEvaluator4.test.js +5 -5
  110. package/package.json +1 -1
@@ -46,6 +46,7 @@ const localize_1 = require("../localization/localize");
46
46
  const parseNodes_1 = require("../parser/parseNodes");
47
47
  const stringTokenUtils_1 = require("../parser/stringTokenUtils");
48
48
  const AnalyzerNodeInfo = __importStar(require("./analyzerNodeInfo"));
49
+ const constructors_1 = require("./constructors");
49
50
  const declaration_1 = require("./declaration");
50
51
  const declarationUtils_1 = require("./declarationUtils");
51
52
  const deprecatedSymbols_1 = require("./deprecatedSymbols");
@@ -176,7 +177,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
176
177
  this._validateBaseClassOverrides(classTypeResult.classType);
177
178
  this._validateMultipleInheritanceBaseClasses(classTypeResult.classType, node.name);
178
179
  this._validateMultipleInheritanceCompatibility(classTypeResult.classType, node.name);
179
- this._validateConstructorConsistency(classTypeResult.classType);
180
+ this._validateConstructorConsistency(classTypeResult.classType, node.name);
180
181
  this._validateFinalMemberOverrides(classTypeResult.classType);
181
182
  this._validateInstanceVariableInitialization(node, classTypeResult.classType);
182
183
  this._validateFinalClassNotAbstract(classTypeResult.classType, node);
@@ -3626,35 +3627,34 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3626
3627
  });
3627
3628
  }
3628
3629
  // Validates that the __init__ and __new__ method signatures are consistent.
3629
- _validateConstructorConsistency(classType) {
3630
- const initMember = (0, typeUtils_1.lookUpClassMember)(classType, '__init__', 4 /* SkipObjectBaseClass */ | 16 /* SkipInstanceMembers */);
3631
- const newMember = (0, typeUtils_1.lookUpClassMember)(classType, '__new__', 4 /* SkipObjectBaseClass */ | 16 /* SkipInstanceMembers */);
3632
- if (!initMember || !newMember || !(0, types_1.isClass)(initMember.classType) || !(0, types_1.isClass)(newMember.classType)) {
3630
+ _validateConstructorConsistency(classType, errorNode) {
3631
+ // If the class has a custom metaclass with a __call__ method, skip this check.
3632
+ const callMethodResult = (0, constructors_1.getBoundCallMethod)(this._evaluator, errorNode, classType);
3633
+ if (callMethodResult) {
3633
3634
  return;
3634
3635
  }
3635
- // If both the __new__ and __init__ come from subclasses, don't bother
3636
- // checking for this class.
3637
- if (!types_1.ClassType.isSameGenericClass(newMember.classType, classType) &&
3638
- !types_1.ClassType.isSameGenericClass(initMember.classType, classType)) {
3636
+ const newMethodResult = (0, constructors_1.getBoundNewMethod)(this._evaluator, errorNode, classType);
3637
+ if (!newMethodResult ||
3638
+ newMethodResult.typeErrors ||
3639
+ !newMethodResult.classType ||
3640
+ !(0, types_1.isClass)(newMethodResult.classType)) {
3639
3641
  return;
3640
3642
  }
3641
- // If the class that provides the __new__ method has a custom metaclass with a
3642
- // __call__ method, skip this check.
3643
- const metaclass = newMember.classType.details.effectiveMetaclass;
3644
- if (metaclass && (0, types_1.isClass)(metaclass) && !types_1.ClassType.isBuiltIn(metaclass, 'type')) {
3645
- const callMethod = (0, typeUtils_1.lookUpClassMember)(metaclass, '__call__', 8 /* SkipTypeBaseClass */ | 16 /* SkipInstanceMembers */);
3646
- if (callMethod) {
3647
- return;
3648
- }
3643
+ const initMethodResult = (0, constructors_1.getBoundInitMethod)(this._evaluator, errorNode, types_1.ClassType.cloneAsInstance(classType));
3644
+ if (!initMethodResult ||
3645
+ initMethodResult.typeErrors ||
3646
+ !initMethodResult.classType ||
3647
+ !(0, types_1.isClass)(initMethodResult.classType)) {
3648
+ return;
3649
3649
  }
3650
- let newMemberType = this._evaluator.getTypeOfMember(newMember);
3651
- if (!(0, types_1.isFunction)(newMemberType) && !(0, types_1.isOverloadedFunction)(newMemberType)) {
3650
+ // If both the __new__ and __init__ come from subclasses, don't bother
3651
+ // checking for this class.
3652
+ if (!types_1.ClassType.isSameGenericClass(initMethodResult.classType, classType) &&
3653
+ !types_1.ClassType.isSameGenericClass(newMethodResult.classType, classType)) {
3652
3654
  return;
3653
3655
  }
3654
- newMemberType = this._evaluator.bindFunctionToClassOrObject(classType, newMemberType,
3655
- /* memberClass */ undefined,
3656
- /* treatConstructorAsClassMember */ true);
3657
- if (!newMemberType) {
3656
+ let newMemberType = newMethodResult.type;
3657
+ if (!(0, types_1.isFunction)(newMemberType) && !(0, types_1.isOverloadedFunction)(newMemberType)) {
3658
3658
  return;
3659
3659
  }
3660
3660
  if ((0, types_1.isOverloadedFunction)(newMemberType)) {
@@ -3664,14 +3664,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3664
3664
  return;
3665
3665
  }
3666
3666
  }
3667
- let initMemberType = this._evaluator.getTypeOfMember(initMember);
3667
+ let initMemberType = initMethodResult.type;
3668
3668
  if (!(0, types_1.isFunction)(initMemberType) && !(0, types_1.isOverloadedFunction)(initMemberType)) {
3669
3669
  return;
3670
3670
  }
3671
- initMemberType = this._evaluator.bindFunctionToClassOrObject(types_1.ClassType.cloneAsInstance(classType), initMemberType);
3672
- if (!initMemberType) {
3673
- return;
3674
- }
3675
3671
  if ((0, types_1.isOverloadedFunction)(initMemberType)) {
3676
3672
  // Find the implementation, not the overloaded signatures.
3677
3673
  initMemberType = types_1.OverloadedFunctionType.getImplementation(initMemberType);
@@ -3679,9 +3675,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3679
3675
  return;
3680
3676
  }
3681
3677
  }
3682
- if (!(0, types_1.isFunction)(initMemberType) || !(0, types_1.isFunction)(newMemberType)) {
3683
- return;
3684
- }
3685
3678
  // If either of the functions has a default parameter signature
3686
3679
  // (* args: Any, ** kwargs: Any), don't proceed with the check.
3687
3680
  if (types_1.FunctionType.hasDefaultParameters(initMemberType) || types_1.FunctionType.hasDefaultParameters(newMemberType)) {
@@ -3704,9 +3697,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3704
3697
  /* diag */ undefined,
3705
3698
  /* destTypeVarContext */ undefined,
3706
3699
  /* srcTypeVarContext */ undefined, 32 /* SkipFunctionReturnTypeCheck */)) {
3707
- const displayOnInit = types_1.ClassType.isSameGenericClass(initMember.classType, classType);
3708
- const initDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(initMember.symbol);
3709
- const newDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(newMember.symbol);
3700
+ const displayOnInit = types_1.ClassType.isSameGenericClass(initMethodResult.classType, classType);
3701
+ const initDecl = initMemberType.details.declaration;
3702
+ const newDecl = newMemberType.details.declaration;
3710
3703
  if (initDecl && newDecl) {
3711
3704
  const mainDecl = displayOnInit ? initDecl : newDecl;
3712
3705
  const mainDeclNode = mainDecl.node.nodeType === 28 /* Function */ ? mainDecl.node.name : mainDecl.node;
@@ -3720,14 +3713,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3720
3713
  type: newSignature,
3721
3714
  }));
3722
3715
  const diagnostic = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportInconsistentConstructor, diagnosticRules_1.DiagnosticRule.reportInconsistentConstructor, localize_1.Localizer.Diagnostic.constructorParametersMismatch().format({
3723
- classType: this._evaluator.printType(types_1.ClassType.cloneAsInstance(displayOnInit ? initMember.classType : newMember.classType)),
3716
+ classType: this._evaluator.printType(types_1.ClassType.cloneAsInstance(displayOnInit ? initMethodResult.classType : newMethodResult.classType)),
3724
3717
  }) + diagAddendum.getString(), mainDeclNode);
3725
3718
  if (diagnostic) {
3726
3719
  const secondaryDecl = displayOnInit ? newDecl : initDecl;
3727
3720
  diagnostic.addRelatedInfo((displayOnInit
3728
3721
  ? localize_1.Localizer.DiagnosticAddendum.newMethodLocation()
3729
3722
  : localize_1.Localizer.DiagnosticAddendum.initMethodLocation()).format({
3730
- type: this._evaluator.printType(types_1.ClassType.cloneAsInstance(displayOnInit ? newMember.classType : initMember.classType)),
3723
+ type: this._evaluator.printType(types_1.ClassType.cloneAsInstance(displayOnInit ? newMethodResult.classType : initMethodResult.classType)),
3731
3724
  }), secondaryDecl.path, secondaryDecl.range);
3732
3725
  }
3733
3726
  }
@@ -3996,7 +3989,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3996
3989
  });
3997
3990
  }
3998
3991
  _validateOverrideDecoratorPresent(symbol, overrideType, baseMember) {
3999
- var _a;
4000
3992
  // Skip this check if disabled.
4001
3993
  if (this._fileInfo.diagnosticRuleSet.reportImplicitOverride === 'none') {
4002
3994
  return;
@@ -4009,12 +4001,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4009
4001
  overrideFunction = types_1.OverloadedFunctionType.getImplementation(overrideType);
4010
4002
  }
4011
4003
  else if ((0, types_1.isClassInstance)(overrideType) && types_1.ClassType.isPropertyClass(overrideType)) {
4012
- const fgetSymbol = overrideType.details.fields.get('fget');
4013
- if (fgetSymbol) {
4014
- const fgetType = (_a = this._evaluator.getDeclaredTypeOfSymbol(fgetSymbol)) === null || _a === void 0 ? void 0 : _a.type;
4015
- if (fgetType && (0, types_1.isFunction)(fgetType)) {
4016
- overrideFunction = fgetType;
4017
- }
4004
+ if (overrideType.fgetFunction) {
4005
+ overrideFunction = overrideType.fgetFunction;
4018
4006
  }
4019
4007
  }
4020
4008
  if (!(overrideFunction === null || overrideFunction === void 0 ? void 0 : overrideFunction.details.declaration) || types_1.FunctionType.isOverridden(overrideFunction)) {
@@ -4039,7 +4027,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4039
4027
  // decorator. In this case, an error is reported because no base class has declared
4040
4028
  // a method of the same name.
4041
4029
  _validateOverrideDecoratorNotPresent(symbol, overrideType) {
4042
- var _a;
4043
4030
  let overrideFunction;
4044
4031
  if ((0, types_1.isFunction)(overrideType)) {
4045
4032
  overrideFunction = overrideType;
@@ -4048,12 +4035,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4048
4035
  overrideFunction = types_1.OverloadedFunctionType.getImplementation(overrideType);
4049
4036
  }
4050
4037
  else if ((0, types_1.isClassInstance)(overrideType) && types_1.ClassType.isPropertyClass(overrideType)) {
4051
- const fgetSymbol = overrideType.details.fields.get('fget');
4052
- if (fgetSymbol) {
4053
- const fgetType = (_a = this._evaluator.getDeclaredTypeOfSymbol(fgetSymbol)) === null || _a === void 0 ? void 0 : _a.type;
4054
- if (fgetType && (0, types_1.isFunction)(fgetType)) {
4055
- overrideFunction = fgetType;
4056
- }
4038
+ if (overrideType.fgetFunction) {
4039
+ overrideFunction = overrideType.fgetFunction;
4057
4040
  }
4058
4041
  }
4059
4042
  if (!(overrideFunction === null || overrideFunction === void 0 ? void 0 : overrideFunction.details.declaration) || !types_1.FunctionType.isOverridden(overrideFunction)) {
@@ -4171,16 +4154,20 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4171
4154
  }
4172
4155
  }
4173
4156
  else {
4174
- const basePropFields = baseType.details.fields;
4175
- const subclassPropFields = overrideType.details.fields;
4176
4157
  const baseClassType = baseClass;
4177
- ['fget', 'fset', 'fdel'].forEach((methodName) => {
4158
+ const propMethodInfo = [
4159
+ ['fget', (c) => c.fgetFunction],
4160
+ ['fset', (c) => c.fsetFunction],
4161
+ ['fdel', (c) => c.fdelFunction],
4162
+ ];
4163
+ propMethodInfo.forEach((info) => {
4178
4164
  const diagAddendum = new diagnostic_1.DiagnosticAddendum();
4179
- const baseClassPropMethod = basePropFields.get(methodName);
4180
- const subclassPropMethod = subclassPropFields.get(methodName);
4165
+ const [methodName, methodAccessor] = info;
4166
+ const baseClassPropMethod = methodAccessor(baseType);
4167
+ const subclassPropMethod = methodAccessor(overrideType);
4181
4168
  // Is the method present on the base class but missing in the subclass?
4182
4169
  if (baseClassPropMethod) {
4183
- const baseClassMethodType = (0, typeUtils_1.partiallySpecializeType)(this._evaluator.getEffectiveTypeOfSymbol(baseClassPropMethod), baseClassType);
4170
+ const baseClassMethodType = (0, typeUtils_1.partiallySpecializeType)(baseClassPropMethod, baseClassType);
4184
4171
  if ((0, types_1.isFunction)(baseClassMethodType)) {
4185
4172
  if (!subclassPropMethod) {
4186
4173
  // The method is missing.
@@ -4200,7 +4187,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4200
4187
  }
4201
4188
  }
4202
4189
  else {
4203
- const subclassMethodType = (0, typeUtils_1.partiallySpecializeType)(this._evaluator.getEffectiveTypeOfSymbol(subclassPropMethod), childClassType);
4190
+ const subclassMethodType = (0, typeUtils_1.partiallySpecializeType)(subclassPropMethod, childClassType);
4204
4191
  if ((0, types_1.isFunction)(subclassMethodType)) {
4205
4192
  if (!this._evaluator.validateOverrideMethod(baseClassMethodType, subclassMethodType, childClassType, diagAddendum.createAddendum())) {
4206
4193
  diagAddendum.addMessage(localize_1.Localizer.DiagnosticAddendum.propertyMethodIncompatible().format({
@@ -4331,7 +4318,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4331
4318
  // __new__ overrides should have a "cls" parameter.
4332
4319
  if (node.parameters.length === 0 ||
4333
4320
  !node.parameters[0].name ||
4334
- !['cls', '_cls', '__cls', '__mcls', 'mcls', 'mcs'].some((name) => node.parameters[0].name.value === name)) {
4321
+ !['cls', '_cls', '__cls', '__mcls', 'mcls', 'mcs', 'metacls'].some((name) => node.parameters[0].name.value === name)) {
4335
4322
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportSelfClsParameterName, diagnosticRules_1.DiagnosticRule.reportSelfClsParameterName, localize_1.Localizer.Diagnostic.newClsParam(), node.parameters.length > 0 ? node.parameters[0] : node.name);
4336
4323
  }
4337
4324
  if (classType) {