@zzzen/pyright-internal 1.2.0-dev.20240526 → 1.2.0-dev.20240609
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/analyzerNodeInfo.d.ts +2 -2
- package/dist/analyzer/binder.d.ts +3 -3
- package/dist/analyzer/binder.js +46 -40
- package/dist/analyzer/binder.js.map +1 -1
- package/dist/analyzer/checker.d.ts +3 -3
- package/dist/analyzer/checker.js +82 -65
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/codeFlowEngine.js +4 -4
- package/dist/analyzer/codeFlowTypes.js +3 -3
- package/dist/analyzer/constraintSolver.js +26 -34
- 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 +12 -8
- package/dist/analyzer/constructors.js.map +1 -1
- package/dist/analyzer/dataClasses.js +1 -1
- package/dist/analyzer/dataClasses.js.map +1 -1
- package/dist/analyzer/declarationUtils.js +3 -3
- package/dist/analyzer/enums.d.ts +1 -1
- package/dist/analyzer/enums.js +25 -22
- package/dist/analyzer/enums.js.map +1 -1
- package/dist/analyzer/importResolver.d.ts +1 -0
- package/dist/analyzer/importResolver.js +6 -3
- package/dist/analyzer/importResolver.js.map +1 -1
- package/dist/analyzer/importStatementUtils.js +6 -6
- package/dist/analyzer/namedTuples.js +2 -2
- package/dist/analyzer/operations.js +8 -9
- package/dist/analyzer/operations.js.map +1 -1
- package/dist/analyzer/parameterUtils.js +1 -13
- package/dist/analyzer/parameterUtils.js.map +1 -1
- package/dist/analyzer/parseTreeUtils.d.ts +1 -1
- package/dist/analyzer/parseTreeUtils.js +94 -94
- package/dist/analyzer/parseTreeUtils.js.map +1 -1
- package/dist/analyzer/parseTreeWalker.d.ts +5 -5
- package/dist/analyzer/parseTreeWalker.js +64 -64
- package/dist/analyzer/parseTreeWalker.js.map +1 -1
- package/dist/analyzer/patternMatching.js +5 -5
- package/dist/analyzer/patternMatching.js.map +1 -1
- package/dist/analyzer/program.d.ts +1 -1
- package/dist/analyzer/program.js +23 -29
- package/dist/analyzer/program.js.map +1 -1
- package/dist/analyzer/properties.js +2 -2
- package/dist/analyzer/properties.js.map +1 -1
- package/dist/analyzer/protocols.js +2 -2
- package/dist/analyzer/protocols.js.map +1 -1
- package/dist/analyzer/scope.d.ts +1 -1
- package/dist/analyzer/scope.js +2 -2
- package/dist/analyzer/scope.js.map +1 -1
- package/dist/analyzer/sourceFile.js +3 -3
- package/dist/analyzer/sourceFile.js.map +1 -1
- package/dist/analyzer/sourceMapper.js +4 -4
- package/dist/analyzer/staticExpressions.js +3 -3
- package/dist/analyzer/testWalker.js +1 -1
- package/dist/analyzer/tracePrinter.js +4 -4
- package/dist/analyzer/typeDocStringUtils.js +1 -1
- package/dist/analyzer/typeEvaluator.js +568 -519
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +2 -3
- package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
- package/dist/analyzer/typeGuards.js +9 -8
- package/dist/analyzer/typeGuards.js.map +1 -1
- package/dist/analyzer/typePrinter.js +21 -14
- package/dist/analyzer/typePrinter.js.map +1 -1
- package/dist/analyzer/typeStubWriter.js +1 -1
- package/dist/analyzer/typeUtils.d.ts +4 -5
- package/dist/analyzer/typeUtils.js +100 -128
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/analyzer/typeVarContext.js +4 -0
- package/dist/analyzer/typeVarContext.js.map +1 -1
- package/dist/analyzer/typedDicts.d.ts +1 -2
- package/dist/analyzer/typedDicts.js +5 -17
- package/dist/analyzer/typedDicts.js.map +1 -1
- package/dist/analyzer/types.d.ts +11 -12
- package/dist/analyzer/types.js +137 -169
- package/dist/analyzer/types.js.map +1 -1
- package/dist/backgroundAnalysisBase.d.ts +1 -1
- package/dist/backgroundAnalysisBase.js +3 -3
- package/dist/commands/dumpFileDebugInfoCommand.d.ts +1 -1
- package/dist/commands/dumpFileDebugInfoCommand.js +15 -15
- package/dist/commands/dumpFileDebugInfoCommand.js.map +1 -1
- package/dist/common/configOptions.d.ts +2 -1
- package/dist/common/configOptions.js +12 -3
- package/dist/common/configOptions.js.map +1 -1
- package/dist/common/realFileSystem.d.ts +3 -3
- package/dist/common/realFileSystem.js +6 -6
- package/dist/common/realFileSystem.js.map +1 -1
- package/dist/common/textEditTracker.js +5 -5
- package/dist/common/uri/fileUri.js +1 -0
- package/dist/common/uri/fileUri.js.map +1 -1
- package/dist/common/uri/uri.d.ts +3 -0
- package/dist/common/uri/uri.js +16 -0
- package/dist/common/uri/uri.js.map +1 -1
- package/dist/languageServerBase.js +1 -1
- package/dist/languageServerBase.js.map +1 -1
- package/dist/languageService/autoImporter.js +4 -4
- package/dist/languageService/callHierarchyProvider.js +1 -1
- package/dist/languageService/completionProvider.js +30 -30
- package/dist/languageService/completionProvider.js.map +1 -1
- package/dist/languageService/documentSymbolCollector.js +7 -7
- package/dist/languageService/hoverProvider.js +2 -2
- package/dist/languageService/importSorter.js +1 -1
- package/dist/languageService/referencesProvider.js +4 -4
- package/dist/languageService/referencesProvider.js.map +1 -1
- package/dist/languageService/symbolIndexer.js +3 -3
- package/dist/languageService/tooltipUtils.js +2 -2
- package/dist/languageService/workspaceSymbolProvider.js +1 -1
- package/dist/localization/localize.d.ts +7 -1
- package/dist/localization/localize.js +4 -1
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.cs.json +5 -3
- package/dist/localization/package.nls.de.json +5 -3
- package/dist/localization/package.nls.en-us.json +4 -1
- package/dist/localization/package.nls.es.json +5 -3
- package/dist/localization/package.nls.fr.json +5 -3
- package/dist/localization/package.nls.it.json +5 -3
- package/dist/localization/package.nls.ja.json +5 -3
- package/dist/localization/package.nls.ko.json +6 -4
- package/dist/localization/package.nls.pl.json +5 -3
- package/dist/localization/package.nls.pt-br.json +5 -3
- package/dist/localization/package.nls.qps-ploc.json +5 -3
- package/dist/localization/package.nls.ru.json +5 -3
- package/dist/localization/package.nls.tr.json +5 -3
- package/dist/localization/package.nls.zh-cn.json +5 -3
- package/dist/localization/package.nls.zh-tw.json +5 -3
- package/dist/parser/parseNodes.d.ts +42 -42
- package/dist/parser/parseNodes.js +69 -69
- package/dist/parser/parseNodes.js.map +1 -1
- package/dist/parser/parser.d.ts +1 -1
- package/dist/parser/parser.js +35 -35
- package/dist/parser/parser.js.map +1 -1
- package/dist/pyright.js +6 -3
- package/dist/pyright.js.map +1 -1
- package/dist/tests/classDeclaration.test.js +1 -1
- package/dist/tests/config.test.js +2 -2
- package/dist/tests/config.test.js.map +1 -1
- package/dist/tests/diagnosticOverrides.test.js +7 -6
- package/dist/tests/diagnosticOverrides.test.js.map +1 -1
- package/dist/tests/importResolver.test.js +16 -0
- package/dist/tests/importResolver.test.js.map +1 -1
- package/dist/tests/parseTreeUtils.test.js +4 -4
- package/dist/tests/parser.test.js +3 -3
- package/dist/tests/testState.test.js +1 -1
- package/dist/tests/testState.test.js.map +1 -1
- package/dist/tests/testUtils.js +1 -1
- package/dist/tests/testUtils.js.map +1 -1
- package/dist/tests/typeEvaluator2.test.js +9 -1
- package/dist/tests/typeEvaluator2.test.js.map +1 -1
- package/dist/tests/typeEvaluator3.test.js +8 -0
- package/dist/tests/typeEvaluator3.test.js.map +1 -1
- package/dist/tests/typeEvaluator4.test.js +7 -3
- package/dist/tests/typeEvaluator4.test.js.map +1 -1
- package/dist/tests/typeEvaluator7.test.js +15 -15
- package/dist/tests/typeEvaluator7.test.js.map +1 -1
- package/dist/tests/typePrinter.test.js +2 -2
- package/dist/tests/typePrinter.test.js.map +1 -1
- package/dist/tests/uri.test.js +11 -3
- package/dist/tests/uri.test.js.map +1 -1
- package/dist/workspaceFactory.js +16 -14
- package/dist/workspaceFactory.js.map +1 -1
- package/package.json +1 -1
package/dist/analyzer/checker.js
CHANGED
@@ -102,7 +102,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
102
102
|
console.log(`Code complexity of module ${this._fileInfo.fileUri.toUserVisibleString()} is ${codeComplexity.toString()}`);
|
103
103
|
}
|
104
104
|
if (codeComplexity > typeEvaluator_1.maxCodeComplexity) {
|
105
|
-
this._evaluator.addDiagnosticForTextRange(this._fileInfo,
|
105
|
+
this._evaluator.addDiagnosticForTextRange(this._fileInfo, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.codeTooComplexToAnalyze(), { start: 0, length: 0 });
|
106
106
|
}
|
107
107
|
this._walkStatementsAndReportUnreachable(this._moduleNode.statements);
|
108
108
|
// Mark symbols accessed by __all__ as accessed.
|
@@ -493,7 +493,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
493
493
|
visitFor(node) {
|
494
494
|
this._evaluator.evaluateTypesForStatement(node);
|
495
495
|
if (node.typeComment) {
|
496
|
-
this._evaluator.addDiagnosticForTextRange(this._fileInfo,
|
496
|
+
this._evaluator.addDiagnosticForTextRange(this._fileInfo, diagnosticRules_1.DiagnosticRule.reportInvalidTypeForm, localize_1.LocMessage.annotationNotSupported(), node.typeComment);
|
497
497
|
}
|
498
498
|
return true;
|
499
499
|
}
|
@@ -509,11 +509,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
509
509
|
this._validateIllegalDefaultParamInitializer(node);
|
510
510
|
return true;
|
511
511
|
}
|
512
|
-
|
512
|
+
visitComprehension(node) {
|
513
513
|
this._scopedNodes.push(node);
|
514
514
|
return true;
|
515
515
|
}
|
516
|
-
|
516
|
+
visitComprehensionIf(node) {
|
517
517
|
this._validateConditionalIsBool(node.testExpression);
|
518
518
|
this._reportUnnecessaryConditionExpression(node.testExpression);
|
519
519
|
return true;
|
@@ -533,7 +533,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
533
533
|
this._evaluator.evaluateTypesForStatement(item);
|
534
534
|
});
|
535
535
|
if (node.typeComment) {
|
536
|
-
this._evaluator.addDiagnosticForTextRange(this._fileInfo,
|
536
|
+
this._evaluator.addDiagnosticForTextRange(this._fileInfo, diagnosticRules_1.DiagnosticRule.reportInvalidTypeForm, localize_1.LocMessage.annotationNotSupported(), node.typeComment);
|
537
537
|
}
|
538
538
|
return true;
|
539
539
|
}
|
@@ -701,7 +701,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
701
701
|
this._evaluator.evaluateTypesForStatement(node);
|
702
702
|
const exceptionType = this._evaluator.getType(node.typeExpression);
|
703
703
|
if (exceptionType) {
|
704
|
-
this._validateExceptionType(exceptionType, node.typeExpression);
|
704
|
+
this._validateExceptionType(exceptionType, node.typeExpression, node.isExceptGroup);
|
705
705
|
}
|
706
706
|
}
|
707
707
|
return true;
|
@@ -719,7 +719,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
719
719
|
if ((0, typeUtils_1.isTupleClass)(type) && type.tupleTypeArguments) {
|
720
720
|
if (type.tupleTypeArguments.length > 0) {
|
721
721
|
if (!(0, typeUtils_1.isUnboundedTupleClass)(type)) {
|
722
|
-
this._evaluator.addDiagnosticForTextRange(this._fileInfo,
|
722
|
+
this._evaluator.addDiagnosticForTextRange(this._fileInfo, diagnosticRules_1.DiagnosticRule.reportAssertAlwaysTrue, localize_1.LocMessage.assertAlwaysTrue(), node.testExpression);
|
723
723
|
}
|
724
724
|
}
|
725
725
|
}
|
@@ -861,7 +861,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
861
861
|
if (this._fileInfo.executionEnvironment.pythonVersion.isLessThan(pythonVersion_1.pythonVersion3_12)) {
|
862
862
|
let curNode = node;
|
863
863
|
while (curNode) {
|
864
|
-
if (curNode.nodeType ===
|
864
|
+
if (curNode.nodeType === 30 /* ParseNodeType.FormatString */) {
|
865
865
|
fStringContainers.push(curNode);
|
866
866
|
}
|
867
867
|
curNode = curNode.parent;
|
@@ -877,14 +877,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
877
877
|
}
|
878
878
|
unescapedResult.unescapeErrors.forEach((error) => {
|
879
879
|
if (error.errorType === 0 /* UnescapeErrorType.InvalidEscapeSequence */) {
|
880
|
-
this._evaluator.addDiagnosticForTextRange(this._fileInfo,
|
880
|
+
this._evaluator.addDiagnosticForTextRange(this._fileInfo, diagnosticRules_1.DiagnosticRule.reportInvalidStringEscapeSequence, localize_1.LocMessage.stringUnsupportedEscape(), { start: start + error.offset, length: error.length });
|
881
881
|
}
|
882
882
|
});
|
883
883
|
// Prior to Python 3.12, it was not allowed to include a slash in an f-string.
|
884
884
|
if (fStringContainers.length > 0) {
|
885
885
|
const escapeOffset = token.escapedValue.indexOf('\\');
|
886
886
|
if (escapeOffset >= 0) {
|
887
|
-
this._evaluator.addDiagnosticForTextRange(this._fileInfo,
|
887
|
+
this._evaluator.addDiagnosticForTextRange(this._fileInfo, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.formatStringEscape(), { start, length: 1 });
|
888
888
|
}
|
889
889
|
}
|
890
890
|
});
|
@@ -901,7 +901,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
901
901
|
this._evaluator.getType(node);
|
902
902
|
}
|
903
903
|
if (node.strings.length > 1 && !node.isParenthesized) {
|
904
|
-
this._evaluator.addDiagnosticForTextRange(this._fileInfo,
|
904
|
+
this._evaluator.addDiagnosticForTextRange(this._fileInfo, diagnosticRules_1.DiagnosticRule.reportImplicitStringConcatenation, localize_1.LocMessage.implicitStringConcat(), node);
|
905
905
|
}
|
906
906
|
return true;
|
907
907
|
}
|
@@ -992,7 +992,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
992
992
|
importInfo.isImportFound &&
|
993
993
|
importInfo.importType !== 2 /* ImportType.Local */ &&
|
994
994
|
!this._fileInfo.isStubFile) {
|
995
|
-
this._evaluator.addDiagnosticForTextRange(this._fileInfo,
|
995
|
+
this._evaluator.addDiagnosticForTextRange(this._fileInfo, diagnosticRules_1.DiagnosticRule.reportWildcardImportFromLibrary, localize_1.LocMessage.wildcardLibraryImport(), node.wildcardToken || node);
|
996
996
|
}
|
997
997
|
}
|
998
998
|
return true;
|
@@ -1024,7 +1024,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1024
1024
|
break;
|
1025
1025
|
}
|
1026
1026
|
let isImportFromTyping = false;
|
1027
|
-
if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.nodeType) ===
|
1027
|
+
if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.nodeType) === 25 /* ParseNodeType.ImportFrom */) {
|
1028
1028
|
if (node.parent.module.leadingDots === 0 && node.parent.module.nameParts.length === 1) {
|
1029
1029
|
if (node.parent.module.nameParts[0].value === 'typing') {
|
1030
1030
|
isImportFromTyping = true;
|
@@ -1066,7 +1066,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1066
1066
|
break;
|
1067
1067
|
}
|
1068
1068
|
}
|
1069
|
-
else if (typeVarScopeNode.nodeType ===
|
1069
|
+
else if (typeVarScopeNode.nodeType === 31 /* ParseNodeType.Function */) {
|
1070
1070
|
const functionType = (_d = this._evaluator.getTypeOfFunction(typeVarScopeNode)) === null || _d === void 0 ? void 0 : _d.functionType;
|
1071
1071
|
if (functionType === null || functionType === void 0 ? void 0 : functionType.details.typeParameters.some((param) => param.details.name === node.name.value)) {
|
1072
1072
|
foundDuplicate = true;
|
@@ -1228,7 +1228,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1228
1228
|
55 /* ParseNodeType.UnaryOperation */,
|
1229
1229
|
7 /* ParseNodeType.BinaryOperation */,
|
1230
1230
|
40 /* ParseNodeType.Number */,
|
1231
|
-
|
1231
|
+
14 /* ParseNodeType.Constant */,
|
1232
1232
|
38 /* ParseNodeType.Name */,
|
1233
1233
|
52 /* ParseNodeType.Tuple */,
|
1234
1234
|
];
|
@@ -1236,11 +1236,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1236
1236
|
if (simpleExpressionTypes.some((nodeType) => nodeType === node.nodeType)) {
|
1237
1237
|
reportAsUnused = true;
|
1238
1238
|
}
|
1239
|
-
else if (node.nodeType ===
|
1239
|
+
else if (node.nodeType === 34 /* ParseNodeType.List */ ||
|
1240
1240
|
node.nodeType === 45 /* ParseNodeType.Set */ ||
|
1241
|
-
node.nodeType ===
|
1241
|
+
node.nodeType === 18 /* ParseNodeType.Dictionary */) {
|
1242
1242
|
// Exclude comprehensions.
|
1243
|
-
if (!node.entries.some((entry) => entry.nodeType ===
|
1243
|
+
if (!node.entries.some((entry) => entry.nodeType === 11 /* ParseNodeType.Comprehension */)) {
|
1244
1244
|
reportAsUnused = true;
|
1245
1245
|
}
|
1246
1246
|
}
|
@@ -1605,7 +1605,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1605
1605
|
}
|
1606
1606
|
}
|
1607
1607
|
const existingEntry = localTypeVarUsage.get(nameType.details.name);
|
1608
|
-
const isParamTypeWithEllipsisUsage = ((_a = curParamNode === null || curParamNode === void 0 ? void 0 : curParamNode.defaultValue) === null || _a === void 0 ? void 0 : _a.nodeType) ===
|
1608
|
+
const isParamTypeWithEllipsisUsage = ((_a = curParamNode === null || curParamNode === void 0 ? void 0 : curParamNode.defaultValue) === null || _a === void 0 ? void 0 : _a.nodeType) === 21 /* ParseNodeType.Ellipsis */;
|
1609
1609
|
if (!existingEntry) {
|
1610
1610
|
localTypeVarUsage.set(nameType.details.name, {
|
1611
1611
|
nodes: [nameNode],
|
@@ -1637,7 +1637,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1637
1637
|
// this constructor method?
|
1638
1638
|
if (constructorClass && nameType.scopeId === constructorClass.details.typeVarScopeId) {
|
1639
1639
|
const existingEntry = classTypeVarUsage.get(nameType.details.name);
|
1640
|
-
const isParamTypeWithEllipsisUsage = ((_d = curParamNode === null || curParamNode === void 0 ? void 0 : curParamNode.defaultValue) === null || _d === void 0 ? void 0 : _d.nodeType) ===
|
1640
|
+
const isParamTypeWithEllipsisUsage = ((_d = curParamNode === null || curParamNode === void 0 ? void 0 : curParamNode.defaultValue) === null || _d === void 0 ? void 0 : _d.nodeType) === 21 /* ParseNodeType.Ellipsis */;
|
1641
1641
|
const isExempt = !!nameType.details.isDefaultExplicit;
|
1642
1642
|
if (!existingEntry) {
|
1643
1643
|
classTypeVarUsage.set(nameType.details.name, {
|
@@ -1799,8 +1799,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1799
1799
|
for (let i = 0; i < prevOverloads.length; i++) {
|
1800
1800
|
const prevOverload = prevOverloads[i];
|
1801
1801
|
if (this._isOverlappingOverload(prevOverload, functionType, /* partialOverlap */ true)) {
|
1802
|
-
const prevReturnType = types_1.FunctionType.
|
1803
|
-
const returnType = types_1.FunctionType.
|
1802
|
+
const prevReturnType = types_1.FunctionType.getEffectiveReturnType(prevOverload);
|
1803
|
+
const returnType = types_1.FunctionType.getEffectiveReturnType(functionType);
|
1804
1804
|
if (prevReturnType &&
|
1805
1805
|
returnType &&
|
1806
1806
|
!this._evaluator.assignType(returnType, prevReturnType,
|
@@ -1901,15 +1901,15 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1901
1901
|
}
|
1902
1902
|
_validateStubStatement(statement) {
|
1903
1903
|
switch (statement.nodeType) {
|
1904
|
-
case
|
1905
|
-
case
|
1904
|
+
case 22 /* ParseNodeType.If */:
|
1905
|
+
case 31 /* ParseNodeType.Function */:
|
1906
1906
|
case 10 /* ParseNodeType.Class */:
|
1907
1907
|
case 0 /* ParseNodeType.Error */: {
|
1908
1908
|
// These are allowed in a stub file.
|
1909
1909
|
break;
|
1910
1910
|
}
|
1911
1911
|
case 57 /* ParseNodeType.While */:
|
1912
|
-
case
|
1912
|
+
case 29 /* ParseNodeType.For */:
|
1913
1913
|
case 53 /* ParseNodeType.Try */:
|
1914
1914
|
case 58 /* ParseNodeType.With */: {
|
1915
1915
|
// These are not allowed.
|
@@ -1924,15 +1924,15 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1924
1924
|
case 4 /* ParseNodeType.AssignmentExpression */:
|
1925
1925
|
case 6 /* ParseNodeType.Await */:
|
1926
1926
|
case 7 /* ParseNodeType.BinaryOperation */:
|
1927
|
-
case
|
1928
|
-
case
|
1929
|
-
case
|
1930
|
-
case
|
1931
|
-
case
|
1932
|
-
case
|
1933
|
-
case
|
1934
|
-
case
|
1935
|
-
case
|
1927
|
+
case 14 /* ParseNodeType.Constant */:
|
1928
|
+
case 17 /* ParseNodeType.Del */:
|
1929
|
+
case 18 /* ParseNodeType.Dictionary */:
|
1930
|
+
case 27 /* ParseNodeType.Index */:
|
1931
|
+
case 29 /* ParseNodeType.For */:
|
1932
|
+
case 30 /* ParseNodeType.FormatString */:
|
1933
|
+
case 32 /* ParseNodeType.Global */:
|
1934
|
+
case 33 /* ParseNodeType.Lambda */:
|
1935
|
+
case 34 /* ParseNodeType.List */:
|
1936
1936
|
case 35 /* ParseNodeType.MemberAccess */:
|
1937
1937
|
case 38 /* ParseNodeType.Name */:
|
1938
1938
|
case 39 /* ParseNodeType.Nonlocal */:
|
@@ -1978,13 +1978,19 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1978
1978
|
}
|
1979
1979
|
}
|
1980
1980
|
}
|
1981
|
-
_validateExceptionTypeRecursive(exceptionType, diag, baseExceptionType, allowTuple) {
|
1981
|
+
_validateExceptionTypeRecursive(exceptionType, diag, baseExceptionType, baseExceptionGroupType, allowTuple, isExceptGroup) {
|
1982
1982
|
const derivesFromBaseException = (classType) => {
|
1983
1983
|
if (!baseExceptionType || !(0, types_1.isInstantiableClass)(baseExceptionType)) {
|
1984
1984
|
return true;
|
1985
1985
|
}
|
1986
1986
|
return (0, typeUtils_1.derivesFromClassRecursive)(classType, baseExceptionType, /* ignoreUnknown */ false);
|
1987
1987
|
};
|
1988
|
+
const derivesFromBaseExceptionGroup = (classType) => {
|
1989
|
+
if (!baseExceptionGroupType || !(0, types_1.isInstantiableClass)(baseExceptionGroupType)) {
|
1990
|
+
return true;
|
1991
|
+
}
|
1992
|
+
return (0, typeUtils_1.derivesFromClassRecursive)(classType, baseExceptionGroupType, /* ignoreUnknown */ false);
|
1993
|
+
};
|
1988
1994
|
(0, typeUtils_1.doForEachSubtype)(exceptionType, (exceptionSubtype) => {
|
1989
1995
|
if ((0, types_1.isAnyOrUnknown)(exceptionSubtype)) {
|
1990
1996
|
return;
|
@@ -1996,12 +2002,15 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1996
2002
|
type: this._evaluator.printType(exceptionSubtype),
|
1997
2003
|
}));
|
1998
2004
|
}
|
2005
|
+
if (isExceptGroup && derivesFromBaseExceptionGroup(exceptionSubtype)) {
|
2006
|
+
diag.addMessage(localize_1.LocMessage.exceptionGroupTypeIncorrect());
|
2007
|
+
}
|
1999
2008
|
return;
|
2000
2009
|
}
|
2001
2010
|
if (allowTuple && exceptionSubtype.tupleTypeArguments) {
|
2002
2011
|
exceptionSubtype.tupleTypeArguments.forEach((typeArg) => {
|
2003
|
-
this._validateExceptionTypeRecursive(typeArg.type, diag, baseExceptionType,
|
2004
|
-
/* allowTuple */ false);
|
2012
|
+
this._validateExceptionTypeRecursive(typeArg.type, diag, baseExceptionType, baseExceptionGroupType,
|
2013
|
+
/* allowTuple */ false, isExceptGroup);
|
2005
2014
|
});
|
2006
2015
|
return;
|
2007
2016
|
}
|
@@ -2011,10 +2020,12 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
2011
2020
|
}
|
2012
2021
|
});
|
2013
2022
|
}
|
2014
|
-
_validateExceptionType(exceptionType, errorNode) {
|
2023
|
+
_validateExceptionType(exceptionType, errorNode, isExceptGroup) {
|
2015
2024
|
const baseExceptionType = this._evaluator.getBuiltInType(errorNode, 'BaseException');
|
2025
|
+
const baseExceptionGroupType = this._evaluator.getBuiltInType(errorNode, 'BaseExceptionGroup');
|
2016
2026
|
const diagAddendum = new diagnostic_1.DiagnosticAddendum();
|
2017
|
-
this._validateExceptionTypeRecursive(exceptionType, diagAddendum, baseExceptionType,
|
2027
|
+
this._validateExceptionTypeRecursive(exceptionType, diagAddendum, baseExceptionType, baseExceptionGroupType,
|
2028
|
+
/* allowTuple */ true, isExceptGroup);
|
2018
2029
|
if (!diagAddendum.isEmpty()) {
|
2019
2030
|
this._evaluator.addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.exceptionTypeNotClass().format({
|
2020
2031
|
type: this._evaluator.printType(exceptionType),
|
@@ -2175,7 +2186,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
2175
2186
|
// the assignment is within an `__init__` method, so ignore class
|
2176
2187
|
// scopes here.
|
2177
2188
|
const classOrFunc = ParseTreeUtils.getEnclosingClassOrFunction(decl.node);
|
2178
|
-
if ((classOrFunc === null || classOrFunc === void 0 ? void 0 : classOrFunc.nodeType) ===
|
2189
|
+
if ((classOrFunc === null || classOrFunc === void 0 ? void 0 : classOrFunc.nodeType) === 31 /* ParseNodeType.Function */) {
|
2179
2190
|
exemptAssignment = true;
|
2180
2191
|
}
|
2181
2192
|
}
|
@@ -2454,7 +2465,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
2454
2465
|
case 8 /* DeclarationType.Alias */:
|
2455
2466
|
diagnosticLevel = this._fileInfo.diagnosticRuleSet.reportUnusedImport;
|
2456
2467
|
rule = diagnosticRules_1.DiagnosticRule.reportUnusedImport;
|
2457
|
-
if (decl.node.nodeType ===
|
2468
|
+
if (decl.node.nodeType === 24 /* ParseNodeType.ImportAs */) {
|
2458
2469
|
if (decl.node.alias) {
|
2459
2470
|
// For statements of the form "import x as x", don't mark "x" as unaccessed
|
2460
2471
|
// because it's assumed to be re-exported.
|
@@ -2471,12 +2482,12 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
2471
2482
|
let textRange = { start: nameParts[0].start, length: nameParts[0].length };
|
2472
2483
|
textRange = textRange_1.TextRange.extend(textRange, nameParts[nameParts.length - 1]);
|
2473
2484
|
this._fileInfo.diagnosticSink.addUnusedCodeWithTextRange(localize_1.LocMessage.unaccessedSymbol().format({ name: multipartName }), textRange, { action: "pyright.unusedImport" /* Commands.unusedImport */ });
|
2474
|
-
this._evaluator.addDiagnosticForTextRange(this._fileInfo,
|
2485
|
+
this._evaluator.addDiagnosticForTextRange(this._fileInfo, diagnosticRules_1.DiagnosticRule.reportUnusedImport, localize_1.LocMessage.unaccessedImport().format({ name: multipartName }), textRange);
|
2475
2486
|
return;
|
2476
2487
|
}
|
2477
2488
|
}
|
2478
2489
|
}
|
2479
|
-
else if (decl.node.nodeType ===
|
2490
|
+
else if (decl.node.nodeType === 26 /* ParseNodeType.ImportFromAs */) {
|
2480
2491
|
const importFrom = decl.node.parent;
|
2481
2492
|
// For statements of the form "from y import x as x", don't mark "x" as
|
2482
2493
|
// unaccessed because it's assumed to be re-exported.
|
@@ -2908,7 +2919,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
2908
2919
|
_isSymbolPrivate(nameValue, scopeType) {
|
2909
2920
|
// All variables within the scope of a function or a list
|
2910
2921
|
// comprehension are considered private.
|
2911
|
-
if (scopeType === 2 /* ScopeType.Function */ || scopeType === 1 /* ScopeType.
|
2922
|
+
if (scopeType === 2 /* ScopeType.Function */ || scopeType === 1 /* ScopeType.Comprehension */) {
|
2912
2923
|
return true;
|
2913
2924
|
}
|
2914
2925
|
// See if the symbol is private.
|
@@ -2966,7 +2977,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
2966
2977
|
let deprecatedMessage;
|
2967
2978
|
function getDeprecatedMessageForFunction(functionType) {
|
2968
2979
|
if (functionType.details.declaration &&
|
2969
|
-
functionType.details.declaration.node.nodeType ===
|
2980
|
+
functionType.details.declaration.node.nodeType === 31 /* ParseNodeType.Function */) {
|
2970
2981
|
const containingClass = ParseTreeUtils.getEnclosingClass(functionType.details.declaration.node,
|
2971
2982
|
/* stopAtFunction */ true);
|
2972
2983
|
if (containingClass) {
|
@@ -3134,7 +3145,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3134
3145
|
this._importResolver.isStdlibModule(desc, this._fileInfo.executionEnvironment) &&
|
3135
3146
|
this._sourceMapper.isUserCode(this._fileInfo.fileUri)) {
|
3136
3147
|
// This means the user has a module that is overwriting the stdlib module.
|
3137
|
-
const diag = this._evaluator.addDiagnosticForTextRange(this._fileInfo,
|
3148
|
+
const diag = this._evaluator.addDiagnosticForTextRange(this._fileInfo, diagnosticRules_1.DiagnosticRule.reportShadowedImports, localize_1.LocMessage.stdlibModuleOverridden().format({
|
3138
3149
|
name: moduleName,
|
3139
3150
|
path: this._fileInfo.fileUri.toUserVisibleString(),
|
3140
3151
|
}), this._moduleNode);
|
@@ -3155,8 +3166,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3155
3166
|
return;
|
3156
3167
|
}
|
3157
3168
|
// Skip this check for relative imports.
|
3158
|
-
const nodeModule = node.nodeType ===
|
3159
|
-
? ((_a = node.parent) === null || _a === void 0 ? void 0 : _a.nodeType) ===
|
3169
|
+
const nodeModule = node.nodeType === 26 /* ParseNodeType.ImportFromAs */
|
3170
|
+
? ((_a = node.parent) === null || _a === void 0 ? void 0 : _a.nodeType) === 25 /* ParseNodeType.ImportFrom */
|
3160
3171
|
? (_b = node.parent) === null || _b === void 0 ? void 0 : _b.module
|
3161
3172
|
: undefined
|
3162
3173
|
: node.module;
|
@@ -3164,9 +3175,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3164
3175
|
return;
|
3165
3176
|
}
|
3166
3177
|
// Otherwise use the name to determine if a match for a stdlib module.
|
3167
|
-
const namePartNodes = node.nodeType ===
|
3178
|
+
const namePartNodes = node.nodeType === 24 /* ParseNodeType.ImportAs */
|
3168
3179
|
? node.module.nameParts
|
3169
|
-
: node.nodeType ===
|
3180
|
+
: node.nodeType === 26 /* ParseNodeType.ImportFromAs */
|
3170
3181
|
? [node.name]
|
3171
3182
|
: node.module.nameParts;
|
3172
3183
|
const nameParts = namePartNodes.map((n) => n.value);
|
@@ -3321,7 +3332,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3321
3332
|
if (statement.nodeType === 47 /* ParseNodeType.StatementList */) {
|
3322
3333
|
for (const substatement of statement.statements) {
|
3323
3334
|
if (substatement.nodeType !== 54 /* ParseNodeType.TypeAnnotation */ &&
|
3324
|
-
substatement.nodeType !==
|
3335
|
+
substatement.nodeType !== 21 /* ParseNodeType.Ellipsis */ &&
|
3325
3336
|
substatement.nodeType !== 48 /* ParseNodeType.StringList */ &&
|
3326
3337
|
substatement.nodeType !== 42 /* ParseNodeType.Pass */) {
|
3327
3338
|
emitBadStatementError(substatement);
|
@@ -3540,11 +3551,13 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3540
3551
|
}
|
3541
3552
|
types_1.ClassType.getSymbolTable(classType).forEach((symbol, name) => {
|
3542
3553
|
var _a;
|
3543
|
-
//
|
3544
|
-
|
3545
|
-
|
3546
|
-
|
3547
|
-
|
3554
|
+
// Determine whether this is an enum member. We ignore the presence
|
3555
|
+
// of an annotation in this case because the runtime does. From a
|
3556
|
+
// type checking perspective, if the runtime treats the assignment
|
3557
|
+
// as an enum member but there is a type annotation present, it is
|
3558
|
+
// considered a type checking error.
|
3559
|
+
const symbolType = (0, enums_1.transformTypeForEnumMember)(this._evaluator, classType, name,
|
3560
|
+
/* ignoreAnnotation */ true);
|
3548
3561
|
// Is this symbol a literal instance of the enum class?
|
3549
3562
|
if (!symbolType ||
|
3550
3563
|
!(0, types_1.isClassInstance)(symbolType) ||
|
@@ -3552,6 +3565,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3552
3565
|
!(symbolType.literalValue instanceof types_1.EnumLiteral)) {
|
3553
3566
|
return;
|
3554
3567
|
}
|
3568
|
+
// Enum members should not have type annotations.
|
3569
|
+
const typedDecls = symbol.getTypedDeclarations();
|
3570
|
+
if (typedDecls.length > 0) {
|
3571
|
+
if (typedDecls[0].type === 1 /* DeclarationType.Variable */ && typedDecls[0].inferredTypeSource) {
|
3572
|
+
this._evaluator.addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.enumMemberTypeAnnotation(), typedDecls[0].node);
|
3573
|
+
}
|
3574
|
+
return;
|
3575
|
+
}
|
3555
3576
|
// Look for a duplicate assignment.
|
3556
3577
|
const decls = symbol.getDeclarations();
|
3557
3578
|
if (decls.length >= 2 && decls[0].type === 1 /* DeclarationType.Variable */) {
|
@@ -3978,12 +3999,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3978
3999
|
// We'll set the "SkipArgsKwargs" flag for pragmatic reasons since __new__
|
3979
4000
|
// often has an *args and/or **kwargs. We'll also set the ParamSpecValue
|
3980
4001
|
// because we don't care about the return type for this check.
|
3981
|
-
initMemberType = types_1.FunctionType.cloneWithNewFlags(initMemberType, initMemberType.details.flags |
|
3982
|
-
|
3983
|
-
65536 /* FunctionTypeFlags.ParamSpecValue */);
|
3984
|
-
newMemberType = types_1.FunctionType.cloneWithNewFlags(newMemberType, initMemberType.details.flags |
|
3985
|
-
32768 /* FunctionTypeFlags.SkipArgsKwargsCompatibilityCheck */ |
|
3986
|
-
65536 /* FunctionTypeFlags.ParamSpecValue */);
|
4002
|
+
initMemberType = types_1.FunctionType.cloneWithNewFlags(initMemberType, initMemberType.details.flags | 32768 /* FunctionTypeFlags.GradualCallableForm */ | 65536 /* FunctionTypeFlags.ParamSpecValue */);
|
4003
|
+
newMemberType = types_1.FunctionType.cloneWithNewFlags(newMemberType, initMemberType.details.flags | 32768 /* FunctionTypeFlags.GradualCallableForm */ | 65536 /* FunctionTypeFlags.ParamSpecValue */);
|
3987
4004
|
if (!this._evaluator.assignType(newMemberType, initMemberType,
|
3988
4005
|
/* diag */ undefined,
|
3989
4006
|
/* destTypeVarContext */ undefined,
|
@@ -3997,7 +4014,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3997
4014
|
const newDecl = newMemberType.details.declaration;
|
3998
4015
|
if (initDecl && newDecl) {
|
3999
4016
|
const mainDecl = displayOnInit ? initDecl : newDecl;
|
4000
|
-
const mainDeclNode = mainDecl.node.nodeType ===
|
4017
|
+
const mainDeclNode = mainDecl.node.nodeType === 31 /* ParseNodeType.Function */ ? mainDecl.node.name : mainDecl.node;
|
4001
4018
|
const diagAddendum = new diagnostic_1.DiagnosticAddendum();
|
4002
4019
|
const initSignature = this._evaluator.printType(initMemberType);
|
4003
4020
|
const newSignature = this._evaluator.printType(newMemberType);
|
@@ -5068,7 +5085,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
5068
5085
|
if (!functionTypeResult) {
|
5069
5086
|
return;
|
5070
5087
|
}
|
5071
|
-
const declaredReturnType = types_1.FunctionType.
|
5088
|
+
const declaredReturnType = types_1.FunctionType.getEffectiveReturnType(functionTypeResult.functionType);
|
5072
5089
|
if (!declaredReturnType) {
|
5073
5090
|
return;
|
5074
5091
|
}
|
@@ -5178,7 +5195,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
5178
5195
|
const importStatements = (0, importStatementUtils_1.getTopLevelImports)(this._moduleNode);
|
5179
5196
|
const importModuleMap = new Map();
|
5180
5197
|
importStatements.orderedImports.forEach((importStatement) => {
|
5181
|
-
if (importStatement.node.nodeType ===
|
5198
|
+
if (importStatement.node.nodeType === 25 /* ParseNodeType.ImportFrom */) {
|
5182
5199
|
const symbolMap = new Map();
|
5183
5200
|
importStatement.node.imports.forEach((importFromAs) => {
|
5184
5201
|
// Ignore duplicates if they're aliased.
|