@zzzen/pyright-internal 1.2.0-dev.20220710 → 1.2.0-dev.20220731
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/analysis.js +1 -1
- package/dist/analyzer/analysis.js.map +1 -1
- package/dist/analyzer/binder.js +14 -0
- package/dist/analyzer/binder.js.map +1 -1
- package/dist/analyzer/checker.d.ts +1 -0
- package/dist/analyzer/checker.js +100 -46
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/codeFlowEngine.d.ts +0 -1
- package/dist/analyzer/codeFlowEngine.js +190 -196
- package/dist/analyzer/codeFlowEngine.js.map +1 -1
- package/dist/analyzer/codeFlowTypes.d.ts +1 -1
- package/dist/analyzer/codeFlowTypes.js.map +1 -1
- package/dist/analyzer/constraintSolver.js +5 -3
- package/dist/analyzer/constraintSolver.js.map +1 -1
- package/dist/analyzer/dataClasses.js +13 -4
- package/dist/analyzer/dataClasses.js.map +1 -1
- package/dist/analyzer/enums.d.ts +13 -0
- package/dist/analyzer/enums.js +207 -0
- package/dist/analyzer/enums.js.map +1 -0
- package/dist/analyzer/importResolver.js +5 -4
- package/dist/analyzer/importResolver.js.map +1 -1
- package/dist/analyzer/importStatementUtils.d.ts +3 -1
- package/dist/analyzer/importStatementUtils.js +96 -19
- package/dist/analyzer/importStatementUtils.js.map +1 -1
- package/dist/analyzer/parseTreeUtils.d.ts +5 -0
- package/dist/analyzer/parseTreeUtils.js +111 -3
- package/dist/analyzer/parseTreeUtils.js.map +1 -1
- package/dist/analyzer/patternMatching.js +3 -3
- package/dist/analyzer/patternMatching.js.map +1 -1
- package/dist/analyzer/properties.js +1 -1
- package/dist/analyzer/properties.js.map +1 -1
- package/dist/analyzer/service.d.ts +1 -1
- package/dist/analyzer/service.js +37 -37
- package/dist/analyzer/service.js.map +1 -1
- package/dist/analyzer/sourceFile.js +40 -9
- package/dist/analyzer/sourceFile.js.map +1 -1
- package/dist/analyzer/typeEvaluator.d.ts +1 -1
- package/dist/analyzer/typeEvaluator.js +733 -709
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +18 -16
- package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
- package/dist/analyzer/typeEvaluatorWithTracker.js +9 -7
- package/dist/analyzer/typeEvaluatorWithTracker.js.map +1 -1
- package/dist/analyzer/typeGuards.d.ts +2 -0
- package/dist/analyzer/typeGuards.js +43 -15
- package/dist/analyzer/typeGuards.js.map +1 -1
- package/dist/analyzer/typePrinter.js +7 -1
- package/dist/analyzer/typePrinter.js.map +1 -1
- package/dist/analyzer/typeUtils.d.ts +4 -3
- package/dist/analyzer/typeUtils.js +99 -38
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/analyzer/typedDicts.d.ts +1 -0
- package/dist/analyzer/typedDicts.js +24 -3
- package/dist/analyzer/typedDicts.js.map +1 -1
- package/dist/analyzer/types.d.ts +9 -0
- package/dist/analyzer/types.js +99 -0
- package/dist/analyzer/types.js.map +1 -1
- package/dist/backgroundAnalysisBase.d.ts +2 -1
- package/dist/backgroundAnalysisBase.js +7 -0
- package/dist/backgroundAnalysisBase.js.map +1 -1
- package/dist/backgroundThreadBase.js +1 -0
- package/dist/backgroundThreadBase.js.map +1 -1
- package/dist/commands/commandResult.js +1 -1
- package/dist/commands/commandResult.js.map +1 -1
- package/dist/common/chokidarFileWatcherProvider.d.ts +1 -2
- package/dist/common/chokidarFileWatcherProvider.js +0 -3
- package/dist/common/chokidarFileWatcherProvider.js.map +1 -1
- package/dist/common/configOptions.d.ts +1 -0
- package/dist/common/configOptions.js +4 -0
- package/dist/common/configOptions.js.map +1 -1
- package/dist/common/diagnostic.d.ts +2 -1
- package/dist/common/diagnostic.js +2 -1
- package/dist/common/diagnostic.js.map +1 -1
- package/dist/common/diagnosticRules.d.ts +1 -0
- package/dist/common/diagnosticRules.js +1 -0
- package/dist/common/diagnosticRules.js.map +1 -1
- package/dist/common/diagnosticSink.d.ts +3 -0
- package/dist/common/diagnosticSink.js +15 -2
- package/dist/common/diagnosticSink.js.map +1 -1
- package/dist/common/editAction.d.ts +6 -0
- package/dist/common/editAction.js +15 -0
- package/dist/common/editAction.js.map +1 -1
- package/dist/common/fileSystem.d.ts +4 -1
- package/dist/common/fileSystem.js +6 -4
- package/dist/common/fileSystem.js.map +1 -1
- package/dist/common/realFileSystem.d.ts +2 -2
- package/dist/common/realFileSystem.js.map +1 -1
- package/dist/common/textEditUtils.d.ts +22 -2
- package/dist/common/textEditUtils.js +138 -1
- package/dist/common/textEditUtils.js.map +1 -1
- package/dist/common/uriParser.d.ts +2 -0
- package/dist/common/uriParser.js +11 -0
- package/dist/common/uriParser.js.map +1 -1
- package/dist/common/workspaceEditUtils.d.ts +1 -0
- package/dist/common/workspaceEditUtils.js +10 -6
- package/dist/common/workspaceEditUtils.js.map +1 -1
- package/dist/languageServerBase.d.ts +17 -16
- package/dist/languageServerBase.js +73 -59
- package/dist/languageServerBase.js.map +1 -1
- package/dist/languageService/codeActionProvider.d.ts +2 -2
- package/dist/languageService/codeActionProvider.js +1 -1
- package/dist/languageService/codeActionProvider.js.map +1 -1
- package/dist/languageService/completionProvider.d.ts +15 -11
- package/dist/languageService/completionProvider.js +75 -5
- package/dist/languageService/completionProvider.js.map +1 -1
- package/dist/languageService/renameModuleProvider.d.ts +1 -4
- package/dist/languageService/renameModuleProvider.js +10 -46
- package/dist/languageService/renameModuleProvider.js.map +1 -1
- package/dist/languageService/tooltipUtils.js +1 -3
- package/dist/languageService/tooltipUtils.js.map +1 -1
- package/dist/localization/localize.d.ts +13 -0
- package/dist/localization/localize.js +4 -0
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.en-us.json +4 -0
- package/dist/parser/parser.js +9 -1
- package/dist/parser/parser.js.map +1 -1
- package/dist/pyright.js +3 -1
- package/dist/pyright.js.map +1 -1
- package/dist/pyrightFileSystem.d.ts +20 -2
- package/dist/pyrightFileSystem.js +29 -2
- package/dist/pyrightFileSystem.js.map +1 -1
- package/dist/server.js +4 -4
- package/dist/server.js.map +1 -1
- package/dist/tests/chainedSourceFiles.test.js +2 -0
- package/dist/tests/chainedSourceFiles.test.js.map +1 -1
- package/dist/tests/checker.test.js +9 -0
- package/dist/tests/checker.test.js.map +1 -1
- package/dist/tests/fourslash/completions.commitChars.fourslash.d.ts +1 -0
- package/dist/tests/fourslash/completions.commitChars.fourslash.js +59 -0
- package/dist/tests/fourslash/completions.commitChars.fourslash.js.map +1 -0
- package/dist/tests/fourslash/completions.triggers.fourslash.d.ts +1 -0
- package/dist/tests/fourslash/completions.triggers.fourslash.js +29 -0
- package/dist/tests/fourslash/completions.triggers.fourslash.js.map +1 -0
- package/dist/tests/fourslash/fourslash.d.ts +1 -0
- package/dist/tests/fourslash/hover.init.fourslash.js +2 -2
- package/dist/tests/fourslash/hover.init.fourslash.js.map +1 -1
- package/dist/tests/harness/fourslash/fourSlashParser.js +5 -1
- package/dist/tests/harness/fourslash/fourSlashParser.js.map +1 -1
- package/dist/tests/harness/fourslash/testLanguageService.js +1 -1
- package/dist/tests/harness/fourslash/testLanguageService.js.map +1 -1
- package/dist/tests/harness/fourslash/testState.js +18 -9
- package/dist/tests/harness/fourslash/testState.js.map +1 -1
- package/dist/tests/pyrightFileSystem.test.js +28 -0
- package/dist/tests/pyrightFileSystem.test.js.map +1 -1
- package/dist/tests/renameModuleTestUtils.js +5 -87
- package/dist/tests/renameModuleTestUtils.js.map +1 -1
- package/dist/tests/testState.test.js +1 -1
- package/dist/tests/testState.test.js.map +1 -1
- package/dist/tests/testStateUtils.d.ts +8 -0
- package/dist/tests/testStateUtils.js +110 -0
- package/dist/tests/testStateUtils.js.map +1 -0
- package/dist/tests/testUtils.d.ts +2 -1
- package/dist/tests/testUtils.js +9 -6
- package/dist/tests/testUtils.js.map +1 -1
- package/dist/tests/typeEvaluator1.test.js +7 -7
- package/dist/tests/typeEvaluator1.test.js.map +1 -1
- package/dist/tests/typeEvaluator2.test.js +16 -4
- package/dist/tests/typeEvaluator2.test.js.map +1 -1
- package/dist/tests/typeEvaluator3.test.js +9 -1
- package/dist/tests/typeEvaluator3.test.js.map +1 -1
- package/dist/tests/typeEvaluator4.test.js +16 -0
- package/dist/tests/typeEvaluator4.test.js.map +1 -1
- package/dist/workspaceMap.d.ts +1 -0
- package/dist/workspaceMap.js +11 -1
- package/dist/workspaceMap.js.map +1 -1
- package/package.json +3 -3
package/dist/analyzer/checker.js
CHANGED
@@ -386,14 +386,19 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
386
386
|
}
|
387
387
|
this._scopedNodes.push(node);
|
388
388
|
if (functionTypeResult && (0, types_1.isOverloadedFunction)(functionTypeResult.decoratedType)) {
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
389
|
+
// If this is the implementation for the overloaded function, skip
|
390
|
+
// overload consistency checks.
|
391
|
+
if (types_1.OverloadedFunctionType.getImplementation(functionTypeResult.decoratedType) !==
|
392
|
+
functionTypeResult.functionType) {
|
393
|
+
const overloads = types_1.OverloadedFunctionType.getOverloads(functionTypeResult.decoratedType);
|
394
|
+
if (overloads.length > 1) {
|
395
|
+
const maxOverloadConsistencyCheckLength = 100;
|
396
|
+
// The check is n^2 in time, so if the number of overloads
|
397
|
+
// is very large (which can happen for some generated code),
|
398
|
+
// skip this check to avoid quadratic analysis time.
|
399
|
+
if (overloads.length < maxOverloadConsistencyCheckLength) {
|
400
|
+
this._validateOverloadConsistency(node, overloads[overloads.length - 1], overloads.slice(0, overloads.length - 1));
|
401
|
+
}
|
397
402
|
}
|
398
403
|
}
|
399
404
|
}
|
@@ -732,6 +737,12 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
732
737
|
this._validateComparisonTypes(node);
|
733
738
|
}
|
734
739
|
}
|
740
|
+
else if (node.operator === 41 /* In */ || node.operator === 42 /* NotIn */) {
|
741
|
+
// Don't apply this rule if it's within an assert.
|
742
|
+
if (!ParseTreeUtils.isWithinAssertExpression(node)) {
|
743
|
+
this._validateContainmentTypes(node);
|
744
|
+
}
|
745
|
+
}
|
735
746
|
this._evaluator.getType(node);
|
736
747
|
return true;
|
737
748
|
}
|
@@ -977,11 +988,46 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
977
988
|
}
|
978
989
|
}
|
979
990
|
}
|
991
|
+
_validateContainmentTypes(node) {
|
992
|
+
const leftType = this._evaluator.getType(node.leftExpression);
|
993
|
+
const containerType = this._evaluator.getType(node.rightExpression);
|
994
|
+
if (!leftType || !containerType) {
|
995
|
+
return;
|
996
|
+
}
|
997
|
+
if ((0, types_1.isNever)(leftType) || (0, types_1.isNever)(containerType)) {
|
998
|
+
return;
|
999
|
+
}
|
1000
|
+
// Use the common narrowing logic for containment.
|
1001
|
+
const elementType = (0, typeGuards_1.getElementTypeForContainerNarrowing)(containerType);
|
1002
|
+
if (!elementType) {
|
1003
|
+
return;
|
1004
|
+
}
|
1005
|
+
const narrowedType = (0, typeGuards_1.narrowTypeForContainerElementType)(this._evaluator, leftType, this._evaluator.makeTopLevelTypeVarsConcrete(elementType));
|
1006
|
+
if ((0, types_1.isNever)(narrowedType)) {
|
1007
|
+
const getMessage = () => {
|
1008
|
+
return node.operator === 41 /* In */
|
1009
|
+
? localize_1.Localizer.Diagnostic.containmentAlwaysFalse()
|
1010
|
+
: localize_1.Localizer.Diagnostic.containmentAlwaysTrue();
|
1011
|
+
};
|
1012
|
+
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportUnnecessaryContains, diagnosticRules_1.DiagnosticRule.reportUnnecessaryContains, getMessage().format({
|
1013
|
+
leftType: this._evaluator.printType(leftType, /* expandTypeAlias */ true),
|
1014
|
+
rightType: this._evaluator.printType(elementType, /* expandTypeAlias */ true),
|
1015
|
+
}), node);
|
1016
|
+
}
|
1017
|
+
}
|
980
1018
|
// Determines whether the types of the two operands for an == or != operation
|
981
1019
|
// have overlapping types.
|
982
1020
|
_validateComparisonTypes(node) {
|
1021
|
+
let rightExpression = node.rightExpression;
|
1022
|
+
// Check for chained comparisons.
|
1023
|
+
if (rightExpression.nodeType === 7 /* BinaryOperation */ &&
|
1024
|
+
!rightExpression.parenthesized &&
|
1025
|
+
ParseTreeUtils.operatorSupportsChaining(rightExpression.operator)) {
|
1026
|
+
// Use the left side of the right expression for comparison purposes.
|
1027
|
+
rightExpression = rightExpression.leftExpression;
|
1028
|
+
}
|
983
1029
|
const leftType = this._evaluator.getType(node.leftExpression);
|
984
|
-
const rightType = this._evaluator.getType(
|
1030
|
+
const rightType = this._evaluator.getType(rightExpression);
|
985
1031
|
if (!leftType || !rightType) {
|
986
1032
|
return;
|
987
1033
|
}
|
@@ -1285,9 +1331,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1285
1331
|
_validateOverloadConsistency(node, functionType, prevOverloads) {
|
1286
1332
|
for (let i = 0; i < prevOverloads.length; i++) {
|
1287
1333
|
const prevOverload = prevOverloads[i];
|
1288
|
-
if (
|
1289
|
-
types_1.FunctionType.isOverloaded(prevOverload) &&
|
1290
|
-
this._isOverlappingOverload(functionType, prevOverload)) {
|
1334
|
+
if (this._isOverlappingOverload(functionType, prevOverload)) {
|
1291
1335
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportOverlappingOverload, diagnosticRules_1.DiagnosticRule.reportOverlappingOverload, localize_1.Localizer.Diagnostic.overlappingOverload().format({
|
1292
1336
|
name: node.name.value,
|
1293
1337
|
obscured: prevOverloads.length + 1,
|
@@ -1298,9 +1342,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1298
1342
|
}
|
1299
1343
|
for (let i = 0; i < prevOverloads.length; i++) {
|
1300
1344
|
const prevOverload = prevOverloads[i];
|
1301
|
-
if (
|
1302
|
-
types_1.FunctionType.isOverloaded(prevOverload) &&
|
1303
|
-
this._isOverlappingOverload(prevOverload, functionType)) {
|
1345
|
+
if (this._isOverlappingOverload(prevOverload, functionType)) {
|
1304
1346
|
const prevReturnType = types_1.FunctionType.getSpecializedReturnType(prevOverload);
|
1305
1347
|
const returnType = types_1.FunctionType.getSpecializedReturnType(functionType);
|
1306
1348
|
if (prevReturnType &&
|
@@ -1388,7 +1430,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1388
1430
|
const start = statement.start;
|
1389
1431
|
const lastStatement = statements[statements.length - 1];
|
1390
1432
|
const end = textRange_1.TextRange.getEnd(lastStatement);
|
1391
|
-
this._evaluator.
|
1433
|
+
this._evaluator.addUnreachableCode(statement, { start, length: end - start });
|
1392
1434
|
reportedUnreachable = true;
|
1393
1435
|
}
|
1394
1436
|
}
|
@@ -1578,8 +1620,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1578
1620
|
const primaryDecl = typedDecls[0];
|
1579
1621
|
if (primaryDecl.type === 5 /* Function */) {
|
1580
1622
|
const type = this._evaluator.getEffectiveTypeOfSymbol(symbol);
|
1581
|
-
const
|
1582
|
-
|
1623
|
+
const overloadedFunctions = (0, types_1.isOverloadedFunction)(type)
|
1624
|
+
? types_1.OverloadedFunctionType.getOverloads(type)
|
1625
|
+
: (0, types_1.isFunction)(type) && types_1.FunctionType.isOverloaded(type)
|
1626
|
+
? [type]
|
1627
|
+
: [];
|
1583
1628
|
if (overloadedFunctions.length === 1) {
|
1584
1629
|
// There should never be a single overload.
|
1585
1630
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.singleOverload().format({ name }), primaryDecl.node.name);
|
@@ -1596,9 +1641,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1596
1641
|
// verify that there is an implementation.
|
1597
1642
|
if (!this._fileInfo.isStubFile && overloadedFunctions.length > 0) {
|
1598
1643
|
let implementationFunction;
|
1599
|
-
if ((0, types_1.isOverloadedFunction)(type) &&
|
1600
|
-
|
1601
|
-
implementationFunction = type.overloads[type.overloads.length - 1];
|
1644
|
+
if ((0, types_1.isOverloadedFunction)(type) && types_1.OverloadedFunctionType.getImplementation(type)) {
|
1645
|
+
implementationFunction = types_1.OverloadedFunctionType.getImplementation(type);
|
1602
1646
|
}
|
1603
1647
|
else if ((0, types_1.isFunction)(type) && !types_1.FunctionType.isOverloaded(type)) {
|
1604
1648
|
implementationFunction = type;
|
@@ -1622,11 +1666,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1622
1666
|
}
|
1623
1667
|
else if ((0, types_1.isOverloadedFunction)(type)) {
|
1624
1668
|
// Verify that all overload signatures are assignable to implementation signature.
|
1625
|
-
type.
|
1669
|
+
types_1.OverloadedFunctionType.getOverloads(type).forEach((overload, index) => {
|
1626
1670
|
var _a, _b, _c, _d;
|
1627
|
-
if (overload === implementationFunction || !types_1.FunctionType.isOverloaded(overload)) {
|
1628
|
-
return;
|
1629
|
-
}
|
1630
1671
|
const diag = new diagnostic_1.DiagnosticAddendum();
|
1631
1672
|
if (!this._isLegalOverloadImplementation(overload, implementationFunction, diag)) {
|
1632
1673
|
if (implementationFunction.details.declaration) {
|
@@ -2814,6 +2855,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
2814
2855
|
if (this._fileInfo.diagnosticRuleSet.reportUninitializedInstanceVariable === 'none') {
|
2815
2856
|
return;
|
2816
2857
|
}
|
2858
|
+
// Protocol classes are exempted from this check.
|
2859
|
+
if (types_1.ClassType.isProtocolClass(classType)) {
|
2860
|
+
return;
|
2861
|
+
}
|
2817
2862
|
classType.details.fields.forEach((localSymbol, name) => {
|
2818
2863
|
// This applies only to instance members.
|
2819
2864
|
if (!localSymbol.isInstanceMember()) {
|
@@ -3012,7 +3057,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3012
3057
|
}
|
3013
3058
|
if ((0, types_1.isOverloadedFunction)(newMemberType)) {
|
3014
3059
|
// Find the implementation, not the overloaded signatures.
|
3015
|
-
newMemberType =
|
3060
|
+
newMemberType = types_1.OverloadedFunctionType.getImplementation(newMemberType);
|
3016
3061
|
if (!newMemberType) {
|
3017
3062
|
return;
|
3018
3063
|
}
|
@@ -3027,7 +3072,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3027
3072
|
}
|
3028
3073
|
if ((0, types_1.isOverloadedFunction)(initMemberType)) {
|
3029
3074
|
// Find the implementation, not the overloaded signatures.
|
3030
|
-
initMemberType =
|
3075
|
+
initMemberType = types_1.OverloadedFunctionType.getImplementation(initMemberType);
|
3031
3076
|
if (!initMemberType) {
|
3032
3077
|
return;
|
3033
3078
|
}
|
@@ -3165,9 +3210,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3165
3210
|
}
|
3166
3211
|
else if ((0, types_1.isOverloadedFunction)(overrideType)) {
|
3167
3212
|
// Use the last overload.
|
3168
|
-
overrideFunction =
|
3213
|
+
overrideFunction = types_1.OverloadedFunctionType.getImplementation(overrideType);
|
3169
3214
|
// If the last overload isn't an implementation, skip the check for this symbol.
|
3170
|
-
if (
|
3215
|
+
if (!overrideFunction) {
|
3171
3216
|
return;
|
3172
3217
|
}
|
3173
3218
|
}
|
@@ -3235,7 +3280,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3235
3280
|
}
|
3236
3281
|
// If the symbol has no declaration, and the type is inferred,
|
3237
3282
|
// skip this check.
|
3238
|
-
if (!symbol.hasTypedDeclarations()) {
|
3283
|
+
if (!symbol.hasTypedDeclarations() && !(0, symbolUtils_1.isFinalVariable)(symbol)) {
|
3239
3284
|
return;
|
3240
3285
|
}
|
3241
3286
|
// Get the symbol type defined in this class.
|
@@ -3263,7 +3308,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3263
3308
|
});
|
3264
3309
|
}
|
3265
3310
|
_validateBaseClassOverride(baseClassAndSymbol, overrideSymbol, overrideType, childClassType, memberName) {
|
3266
|
-
var _a;
|
3267
3311
|
if (!(0, types_1.isInstantiableClass)(baseClassAndSymbol.classType)) {
|
3268
3312
|
return;
|
3269
3313
|
}
|
@@ -3281,15 +3325,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3281
3325
|
const baseType = (0, typeUtils_1.partiallySpecializeType)(this._evaluator.getEffectiveTypeOfSymbol(baseClassAndSymbol.symbol), baseClassAndSymbol.classType);
|
3282
3326
|
if ((0, types_1.isFunction)(baseType) || (0, types_1.isOverloadedFunction)(baseType)) {
|
3283
3327
|
const diagAddendum = new diagnostic_1.DiagnosticAddendum();
|
3284
|
-
|
3285
|
-
if ((0, types_1.isFunction)(overrideType)) {
|
3286
|
-
overrideFunction = overrideType;
|
3287
|
-
}
|
3288
|
-
else if ((0, types_1.isOverloadedFunction)(overrideType)) {
|
3289
|
-
// Use the last overload.
|
3290
|
-
overrideFunction = overrideType.overloads[overrideType.overloads.length - 1];
|
3291
|
-
}
|
3292
|
-
if (overrideFunction) {
|
3328
|
+
if ((0, types_1.isFunction)(overrideType) || (0, types_1.isOverloadedFunction)(overrideType)) {
|
3293
3329
|
const exemptMethods = ['__init__', '__new__', '__init_subclass__'];
|
3294
3330
|
// Don't enforce parameter names for dundered methods. Many of them
|
3295
3331
|
// are misnamed in typeshed stubs, so this would result in many
|
@@ -3298,8 +3334,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3298
3334
|
// Don't check certain magic functions or private symbols.
|
3299
3335
|
if (!exemptMethods.some((exempt) => exempt === memberName) &&
|
3300
3336
|
!SymbolNameUtils.isPrivateName(memberName)) {
|
3301
|
-
if (!this._evaluator.validateOverrideMethod(baseType,
|
3302
|
-
const decl = (
|
3337
|
+
if (!this._evaluator.validateOverrideMethod(baseType, overrideType, diagAddendum, enforceParamNameMatch)) {
|
3338
|
+
const decl = (0, types_1.isFunction)(overrideType) && overrideType.details.declaration
|
3339
|
+
? overrideType.details.declaration
|
3340
|
+
: (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(overrideSymbol);
|
3303
3341
|
if (decl) {
|
3304
3342
|
const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleMethodOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleMethodOverride, localize_1.Localizer.Diagnostic.incompatibleMethodOverride().format({
|
3305
3343
|
name: memberName,
|
@@ -3436,6 +3474,18 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3436
3474
|
diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.overriddenSymbol(), origDecl.path, origDecl.range);
|
3437
3475
|
}
|
3438
3476
|
}
|
3477
|
+
// Verify that there is not a Final mismatch.
|
3478
|
+
const isBaseVarFinal = (0, symbolUtils_1.isFinalVariable)(baseClassAndSymbol.symbol);
|
3479
|
+
const overrideFinalVarDecl = decls.find((d) => (0, declarationUtils_1.isFinalVariableDeclaration)(d));
|
3480
|
+
if (!isBaseVarFinal && overrideFinalVarDecl) {
|
3481
|
+
const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleVariableOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleVariableOverride, localize_1.Localizer.Diagnostic.variableFinalOverride().format({
|
3482
|
+
name: memberName,
|
3483
|
+
className: baseClassAndSymbol.classType.details.name,
|
3484
|
+
}), lastDecl.node);
|
3485
|
+
if (diag) {
|
3486
|
+
diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.overriddenSymbol(), overrideFinalVarDecl.path, overrideFinalVarDecl.range);
|
3487
|
+
}
|
3488
|
+
}
|
3439
3489
|
// Verify that a class variable isn't overriding an instance
|
3440
3490
|
// variable or vice versa.
|
3441
3491
|
const isBaseClassVar = baseClassAndSymbol.symbol.isClassVar();
|
@@ -3473,6 +3523,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3473
3523
|
// Performs checks on a function that is located within a class
|
3474
3524
|
// and has been determined not to be a property accessor.
|
3475
3525
|
_validateMethod(node, functionType, classNode) {
|
3526
|
+
var _a, _b, _c, _d;
|
3476
3527
|
const classTypeInfo = this._evaluator.getTypeOfClass(classNode);
|
3477
3528
|
const classType = classTypeInfo === null || classTypeInfo === void 0 ? void 0 : classTypeInfo.classType;
|
3478
3529
|
if (node.name && classType) {
|
@@ -3485,7 +3536,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3485
3536
|
}
|
3486
3537
|
}
|
3487
3538
|
}
|
3488
|
-
if (node.name
|
3539
|
+
if (((_a = node.name) === null || _a === void 0 ? void 0 : _a.value) === '__new__') {
|
3489
3540
|
// __new__ overrides should have a "cls" parameter.
|
3490
3541
|
if (node.parameters.length === 0 ||
|
3491
3542
|
!node.parameters[0].name ||
|
@@ -3496,7 +3547,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3496
3547
|
this._validateClsSelfParameterType(functionType, classType, /* isCls */ true);
|
3497
3548
|
}
|
3498
3549
|
}
|
3499
|
-
else if (node.name
|
3550
|
+
else if (((_b = node.name) === null || _b === void 0 ? void 0 : _b.value) === '__init_subclass__') {
|
3500
3551
|
// __init_subclass__ overrides should have a "cls" parameter.
|
3501
3552
|
if (node.parameters.length === 0 || !node.parameters[0].name || node.parameters[0].name.value !== 'cls') {
|
3502
3553
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportSelfClsParameterName, diagnosticRules_1.DiagnosticRule.reportSelfClsParameterName, localize_1.Localizer.Diagnostic.initSubclassClsParam(), node.parameters.length > 0 ? node.parameters[0] : node.name);
|
@@ -3505,7 +3556,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3505
3556
|
this._validateClsSelfParameterType(functionType, classType, /* isCls */ true);
|
3506
3557
|
}
|
3507
3558
|
}
|
3508
|
-
else if (node.name
|
3559
|
+
else if (((_c = node.name) === null || _c === void 0 ? void 0 : _c.value) === '__class_getitem__') {
|
3509
3560
|
// __class_getitem__ overrides should have a "cls" parameter.
|
3510
3561
|
if (node.parameters.length === 0 || !node.parameters[0].name || node.parameters[0].name.value !== 'cls') {
|
3511
3562
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportSelfClsParameterName, diagnosticRules_1.DiagnosticRule.reportSelfClsParameterName, localize_1.Localizer.Diagnostic.classGetItemClsParam(), node.parameters.length > 0 ? node.parameters[0] : node.name);
|
@@ -3514,6 +3565,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3514
3565
|
this._validateClsSelfParameterType(functionType, classType, /* isCls */ true);
|
3515
3566
|
}
|
3516
3567
|
}
|
3568
|
+
else if (((_d = node.name) === null || _d === void 0 ? void 0 : _d.value) === '_generate_next_value_') {
|
3569
|
+
// Skip this check for _generate_next_value_.
|
3570
|
+
}
|
3517
3571
|
else if (types_1.FunctionType.isStaticMethod(functionType)) {
|
3518
3572
|
// Static methods should not have "self" or "cls" parameters.
|
3519
3573
|
if (node.parameters.length > 0 && node.parameters[0].name) {
|
@@ -3770,7 +3824,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3770
3824
|
// Were all of the exception types overridden?
|
3771
3825
|
if (typesOfThisExcept.length === overriddenExceptionCount) {
|
3772
3826
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.unreachableExcept() + diagAddendum.getString(), except.typeExpression);
|
3773
|
-
this._evaluator.
|
3827
|
+
this._evaluator.addUnreachableCode(except, except.exceptSuite);
|
3774
3828
|
}
|
3775
3829
|
}
|
3776
3830
|
exceptionTypesSoFar.push(...typesOfThisExcept);
|