@zzzen/pyright-internal 1.2.0-dev.20240602 → 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/binder.js +14 -8
- package/dist/analyzer/binder.js.map +1 -1
- package/dist/analyzer/checker.js +47 -30
- package/dist/analyzer/checker.js.map +1 -1
- 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 +2 -5
- 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/enums.d.ts +1 -1
- package/dist/analyzer/enums.js +19 -16
- package/dist/analyzer/enums.js.map +1 -1
- package/dist/analyzer/operations.js +6 -7
- 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/patternMatching.js +4 -4
- package/dist/analyzer/patternMatching.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/sourceFile.js +3 -3
- package/dist/analyzer/sourceFile.js.map +1 -1
- package/dist/analyzer/typeEvaluator.js +279 -209
- 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 +3 -2
- 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/typeUtils.d.ts +3 -4
- package/dist/analyzer/typeUtils.js +89 -124
- 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/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.js +1 -1
- 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/languageServerBase.js +1 -1
- package/dist/languageServerBase.js.map +1 -1
- package/dist/languageService/workspaceSymbolProvider.js +1 -1
- package/dist/localization/localize.d.ts +6 -0
- package/dist/localization/localize.js +3 -0
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.cs.json +2 -2
- package/dist/localization/package.nls.de.json +2 -2
- package/dist/localization/package.nls.en-us.json +3 -0
- package/dist/localization/package.nls.es.json +2 -2
- package/dist/localization/package.nls.fr.json +2 -2
- package/dist/localization/package.nls.it.json +2 -2
- package/dist/localization/package.nls.ja.json +2 -2
- package/dist/localization/package.nls.ko.json +3 -3
- package/dist/localization/package.nls.pl.json +2 -2
- package/dist/localization/package.nls.pt-br.json +2 -2
- package/dist/localization/package.nls.qps-ploc.json +2 -2
- package/dist/localization/package.nls.ru.json +2 -2
- package/dist/localization/package.nls.tr.json +2 -2
- package/dist/localization/package.nls.zh-cn.json +2 -2
- package/dist/localization/package.nls.zh-tw.json +2 -2
- package/dist/pyright.js +3 -0
- package/dist/pyright.js.map +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/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 +4 -0
- 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 -9
- 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/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
|
}
|
@@ -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
|
}
|
@@ -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;
|
@@ -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,
|
@@ -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),
|
@@ -2471,7 +2482,7 @@ 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
|
}
|
@@ -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);
|
@@ -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,
|
@@ -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
|
}
|