@zzzen/pyright-internal 1.2.0-dev.20250316 → 1.2.0-dev.20250330

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 (130) hide show
  1. package/dist/analyzer/analyzerFileInfo.d.ts +1 -0
  2. package/dist/analyzer/analyzerFileInfo.js.map +1 -1
  3. package/dist/analyzer/backgroundAnalysisProgram.d.ts +1 -0
  4. package/dist/analyzer/backgroundAnalysisProgram.js +6 -0
  5. package/dist/analyzer/backgroundAnalysisProgram.js.map +1 -1
  6. package/dist/analyzer/binder.js +37 -13
  7. package/dist/analyzer/binder.js.map +1 -1
  8. package/dist/analyzer/checker.d.ts +3 -0
  9. package/dist/analyzer/checker.js +66 -15
  10. package/dist/analyzer/checker.js.map +1 -1
  11. package/dist/analyzer/codeFlowTypes.d.ts +2 -2
  12. package/dist/analyzer/codeFlowTypes.js +9 -0
  13. package/dist/analyzer/codeFlowTypes.js.map +1 -1
  14. package/dist/analyzer/constraintSolver.js +1 -1
  15. package/dist/analyzer/constraintSolver.js.map +1 -1
  16. package/dist/analyzer/constructorTransform.js +1 -1
  17. package/dist/analyzer/constructorTransform.js.map +1 -1
  18. package/dist/analyzer/constructors.js +7 -1
  19. package/dist/analyzer/constructors.js.map +1 -1
  20. package/dist/analyzer/importResolver.d.ts +2 -0
  21. package/dist/analyzer/importResolver.js +29 -6
  22. package/dist/analyzer/importResolver.js.map +1 -1
  23. package/dist/analyzer/importResult.d.ts +1 -0
  24. package/dist/analyzer/operations.js +13 -7
  25. package/dist/analyzer/operations.js.map +1 -1
  26. package/dist/analyzer/parameterUtils.d.ts +15 -0
  27. package/dist/analyzer/parameterUtils.js +59 -1
  28. package/dist/analyzer/parameterUtils.js.map +1 -1
  29. package/dist/analyzer/parseTreeUtils.d.ts +2 -0
  30. package/dist/analyzer/parseTreeUtils.js +19 -0
  31. package/dist/analyzer/parseTreeUtils.js.map +1 -1
  32. package/dist/analyzer/program.d.ts +2 -0
  33. package/dist/analyzer/program.js +30 -4
  34. package/dist/analyzer/program.js.map +1 -1
  35. package/dist/analyzer/programTypes.d.ts +2 -2
  36. package/dist/analyzer/programTypes.js.map +1 -1
  37. package/dist/analyzer/properties.js +4 -10
  38. package/dist/analyzer/properties.js.map +1 -1
  39. package/dist/analyzer/service.d.ts +3 -4
  40. package/dist/analyzer/service.js +48 -47
  41. package/dist/analyzer/service.js.map +1 -1
  42. package/dist/analyzer/sourceFile.d.ts +2 -1
  43. package/dist/analyzer/sourceFile.js +3 -1
  44. package/dist/analyzer/sourceFile.js.map +1 -1
  45. package/dist/analyzer/typeEvaluator.js +165 -213
  46. package/dist/analyzer/typeEvaluator.js.map +1 -1
  47. package/dist/analyzer/typeEvaluatorTypes.d.ts +2 -1
  48. package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
  49. package/dist/analyzer/typeGuards.js +39 -18
  50. package/dist/analyzer/typeGuards.js.map +1 -1
  51. package/dist/analyzer/typeUtils.js +8 -7
  52. package/dist/analyzer/typeUtils.js.map +1 -1
  53. package/dist/analyzer/typeWalker.js +1 -1
  54. package/dist/analyzer/typeWalker.js.map +1 -1
  55. package/dist/analyzer/types.d.ts +6 -5
  56. package/dist/analyzer/types.js +15 -23
  57. package/dist/analyzer/types.js.map +1 -1
  58. package/dist/backgroundAnalysis.d.ts +2 -1
  59. package/dist/backgroundAnalysis.js +2 -1
  60. package/dist/backgroundAnalysis.js.map +1 -1
  61. package/dist/backgroundAnalysisBase.d.ts +4 -1
  62. package/dist/backgroundAnalysisBase.js +29 -0
  63. package/dist/backgroundAnalysisBase.js.map +1 -1
  64. package/dist/backgroundThreadBase.d.ts +3 -0
  65. package/dist/backgroundThreadBase.js +6 -5
  66. package/dist/backgroundThreadBase.js.map +1 -1
  67. package/dist/common/cancellationUtils.d.ts +3 -0
  68. package/dist/common/cancellationUtils.js +8 -1
  69. package/dist/common/cancellationUtils.js.map +1 -1
  70. package/dist/common/diagnostic.d.ts +4 -0
  71. package/dist/common/diagnostic.js +9 -0
  72. package/dist/common/diagnostic.js.map +1 -1
  73. package/dist/common/fullAccessHost.js +2 -14
  74. package/dist/common/fullAccessHost.js.map +1 -1
  75. package/dist/common/languageServerInterface.d.ts +0 -2
  76. package/dist/common/languageServerInterface.js.map +1 -1
  77. package/dist/common/processUtils.d.ts +3 -0
  78. package/dist/common/processUtils.js +61 -0
  79. package/dist/common/processUtils.js.map +1 -0
  80. package/dist/common/progressReporter.d.ts +2 -0
  81. package/dist/common/progressReporter.js +3 -0
  82. package/dist/common/progressReporter.js.map +1 -1
  83. package/dist/common/serviceKeys.d.ts +2 -0
  84. package/dist/common/serviceKeys.js +1 -0
  85. package/dist/common/serviceKeys.js.map +1 -1
  86. package/dist/common/serviceProviderExtensions.d.ts +2 -0
  87. package/dist/common/serviceProviderExtensions.js +9 -2
  88. package/dist/common/serviceProviderExtensions.js.map +1 -1
  89. package/dist/languageServerBase.d.ts +5 -2
  90. package/dist/languageServerBase.js +28 -21
  91. package/dist/languageServerBase.js.map +1 -1
  92. package/dist/languageService/tooltipUtils.js +2 -2
  93. package/dist/languageService/tooltipUtils.js.map +1 -1
  94. package/dist/localization/package.nls.cs.json +1 -1
  95. package/dist/localization/package.nls.de.json +6 -6
  96. package/dist/localization/package.nls.es.json +1 -1
  97. package/dist/localization/package.nls.fr.json +1 -1
  98. package/dist/localization/package.nls.it.json +1 -1
  99. package/dist/localization/package.nls.ja.json +1 -1
  100. package/dist/localization/package.nls.ko.json +1 -1
  101. package/dist/localization/package.nls.pl.json +1 -1
  102. package/dist/localization/package.nls.pt-br.json +1 -1
  103. package/dist/localization/package.nls.ru.json +1 -1
  104. package/dist/localization/package.nls.tr.json +1 -1
  105. package/dist/localization/package.nls.zh-cn.json +1 -1
  106. package/dist/localization/package.nls.zh-tw.json +1 -1
  107. package/dist/partialStubService.d.ts +0 -1
  108. package/dist/partialStubService.js +0 -28
  109. package/dist/partialStubService.js.map +1 -1
  110. package/dist/readonlyAugmentedFileSystem.js +4 -0
  111. package/dist/readonlyAugmentedFileSystem.js.map +1 -1
  112. package/dist/server.js +6 -3
  113. package/dist/server.js.map +1 -1
  114. package/dist/tests/checker.test.js +55 -10
  115. package/dist/tests/checker.test.js.map +1 -1
  116. package/dist/tests/fourslash/import.pytyped.privateSymbols.fourslash.js +18 -0
  117. package/dist/tests/fourslash/import.pytyped.privateSymbols.fourslash.js.map +1 -1
  118. package/dist/tests/languageServer.test.js +2 -2
  119. package/dist/tests/lsp/languageServer.js +2 -2
  120. package/dist/tests/lsp/languageServer.js.map +1 -1
  121. package/dist/tests/sourceFile.test.js +5 -4
  122. package/dist/tests/sourceFile.test.js.map +1 -1
  123. package/dist/tests/typeEvaluator1.test.js +5 -1
  124. package/dist/tests/typeEvaluator1.test.js.map +1 -1
  125. package/dist/tests/typeEvaluator3.test.js +2 -2
  126. package/dist/tests/typeEvaluator4.test.js +1 -1
  127. package/dist/tests/typeEvaluator5.test.js +1 -1
  128. package/dist/tests/typeEvaluator6.test.js +1 -1
  129. package/dist/workspaceFactory.d.ts +1 -1
  130. package/package.json +1 -1
