@zzzen/pyright-internal 1.2.0-dev.20231217 → 1.2.0-dev.20231231
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/binder.js +11 -10
- package/dist/analyzer/binder.js.map +1 -1
- package/dist/analyzer/checker.d.ts +1 -0
- package/dist/analyzer/checker.js +34 -14
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/codeFlowEngine.js +10 -2
- package/dist/analyzer/codeFlowEngine.js.map +1 -1
- package/dist/analyzer/constraintSolver.js +16 -16
- package/dist/analyzer/constraintSolver.js.map +1 -1
- package/dist/analyzer/dataClasses.js +2 -9
- package/dist/analyzer/dataClasses.js.map +1 -1
- package/dist/analyzer/enums.js +1 -1
- package/dist/analyzer/enums.js.map +1 -1
- package/dist/analyzer/namedTuples.js +1 -1
- package/dist/analyzer/namedTuples.js.map +1 -1
- package/dist/analyzer/operations.d.ts +1 -1
- package/dist/analyzer/operations.js +16 -1
- package/dist/analyzer/operations.js.map +1 -1
- package/dist/analyzer/packageTypeVerifier.d.ts +5 -1
- package/dist/analyzer/packageTypeVerifier.js +58 -40
- package/dist/analyzer/packageTypeVerifier.js.map +1 -1
- package/dist/analyzer/parameterUtils.js +1 -1
- package/dist/analyzer/parameterUtils.js.map +1 -1
- package/dist/analyzer/protocols.js +21 -9
- package/dist/analyzer/protocols.js.map +1 -1
- package/dist/analyzer/typeEvaluator.js +222 -196
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +5 -5
- package/dist/analyzer/typeGuards.js +9 -8
- package/dist/analyzer/typeGuards.js.map +1 -1
- package/dist/analyzer/typeUtils.d.ts +11 -10
- package/dist/analyzer/typeUtils.js +25 -17
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/analyzer/typeVarContext.d.ts +0 -1
- package/dist/analyzer/typeVarContext.js +4 -5
- package/dist/analyzer/typeVarContext.js.map +1 -1
- package/dist/analyzer/typedDicts.js +24 -36
- package/dist/analyzer/typedDicts.js.map +1 -1
- package/dist/analyzer/types.d.ts +9 -3
- package/dist/analyzer/types.js +62 -11
- package/dist/analyzer/types.js.map +1 -1
- package/dist/common/diagnostic.d.ts +1 -0
- package/dist/common/diagnostic.js +18 -1
- package/dist/common/diagnostic.js.map +1 -1
- package/dist/common/uri/webUri.js +1 -25
- package/dist/common/uri/webUri.js.map +1 -1
- package/dist/languageService/documentSymbolCollector.js +1 -1
- package/dist/languageService/documentSymbolCollector.js.map +1 -1
- package/dist/localization/localize.d.ts +21 -0
- package/dist/localization/localize.js +13 -0
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.en-us.json +14 -1
- package/dist/parser/parser.js +1 -1
- package/dist/parser/parser.js.map +1 -1
- package/dist/pyright.js +13 -7
- package/dist/pyright.js.map +1 -1
- package/dist/tests/fourslash/fourslash.d.ts +1 -0
- package/dist/tests/fourslash/fourslash.js +2 -2
- package/dist/tests/fourslash/rename.parens.fourslash.d.ts +1 -0
- package/dist/tests/fourslash/rename.parens.fourslash.js +20 -0
- package/dist/tests/fourslash/rename.parens.fourslash.js.map +1 -0
- package/dist/tests/fourslash/typeVerifier.fourslash.d.ts +1 -0
- package/dist/tests/fourslash/typeVerifier.fourslash.js +47 -0
- package/dist/tests/fourslash/typeVerifier.fourslash.js.map +1 -0
- package/dist/tests/harness/fourslash/testState.d.ts +2 -0
- package/dist/tests/harness/fourslash/testState.js +16 -0
- package/dist/tests/harness/fourslash/testState.js.map +1 -1
- package/dist/tests/typeEvaluator1.test.js +2 -2
- package/dist/tests/typeEvaluator2.test.js +11 -7
- package/dist/tests/typeEvaluator2.test.js.map +1 -1
- package/dist/tests/typeEvaluator3.test.js +4 -0
- package/dist/tests/typeEvaluator3.test.js.map +1 -1
- package/dist/tests/typeEvaluator4.test.js +6 -2
- package/dist/tests/typeEvaluator4.test.js.map +1 -1
- package/dist/tests/typeEvaluator5.test.js +1 -1
- package/dist/tests/typePrinter.test.js +2 -10
- package/dist/tests/typePrinter.test.js.map +1 -1
- package/dist/tests/uri.test.js +4 -0
- package/dist/tests/uri.test.js.map +1 -1
- package/package.json +1 -1
package/dist/analyzer/checker.js
CHANGED
@@ -386,6 +386,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
386
386
|
this._validateFunctionTypeVarUsage(node, functionTypeResult);
|
387
387
|
this._validateGeneratorReturnType(node, functionTypeResult.functionType);
|
388
388
|
this._reportDeprecatedClassProperty(node, functionTypeResult);
|
389
|
+
// If this is not a method, @final is disallowed.
|
390
|
+
if (!containingClassNode && types_1.FunctionType.isFinal(functionTypeResult.functionType)) {
|
391
|
+
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.finalNonMethod().format({ name: node.name.value }), node.name);
|
392
|
+
}
|
389
393
|
}
|
390
394
|
// If we're at the module level within a stub file, report a diagnostic
|
391
395
|
// if there is a '__getattr__' function defined when in strict mode.
|
@@ -564,7 +568,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
564
568
|
let diagAddendum = new diagnostic_1.DiagnosticAddendum();
|
565
569
|
let returnTypeMatches = false;
|
566
570
|
if (this._evaluator.assignType(declaredReturnType, returnTypeResult.type, diagAddendum, new typeVarContext_1.TypeVarContext(),
|
567
|
-
/* srcTypeVarContext */ undefined,
|
571
|
+
/* srcTypeVarContext */ undefined, 128 /* AssignTypeFlags.AllowBoolTypeGuard */)) {
|
568
572
|
returnTypeMatches = true;
|
569
573
|
}
|
570
574
|
else {
|
@@ -587,7 +591,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
587
591
|
const adjustedReturnType = (0, typeUtils_1.applySolvedTypeVars)(declaredReturnType, typeVarContext);
|
588
592
|
if (this._evaluator.assignType(adjustedReturnType, returnTypeResult.type, diagAddendum,
|
589
593
|
/* destTypeVarContext */ undefined,
|
590
|
-
/* srcTypeVarContext */ undefined,
|
594
|
+
/* srcTypeVarContext */ undefined, 128 /* AssignTypeFlags.AllowBoolTypeGuard */)) {
|
591
595
|
returnTypeMatches = true;
|
592
596
|
}
|
593
597
|
}
|
@@ -1731,7 +1735,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1731
1735
|
_validateOverloadConsistency(node, functionType, prevOverloads) {
|
1732
1736
|
for (let i = 0; i < prevOverloads.length; i++) {
|
1733
1737
|
const prevOverload = prevOverloads[i];
|
1734
|
-
if (this._isOverlappingOverload(functionType, prevOverload)) {
|
1738
|
+
if (this._isOverlappingOverload(functionType, prevOverload, /* partialOverlap */ false)) {
|
1735
1739
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportOverlappingOverload, diagnosticRules_1.DiagnosticRule.reportOverlappingOverload, localize_1.Localizer.Diagnostic.overlappingOverload().format({
|
1736
1740
|
name: node.name.value,
|
1737
1741
|
obscured: prevOverloads.length + 1,
|
@@ -1742,14 +1746,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1742
1746
|
}
|
1743
1747
|
for (let i = 0; i < prevOverloads.length; i++) {
|
1744
1748
|
const prevOverload = prevOverloads[i];
|
1745
|
-
if (this._isOverlappingOverload(prevOverload, functionType)) {
|
1749
|
+
if (this._isOverlappingOverload(prevOverload, functionType, /* partialOverlap */ true)) {
|
1746
1750
|
const prevReturnType = types_1.FunctionType.getSpecializedReturnType(prevOverload);
|
1747
1751
|
const returnType = types_1.FunctionType.getSpecializedReturnType(functionType);
|
1748
1752
|
if (prevReturnType &&
|
1749
1753
|
returnType &&
|
1750
1754
|
!this._evaluator.assignType(returnType, prevReturnType,
|
1751
1755
|
/* diag */ undefined, new typeVarContext_1.TypeVarContext(),
|
1752
|
-
/* srcTypeVarContext */ undefined, 8 /* AssignTypeFlags.SkipSolveTypeVars */ |
|
1756
|
+
/* srcTypeVarContext */ undefined, 8 /* AssignTypeFlags.SkipSolveTypeVars */ | 1024 /* AssignTypeFlags.IgnoreTypeVarScope */)) {
|
1753
1757
|
const altNode = this._findNodeForOverload(node, prevOverload);
|
1754
1758
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportOverlappingOverload, diagnosticRules_1.DiagnosticRule.reportOverlappingOverload, localize_1.Localizer.Diagnostic.overloadReturnTypeMismatch().format({
|
1755
1759
|
name: node.name.value,
|
@@ -1779,7 +1783,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1779
1783
|
}
|
1780
1784
|
return undefined;
|
1781
1785
|
}
|
1782
|
-
_isOverlappingOverload(functionType, prevOverload) {
|
1786
|
+
_isOverlappingOverload(functionType, prevOverload, partialOverlap) {
|
1783
1787
|
// According to precedent, the __get__ method is special-cased and is
|
1784
1788
|
// exempt from overlapping overload checks. It's not clear why this is
|
1785
1789
|
// the case, but for consistency with other type checkers, we'll honor
|
@@ -1788,18 +1792,22 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1788
1792
|
if (types_1.FunctionType.isInstanceMethod(functionType) && functionType.details.name === '__get__') {
|
1789
1793
|
return false;
|
1790
1794
|
}
|
1795
|
+
let flags = 64 /* AssignTypeFlags.SkipFunctionReturnTypeCheck */ | 16 /* AssignTypeFlags.OverloadOverlapCheck */;
|
1796
|
+
if (partialOverlap) {
|
1797
|
+
flags |= 32 /* AssignTypeFlags.PartialOverloadOverlapCheck */;
|
1798
|
+
}
|
1791
1799
|
return this._evaluator.assignType(functionType, prevOverload,
|
1792
1800
|
/* diag */ undefined, new typeVarContext_1.TypeVarContext((0, typeUtils_1.getTypeVarScopeId)(functionType)),
|
1793
|
-
/* srcTypeVarContext */ undefined,
|
1801
|
+
/* srcTypeVarContext */ undefined, flags);
|
1794
1802
|
}
|
1795
1803
|
_isLegalOverloadImplementation(overload, implementation, diag) {
|
1796
1804
|
var _a;
|
1797
1805
|
const implTypeVarContext = new typeVarContext_1.TypeVarContext((0, typeUtils_1.getTypeVarScopeId)(implementation));
|
1798
1806
|
const overloadTypeVarContext = new typeVarContext_1.TypeVarContext((0, typeUtils_1.getTypeVarScopeId)(overload));
|
1799
1807
|
// First check the parameters to see if they are assignable.
|
1800
|
-
let isLegal = this._evaluator.assignType(overload, implementation, diag, overloadTypeVarContext, implTypeVarContext,
|
1808
|
+
let isLegal = this._evaluator.assignType(overload, implementation, diag, overloadTypeVarContext, implTypeVarContext, 64 /* AssignTypeFlags.SkipFunctionReturnTypeCheck */ |
|
1801
1809
|
2 /* AssignTypeFlags.ReverseTypeVarMatching */ |
|
1802
|
-
|
1810
|
+
512 /* AssignTypeFlags.SkipSelfClsTypeCheck */);
|
1803
1811
|
// Now check the return types.
|
1804
1812
|
const overloadReturnType = (_a = overload.details.declaredReturnType) !== null && _a !== void 0 ? _a : this._evaluator.getFunctionInferredReturnType(overload);
|
1805
1813
|
const implementationReturnType = (0, typeUtils_1.applySolvedTypeVars)(implementation.details.declaredReturnType || this._evaluator.getFunctionInferredReturnType(implementation), implTypeVarContext);
|
@@ -2715,6 +2723,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
2715
2723
|
diag.addMessage(localize_1.Localizer.DiagnosticAddendum.noneNotAllowed());
|
2716
2724
|
isSupported = false;
|
2717
2725
|
}
|
2726
|
+
else if (types_1.ClassType.isTypedDictClass(subtype)) {
|
2727
|
+
diag.addMessage(localize_1.Localizer.DiagnosticAddendum.typedDictClassNotAllowed());
|
2728
|
+
isSupported = false;
|
2729
|
+
}
|
2718
2730
|
else if (subtype.isTypeArgumentExplicit && !subtype.includeSubclasses) {
|
2719
2731
|
// If it's a class, make sure that it has not been given explicit
|
2720
2732
|
// type arguments. This will result in a TypeError exception.
|
@@ -2730,6 +2742,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
2730
2742
|
diag.addMessage(localize_1.Localizer.DiagnosticAddendum.protocolRequiresRuntimeCheckable());
|
2731
2743
|
isSupported = false;
|
2732
2744
|
}
|
2745
|
+
else if (types_1.ClassType.isNewTypeClass(subtype)) {
|
2746
|
+
diag.addMessage(localize_1.Localizer.DiagnosticAddendum.newTypeClassNotAllowed());
|
2747
|
+
isSupported = false;
|
2748
|
+
}
|
2733
2749
|
break;
|
2734
2750
|
case 4 /* TypeCategory.Function */:
|
2735
2751
|
if (!types_1.TypeBase.isInstantiable(subtype) || subtype.isCallableWithTypeArgs) {
|
@@ -3782,11 +3798,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3782
3798
|
if (!this._evaluator.assignType(newMemberType, initMemberType,
|
3783
3799
|
/* diag */ undefined,
|
3784
3800
|
/* destTypeVarContext */ undefined,
|
3785
|
-
/* srcTypeVarContext */ undefined,
|
3801
|
+
/* srcTypeVarContext */ undefined, 64 /* AssignTypeFlags.SkipFunctionReturnTypeCheck */) ||
|
3786
3802
|
!this._evaluator.assignType(initMemberType, newMemberType,
|
3787
3803
|
/* diag */ undefined,
|
3788
3804
|
/* destTypeVarContext */ undefined,
|
3789
|
-
/* srcTypeVarContext */ undefined,
|
3805
|
+
/* srcTypeVarContext */ undefined, 64 /* AssignTypeFlags.SkipFunctionReturnTypeCheck */)) {
|
3790
3806
|
const displayOnInit = types_1.ClassType.isSameGenericClass(initMethodResult.classType, classType);
|
3791
3807
|
const initDecl = initMemberType.details.declaration;
|
3792
3808
|
const newDecl = newMemberType.details.declaration;
|
@@ -4150,7 +4166,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4150
4166
|
return;
|
4151
4167
|
}
|
4152
4168
|
// Constructors are exempt.
|
4153
|
-
if (
|
4169
|
+
if (this._isMethodExemptFromLsp(overrideFunction.details.name)) {
|
4154
4170
|
return;
|
4155
4171
|
}
|
4156
4172
|
// If the declaration for the override function is not the same as the
|
@@ -4164,6 +4180,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4164
4180
|
className: this._evaluator.printType((0, typeUtils_1.convertToInstance)(baseMember.classType)),
|
4165
4181
|
}), funcNode.name);
|
4166
4182
|
}
|
4183
|
+
// Determines whether the name is exempt from Liskov Substitution Principle rules.
|
4184
|
+
_isMethodExemptFromLsp(name) {
|
4185
|
+
const exemptMethods = ['__init__', '__new__', '__init_subclass__', '__post_init__'];
|
4186
|
+
return exemptMethods.some((n) => n === name);
|
4187
|
+
}
|
4167
4188
|
// Determines whether the type is a function or overloaded function with an @override
|
4168
4189
|
// decorator. In this case, an error is reported because no base class has declared
|
4169
4190
|
// a method of the same name.
|
@@ -4217,7 +4238,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4217
4238
|
if ((0, types_1.isFunction)(baseType) || (0, types_1.isOverloadedFunction)(baseType)) {
|
4218
4239
|
const diagAddendum = new diagnostic_1.DiagnosticAddendum();
|
4219
4240
|
if ((0, types_1.isFunction)(overrideType) || (0, types_1.isOverloadedFunction)(overrideType)) {
|
4220
|
-
const exemptMethods = ['__init__', '__new__', '__init_subclass__'];
|
4221
4241
|
// Don't enforce parameter names for dundered methods. Many of them
|
4222
4242
|
// are misnamed in typeshed stubs, so this would result in many
|
4223
4243
|
// false positives.
|
@@ -4226,7 +4246,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4226
4246
|
// Also, skip this check if the class is a TypedDict. The methods for a TypedDict
|
4227
4247
|
// are synthesized, and they can result in many overloads. We assume they
|
4228
4248
|
// are correct and will not produce any errors.
|
4229
|
-
if (!
|
4249
|
+
if (!this._isMethodExemptFromLsp(memberName) &&
|
4230
4250
|
!SymbolNameUtils.isPrivateName(memberName) &&
|
4231
4251
|
!types_1.ClassType.isTypedDictClass(childClassType)) {
|
4232
4252
|
if (!this._evaluator.validateOverrideMethod(baseType, overrideType, childClassType, diagAddendum, enforceParamNameMatch)) {
|