@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.
- package/dist/analyzer/analyzerFileInfo.d.ts +1 -0
- package/dist/analyzer/analyzerFileInfo.js.map +1 -1
- package/dist/analyzer/binder.js +21 -13
- package/dist/analyzer/binder.js.map +1 -1
- package/dist/analyzer/checker.d.ts +3 -0
- package/dist/analyzer/checker.js +58 -9
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/codeFlowTypes.d.ts +2 -2
- package/dist/analyzer/codeFlowTypes.js +9 -0
- package/dist/analyzer/codeFlowTypes.js.map +1 -1
- package/dist/analyzer/constructorTransform.js +1 -1
- package/dist/analyzer/constructorTransform.js.map +1 -1
- package/dist/analyzer/constructors.js +7 -1
- package/dist/analyzer/constructors.js.map +1 -1
- package/dist/analyzer/declaration.d.ts +1 -1
- package/dist/analyzer/declaration.js.map +1 -1
- package/dist/analyzer/importResolver.d.ts +2 -0
- package/dist/analyzer/importResolver.js +29 -6
- package/dist/analyzer/importResolver.js.map +1 -1
- package/dist/analyzer/importResult.d.ts +1 -0
- package/dist/analyzer/operations.js +10 -2
- package/dist/analyzer/operations.js.map +1 -1
- package/dist/analyzer/parameterUtils.d.ts +15 -0
- package/dist/analyzer/parameterUtils.js +59 -1
- package/dist/analyzer/parameterUtils.js.map +1 -1
- package/dist/analyzer/parseTreeUtils.d.ts +2 -0
- package/dist/analyzer/parseTreeUtils.js +19 -0
- package/dist/analyzer/parseTreeUtils.js.map +1 -1
- package/dist/analyzer/program.js +17 -4
- package/dist/analyzer/program.js.map +1 -1
- package/dist/analyzer/programTypes.d.ts +2 -2
- package/dist/analyzer/programTypes.js.map +1 -1
- package/dist/analyzer/service.d.ts +3 -3
- package/dist/analyzer/service.js +16 -6
- package/dist/analyzer/service.js.map +1 -1
- package/dist/analyzer/sourceFile.d.ts +2 -1
- package/dist/analyzer/sourceFile.js +3 -1
- package/dist/analyzer/sourceFile.js.map +1 -1
- package/dist/analyzer/typeEvaluator.js +236 -245
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +3 -1
- package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
- package/dist/analyzer/typeUtils.js +8 -7
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/analyzer/typeWalker.js +1 -1
- package/dist/analyzer/typeWalker.js.map +1 -1
- package/dist/analyzer/types.d.ts +6 -5
- package/dist/analyzer/types.js +15 -23
- package/dist/analyzer/types.js.map +1 -1
- package/dist/common/cancellationUtils.d.ts +3 -0
- package/dist/common/cancellationUtils.js +8 -1
- package/dist/common/cancellationUtils.js.map +1 -1
- package/dist/common/languageServerInterface.d.ts +0 -2
- package/dist/common/languageServerInterface.js.map +1 -1
- package/dist/common/serviceKeys.d.ts +2 -0
- package/dist/common/serviceKeys.js +1 -0
- package/dist/common/serviceKeys.js.map +1 -1
- package/dist/common/serviceProviderExtensions.d.ts +2 -0
- package/dist/common/serviceProviderExtensions.js +9 -2
- package/dist/common/serviceProviderExtensions.js.map +1 -1
- package/dist/languageServerBase.d.ts +7 -3
- package/dist/languageServerBase.js +126 -5
- package/dist/languageServerBase.js.map +1 -1
- package/dist/languageService/tooltipUtils.js +2 -2
- package/dist/languageService/tooltipUtils.js.map +1 -1
- package/dist/localization/package.nls.cs.json +1 -1
- package/dist/localization/package.nls.de.json +1 -1
- package/dist/localization/package.nls.es.json +1 -1
- package/dist/localization/package.nls.fr.json +1 -1
- package/dist/localization/package.nls.it.json +1 -1
- package/dist/localization/package.nls.ja.json +1 -1
- package/dist/localization/package.nls.ko.json +1 -1
- package/dist/localization/package.nls.pl.json +1 -1
- package/dist/localization/package.nls.pt-br.json +1 -1
- package/dist/localization/package.nls.ru.json +1 -1
- package/dist/localization/package.nls.tr.json +1 -1
- package/dist/localization/package.nls.zh-cn.json +1 -1
- package/dist/localization/package.nls.zh-tw.json +1 -1
- package/dist/pyright.js +9 -3
- package/dist/pyright.js.map +1 -1
- package/dist/readonlyAugmentedFileSystem.js +4 -0
- package/dist/readonlyAugmentedFileSystem.js.map +1 -1
- package/dist/server.js +1 -2
- package/dist/server.js.map +1 -1
- package/dist/tests/checker.test.js +11 -0
- package/dist/tests/checker.test.js.map +1 -1
- package/dist/tests/fourslash/import.pytyped.privateSymbols.fourslash.js +18 -0
- package/dist/tests/fourslash/import.pytyped.privateSymbols.fourslash.js.map +1 -1
- package/dist/tests/languageServer.test.js +97 -57
- package/dist/tests/languageServer.test.js.map +1 -1
- package/dist/tests/lsp/customLsp.d.ts +8 -1
- package/dist/tests/lsp/customLsp.js +1 -0
- package/dist/tests/lsp/customLsp.js.map +1 -1
- package/dist/tests/lsp/languageServer.js +12 -0
- package/dist/tests/lsp/languageServer.js.map +1 -1
- package/dist/tests/lsp/languageServerTestUtils.d.ts +7 -3
- package/dist/tests/lsp/languageServerTestUtils.js +90 -6
- package/dist/tests/lsp/languageServerTestUtils.js.map +1 -1
- package/dist/tests/sourceFile.test.js +5 -4
- package/dist/tests/sourceFile.test.js.map +1 -1
- package/dist/tests/typeEvaluator1.test.js +6 -2
- package/dist/tests/typeEvaluator1.test.js.map +1 -1
- package/dist/tests/typeEvaluator4.test.js +1 -1
- package/dist/tests/typeEvaluator5.test.js +1 -1
- package/dist/tests/typeEvaluator6.test.js +1 -1
- package/dist/types.d.ts +6 -2
- package/package.json +1 -1
package/dist/analyzer/checker.js
CHANGED
@@ -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
|
-
|
2487
|
-
|
2488
|
-
|
2489
|
-
|
2490
|
-
|
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
|
}
|