@zzzen/pyright-internal 1.2.0-dev.20250202 → 1.2.0-dev.20250216
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 +1 -0
- package/dist/analyzer/binder.js.map +1 -1
- package/dist/analyzer/checker.d.ts +2 -1
- package/dist/analyzer/checker.js +53 -89
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/codeFlowEngine.js +2 -2
- package/dist/analyzer/codeFlowEngine.js.map +1 -1
- package/dist/analyzer/constraintTracker.d.ts +2 -2
- package/dist/analyzer/constraintTracker.js +11 -5
- package/dist/analyzer/constraintTracker.js.map +1 -1
- package/dist/analyzer/constructors.js +2 -2
- package/dist/analyzer/constructors.js.map +1 -1
- package/dist/analyzer/importResolver.d.ts +1 -1
- package/dist/analyzer/parameterUtils.d.ts +4 -1
- package/dist/analyzer/parameterUtils.js +7 -3
- package/dist/analyzer/parameterUtils.js.map +1 -1
- package/dist/analyzer/program.d.ts +1 -0
- package/dist/analyzer/program.js +4 -1
- package/dist/analyzer/program.js.map +1 -1
- package/dist/analyzer/protocols.js +26 -11
- package/dist/analyzer/protocols.js.map +1 -1
- package/dist/analyzer/service.d.ts +1 -0
- package/dist/analyzer/service.js +3 -1
- package/dist/analyzer/service.js.map +1 -1
- package/dist/analyzer/sourceFile.d.ts +10 -0
- package/dist/analyzer/sourceFile.js +5 -0
- package/dist/analyzer/sourceFile.js.map +1 -1
- package/dist/analyzer/sourceFileInfoUtils.d.ts +1 -0
- package/dist/analyzer/sourceFileInfoUtils.js +12 -11
- package/dist/analyzer/sourceFileInfoUtils.js.map +1 -1
- package/dist/analyzer/typeEvaluator.js +257 -122
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +1 -0
- package/dist/analyzer/typeGuards.js +20 -3
- package/dist/analyzer/typeGuards.js.map +1 -1
- package/dist/analyzer/typeUtils.d.ts +2 -1
- package/dist/analyzer/typeUtils.js +8 -2
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/analyzer/typedDicts.js +25 -10
- package/dist/analyzer/typedDicts.js.map +1 -1
- package/dist/backgroundAnalysisBase.d.ts +2 -2
- package/dist/backgroundAnalysisBase.js +14 -13
- package/dist/backgroundAnalysisBase.js.map +1 -1
- package/dist/backgroundThreadBase.d.ts +6 -2
- package/dist/backgroundThreadBase.js +7 -1
- package/dist/backgroundThreadBase.js.map +1 -1
- package/dist/common/fileSystem.d.ts +2 -0
- package/dist/common/fileSystem.js.map +1 -1
- package/dist/common/languageServerInterface.d.ts +0 -24
- package/dist/common/languageServerInterface.js.map +1 -1
- package/dist/common/realFileSystem.d.ts +2 -0
- package/dist/common/realFileSystem.js +8 -0
- package/dist/common/realFileSystem.js.map +1 -1
- package/dist/common/serviceKeys.d.ts +1 -1
- package/dist/common/serviceProviderExtensions.d.ts +1 -1
- package/dist/common/serviceProviderExtensions.js +2 -2
- package/dist/common/serviceProviderExtensions.js.map +1 -1
- package/dist/common/uri/uriMap.d.ts +17 -0
- package/dist/common/uri/uriMap.js +76 -0
- package/dist/common/uri/uriMap.js.map +1 -0
- package/dist/languageServerBase.d.ts +2 -1
- package/dist/languageServerBase.js +2 -0
- package/dist/languageServerBase.js.map +1 -1
- package/dist/languageService/completionProvider.js +1 -1
- package/dist/languageService/completionProvider.js.map +1 -1
- package/dist/languageService/referencesProvider.js +9 -2
- package/dist/languageService/referencesProvider.js.map +1 -1
- package/dist/localization/localize.d.ts +4 -5
- package/dist/localization/localize.js +2 -2
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.cs.json +7 -7
- package/dist/localization/package.nls.de.json +7 -7
- package/dist/localization/package.nls.en-us.json +7 -7
- package/dist/localization/package.nls.es.json +7 -7
- package/dist/localization/package.nls.fr.json +7 -7
- package/dist/localization/package.nls.it.json +7 -7
- package/dist/localization/package.nls.ja.json +7 -7
- package/dist/localization/package.nls.ko.json +7 -7
- package/dist/localization/package.nls.pl.json +7 -7
- package/dist/localization/package.nls.pt-br.json +7 -7
- package/dist/localization/package.nls.qps-ploc.json +3 -3
- package/dist/localization/package.nls.ru.json +7 -7
- package/dist/localization/package.nls.tr.json +7 -7
- package/dist/localization/package.nls.zh-cn.json +7 -7
- package/dist/localization/package.nls.zh-tw.json +7 -7
- package/dist/parser/parser.js +6 -3
- package/dist/parser/parser.js.map +1 -1
- package/dist/parser/tokenizer.js +9 -7
- package/dist/parser/tokenizer.js.map +1 -1
- package/dist/partialStubService.d.ts +26 -0
- package/dist/partialStubService.js +138 -0
- package/dist/partialStubService.js.map +1 -0
- package/dist/pyrightFileSystem.d.ts +1 -21
- package/dist/pyrightFileSystem.js +7 -137
- package/dist/pyrightFileSystem.js.map +1 -1
- package/dist/readonlyAugmentedFileSystem.d.ts +7 -4
- package/dist/readonlyAugmentedFileSystem.js +124 -60
- package/dist/readonlyAugmentedFileSystem.js.map +1 -1
- package/dist/server.js +3 -1
- package/dist/server.js.map +1 -1
- package/dist/tests/completions.test.js +23 -0
- package/dist/tests/completions.test.js.map +1 -1
- package/dist/tests/fourslash/completions.vardecls.fourslash.js +2 -1
- package/dist/tests/fourslash/completions.vardecls.fourslash.js.map +1 -1
- package/dist/tests/fourslash/hover.async.fourslash.js +1 -1
- package/dist/tests/fourslash/hover.async.fourslash.js.map +1 -1
- package/dist/tests/fourslash/rename.typeParams.fourslash.d.ts +1 -0
- package/dist/tests/fourslash/rename.typeParams.fourslash.js +27 -0
- package/dist/tests/fourslash/rename.typeParams.fourslash.js.map +1 -0
- package/dist/tests/harness/fourslash/testState.js +3 -1
- package/dist/tests/harness/fourslash/testState.js.map +1 -1
- package/dist/tests/harness/vfs/filesystem.d.ts +2 -0
- package/dist/tests/harness/vfs/filesystem.js +5 -2
- package/dist/tests/harness/vfs/filesystem.js.map +1 -1
- package/dist/tests/importResolver.test.js +8 -2
- package/dist/tests/importResolver.test.js.map +1 -1
- package/dist/tests/pyrightFileSystem.test.js +15 -8
- package/dist/tests/pyrightFileSystem.test.js.map +1 -1
- package/dist/tests/typeEvaluator1.test.js +1 -1
- package/dist/tests/typeEvaluator2.test.js +1 -1
- package/dist/tests/typeEvaluator4.test.js +4 -4
- package/dist/tests/typeEvaluator5.test.js +3 -3
- package/dist/tests/typeEvaluator6.test.js +6 -2
- package/dist/tests/typeEvaluator6.test.js.map +1 -1
- package/dist/tests/typeEvaluator7.test.js +6 -2
- package/dist/tests/typeEvaluator7.test.js.map +1 -1
- package/dist/tests/typeEvaluator8.test.js +1 -1
- package/dist/tests/typeEvaluator8.test.js.map +1 -1
- package/dist/types.d.ts +26 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +1 -1
package/dist/analyzer/checker.js
CHANGED
@@ -475,7 +475,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
475
475
|
this._evaluator.addDiagnostic(diagnosticRules_1.DiagnosticRule.reportUnusedCallResult, localize_1.LocMessage.unusedCallResult().format({
|
476
476
|
type: this._evaluator.printType(returnType),
|
477
477
|
}), node);
|
478
|
-
if ((0, types_1.isClassInstance)(returnType) &&
|
478
|
+
if ((0, types_1.isClassInstance)(returnType) &&
|
479
|
+
types_1.ClassType.isBuiltIn(returnType, ['Coroutine', 'CoroutineType'])) {
|
479
480
|
this._evaluator.addDiagnostic(diagnosticRules_1.DiagnosticRule.reportUnusedCoroutine, localize_1.LocMessage.unusedCoroutine(), node);
|
480
481
|
}
|
481
482
|
}
|
@@ -643,7 +644,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
643
644
|
const yieldFromType = this._evaluator.getType(node.d.expr) || types_1.UnknownType.create();
|
644
645
|
let yieldType;
|
645
646
|
let sendType;
|
646
|
-
if ((0, types_1.isClassInstance)(yieldFromType) && types_1.ClassType.isBuiltIn(yieldFromType, 'Coroutine')) {
|
647
|
+
if ((0, types_1.isClassInstance)(yieldFromType) && types_1.ClassType.isBuiltIn(yieldFromType, ['Coroutine', 'CoroutineType'])) {
|
647
648
|
// Handle the case of old-style (pre-await) coroutines.
|
648
649
|
yieldType = types_1.UnknownType.create();
|
649
650
|
}
|
@@ -911,6 +912,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
911
912
|
node.d.targets.forEach((name) => {
|
912
913
|
this._evaluator.getType(name);
|
913
914
|
this.walk(name);
|
915
|
+
this._validateNonlocalTypeParam(name);
|
914
916
|
});
|
915
917
|
});
|
916
918
|
return false;
|
@@ -1188,7 +1190,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1188
1190
|
if (!(0, types_1.isFunction)(subtype) && !(0, types_1.isOverloaded)(subtype)) {
|
1189
1191
|
isExprFunction = false;
|
1190
1192
|
}
|
1191
|
-
if (!(0, types_1.isClassInstance)(subtype) || !types_1.ClassType.isBuiltIn(subtype, 'Coroutine')) {
|
1193
|
+
if (!(0, types_1.isClassInstance)(subtype) || !types_1.ClassType.isBuiltIn(subtype, ['Coroutine', 'CoroutineType'])) {
|
1192
1194
|
isCoroutine = false;
|
1193
1195
|
}
|
1194
1196
|
});
|
@@ -1237,6 +1239,16 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1237
1239
|
this._evaluator.addDiagnostic(diagnosticRules_1.DiagnosticRule.reportUnusedExpression, localize_1.LocMessage.unusedExpression(), node);
|
1238
1240
|
}
|
1239
1241
|
}
|
1242
|
+
// Verifies that the target of a nonlocal statement is not a PEP 695-style
|
1243
|
+
// TypeParameter. This situation results in a runtime exception.
|
1244
|
+
_validateNonlocalTypeParam(node) {
|
1245
|
+
// Look up the symbol to see if it's a type parameter.
|
1246
|
+
const symbolWithScope = this._evaluator.lookUpSymbolRecursive(node, node.d.value, /* honorCodeFlow */ false);
|
1247
|
+
if (!symbolWithScope || symbolWithScope.scope.type !== 0 /* ScopeType.TypeParameter */) {
|
1248
|
+
return;
|
1249
|
+
}
|
1250
|
+
this._evaluator.addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.nonlocalTypeParam().format({ name: node.d.value }), node);
|
1251
|
+
}
|
1240
1252
|
_validateExhaustiveMatch(node) {
|
1241
1253
|
// This check can be expensive, so skip it if it's disabled.
|
1242
1254
|
if (this._fileInfo.diagnosticRuleSet.reportMatchNotExhaustive === 'none') {
|
@@ -1370,7 +1382,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1370
1382
|
if (isComparable) {
|
1371
1383
|
return;
|
1372
1384
|
}
|
1373
|
-
if (this.
|
1385
|
+
if (this._evaluator.isTypeComparable(leftSubtype, rightSubtype)) {
|
1374
1386
|
isComparable = true;
|
1375
1387
|
}
|
1376
1388
|
return rightSubtype;
|
@@ -1387,71 +1399,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1387
1399
|
}
|
1388
1400
|
}
|
1389
1401
|
}
|
1390
|
-
// Determines whether the two types are potentially comparable -- i.e.
|
1391
|
-
// their types overlap in such a way that it makes sense for them to
|
1392
|
-
// be compared with an == or != operator.
|
1393
|
-
_isTypeComparable(leftType, rightType) {
|
1394
|
-
if ((0, types_1.isAnyOrUnknown)(leftType) || (0, types_1.isAnyOrUnknown)(rightType)) {
|
1395
|
-
return true;
|
1396
|
-
}
|
1397
|
-
if ((0, types_1.isNever)(leftType) || (0, types_1.isNever)(rightType)) {
|
1398
|
-
return false;
|
1399
|
-
}
|
1400
|
-
if ((0, types_1.isModule)(leftType) || (0, types_1.isModule)(rightType)) {
|
1401
|
-
return (0, types_1.isTypeSame)(leftType, rightType, { ignoreConditions: true });
|
1402
|
-
}
|
1403
|
-
const isLeftCallable = (0, types_1.isFunction)(leftType) || (0, types_1.isOverloaded)(leftType);
|
1404
|
-
const isRightCallable = (0, types_1.isFunction)(rightType) || (0, types_1.isOverloaded)(rightType);
|
1405
|
-
if (isLeftCallable !== isRightCallable) {
|
1406
|
-
return false;
|
1407
|
-
}
|
1408
|
-
if ((0, types_1.isInstantiableClass)(leftType) || ((0, types_1.isClassInstance)(leftType) && types_1.ClassType.isBuiltIn(leftType, 'type'))) {
|
1409
|
-
if ((0, types_1.isInstantiableClass)(rightType) ||
|
1410
|
-
((0, types_1.isClassInstance)(rightType) && types_1.ClassType.isBuiltIn(rightType, 'type'))) {
|
1411
|
-
const genericLeftType = types_1.ClassType.specialize(leftType, /* typeArgs */ undefined);
|
1412
|
-
const genericRightType = types_1.ClassType.specialize(rightType, /* typeArgs */ undefined);
|
1413
|
-
if (this._evaluator.assignType(genericLeftType, genericRightType) ||
|
1414
|
-
this._evaluator.assignType(genericRightType, genericLeftType)) {
|
1415
|
-
return true;
|
1416
|
-
}
|
1417
|
-
}
|
1418
|
-
// Does the class have an operator overload for eq?
|
1419
|
-
const metaclass = leftType.shared.effectiveMetaclass;
|
1420
|
-
if (metaclass && (0, types_1.isClass)(metaclass)) {
|
1421
|
-
if ((0, typeUtils_1.lookUpClassMember)(metaclass, '__eq__', 4 /* MemberAccessFlags.SkipObjectBaseClass */)) {
|
1422
|
-
return true;
|
1423
|
-
}
|
1424
|
-
}
|
1425
|
-
return false;
|
1426
|
-
}
|
1427
|
-
if ((0, types_1.isClassInstance)(leftType)) {
|
1428
|
-
if ((0, types_1.isClass)(rightType)) {
|
1429
|
-
const genericLeftType = types_1.ClassType.specialize(leftType, /* typeArgs */ undefined);
|
1430
|
-
const genericRightType = types_1.ClassType.specialize(rightType, /* typeArgs */ undefined);
|
1431
|
-
if (this._evaluator.assignType(genericLeftType, genericRightType) ||
|
1432
|
-
this._evaluator.assignType(genericRightType, genericLeftType)) {
|
1433
|
-
return true;
|
1434
|
-
}
|
1435
|
-
// Assume that if the types are disjoint and built-in classes that they
|
1436
|
-
// will never be comparable.
|
1437
|
-
if (types_1.ClassType.isBuiltIn(leftType) && types_1.ClassType.isBuiltIn(rightType) && types_1.TypeBase.isInstance(rightType)) {
|
1438
|
-
return false;
|
1439
|
-
}
|
1440
|
-
}
|
1441
|
-
// Does the class have an operator overload for eq?
|
1442
|
-
const eqMethod = (0, typeUtils_1.lookUpClassMember)(types_1.ClassType.cloneAsInstantiable(leftType), '__eq__', 4 /* MemberAccessFlags.SkipObjectBaseClass */);
|
1443
|
-
if (eqMethod) {
|
1444
|
-
// If this is a synthesized method for a dataclass, we can assume
|
1445
|
-
// that other dataclass types will not be comparable.
|
1446
|
-
if (types_1.ClassType.isDataClass(leftType) && eqMethod.symbol.getSynthesizedType()) {
|
1447
|
-
return false;
|
1448
|
-
}
|
1449
|
-
return true;
|
1450
|
-
}
|
1451
|
-
return false;
|
1452
|
-
}
|
1453
|
-
return true;
|
1454
|
-
}
|
1455
1402
|
// If the function is a generator, validates that its annotated return type
|
1456
1403
|
// is appropriate for a generator.
|
1457
1404
|
_validateGeneratorReturnType(node, functionType) {
|
@@ -2113,6 +2060,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
2113
2060
|
implementation = type;
|
2114
2061
|
}
|
2115
2062
|
if (!implementation) {
|
2063
|
+
// If this is a method within a protocol class, don't require that
|
2064
|
+
// there is an implementation.
|
2116
2065
|
const containingClassNode = ParseTreeUtils.getEnclosingClassOrFunction(primaryDecl.node);
|
2117
2066
|
if (containingClassNode && containingClassNode.nodeType === 10 /* ParseNodeType.Class */) {
|
2118
2067
|
const classType = this._evaluator.getTypeOfClass(containingClassNode);
|
@@ -2128,8 +2077,12 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
2128
2077
|
}
|
2129
2078
|
}
|
2130
2079
|
}
|
2131
|
-
// If
|
2132
|
-
//
|
2080
|
+
// If the declaration isn't associated with any of the overloads in the
|
2081
|
+
// type, the overloads came from a decorator that captured the overload
|
2082
|
+
// from somewhere else.
|
2083
|
+
if (!overloads.find((overload) => overload.shared.declaration === primaryDecl)) {
|
2084
|
+
return;
|
2085
|
+
}
|
2133
2086
|
this._evaluator.addDiagnostic(diagnosticRules_1.DiagnosticRule.reportNoOverloadImplementation, localize_1.LocMessage.overloadWithoutImplementation().format({
|
2134
2087
|
name: primaryDecl.node.d.name.d.value,
|
2135
2088
|
}), primaryDecl.node.d.name);
|
@@ -4613,24 +4566,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4613
4566
|
if ((0, types_1.isFunction)(baseType) || (0, types_1.isOverloaded)(baseType)) {
|
4614
4567
|
const diagAddendum = new diagnostic_1.DiagnosticAddendum();
|
4615
4568
|
// Determine whether this is an attempt to override a method marked @final.
|
4616
|
-
|
4617
|
-
// Private names (starting with double underscore) are exempt from this check.
|
4618
|
-
if (!SymbolNameUtils.isPrivateName(memberName)) {
|
4619
|
-
if ((0, types_1.isFunction)(baseType) && types_1.FunctionType.isFinal(baseType)) {
|
4620
|
-
reportFinalMethodOverride = true;
|
4621
|
-
}
|
4622
|
-
else if ((0, types_1.isOverloaded)(baseType)) {
|
4623
|
-
const overloads = types_1.OverloadedType.getOverloads(baseType);
|
4624
|
-
const impl = types_1.OverloadedType.getImplementation(baseType);
|
4625
|
-
if (overloads.some((overload) => types_1.FunctionType.isFinal(overload))) {
|
4626
|
-
reportFinalMethodOverride = true;
|
4627
|
-
}
|
4628
|
-
if (impl && (0, types_1.isFunction)(impl) && types_1.FunctionType.isFinal(impl)) {
|
4629
|
-
reportFinalMethodOverride = true;
|
4630
|
-
}
|
4631
|
-
}
|
4632
|
-
}
|
4633
|
-
if (reportFinalMethodOverride) {
|
4569
|
+
if (this._isFinalFunction(memberName, baseType)) {
|
4634
4570
|
const decl = (0, symbolUtils_1.getLastTypedDeclarationForSymbol)(overrideSymbol);
|
4635
4571
|
if (decl && decl.type === 5 /* DeclarationType.Function */) {
|
4636
4572
|
const diag = this._evaluator.addDiagnostic(diagnosticRules_1.DiagnosticRule.reportIncompatibleMethodOverride, localize_1.LocMessage.finalMethodOverride().format({
|
@@ -4839,6 +4775,25 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4839
4775
|
}
|
4840
4776
|
}
|
4841
4777
|
}
|
4778
|
+
_isFinalFunction(name, type) {
|
4779
|
+
if (SymbolNameUtils.isPrivateName(name)) {
|
4780
|
+
return false;
|
4781
|
+
}
|
4782
|
+
if ((0, types_1.isFunction)(type) && types_1.FunctionType.isFinal(type)) {
|
4783
|
+
return true;
|
4784
|
+
}
|
4785
|
+
if ((0, types_1.isOverloaded)(type)) {
|
4786
|
+
const overloads = types_1.OverloadedType.getOverloads(type);
|
4787
|
+
const impl = types_1.OverloadedType.getImplementation(type);
|
4788
|
+
if (overloads.some((overload) => types_1.FunctionType.isFinal(overload))) {
|
4789
|
+
return true;
|
4790
|
+
}
|
4791
|
+
if (impl && (0, types_1.isFunction)(impl) && types_1.FunctionType.isFinal(impl)) {
|
4792
|
+
return true;
|
4793
|
+
}
|
4794
|
+
}
|
4795
|
+
return false;
|
4796
|
+
}
|
4842
4797
|
_validatePropertyOverride(baseClassType, childClassType, baseType, childType, overrideSymbol, memberName) {
|
4843
4798
|
const propMethodInfo = [
|
4844
4799
|
['fget', (c) => c.priv.fgetInfo?.methodType],
|
@@ -4875,6 +4830,15 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4875
4830
|
}
|
4876
4831
|
return;
|
4877
4832
|
}
|
4833
|
+
else if (this._isFinalFunction(methodName, baseClassPropMethod)) {
|
4834
|
+
const decl = (0, symbolUtils_1.getLastTypedDeclarationForSymbol)(overrideSymbol);
|
4835
|
+
if (decl && decl.type === 5 /* DeclarationType.Function */) {
|
4836
|
+
this._evaluator.addDiagnostic(diagnosticRules_1.DiagnosticRule.reportIncompatibleMethodOverride, localize_1.LocMessage.finalMethodOverride().format({
|
4837
|
+
name: memberName,
|
4838
|
+
className: baseClassType.shared.name,
|
4839
|
+
}), decl.node.d.name);
|
4840
|
+
}
|
4841
|
+
}
|
4878
4842
|
const subclassMethodType = (0, typeUtils_1.partiallySpecializeType)(subclassPropMethod, childClassType, this._evaluator.getTypeClassType());
|
4879
4843
|
if (!(0, types_1.isFunction)(subclassMethodType)) {
|
4880
4844
|
return;
|