@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.
- package/dist/analyzer/checker.js +45 -58
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/codeFlowEngine.js +12 -33
- package/dist/analyzer/codeFlowEngine.js.map +1 -1
- package/dist/analyzer/constraintSolver.js +20 -21
- package/dist/analyzer/constraintSolver.js.map +1 -1
- package/dist/analyzer/constructorTransform.js +3 -5
- package/dist/analyzer/constructorTransform.js.map +1 -1
- package/dist/analyzer/constructors.d.ts +6 -3
- package/dist/analyzer/constructors.js +43 -23
- package/dist/analyzer/constructors.js.map +1 -1
- package/dist/analyzer/dataClasses.js +10 -15
- package/dist/analyzer/dataClasses.js.map +1 -1
- package/dist/analyzer/declarationUtils.js +1 -1
- package/dist/analyzer/declarationUtils.js.map +1 -1
- package/dist/analyzer/decorators.js +1 -1
- package/dist/analyzer/decorators.js.map +1 -1
- package/dist/analyzer/enums.js +1 -1
- package/dist/analyzer/enums.js.map +1 -1
- package/dist/analyzer/importResolver.d.ts +2 -1
- package/dist/analyzer/importResolver.js +17 -5
- package/dist/analyzer/importResolver.js.map +1 -1
- package/dist/analyzer/importStatementUtils.d.ts +1 -1
- package/dist/analyzer/importStatementUtils.js +33 -5
- package/dist/analyzer/importStatementUtils.js.map +1 -1
- package/dist/analyzer/operations.js +12 -6
- package/dist/analyzer/operations.js.map +1 -1
- package/dist/analyzer/packageTypeVerifier.js +9 -5
- package/dist/analyzer/packageTypeVerifier.js.map +1 -1
- package/dist/analyzer/parseTreeUtils.d.ts +1 -0
- package/dist/analyzer/parseTreeUtils.js +17 -2
- package/dist/analyzer/parseTreeUtils.js.map +1 -1
- package/dist/analyzer/patternMatching.js +1 -1
- package/dist/analyzer/patternMatching.js.map +1 -1
- package/dist/analyzer/program.js +17 -9
- package/dist/analyzer/program.js.map +1 -1
- package/dist/analyzer/properties.js +20 -23
- package/dist/analyzer/properties.js.map +1 -1
- package/dist/analyzer/protocols.d.ts +1 -1
- package/dist/analyzer/protocols.js +14 -18
- package/dist/analyzer/protocols.js.map +1 -1
- package/dist/analyzer/service.js +1 -2
- package/dist/analyzer/service.js.map +1 -1
- package/dist/analyzer/sourceFile.js +33 -2
- package/dist/analyzer/sourceFile.js.map +1 -1
- package/dist/analyzer/sourceFileInfoUtils.d.ts +1 -1
- package/dist/analyzer/sourceFileInfoUtils.js +9 -3
- package/dist/analyzer/sourceFileInfoUtils.js.map +1 -1
- package/dist/analyzer/typeEvaluator.d.ts +3 -1
- package/dist/analyzer/typeEvaluator.js +551 -580
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +2 -2
- package/dist/analyzer/typeGuards.js +10 -9
- package/dist/analyzer/typeGuards.js.map +1 -1
- package/dist/analyzer/typeUtils.js +3 -1
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/analyzer/types.d.ts +3 -1
- package/dist/analyzer/types.js +1 -1
- package/dist/analyzer/types.js.map +1 -1
- package/dist/common/configOptions.d.ts +2 -1
- package/dist/common/configOptions.js +18 -1
- package/dist/common/configOptions.js.map +1 -1
- package/dist/common/extensibility.d.ts +3 -0
- package/dist/common/serviceProviderExtensions.d.ts +2 -1
- package/dist/common/serviceProviderExtensions.js +1 -0
- package/dist/common/serviceProviderExtensions.js.map +1 -1
- package/dist/common/textEditTracker.js +2 -2
- package/dist/common/textEditTracker.js.map +1 -1
- package/dist/languageServerBase.d.ts +1 -1
- package/dist/languageServerBase.js +4 -1
- package/dist/languageServerBase.js.map +1 -1
- package/dist/languageService/completionProvider.d.ts +2 -1
- package/dist/languageService/completionProvider.js +4 -2
- package/dist/languageService/completionProvider.js.map +1 -1
- package/dist/localization/localize.d.ts +4 -0
- package/dist/localization/localize.js +2 -0
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.cs.json +3 -0
- package/dist/localization/package.nls.de.json +3 -0
- package/dist/localization/package.nls.en-us.json +3 -1
- package/dist/localization/package.nls.es.json +3 -0
- package/dist/localization/package.nls.fr.json +3 -0
- package/dist/localization/package.nls.it.json +3 -0
- package/dist/localization/package.nls.ja.json +3 -0
- package/dist/localization/package.nls.ko.json +3 -0
- package/dist/localization/package.nls.pl.json +3 -0
- package/dist/localization/package.nls.pt-br.json +3 -0
- package/dist/localization/package.nls.qps-ploc.json +3 -0
- package/dist/localization/package.nls.ru.json +3 -0
- package/dist/localization/package.nls.tr.json +3 -0
- package/dist/localization/package.nls.zh-cn.json +3 -0
- package/dist/localization/package.nls.zh-tw.json +3 -0
- package/dist/server.js.map +1 -1
- package/dist/tests/diagnosticOverrides.test.js +4 -2
- package/dist/tests/diagnosticOverrides.test.js.map +1 -1
- package/dist/tests/fourslash/signature.dunderNew.fourslash.js +1 -1
- package/dist/tests/fourslash/signature.dunderNew.fourslash.js.map +1 -1
- package/dist/tests/harness/fourslash/testState.js +3 -3
- package/dist/tests/harness/fourslash/testState.js.map +1 -1
- package/dist/tests/parseTreeUtils.test.js +15 -0
- package/dist/tests/parseTreeUtils.test.js.map +1 -1
- package/dist/tests/textEditUtil.test.js +25 -0
- package/dist/tests/textEditUtil.test.js.map +1 -1
- package/dist/tests/typeEvaluator1.test.js +4 -0
- package/dist/tests/typeEvaluator1.test.js.map +1 -1
- package/dist/tests/typeEvaluator2.test.js +4 -0
- package/dist/tests/typeEvaluator2.test.js.map +1 -1
- package/dist/tests/typeEvaluator3.test.js +3 -3
- package/dist/tests/typeEvaluator4.test.js +5 -5
- package/package.json +1 -1
package/dist/analyzer/checker.js
CHANGED
@@ -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
|
-
|
3631
|
-
const
|
3632
|
-
if (
|
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
|
-
|
3636
|
-
|
3637
|
-
|
3638
|
-
!
|
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
|
-
|
3642
|
-
|
3643
|
-
|
3644
|
-
|
3645
|
-
|
3646
|
-
|
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
|
-
|
3651
|
-
|
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 =
|
3655
|
-
|
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 =
|
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(
|
3708
|
-
const initDecl =
|
3709
|
-
const newDecl =
|
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 ?
|
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 ?
|
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
|
-
|
4013
|
-
|
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
|
-
|
4052
|
-
|
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
|
-
|
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
|
4180
|
-
const
|
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)(
|
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)(
|
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) {
|