@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.
Files changed (132) hide show
  1. package/dist/analyzer/binder.js +1 -0
  2. package/dist/analyzer/binder.js.map +1 -1
  3. package/dist/analyzer/checker.d.ts +2 -1
  4. package/dist/analyzer/checker.js +53 -89
  5. package/dist/analyzer/checker.js.map +1 -1
  6. package/dist/analyzer/codeFlowEngine.js +2 -2
  7. package/dist/analyzer/codeFlowEngine.js.map +1 -1
  8. package/dist/analyzer/constraintTracker.d.ts +2 -2
  9. package/dist/analyzer/constraintTracker.js +11 -5
  10. package/dist/analyzer/constraintTracker.js.map +1 -1
  11. package/dist/analyzer/constructors.js +2 -2
  12. package/dist/analyzer/constructors.js.map +1 -1
  13. package/dist/analyzer/importResolver.d.ts +1 -1
  14. package/dist/analyzer/parameterUtils.d.ts +4 -1
  15. package/dist/analyzer/parameterUtils.js +7 -3
  16. package/dist/analyzer/parameterUtils.js.map +1 -1
  17. package/dist/analyzer/program.d.ts +1 -0
  18. package/dist/analyzer/program.js +4 -1
  19. package/dist/analyzer/program.js.map +1 -1
  20. package/dist/analyzer/protocols.js +26 -11
  21. package/dist/analyzer/protocols.js.map +1 -1
  22. package/dist/analyzer/service.d.ts +1 -0
  23. package/dist/analyzer/service.js +3 -1
  24. package/dist/analyzer/service.js.map +1 -1
  25. package/dist/analyzer/sourceFile.d.ts +10 -0
  26. package/dist/analyzer/sourceFile.js +5 -0
  27. package/dist/analyzer/sourceFile.js.map +1 -1
  28. package/dist/analyzer/sourceFileInfoUtils.d.ts +1 -0
  29. package/dist/analyzer/sourceFileInfoUtils.js +12 -11
  30. package/dist/analyzer/sourceFileInfoUtils.js.map +1 -1
  31. package/dist/analyzer/typeEvaluator.js +257 -122
  32. package/dist/analyzer/typeEvaluator.js.map +1 -1
  33. package/dist/analyzer/typeEvaluatorTypes.d.ts +1 -0
  34. package/dist/analyzer/typeGuards.js +20 -3
  35. package/dist/analyzer/typeGuards.js.map +1 -1
  36. package/dist/analyzer/typeUtils.d.ts +2 -1
  37. package/dist/analyzer/typeUtils.js +8 -2
  38. package/dist/analyzer/typeUtils.js.map +1 -1
  39. package/dist/analyzer/typedDicts.js +25 -10
  40. package/dist/analyzer/typedDicts.js.map +1 -1
  41. package/dist/backgroundAnalysisBase.d.ts +2 -2
  42. package/dist/backgroundAnalysisBase.js +14 -13
  43. package/dist/backgroundAnalysisBase.js.map +1 -1
  44. package/dist/backgroundThreadBase.d.ts +6 -2
  45. package/dist/backgroundThreadBase.js +7 -1
  46. package/dist/backgroundThreadBase.js.map +1 -1
  47. package/dist/common/fileSystem.d.ts +2 -0
  48. package/dist/common/fileSystem.js.map +1 -1
  49. package/dist/common/languageServerInterface.d.ts +0 -24
  50. package/dist/common/languageServerInterface.js.map +1 -1
  51. package/dist/common/realFileSystem.d.ts +2 -0
  52. package/dist/common/realFileSystem.js +8 -0
  53. package/dist/common/realFileSystem.js.map +1 -1
  54. package/dist/common/serviceKeys.d.ts +1 -1
  55. package/dist/common/serviceProviderExtensions.d.ts +1 -1
  56. package/dist/common/serviceProviderExtensions.js +2 -2
  57. package/dist/common/serviceProviderExtensions.js.map +1 -1
  58. package/dist/common/uri/uriMap.d.ts +17 -0
  59. package/dist/common/uri/uriMap.js +76 -0
  60. package/dist/common/uri/uriMap.js.map +1 -0
  61. package/dist/languageServerBase.d.ts +2 -1
  62. package/dist/languageServerBase.js +2 -0
  63. package/dist/languageServerBase.js.map +1 -1
  64. package/dist/languageService/completionProvider.js +1 -1
  65. package/dist/languageService/completionProvider.js.map +1 -1
  66. package/dist/languageService/referencesProvider.js +9 -2
  67. package/dist/languageService/referencesProvider.js.map +1 -1
  68. package/dist/localization/localize.d.ts +4 -5
  69. package/dist/localization/localize.js +2 -2
  70. package/dist/localization/localize.js.map +1 -1
  71. package/dist/localization/package.nls.cs.json +7 -7
  72. package/dist/localization/package.nls.de.json +7 -7
  73. package/dist/localization/package.nls.en-us.json +7 -7
  74. package/dist/localization/package.nls.es.json +7 -7
  75. package/dist/localization/package.nls.fr.json +7 -7
  76. package/dist/localization/package.nls.it.json +7 -7
  77. package/dist/localization/package.nls.ja.json +7 -7
  78. package/dist/localization/package.nls.ko.json +7 -7
  79. package/dist/localization/package.nls.pl.json +7 -7
  80. package/dist/localization/package.nls.pt-br.json +7 -7
  81. package/dist/localization/package.nls.qps-ploc.json +3 -3
  82. package/dist/localization/package.nls.ru.json +7 -7
  83. package/dist/localization/package.nls.tr.json +7 -7
  84. package/dist/localization/package.nls.zh-cn.json +7 -7
  85. package/dist/localization/package.nls.zh-tw.json +7 -7
  86. package/dist/parser/parser.js +6 -3
  87. package/dist/parser/parser.js.map +1 -1
  88. package/dist/parser/tokenizer.js +9 -7
  89. package/dist/parser/tokenizer.js.map +1 -1
  90. package/dist/partialStubService.d.ts +26 -0
  91. package/dist/partialStubService.js +138 -0
  92. package/dist/partialStubService.js.map +1 -0
  93. package/dist/pyrightFileSystem.d.ts +1 -21
  94. package/dist/pyrightFileSystem.js +7 -137
  95. package/dist/pyrightFileSystem.js.map +1 -1
  96. package/dist/readonlyAugmentedFileSystem.d.ts +7 -4
  97. package/dist/readonlyAugmentedFileSystem.js +124 -60
  98. package/dist/readonlyAugmentedFileSystem.js.map +1 -1
  99. package/dist/server.js +3 -1
  100. package/dist/server.js.map +1 -1
  101. package/dist/tests/completions.test.js +23 -0
  102. package/dist/tests/completions.test.js.map +1 -1
  103. package/dist/tests/fourslash/completions.vardecls.fourslash.js +2 -1
  104. package/dist/tests/fourslash/completions.vardecls.fourslash.js.map +1 -1
  105. package/dist/tests/fourslash/hover.async.fourslash.js +1 -1
  106. package/dist/tests/fourslash/hover.async.fourslash.js.map +1 -1
  107. package/dist/tests/fourslash/rename.typeParams.fourslash.d.ts +1 -0
  108. package/dist/tests/fourslash/rename.typeParams.fourslash.js +27 -0
  109. package/dist/tests/fourslash/rename.typeParams.fourslash.js.map +1 -0
  110. package/dist/tests/harness/fourslash/testState.js +3 -1
  111. package/dist/tests/harness/fourslash/testState.js.map +1 -1
  112. package/dist/tests/harness/vfs/filesystem.d.ts +2 -0
  113. package/dist/tests/harness/vfs/filesystem.js +5 -2
  114. package/dist/tests/harness/vfs/filesystem.js.map +1 -1
  115. package/dist/tests/importResolver.test.js +8 -2
  116. package/dist/tests/importResolver.test.js.map +1 -1
  117. package/dist/tests/pyrightFileSystem.test.js +15 -8
  118. package/dist/tests/pyrightFileSystem.test.js.map +1 -1
  119. package/dist/tests/typeEvaluator1.test.js +1 -1
  120. package/dist/tests/typeEvaluator2.test.js +1 -1
  121. package/dist/tests/typeEvaluator4.test.js +4 -4
  122. package/dist/tests/typeEvaluator5.test.js +3 -3
  123. package/dist/tests/typeEvaluator6.test.js +6 -2
  124. package/dist/tests/typeEvaluator6.test.js.map +1 -1
  125. package/dist/tests/typeEvaluator7.test.js +6 -2
  126. package/dist/tests/typeEvaluator7.test.js.map +1 -1
  127. package/dist/tests/typeEvaluator8.test.js +1 -1
  128. package/dist/tests/typeEvaluator8.test.js.map +1 -1
  129. package/dist/types.d.ts +26 -0
  130. package/dist/types.js +3 -0
  131. package/dist/types.js.map +1 -0
  132. package/package.json +1 -1
@@ -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) && types_1.ClassType.isBuiltIn(returnType, 'Coroutine')) {
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._isTypeComparable(leftSubtype, rightSubtype)) {
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 this is a method within a protocol class, don't require that
2132
- // there is an implementation.
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
- let reportFinalMethodOverride = false;
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;