@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.
- package/dist/analyzer/analyzerFileInfo.d.ts +1 -0
- package/dist/analyzer/analyzerFileInfo.js.map +1 -1
- package/dist/analyzer/backgroundAnalysisProgram.d.ts +1 -0
- package/dist/analyzer/backgroundAnalysisProgram.js +6 -0
- package/dist/analyzer/backgroundAnalysisProgram.js.map +1 -1
- package/dist/analyzer/binder.js +37 -13
- package/dist/analyzer/binder.js.map +1 -1
- package/dist/analyzer/checker.d.ts +3 -0
- package/dist/analyzer/checker.js +66 -15
- 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/constraintSolver.js +1 -1
- package/dist/analyzer/constraintSolver.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/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 +13 -7
- 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.d.ts +2 -0
- package/dist/analyzer/program.js +30 -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/properties.js +4 -10
- package/dist/analyzer/properties.js.map +1 -1
- package/dist/analyzer/service.d.ts +3 -4
- package/dist/analyzer/service.js +48 -47
- 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 +165 -213
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +2 -1
- package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
- package/dist/analyzer/typeGuards.js +39 -18
- package/dist/analyzer/typeGuards.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/backgroundAnalysis.d.ts +2 -1
- package/dist/backgroundAnalysis.js +2 -1
- package/dist/backgroundAnalysis.js.map +1 -1
- package/dist/backgroundAnalysisBase.d.ts +4 -1
- package/dist/backgroundAnalysisBase.js +29 -0
- package/dist/backgroundAnalysisBase.js.map +1 -1
- package/dist/backgroundThreadBase.d.ts +3 -0
- package/dist/backgroundThreadBase.js +6 -5
- package/dist/backgroundThreadBase.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/diagnostic.d.ts +4 -0
- package/dist/common/diagnostic.js +9 -0
- package/dist/common/diagnostic.js.map +1 -1
- package/dist/common/fullAccessHost.js +2 -14
- package/dist/common/fullAccessHost.js.map +1 -1
- package/dist/common/languageServerInterface.d.ts +0 -2
- package/dist/common/languageServerInterface.js.map +1 -1
- package/dist/common/processUtils.d.ts +3 -0
- package/dist/common/processUtils.js +61 -0
- package/dist/common/processUtils.js.map +1 -0
- package/dist/common/progressReporter.d.ts +2 -0
- package/dist/common/progressReporter.js +3 -0
- package/dist/common/progressReporter.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 +5 -2
- package/dist/languageServerBase.js +28 -21
- 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 +6 -6
- 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/partialStubService.d.ts +0 -1
- package/dist/partialStubService.js +0 -28
- package/dist/partialStubService.js.map +1 -1
- package/dist/readonlyAugmentedFileSystem.js +4 -0
- package/dist/readonlyAugmentedFileSystem.js.map +1 -1
- package/dist/server.js +6 -3
- package/dist/server.js.map +1 -1
- package/dist/tests/checker.test.js +55 -10
- 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 +2 -2
- package/dist/tests/lsp/languageServer.js +2 -2
- package/dist/tests/lsp/languageServer.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 +5 -1
- package/dist/tests/typeEvaluator1.test.js.map +1 -1
- package/dist/tests/typeEvaluator3.test.js +2 -2
- 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/workspaceFactory.d.ts +1 -1
- 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) {
|
@@ -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
|
-
|
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
|
-
|
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
|
-
|
2487
|
-
|
2488
|
-
|
2489
|
-
|
2490
|
-
|
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(),
|
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]);
|