@@ -92,6 +92,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
92
92
  this._scopedNodes = [];
93
93
  // A list of all visited type parameter lists.
94
94
  this._typeParamLists = [];
95
+ // A list of all visited multipart import statements.
96
+ this._multipartImports = [];
95
97
  this._moduleNode = parseResults.parseTree;
96
98
  this._fileInfo = AnalyzerNodeInfo.getFileInfo(this._moduleNode);
97
99
  }
@@ -116,6 +118,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
116
118
  // Perform a one-time validation of symbols in all scopes
117
119
  // defined in this module for things like unaccessed variables.
118
120
  this._validateSymbolTables();
121
+ this._reportUnusedMultipartImports();
119
122
  this._reportDuplicateImports();
120
123
  }
121
124
  walk(node) {
@@ -940,7 +943,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
940
943
  const typeResult = this._evaluator.getTypeResult(node.d.member);
941
944
  const type = typeResult?.type ?? types_1.UnknownType.create();
942
945
  const leftExprType = this._evaluator.getType(node.d.leftExpr);
943
- this._reportDeprecatedUseForType(node.d.member, type, leftExprType && (0, types_1.isModule)(leftExprType) && leftExprType.priv.moduleName === 'typing');
946
+ const moduleName = leftExprType && (0, types_1.isModule)(leftExprType) ? leftExprType.priv.moduleName : undefined;
947
+ const isImportedFromTyping = moduleName === 'typing' || moduleName === 'typing_extensions';
948
+ this._reportDeprecatedUseForType(node.d.member, type, isImportedFromTyping);
944
949
  if (typeResult?.memberAccessDeprecationInfo) {
945
950
  this._reportDeprecatedUseForMemberAccess(node.d.member, typeResult.memberAccessDeprecationInfo);
946
951
  }
@@ -952,6 +957,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
952
957
  visitImportAs(node) {
953
958
  this._conditionallyReportShadowedImport(node);
954
959
  this._evaluator.evaluateTypesForStatement(node);
960
+ const nameParts = node.d.module.d.nameParts;
961
+ if (nameParts.length > 1 && !node.d.alias) {
962
+ this._multipartImports.push(node);
963
+ }
955
964
  return true;
956
965
  }
957
966
  visitImportFrom(node) {
@@ -1009,7 +1018,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1009
1018
  let isImportFromTyping = false;
1010
1019
  if (node.parent?.nodeType === 25 /* ParseNodeType.ImportFrom */) {
1011
1020
  if (node.parent.d.module.d.leadingDots === 0 && node.parent.d.module.d.nameParts.length === 1) {
1012
- if (node.parent.d.module.d.nameParts[0].d.value === 'typing') {
1021
+ const namePart = node.parent.d.module.d.nameParts[0].d.value;
1022
+ if (namePart === 'typing' || namePart === 'typing_extensions') {
1013
1023
  isImportFromTyping = true;
1014
1024
  }
1015
1025
  }
@@ -1104,6 +1114,50 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1104
1114
  // Don't explore further.
1105
1115
  return false;
1106
1116
  }
1117
+ _reportUnusedMultipartImports() {
1118
+ this._multipartImports.forEach((node) => {
1119
+ const nameParts = node.d.module.d.nameParts;
1120
+ if (this._isMultipartImportUnused(node)) {
1121
+ const multipartName = nameParts.map((np) => np.d.value).join('.');
1122
+ let textRange = { start: nameParts[0].start, length: nameParts[0].length };
1123
+ textRange = textRange_1.TextRange.extend(textRange, nameParts[nameParts.length - 1]);
1124
+ this._fileInfo.diagnosticSink.addUnusedCodeWithTextRange(localize_1.LocMessage.unaccessedSymbol().format({ name: multipartName }), textRange, { action: "pyright.unusedImport" /* Commands.unusedImport */ });
1125
+ this._evaluator.addDiagnosticForTextRange(this._fileInfo, diagnosticRules_1.DiagnosticRule.reportUnusedImport, localize_1.LocMessage.unaccessedImport().format({ name: multipartName }), textRange);
1126
+ }
1127
+ });
1128
+ }
1129
+ _isMultipartImportUnused(node) {
1130
+ const nameParts = node.d.module.d.nameParts;
1131
+ (0, debug_1.assert)(nameParts.length > 1);
1132
+ // Get the top-level module type associated with this import.
1133
+ let moduleType = this._evaluator.evaluateTypeForSubnode(node, () => {
1134
+ this._evaluator.evaluateTypesForStatement(node);
1135
+ })?.type;
1136
+ if (!moduleType || !(0, types_1.isModule)(moduleType)) {
1137
+ return false;
1138
+ }
1139
+ // Walk the module hierarchy to get the submodules in the
1140
+ // multi-name import path until we get to the second-to-the-last
1141
+ // part.
1142
+ for (let i = 1; i < nameParts.length - 1; i++) {
1143
+ const symbol = types_1.ModuleType.getField(moduleType, nameParts[i].d.value);
1144
+ if (!symbol) {
1145
+ return false;
1146
+ }
1147
+ const submoduleType = symbol.getSynthesizedType();
1148
+ if (!submoduleType || !(0, types_1.isModule)(submoduleType.type)) {
1149
+ return false;
1150
+ }
1151
+ moduleType = submoduleType.type;
1152
+ }
1153
+ // Look up the last part of the import to get its symbol ID.
1154
+ const lastPartName = nameParts[nameParts.length - 1].d.value;
1155
+ const symbol = types_1.ModuleType.getField(moduleType, lastPartName);
1156
+ if (!symbol) {
1157
+ return false;
1158
+ }
1159
+ return !this._fileInfo.accessedSymbolSet.has(symbol.id);
1160
+ }
1107
1161
  _getImportResult(node, uri) {
1108
1162
  const execEnv = this._importResolver.getConfigOptions().findExecEnvironment(uri);
1109
1163
  const moduleNameNode = node.parent.d.module;
@@ -1330,6 +1384,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1330
1384
  // have overlapping types.
1331
1385
  _validateComparisonTypes(node) {
1332
1386
  let rightExpression = node.d.rightExpr;
1387
+ const assumeIsOperator = node.d.operator === 39 /* OperatorType.Is */ || node.d.operator === 40 /* OperatorType.IsNot */;
1333
1388
  // Check for chained comparisons.
1334
1389
  if (rightExpression.nodeType === 7 /* ParseNodeType.BinaryOperation */ &&
1335
1390
  !rightExpression.d.hasParens &&
@@ -1382,7 +1437,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1382
1437
  if (isComparable) {
1383
1438
  return;
1384
1439
  }
1385
- if (this._evaluator.isTypeComparable(leftSubtype, rightSubtype)) {
1440
+ if (this._evaluator.isTypeComparable(leftSubtype, rightSubtype, assumeIsOperator)) {
1386
1441
  isComparable = true;
1387
1442
  }
1388
1443
  return rightSubtype;
@@ -2481,15 +2536,12 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
2481
2536
  }
2482
2537
  }
2483
2538
  else {
2484
- // Handle multi-part names specially.
2485
2539
  const nameParts = decl.node.d.module.d.nameParts;
2486
- if (nameParts.length > 0) {
2487
- const multipartName = nameParts.map((np) => np.d.value).join('.');
2488
- let textRange = { start: nameParts[0].start, length: nameParts[0].length };
2489
- textRange = textRange_1.TextRange.extend(textRange, nameParts[nameParts.length - 1]);
2490
- this._fileInfo.diagnosticSink.addUnusedCodeWithTextRange(localize_1.LocMessage.unaccessedSymbol().format({ name: multipartName }), textRange, { action: "pyright.unusedImport" /* Commands.unusedImport */ });
2491
- this._evaluator.addDiagnosticForTextRange(this._fileInfo, diagnosticRules_1.DiagnosticRule.reportUnusedImport, localize_1.LocMessage.unaccessedImport().format({ name: multipartName }), textRange);
2492
- return;
2540
+ // Multi-part imports are handled separately, so ignore those here.
2541
+ if (nameParts.length === 1) {
2542
+ nameNode = nameParts[0];
2543
+ this._evaluator.addDiagnostic(diagnosticRules_1.DiagnosticRule.reportUnusedImport, localize_1.LocMessage.unaccessedImport().format({ name: nameNode.d.value }), nameNode);
2544
+ message = localize_1.LocMessage.unaccessedImport().format({ name: nameNode.d.value });
2493
2545
  }
2494
2546
  }
2495
2547
  }
@@ -3329,9 +3381,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3329
3381
  // If the function consists entirely of "...", assume that it's
3330
3382
  // an abstract method or a protocol method and don't require that
3331
3383
  // the return type matches. This check can also be skipped for an overload.
3332
- if (!ParseTreeUtils.isSuiteEmpty(node.d.suite) &&
3333
- !types_1.FunctionType.isOverloaded(functionType) &&
3334
- !types_1.FunctionType.isAsync(functionType)) {
3384
+ if (!ParseTreeUtils.isSuiteEmpty(node.d.suite) && !types_1.FunctionType.isOverloaded(functionType)) {
3335
3385
  this._evaluator.addDiagnostic(diagnosticRules_1.DiagnosticRule.reportReturnType, localize_1.LocMessage.noReturnReturnsNone(), returnAnnotation);
3336
3386
  }
3337
3387
  }
@@ -4556,8 +4606,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4556
4606
  return;
4557
4607
  }
4558
4608
  const baseClass = baseClassAndSymbol.classType;
4609
+ const baseClassSelf = types_1.ClassType.cloneAsInstance((0, typeUtils_1.selfSpecializeClass)(baseClass, { useBoundTypeVars: true }));
4559
4610
  const childClassSelf = types_1.ClassType.cloneAsInstance((0, typeUtils_1.selfSpecializeClass)(childClassType, { useBoundTypeVars: true }));
4560
- let baseType = (0, typeUtils_1.partiallySpecializeType)(this._evaluator.getEffectiveTypeOfSymbol(baseClassAndSymbol.symbol), baseClass, this._evaluator.getTypeClassType(), childClassSelf);
4611
+ let baseType = (0, typeUtils_1.partiallySpecializeType)(this._evaluator.getEffectiveTypeOfSymbol(baseClassAndSymbol.symbol), baseClass, this._evaluator.getTypeClassType(), baseClassSelf);
4561
4612
  overrideType = (0, typeUtils_1.partiallySpecializeType)(overrideType, childClassType, this._evaluator.getTypeClassType(), childClassSelf);
4562
4613
  if (childClassType.shared.typeVarScopeId) {
4563
4614
  overrideType = (0, typeUtils_1.makeTypeVarsBound)(overrideType, [childClassType.shared.typeVarScopeId]);