@zzzen/pyright-internal 1.2.0-dev.20231029 → 1.2.0-dev.20231105
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/checker.js +57 -50
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/codeFlowEngine.js +4 -4
- package/dist/analyzer/codeFlowEngine.js.map +1 -1
- package/dist/analyzer/codeFlowUtils.js +4 -2
- package/dist/analyzer/codeFlowUtils.js.map +1 -1
- package/dist/analyzer/constraintSolver.js +2 -3
- 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 +41 -36
- package/dist/analyzer/constructors.js.map +1 -1
- package/dist/analyzer/dataClasses.js +3 -3
- package/dist/analyzer/dataClasses.js.map +1 -1
- package/dist/analyzer/enums.d.ts +2 -5
- package/dist/analyzer/enums.js +4 -2
- package/dist/analyzer/enums.js.map +1 -1
- package/dist/analyzer/functionTransform.js +1 -1
- package/dist/analyzer/functionTransform.js.map +1 -1
- package/dist/analyzer/importResolver.d.ts +2 -1
- package/dist/analyzer/importResolver.js +13 -5
- package/dist/analyzer/importResolver.js.map +1 -1
- package/dist/analyzer/namedTuples.js +3 -2
- package/dist/analyzer/namedTuples.js.map +1 -1
- package/dist/analyzer/operations.js +22 -25
- package/dist/analyzer/operations.js.map +1 -1
- package/dist/analyzer/packageTypeVerifier.js +19 -21
- package/dist/analyzer/packageTypeVerifier.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 +17 -12
- package/dist/analyzer/program.js.map +1 -1
- package/dist/analyzer/properties.js +5 -5
- package/dist/analyzer/properties.js.map +1 -1
- package/dist/analyzer/protocols.js +1 -1
- package/dist/analyzer/protocols.js.map +1 -1
- package/dist/analyzer/service.js +11 -4
- package/dist/analyzer/service.js.map +1 -1
- package/dist/analyzer/sourceFile.d.ts +1 -0
- package/dist/analyzer/sourceFile.js +3 -0
- package/dist/analyzer/sourceFile.js.map +1 -1
- package/dist/analyzer/tracePrinter.js +11 -13
- package/dist/analyzer/tracePrinter.js.map +1 -1
- package/dist/analyzer/typeDocStringUtils.js +3 -3
- package/dist/analyzer/typeDocStringUtils.js.map +1 -1
- package/dist/analyzer/typeEvaluator.js +748 -805
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +12 -25
- package/dist/analyzer/typeEvaluatorTypes.js +1 -36
- package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
- package/dist/analyzer/typeGuards.js +27 -23
- package/dist/analyzer/typeGuards.js.map +1 -1
- package/dist/analyzer/typePrinter.js +19 -18
- package/dist/analyzer/typePrinter.js.map +1 -1
- package/dist/analyzer/typeUtils.d.ts +17 -8
- package/dist/analyzer/typeUtils.js +146 -93
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/analyzer/typeVarContext.js +6 -7
- package/dist/analyzer/typeVarContext.js.map +1 -1
- package/dist/analyzer/typeWalker.d.ts +1 -2
- package/dist/analyzer/typeWalker.js +7 -13
- package/dist/analyzer/typeWalker.js.map +1 -1
- package/dist/analyzer/typedDicts.js +10 -10
- package/dist/analyzer/typedDicts.js.map +1 -1
- package/dist/analyzer/types.d.ts +8 -19
- package/dist/analyzer/types.js +44 -76
- package/dist/analyzer/types.js.map +1 -1
- package/dist/commands/dumpFileDebugInfoCommand.js +7 -9
- package/dist/commands/dumpFileDebugInfoCommand.js.map +1 -1
- package/dist/common/commandLineOptions.d.ts +2 -1
- package/dist/common/commandLineOptions.js +1 -1
- package/dist/common/commandLineOptions.js.map +1 -1
- package/dist/common/configOptions.d.ts +1 -1
- package/dist/common/configOptions.js +22 -24
- package/dist/common/configOptions.js.map +1 -1
- package/dist/common/pathUtils.d.ts +1 -1
- package/dist/common/pathUtils.js +11 -10
- package/dist/common/pathUtils.js.map +1 -1
- package/dist/common/realFileSystem.js +4 -6
- package/dist/common/realFileSystem.js.map +1 -1
- package/dist/languageServerBase.d.ts +2 -2
- package/dist/languageServerBase.js +14 -14
- package/dist/languageServerBase.js.map +1 -1
- package/dist/languageService/analyzerServiceExecutor.js +1 -1
- package/dist/languageService/analyzerServiceExecutor.js.map +1 -1
- package/dist/languageService/callHierarchyProvider.js +3 -3
- package/dist/languageService/callHierarchyProvider.js.map +1 -1
- package/dist/languageService/completionProvider.js +8 -8
- package/dist/languageService/completionProvider.js.map +1 -1
- package/dist/languageService/completionProviderUtils.js +1 -1
- package/dist/languageService/definitionProvider.js +1 -1
- package/dist/languageService/documentSymbolCollector.js +1 -1
- package/dist/languageService/hoverProvider.js +1 -1
- package/dist/languageService/signatureHelpProvider.js +0 -14
- package/dist/languageService/signatureHelpProvider.js.map +1 -1
- package/dist/languageService/tooltipUtils.js +4 -4
- package/dist/languageService/tooltipUtils.js.map +1 -1
- package/dist/localization/localize.d.ts +12 -0
- package/dist/localization/localize.js +4 -0
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.cs.json +1 -1
- package/dist/localization/package.nls.de.json +1 -1
- package/dist/localization/package.nls.en-us.json +4 -0
- package/dist/localization/package.nls.es.json +1 -1
- package/dist/localization/package.nls.fr.json +1 -1
- package/dist/localization/package.nls.it.json +1 -1
- package/dist/localization/package.nls.ja.json +1 -1
- package/dist/localization/package.nls.ko.json +1 -1
- package/dist/localization/package.nls.pl.json +1 -1
- package/dist/localization/package.nls.pt-br.json +1 -1
- package/dist/localization/package.nls.ru.json +1 -1
- package/dist/localization/package.nls.tr.json +1 -1
- package/dist/localization/package.nls.zh-cn.json +1 -1
- package/dist/localization/package.nls.zh-tw.json +1 -1
- package/dist/pyright.js +3 -6
- package/dist/pyright.js.map +1 -1
- package/dist/server.d.ts +1 -0
- package/dist/server.js +10 -1
- package/dist/server.js.map +1 -1
- package/dist/tests/fourslash/{completions.importInterimFile.fourslash.js → completions.importInterimFile.fourslash.disabled.js} +2 -2
- package/dist/tests/fourslash/completions.importInterimFile.fourslash.disabled.js.map +1 -0
- package/dist/tests/fourslash/fourslash.d.ts +1 -1
- package/dist/tests/fourslash/signature.complicated.fourslash.js +6 -6
- package/dist/tests/fourslash/signature.complicated.fourslash.js.map +1 -1
- package/dist/tests/harness/fourslash/testState.d.ts +1 -1
- package/dist/tests/harness/fourslash/testState.js +1 -1
- package/dist/tests/harness/fourslash/testState.js.map +1 -1
- package/dist/tests/harness/vfs/filesystem.js +1 -1
- package/dist/tests/harness/vfs/filesystem.js.map +1 -1
- package/dist/tests/logger.test.js +0 -1
- package/dist/tests/logger.test.js.map +1 -1
- package/dist/tests/pathUtils.test.js +30 -1
- package/dist/tests/pathUtils.test.js.map +1 -1
- package/dist/tests/testUtils.js +2 -1
- package/dist/tests/testUtils.js.map +1 -1
- package/dist/tests/typeEvaluator1.test.js +3 -3
- package/dist/tests/typeEvaluator2.test.js +1 -1
- package/dist/tests/typeEvaluator3.test.js +7 -1
- package/dist/tests/typeEvaluator3.test.js.map +1 -1
- package/dist/tests/typeEvaluator4.test.js +6 -2
- package/dist/tests/typeEvaluator4.test.js.map +1 -1
- package/dist/tests/typePrinter.test.js +12 -16
- package/dist/tests/typePrinter.test.js.map +1 -1
- package/dist/tests/zipfs.test.js +2 -0
- package/dist/tests/zipfs.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/tests/fourslash/completions.importInterimFile.fourslash.js.map +0 -1
- /package/dist/tests/fourslash/{completions.importInterimFile.fourslash.d.ts → completions.importInterimFile.fourslash.disabled.d.ts} +0 -0
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"analyzerFileInfo.js","sourceRoot":"","sources":["../../../src/analyzer/analyzerFileInfo.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAIH,2DAAwD;
|
1
|
+
{"version":3,"file":"analyzerFileInfo.js","sourceRoot":"","sources":["../../../src/analyzer/analyzerFileInfo.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAIH,2DAAwD;AAsDxD,SAAgB,+BAA+B,CAAC,QAA0B;IACtE,IAAI,QAAQ,CAAC,UAAU,EAAE;QACrB,OAAO,IAAI,CAAC;KACf;IAED,IAAI,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;QAC3C,OAAO,IAAI,CAAC;KACf;IAED,oFAAoF;IACpF,iFAAiF;IACjF,8BAA8B;IAC9B,qGAAqG;IACrG,IAAI,QAAQ,CAAC,oBAAoB,CAAC,aAAa,IAAI,6BAAa,CAAC,KAAK,EAAE;QACpE,OAAO,IAAI,CAAC;KACf;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAlBD,0EAkBC"}
|
package/dist/analyzer/checker.js
CHANGED
@@ -195,7 +195,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
195
195
|
return false;
|
196
196
|
}
|
197
197
|
visitFunction(node) {
|
198
|
-
var _a;
|
198
|
+
var _a, _b;
|
199
199
|
if (node.typeParameters) {
|
200
200
|
this.walk(node.typeParameters);
|
201
201
|
}
|
@@ -210,9 +210,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
210
210
|
// Track whether we have seen a *args: P.args parameter. Named
|
211
211
|
// parameters after this need to be flagged as an error.
|
212
212
|
let sawParamSpecArgs = false;
|
213
|
+
const keywordNames = new Set();
|
214
|
+
const paramDetails = (0, parameterUtils_1.getParameterListDetails)(functionTypeResult.functionType);
|
213
215
|
// Report any unknown or missing parameter types.
|
214
216
|
node.parameters.forEach((param, index) => {
|
215
217
|
if (param.name) {
|
218
|
+
if (param.category === 0 /* Simple */ && index >= paramDetails.positionOnlyParamCount) {
|
219
|
+
keywordNames.add(param.name.value);
|
220
|
+
}
|
216
221
|
// Determine whether this is a P.args parameter.
|
217
222
|
if (param.category === 1 /* ArgsList */) {
|
218
223
|
const annotationExpr = param.typeAnnotation || param.typeAnnotationComment;
|
@@ -270,6 +275,24 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
270
275
|
}
|
271
276
|
}
|
272
277
|
});
|
278
|
+
// Verify that an unpacked TypedDict doesn't overlap any keyword parameters.
|
279
|
+
if (paramDetails.hasUnpackedTypedDict) {
|
280
|
+
const kwargsIndex = functionTypeResult.functionType.details.parameters.length - 1;
|
281
|
+
const kwargsType = types_1.FunctionType.getEffectiveParameterType(functionTypeResult.functionType, kwargsIndex);
|
282
|
+
if ((0, types_1.isClass)(kwargsType) && kwargsType.details.typedDictEntries) {
|
283
|
+
const overlappingEntries = new Set();
|
284
|
+
kwargsType.details.typedDictEntries.forEach((_, name) => {
|
285
|
+
if (keywordNames.has(name)) {
|
286
|
+
overlappingEntries.add(name);
|
287
|
+
}
|
288
|
+
});
|
289
|
+
if (overlappingEntries.size > 0) {
|
290
|
+
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.overlappingKeywordArgs().format({
|
291
|
+
names: [...overlappingEntries.values()].join(', '),
|
292
|
+
}), (_a = node.parameters[kwargsIndex].typeAnnotation) !== null && _a !== void 0 ? _a : node.parameters[kwargsIndex]);
|
293
|
+
}
|
294
|
+
}
|
295
|
+
}
|
273
296
|
// Check for invalid use of ParamSpec P.args and P.kwargs.
|
274
297
|
const paramSpecParams = functionTypeResult.functionType.details.parameters.filter((param) => {
|
275
298
|
if (param.typeAnnotation && (0, types_1.isTypeVar)(param.type) && (0, types_1.isParamSpec)(param.type)) {
|
@@ -284,7 +307,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
284
307
|
}
|
285
308
|
// If this is a stub, ensure that the return type is specified.
|
286
309
|
if (this._fileInfo.isStubFile) {
|
287
|
-
const returnAnnotation = node.returnTypeAnnotation || ((
|
310
|
+
const returnAnnotation = node.returnTypeAnnotation || ((_b = node.functionAnnotationComment) === null || _b === void 0 ? void 0 : _b.returnTypeAnnotation);
|
288
311
|
if (!returnAnnotation) {
|
289
312
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportUnknownParameterType, diagnosticRules_1.DiagnosticRule.reportUnknownParameterType, localize_1.Localizer.Diagnostic.returnTypeUnknown(), node.name);
|
290
313
|
}
|
@@ -514,7 +537,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
514
537
|
}
|
515
538
|
else {
|
516
539
|
// There is no return expression, so "None" is assumed.
|
517
|
-
returnTypeResult = { type:
|
540
|
+
returnTypeResult = { type: this._evaluator.getNoneType() };
|
518
541
|
}
|
519
542
|
// If the enclosing function is async and a generator, the return
|
520
543
|
// statement is not allowed to have an argument. A syntax error occurs
|
@@ -591,7 +614,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
591
614
|
var _a;
|
592
615
|
const yieldTypeResult = node.expression
|
593
616
|
? this._evaluator.getTypeResult(node.expression)
|
594
|
-
: { type:
|
617
|
+
: { type: this._evaluator.getNoneType() };
|
595
618
|
this._validateYieldType(node, (_a = yieldTypeResult === null || yieldTypeResult === void 0 ? void 0 : yieldTypeResult.type) !== null && _a !== void 0 ? _a : types_1.UnknownType.create(), yieldTypeResult === null || yieldTypeResult === void 0 ? void 0 : yieldTypeResult.expectedTypeDiagAddendum);
|
596
619
|
return true;
|
597
620
|
}
|
@@ -633,7 +656,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
633
656
|
const diagAddendum = new diagnostic_1.DiagnosticAddendum();
|
634
657
|
(0, typeUtils_1.doForEachSubtype)(exceptionType, (subtype) => {
|
635
658
|
subtype = this._evaluator.makeTopLevelTypeVarsConcrete(subtype);
|
636
|
-
if (!(0, types_1.isAnyOrUnknown)(subtype) && !(0,
|
659
|
+
if (!(0, types_1.isAnyOrUnknown)(subtype) && !(0, typeUtils_1.isNoneInstance)(subtype)) {
|
637
660
|
if ((0, types_1.isClass)(subtype)) {
|
638
661
|
if (!(0, typeUtils_1.derivesFromClassRecursive)(subtype, baseExceptionType, /* ignoreUnknown */ false)) {
|
639
662
|
diagAddendum.addMessage(localize_1.Localizer.Diagnostic.exceptionTypeIncorrect().format({
|
@@ -1077,7 +1100,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1077
1100
|
return undefined;
|
1078
1101
|
}
|
1079
1102
|
// Invoke the __bool__ method on the type.
|
1080
|
-
const boolReturnType = this._evaluator.
|
1103
|
+
const boolReturnType = this._evaluator.getTypeOfMagicMethodCall(expandedSubtype, '__bool__', [], node,
|
1081
1104
|
/* inferenceContext */ undefined);
|
1082
1105
|
if (!boolReturnType || (0, types_1.isAnyOrUnknown)(boolReturnType)) {
|
1083
1106
|
return undefined;
|
@@ -1252,7 +1275,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1252
1275
|
// operation have overlapping types.
|
1253
1276
|
_validateComparisonTypesForIsOperator(node) {
|
1254
1277
|
const rightType = this._evaluator.getType(node.rightExpression);
|
1255
|
-
if (!rightType || !(0,
|
1278
|
+
if (!rightType || !(0, typeUtils_1.isNoneInstance)(rightType)) {
|
1256
1279
|
return;
|
1257
1280
|
}
|
1258
1281
|
const leftType = this._evaluator.getType(node.leftExpression);
|
@@ -1262,7 +1285,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1262
1285
|
let foundMatchForNone = false;
|
1263
1286
|
(0, typeUtils_1.doForEachSubtype)(leftType, (subtype) => {
|
1264
1287
|
subtype = this._evaluator.makeTopLevelTypeVarsConcrete(subtype);
|
1265
|
-
if (this._evaluator.assignType(subtype,
|
1288
|
+
if (this._evaluator.assignType(subtype, this._evaluator.getNoneType())) {
|
1266
1289
|
foundMatchForNone = true;
|
1267
1290
|
}
|
1268
1291
|
});
|
@@ -1359,7 +1382,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1359
1382
|
if ((0, types_1.isModule)(leftType) || (0, types_1.isModule)(rightType)) {
|
1360
1383
|
return (0, types_1.isTypeSame)(leftType, rightType);
|
1361
1384
|
}
|
1362
|
-
if ((0,
|
1385
|
+
if ((0, typeUtils_1.isNoneInstance)(leftType) || (0, typeUtils_1.isNoneInstance)(rightType)) {
|
1363
1386
|
return (0, types_1.isTypeSame)(leftType, rightType);
|
1364
1387
|
}
|
1365
1388
|
const isLeftCallable = (0, types_1.isFunction)(leftType) || (0, types_1.isOverloadedFunction)(leftType);
|
@@ -1468,7 +1491,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1468
1491
|
// Determines whether the specified type is one that should trigger
|
1469
1492
|
// an "unused" value diagnostic.
|
1470
1493
|
_isTypeValidForUnusedValueTest(type) {
|
1471
|
-
return !(0,
|
1494
|
+
return !(0, typeUtils_1.isNoneInstance)(type) && !(0, types_1.isNever)(type) && !(0, types_1.isAnyOrUnknown)(type);
|
1472
1495
|
}
|
1473
1496
|
// Verifies that each local type variable is used more than once.
|
1474
1497
|
_validateFunctionTypeVarUsage(node, functionTypeResult) {
|
@@ -2638,22 +2661,22 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
2638
2661
|
case 1 /* Unknown */:
|
2639
2662
|
case 0 /* Unbound */:
|
2640
2663
|
break;
|
2641
|
-
case
|
2642
|
-
|
2643
|
-
|
2644
|
-
|
2664
|
+
case 6 /* Class */:
|
2665
|
+
if ((0, typeUtils_1.isNoneInstance)(subtype)) {
|
2666
|
+
isSupported = false;
|
2667
|
+
}
|
2668
|
+
else if (subtype.isTypeArgumentExplicit && !subtype.includeSubclasses) {
|
2669
|
+
// If it's a class, make sure that it has not been given explicit
|
2670
|
+
// type arguments. This will result in a TypeError exception.
|
2645
2671
|
isSupported = false;
|
2646
2672
|
}
|
2647
2673
|
break;
|
2648
|
-
case
|
2649
|
-
isSupported = types_1.TypeBase.isInstantiable(subtype);
|
2650
|
-
break;
|
2651
|
-
case 5 /* Function */:
|
2674
|
+
case 4 /* Function */:
|
2652
2675
|
if (!types_1.TypeBase.isInstantiable(subtype) || subtype.isCallableWithTypeArgs) {
|
2653
2676
|
isSupported = false;
|
2654
2677
|
}
|
2655
2678
|
break;
|
2656
|
-
case
|
2679
|
+
case 8 /* Union */:
|
2657
2680
|
isSupported = this._isTypeSupportedTypeForIsInstance(subtype, isInstanceCheck);
|
2658
2681
|
break;
|
2659
2682
|
default:
|
@@ -3105,14 +3128,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3105
3128
|
const returnAnnotation = node.returnTypeAnnotation || ((_a = node.functionAnnotationComment) === null || _a === void 0 ? void 0 : _a.returnTypeAnnotation);
|
3106
3129
|
const declaredReturnType = functionType.details.declaredReturnType;
|
3107
3130
|
if (returnAnnotation && declaredReturnType) {
|
3108
|
-
if (!(0,
|
3131
|
+
if (!(0, typeUtils_1.isNoneInstance)(declaredReturnType) && !(0, types_1.isNever)(declaredReturnType)) {
|
3109
3132
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.initMustReturnNone(), returnAnnotation);
|
3110
3133
|
}
|
3111
3134
|
}
|
3112
3135
|
else {
|
3113
3136
|
const inferredReturnType = this._evaluator.getFunctionInferredReturnType(functionType);
|
3114
3137
|
if (!(0, types_1.isNever)(inferredReturnType) &&
|
3115
|
-
!(0,
|
3138
|
+
!(0, typeUtils_1.isNoneInstance)(inferredReturnType) &&
|
3116
3139
|
!(0, types_1.isAnyOrUnknown)(inferredReturnType)) {
|
3117
3140
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.initMustReturnNone(), node.name);
|
3118
3141
|
}
|
@@ -3161,7 +3184,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3161
3184
|
// type doesn't allow it. Skip this check for abstract methods.
|
3162
3185
|
const diagAddendum = new diagnostic_1.DiagnosticAddendum();
|
3163
3186
|
// If the declared type isn't compatible with 'None', flag an error.
|
3164
|
-
if (!this._evaluator.assignType(declaredReturnType,
|
3187
|
+
if (!this._evaluator.assignType(declaredReturnType, this._evaluator.getNoneType(), diagAddendum)) {
|
3165
3188
|
// If the function consists entirely of "...", assume that it's
|
3166
3189
|
// an abstract method or a protocol method and don't require that
|
3167
3190
|
// the return type matches. This check can also be skipped for an overload.
|
@@ -3289,7 +3312,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3289
3312
|
if (!types_1.ClassType.isDataClass(classType)) {
|
3290
3313
|
return;
|
3291
3314
|
}
|
3292
|
-
const postInitMember = (0, typeUtils_1.lookUpClassMember)(classType, '__post_init__', 2 /* SkipBaseClasses */ |
|
3315
|
+
const postInitMember = (0, typeUtils_1.lookUpClassMember)(classType, '__post_init__', 2 /* SkipBaseClasses */ | 64 /* DeclaredTypesOnly */);
|
3293
3316
|
// If there's no __post_init__ method, there's nothing to check.
|
3294
3317
|
if (!postInitMember) {
|
3295
3318
|
return;
|
@@ -3604,8 +3627,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3604
3627
|
}
|
3605
3628
|
// Validates that the __init__ and __new__ method signatures are consistent.
|
3606
3629
|
_validateConstructorConsistency(classType) {
|
3607
|
-
const initMember = (0, typeUtils_1.lookUpClassMember)(classType, '__init__', 4 /* SkipObjectBaseClass */ |
|
3608
|
-
const newMember = (0, typeUtils_1.lookUpClassMember)(classType, '__new__', 4 /* SkipObjectBaseClass */ |
|
3630
|
+
const initMember = (0, typeUtils_1.lookUpClassMember)(classType, '__init__', 4 /* SkipObjectBaseClass */ | 16 /* SkipInstanceMembers */);
|
3631
|
+
const newMember = (0, typeUtils_1.lookUpClassMember)(classType, '__new__', 4 /* SkipObjectBaseClass */ | 16 /* SkipInstanceMembers */);
|
3609
3632
|
if (!initMember || !newMember || !(0, types_1.isClass)(initMember.classType) || !(0, types_1.isClass)(newMember.classType)) {
|
3610
3633
|
return;
|
3611
3634
|
}
|
@@ -3619,7 +3642,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3619
3642
|
// __call__ method, skip this check.
|
3620
3643
|
const metaclass = newMember.classType.details.effectiveMetaclass;
|
3621
3644
|
if (metaclass && (0, types_1.isClass)(metaclass) && !types_1.ClassType.isBuiltIn(metaclass, 'type')) {
|
3622
|
-
const callMethod = (0, typeUtils_1.lookUpClassMember)(metaclass, '__call__',
|
3645
|
+
const callMethod = (0, typeUtils_1.lookUpClassMember)(metaclass, '__call__', 8 /* SkipTypeBaseClass */ | 16 /* SkipInstanceMembers */);
|
3623
3646
|
if (callMethod) {
|
3624
3647
|
return;
|
3625
3648
|
}
|
@@ -4064,8 +4087,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4064
4087
|
return;
|
4065
4088
|
}
|
4066
4089
|
const baseClass = baseClassAndSymbol.classType;
|
4067
|
-
const childClassSelf = (0, typeUtils_1.selfSpecializeClass)(childClassType);
|
4068
|
-
const baseType = (0, typeUtils_1.partiallySpecializeType)(this._evaluator.getEffectiveTypeOfSymbol(baseClassAndSymbol.symbol), baseClass,
|
4090
|
+
const childClassSelf = types_1.ClassType.cloneAsInstance((0, typeUtils_1.selfSpecializeClass)(childClassType));
|
4091
|
+
const baseType = (0, typeUtils_1.partiallySpecializeType)(this._evaluator.getEffectiveTypeOfSymbol(baseClassAndSymbol.symbol), baseClass, childClassSelf);
|
4092
|
+
overrideType = (0, typeUtils_1.partiallySpecializeType)(overrideType, childClassType, childClassSelf);
|
4069
4093
|
if ((0, types_1.isFunction)(baseType) || (0, types_1.isOverloadedFunction)(baseType)) {
|
4070
4094
|
const diagAddendum = new diagnostic_1.DiagnosticAddendum();
|
4071
4095
|
if ((0, types_1.isFunction)(overrideType) || (0, types_1.isOverloadedFunction)(overrideType)) {
|
@@ -4290,7 +4314,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4290
4314
|
// Performs checks on a function that is located within a class
|
4291
4315
|
// and has been determined not to be a property accessor.
|
4292
4316
|
_validateMethod(node, functionType, classNode) {
|
4293
|
-
var _a, _b
|
4317
|
+
var _a, _b;
|
4294
4318
|
const classTypeInfo = this._evaluator.getTypeOfClass(classNode);
|
4295
4319
|
const classType = classTypeInfo === null || classTypeInfo === void 0 ? void 0 : classTypeInfo.classType;
|
4296
4320
|
if (node.name && classType) {
|
@@ -4314,25 +4338,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4314
4338
|
this._validateClsSelfParameterType(functionType, classType, /* isCls */ true);
|
4315
4339
|
}
|
4316
4340
|
}
|
4317
|
-
else if (((_b = node.name) === null || _b === void 0 ? void 0 : _b.value) === '
|
4318
|
-
// __init_subclass__ overrides should have a "cls" parameter.
|
4319
|
-
if (node.parameters.length === 0 || !node.parameters[0].name || node.parameters[0].name.value !== 'cls') {
|
4320
|
-
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);
|
4321
|
-
}
|
4322
|
-
if (classType) {
|
4323
|
-
this._validateClsSelfParameterType(functionType, classType, /* isCls */ true);
|
4324
|
-
}
|
4325
|
-
}
|
4326
|
-
else if (((_c = node.name) === null || _c === void 0 ? void 0 : _c.value) === '__class_getitem__') {
|
4327
|
-
// __class_getitem__ overrides should have a "cls" parameter.
|
4328
|
-
if (node.parameters.length === 0 || !node.parameters[0].name || node.parameters[0].name.value !== 'cls') {
|
4329
|
-
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);
|
4330
|
-
}
|
4331
|
-
if (classType) {
|
4332
|
-
this._validateClsSelfParameterType(functionType, classType, /* isCls */ true);
|
4333
|
-
}
|
4334
|
-
}
|
4335
|
-
else if (((_d = node.name) === null || _d === void 0 ? void 0 : _d.value) === '_generate_next_value_') {
|
4341
|
+
else if (((_b = node.name) === null || _b === void 0 ? void 0 : _b.value) === '_generate_next_value_') {
|
4336
4342
|
// Skip this check for _generate_next_value_.
|
4337
4343
|
}
|
4338
4344
|
else if (types_1.FunctionType.isStaticMethod(functionType)) {
|
@@ -4420,7 +4426,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4420
4426
|
// it could be combined with other classes in a multi-inheritance
|
4421
4427
|
// situation that effectively adds new superclasses that we don't know
|
4422
4428
|
// about statically.
|
4423
|
-
let effectiveFlags =
|
4429
|
+
let effectiveFlags = 16 /* SkipInstanceMembers */ | 1 /* SkipOriginalClass */;
|
4424
4430
|
if (types_1.ClassType.isFinal(classType)) {
|
4425
4431
|
effectiveFlags |= 4 /* SkipObjectBaseClass */;
|
4426
4432
|
}
|
@@ -4593,7 +4599,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4593
4599
|
else if ((0, types_1.isClassInstance)(exceptionType)) {
|
4594
4600
|
const iterableType = (_b = (_a = this._evaluator.getTypeOfIterator({ type: exceptionType },
|
4595
4601
|
/* isAsync */ false,
|
4596
|
-
/* errorNode */
|
4602
|
+
/* errorNode */ except.typeExpression,
|
4603
|
+
/* emitNotIterableError */ false)) === null || _a === void 0 ? void 0 : _a.type) !== null && _b !== void 0 ? _b : types_1.UnknownType.create();
|
4597
4604
|
(0, typeUtils_1.doForEachSubtype)(iterableType, (subtype) => {
|
4598
4605
|
if ((0, types_1.isAnyOrUnknown)(subtype)) {
|
4599
4606
|
sawUnknownExceptionType = true;
|