@zzzen/pyright-internal 1.2.0-dev.20250309 → 1.2.0-dev.20250323

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 (107) hide show
  1. package/dist/analyzer/analyzerFileInfo.d.ts +1 -0
  2. package/dist/analyzer/analyzerFileInfo.js.map +1 -1
  3. package/dist/analyzer/binder.js +21 -13
  4. package/dist/analyzer/binder.js.map +1 -1
  5. package/dist/analyzer/checker.d.ts +3 -0
  6. package/dist/analyzer/checker.js +58 -9
  7. package/dist/analyzer/checker.js.map +1 -1
  8. package/dist/analyzer/codeFlowTypes.d.ts +2 -2
  9. package/dist/analyzer/codeFlowTypes.js +9 -0
  10. package/dist/analyzer/codeFlowTypes.js.map +1 -1
  11. package/dist/analyzer/constructorTransform.js +1 -1
  12. package/dist/analyzer/constructorTransform.js.map +1 -1
  13. package/dist/analyzer/constructors.js +7 -1
  14. package/dist/analyzer/constructors.js.map +1 -1
  15. package/dist/analyzer/declaration.d.ts +1 -1
  16. package/dist/analyzer/declaration.js.map +1 -1
  17. package/dist/analyzer/importResolver.d.ts +2 -0
  18. package/dist/analyzer/importResolver.js +29 -6
  19. package/dist/analyzer/importResolver.js.map +1 -1
  20. package/dist/analyzer/importResult.d.ts +1 -0
  21. package/dist/analyzer/operations.js +10 -2
  22. package/dist/analyzer/operations.js.map +1 -1
  23. package/dist/analyzer/parameterUtils.d.ts +15 -0
  24. package/dist/analyzer/parameterUtils.js +59 -1
  25. package/dist/analyzer/parameterUtils.js.map +1 -1
  26. package/dist/analyzer/parseTreeUtils.d.ts +2 -0
  27. package/dist/analyzer/parseTreeUtils.js +19 -0
  28. package/dist/analyzer/parseTreeUtils.js.map +1 -1
  29. package/dist/analyzer/program.js +17 -4
  30. package/dist/analyzer/program.js.map +1 -1
  31. package/dist/analyzer/programTypes.d.ts +2 -2
  32. package/dist/analyzer/programTypes.js.map +1 -1
  33. package/dist/analyzer/service.d.ts +3 -3
  34. package/dist/analyzer/service.js +16 -6
  35. package/dist/analyzer/service.js.map +1 -1
  36. package/dist/analyzer/sourceFile.d.ts +2 -1
  37. package/dist/analyzer/sourceFile.js +3 -1
  38. package/dist/analyzer/sourceFile.js.map +1 -1
  39. package/dist/analyzer/typeEvaluator.js +236 -245
  40. package/dist/analyzer/typeEvaluator.js.map +1 -1
  41. package/dist/analyzer/typeEvaluatorTypes.d.ts +3 -1
  42. package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
  43. package/dist/analyzer/typeUtils.js +8 -7
  44. package/dist/analyzer/typeUtils.js.map +1 -1
  45. package/dist/analyzer/typeWalker.js +1 -1
  46. package/dist/analyzer/typeWalker.js.map +1 -1
  47. package/dist/analyzer/types.d.ts +6 -5
  48. package/dist/analyzer/types.js +15 -23
  49. package/dist/analyzer/types.js.map +1 -1
  50. package/dist/common/cancellationUtils.d.ts +3 -0
  51. package/dist/common/cancellationUtils.js +8 -1
  52. package/dist/common/cancellationUtils.js.map +1 -1
  53. package/dist/common/languageServerInterface.d.ts +0 -2
  54. package/dist/common/languageServerInterface.js.map +1 -1
  55. package/dist/common/serviceKeys.d.ts +2 -0
  56. package/dist/common/serviceKeys.js +1 -0
  57. package/dist/common/serviceKeys.js.map +1 -1
  58. package/dist/common/serviceProviderExtensions.d.ts +2 -0
  59. package/dist/common/serviceProviderExtensions.js +9 -2
  60. package/dist/common/serviceProviderExtensions.js.map +1 -1
  61. package/dist/languageServerBase.d.ts +7 -3
  62. package/dist/languageServerBase.js +126 -5
  63. package/dist/languageServerBase.js.map +1 -1
  64. package/dist/languageService/tooltipUtils.js +2 -2
  65. package/dist/languageService/tooltipUtils.js.map +1 -1
  66. package/dist/localization/package.nls.cs.json +1 -1
  67. package/dist/localization/package.nls.de.json +1 -1
  68. package/dist/localization/package.nls.es.json +1 -1
  69. package/dist/localization/package.nls.fr.json +1 -1
  70. package/dist/localization/package.nls.it.json +1 -1
  71. package/dist/localization/package.nls.ja.json +1 -1
  72. package/dist/localization/package.nls.ko.json +1 -1
  73. package/dist/localization/package.nls.pl.json +1 -1
  74. package/dist/localization/package.nls.pt-br.json +1 -1
  75. package/dist/localization/package.nls.ru.json +1 -1
  76. package/dist/localization/package.nls.tr.json +1 -1
  77. package/dist/localization/package.nls.zh-cn.json +1 -1
  78. package/dist/localization/package.nls.zh-tw.json +1 -1
  79. package/dist/pyright.js +9 -3
  80. package/dist/pyright.js.map +1 -1
  81. package/dist/readonlyAugmentedFileSystem.js +4 -0
  82. package/dist/readonlyAugmentedFileSystem.js.map +1 -1
  83. package/dist/server.js +1 -2
  84. package/dist/server.js.map +1 -1
  85. package/dist/tests/checker.test.js +11 -0
  86. package/dist/tests/checker.test.js.map +1 -1
  87. package/dist/tests/fourslash/import.pytyped.privateSymbols.fourslash.js +18 -0
  88. package/dist/tests/fourslash/import.pytyped.privateSymbols.fourslash.js.map +1 -1
  89. package/dist/tests/languageServer.test.js +97 -57
  90. package/dist/tests/languageServer.test.js.map +1 -1
  91. package/dist/tests/lsp/customLsp.d.ts +8 -1
  92. package/dist/tests/lsp/customLsp.js +1 -0
  93. package/dist/tests/lsp/customLsp.js.map +1 -1
  94. package/dist/tests/lsp/languageServer.js +12 -0
  95. package/dist/tests/lsp/languageServer.js.map +1 -1
  96. package/dist/tests/lsp/languageServerTestUtils.d.ts +7 -3
  97. package/dist/tests/lsp/languageServerTestUtils.js +90 -6
  98. package/dist/tests/lsp/languageServerTestUtils.js.map +1 -1
  99. package/dist/tests/sourceFile.test.js +5 -4
  100. package/dist/tests/sourceFile.test.js.map +1 -1
  101. package/dist/tests/typeEvaluator1.test.js +6 -2
  102. package/dist/tests/typeEvaluator1.test.js.map +1 -1
  103. package/dist/tests/typeEvaluator4.test.js +1 -1
  104. package/dist/tests/typeEvaluator5.test.js +1 -1
  105. package/dist/tests/typeEvaluator6.test.js +1 -1
  106. package/dist/types.d.ts +6 -2
  107. 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) {
@@ -952,6 +955,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
952
955
  visitImportAs(node) {
953
956
  this._conditionallyReportShadowedImport(node);
954
957
  this._evaluator.evaluateTypesForStatement(node);
958
+ const nameParts = node.d.module.d.nameParts;
959
+ if (nameParts.length > 1 && !node.d.alias) {
960
+ this._multipartImports.push(node);
961
+ }
955
962
  return true;
956
963
  }
957
964
  visitImportFrom(node) {
@@ -1104,6 +1111,50 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1104
1111
  // Don't explore further.
1105
1112
  return false;
1106
1113
  }
1114
+ _reportUnusedMultipartImports() {
1115
+ this._multipartImports.forEach((node) => {
1116
+ const nameParts = node.d.module.d.nameParts;
1117
+ if (this._isMultipartImportUnused(node)) {
1118
+ const multipartName = nameParts.map((np) => np.d.value).join('.');
1119
+ let textRange = { start: nameParts[0].start, length: nameParts[0].length };
1120
+ textRange = textRange_1.TextRange.extend(textRange, nameParts[nameParts.length - 1]);
1121
+ this._fileInfo.diagnosticSink.addUnusedCodeWithTextRange(localize_1.LocMessage.unaccessedSymbol().format({ name: multipartName }), textRange, { action: "pyright.unusedImport" /* Commands.unusedImport */ });
1122
+ this._evaluator.addDiagnosticForTextRange(this._fileInfo, diagnosticRules_1.DiagnosticRule.reportUnusedImport, localize_1.LocMessage.unaccessedImport().format({ name: multipartName }), textRange);
1123
+ }
1124
+ });
1125
+ }
1126
+ _isMultipartImportUnused(node) {
1127
+ const nameParts = node.d.module.d.nameParts;
1128
+ (0, debug_1.assert)(nameParts.length > 1);
1129
+ // Get the top-level module type associated with this import.
1130
+ let moduleType = this._evaluator.evaluateTypeForSubnode(node, () => {
1131
+ this._evaluator.evaluateTypesForStatement(node);
1132
+ })?.type;
1133
+ if (!moduleType || !(0, types_1.isModule)(moduleType)) {
1134
+ return false;
1135
+ }
1136
+ // Walk the module hierarchy to get the submodules in the
1137
+ // multi-name import path until we get to the second-to-the-last
1138
+ // part.
1139
+ for (let i = 1; i < nameParts.length - 1; i++) {
1140
+ const symbol = types_1.ModuleType.getField(moduleType, nameParts[i].d.value);
1141
+ if (!symbol) {
1142
+ return false;
1143
+ }
1144
+ const submoduleType = symbol.getSynthesizedType();
1145
+ if (!submoduleType || !(0, types_1.isModule)(submoduleType.type)) {
1146
+ return false;
1147
+ }
1148
+ moduleType = submoduleType.type;
1149
+ }
1150
+ // Look up the last part of the import to get its symbol ID.
1151
+ const lastPartName = nameParts[nameParts.length - 1].d.value;
1152
+ const symbol = types_1.ModuleType.getField(moduleType, lastPartName);
1153
+ if (!symbol) {
1154
+ return false;
1155
+ }
1156
+ return !this._fileInfo.accessedSymbolSet.has(symbol.id);
1157
+ }
1107
1158
  _getImportResult(node, uri) {
1108
1159
  const execEnv = this._importResolver.getConfigOptions().findExecEnvironment(uri);
1109
1160
  const moduleNameNode = node.parent.d.module;
@@ -1330,6 +1381,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1330
1381
  // have overlapping types.
1331
1382
  _validateComparisonTypes(node) {
1332
1383
  let rightExpression = node.d.rightExpr;
1384
+ const assumeIsOperator = node.d.operator === 39 /* OperatorType.Is */ || node.d.operator === 40 /* OperatorType.IsNot */;
1333
1385
  // Check for chained comparisons.
1334
1386
  if (rightExpression.nodeType === 7 /* ParseNodeType.BinaryOperation */ &&
1335
1387
  !rightExpression.d.hasParens &&
@@ -1382,7 +1434,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
1382
1434
  if (isComparable) {
1383
1435
  return;
1384
1436
  }
1385
- if (this._evaluator.isTypeComparable(leftSubtype, rightSubtype)) {
1437
+ if (this._evaluator.isTypeComparable(leftSubtype, rightSubtype, assumeIsOperator)) {
1386
1438
  isComparable = true;
1387
1439
  }
1388
1440
  return rightSubtype;
@@ -2481,15 +2533,12 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
2481
2533
  }
2482
2534
  }
2483
2535
  else {
2484
- // Handle multi-part names specially.
2485
2536
  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;
2537
+ // Multi-part imports are handled separately, so ignore those here.
2538
+ if (nameParts.length === 1) {
2539
+ nameNode = nameParts[0];
2540
+ this._evaluator.addDiagnostic(diagnosticRules_1.DiagnosticRule.reportUnusedImport, localize_1.LocMessage.unaccessedImport().format({ name: nameNode.d.value }), nameNode);
2541
+ message = localize_1.LocMessage.unaccessedImport().format({ name: nameNode.d.value });
2493
2542
  }
2494
2543
  }
2495
2544
  }