@zzzen/pyright-internal 1.2.0-dev.20231029 → 1.2.0-dev.20231112
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 +99 -105
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/codeFlowEngine.js +12 -33
- 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 +21 -23
- package/dist/analyzer/constraintSolver.js.map +1 -1
- package/dist/analyzer/constructorTransform.js +4 -6
- package/dist/analyzer/constructorTransform.js.map +1 -1
- package/dist/analyzer/constructors.d.ts +6 -3
- package/dist/analyzer/constructors.js +66 -41
- package/dist/analyzer/constructors.js.map +1 -1
- package/dist/analyzer/dataClasses.js +13 -18
- package/dist/analyzer/dataClasses.js.map +1 -1
- package/dist/analyzer/declarationUtils.js +1 -1
- package/dist/analyzer/declarationUtils.js.map +1 -1
- package/dist/analyzer/decorators.js +1 -1
- package/dist/analyzer/decorators.js.map +1 -1
- package/dist/analyzer/enums.d.ts +2 -5
- package/dist/analyzer/enums.js +5 -3
- 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 +4 -2
- package/dist/analyzer/importResolver.js +30 -10
- package/dist/analyzer/importResolver.js.map +1 -1
- package/dist/analyzer/importStatementUtils.d.ts +1 -1
- package/dist/analyzer/importStatementUtils.js +33 -5
- package/dist/analyzer/importStatementUtils.js.map +1 -1
- package/dist/analyzer/namedTuples.js +3 -2
- package/dist/analyzer/namedTuples.js.map +1 -1
- package/dist/analyzer/operations.js +34 -31
- package/dist/analyzer/operations.js.map +1 -1
- package/dist/analyzer/packageTypeVerifier.js +28 -26
- package/dist/analyzer/packageTypeVerifier.js.map +1 -1
- package/dist/analyzer/parseTreeUtils.d.ts +1 -0
- package/dist/analyzer/parseTreeUtils.js +17 -2
- package/dist/analyzer/parseTreeUtils.js.map +1 -1
- package/dist/analyzer/patternMatching.js +6 -6
- package/dist/analyzer/patternMatching.js.map +1 -1
- package/dist/analyzer/program.d.ts +1 -1
- package/dist/analyzer/program.js +34 -21
- package/dist/analyzer/program.js.map +1 -1
- package/dist/analyzer/properties.js +25 -28
- package/dist/analyzer/properties.js.map +1 -1
- package/dist/analyzer/protocols.d.ts +1 -1
- package/dist/analyzer/protocols.js +15 -19
- package/dist/analyzer/protocols.js.map +1 -1
- package/dist/analyzer/service.js +12 -6
- package/dist/analyzer/service.js.map +1 -1
- package/dist/analyzer/sourceFile.d.ts +1 -0
- package/dist/analyzer/sourceFile.js +36 -2
- package/dist/analyzer/sourceFile.js.map +1 -1
- package/dist/analyzer/sourceFileInfoUtils.d.ts +1 -1
- package/dist/analyzer/sourceFileInfoUtils.js +9 -3
- package/dist/analyzer/sourceFileInfoUtils.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.d.ts +3 -1
- package/dist/analyzer/typeEvaluator.js +1184 -1270
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +13 -26
- package/dist/analyzer/typeEvaluatorTypes.js +1 -36
- package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
- package/dist/analyzer/typeGuards.js +37 -32
- 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 +149 -94
- 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 +11 -20
- package/dist/analyzer/types.js +45 -77
- 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 +3 -2
- package/dist/common/configOptions.js +40 -25
- package/dist/common/configOptions.js.map +1 -1
- package/dist/common/extensibility.d.ts +3 -0
- 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/common/serviceProviderExtensions.d.ts +2 -1
- package/dist/common/serviceProviderExtensions.js +1 -0
- package/dist/common/serviceProviderExtensions.js.map +1 -1
- package/dist/common/textEditTracker.js +2 -2
- package/dist/common/textEditTracker.js.map +1 -1
- package/dist/languageServerBase.d.ts +3 -3
- package/dist/languageServerBase.js +18 -15
- 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.d.ts +2 -1
- package/dist/languageService/completionProvider.js +12 -10
- 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 +16 -0
- package/dist/localization/localize.js +6 -0
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.cs.json +4 -1
- package/dist/localization/package.nls.de.json +4 -1
- package/dist/localization/package.nls.en-us.json +7 -1
- package/dist/localization/package.nls.es.json +4 -1
- package/dist/localization/package.nls.fr.json +4 -1
- package/dist/localization/package.nls.it.json +4 -1
- package/dist/localization/package.nls.ja.json +4 -1
- package/dist/localization/package.nls.ko.json +4 -1
- package/dist/localization/package.nls.pl.json +4 -1
- package/dist/localization/package.nls.pt-br.json +4 -1
- package/dist/localization/package.nls.qps-ploc.json +3 -0
- package/dist/localization/package.nls.ru.json +4 -1
- package/dist/localization/package.nls.tr.json +4 -1
- package/dist/localization/package.nls.zh-cn.json +4 -1
- package/dist/localization/package.nls.zh-tw.json +4 -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/diagnosticOverrides.test.js +4 -2
- package/dist/tests/diagnosticOverrides.test.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/fourslash/signature.dunderNew.fourslash.js +1 -1
- package/dist/tests/fourslash/signature.dunderNew.fourslash.js.map +1 -1
- package/dist/tests/harness/fourslash/testState.d.ts +1 -1
- package/dist/tests/harness/fourslash/testState.js +4 -4
- 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/parseTreeUtils.test.js +15 -0
- package/dist/tests/parseTreeUtils.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/textEditUtil.test.js +25 -0
- package/dist/tests/textEditUtil.test.js.map +1 -1
- package/dist/tests/typeEvaluator1.test.js +7 -3
- package/dist/tests/typeEvaluator1.test.js.map +1 -1
- package/dist/tests/typeEvaluator2.test.js +5 -1
- package/dist/tests/typeEvaluator2.test.js.map +1 -1
- package/dist/tests/typeEvaluator3.test.js +10 -4
- package/dist/tests/typeEvaluator3.test.js.map +1 -1
- package/dist/tests/typeEvaluator4.test.js +11 -7
- 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
@@ -46,6 +46,7 @@ const localize_1 = require("../localization/localize");
|
|
46
46
|
const parseNodes_1 = require("../parser/parseNodes");
|
47
47
|
const stringTokenUtils_1 = require("../parser/stringTokenUtils");
|
48
48
|
const AnalyzerNodeInfo = __importStar(require("./analyzerNodeInfo"));
|
49
|
+
const constructors_1 = require("./constructors");
|
49
50
|
const declaration_1 = require("./declaration");
|
50
51
|
const declarationUtils_1 = require("./declarationUtils");
|
51
52
|
const deprecatedSymbols_1 = require("./deprecatedSymbols");
|
@@ -176,7 +177,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
176
177
|
this._validateBaseClassOverrides(classTypeResult.classType);
|
177
178
|
this._validateMultipleInheritanceBaseClasses(classTypeResult.classType, node.name);
|
178
179
|
this._validateMultipleInheritanceCompatibility(classTypeResult.classType, node.name);
|
179
|
-
this._validateConstructorConsistency(classTypeResult.classType);
|
180
|
+
this._validateConstructorConsistency(classTypeResult.classType, node.name);
|
180
181
|
this._validateFinalMemberOverrides(classTypeResult.classType);
|
181
182
|
this._validateInstanceVariableInitialization(node, classTypeResult.classType);
|
182
183
|
this._validateFinalClassNotAbstract(classTypeResult.classType, node);
|
@@ -195,7 +196,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
195
196
|
return false;
|
196
197
|
}
|
197
198
|
visitFunction(node) {
|
198
|
-
var _a;
|
199
|
+
var _a, _b;
|
199
200
|
if (node.typeParameters) {
|
200
201
|
this.walk(node.typeParameters);
|
201
202
|
}
|
@@ -210,9 +211,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
210
211
|
// Track whether we have seen a *args: P.args parameter. Named
|
211
212
|
// parameters after this need to be flagged as an error.
|
212
213
|
let sawParamSpecArgs = false;
|
214
|
+
const keywordNames = new Set();
|
215
|
+
const paramDetails = (0, parameterUtils_1.getParameterListDetails)(functionTypeResult.functionType);
|
213
216
|
// Report any unknown or missing parameter types.
|
214
217
|
node.parameters.forEach((param, index) => {
|
215
218
|
if (param.name) {
|
219
|
+
if (param.category === 0 /* Simple */ && index >= paramDetails.positionOnlyParamCount) {
|
220
|
+
keywordNames.add(param.name.value);
|
221
|
+
}
|
216
222
|
// Determine whether this is a P.args parameter.
|
217
223
|
if (param.category === 1 /* ArgsList */) {
|
218
224
|
const annotationExpr = param.typeAnnotation || param.typeAnnotationComment;
|
@@ -270,6 +276,24 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
270
276
|
}
|
271
277
|
}
|
272
278
|
});
|
279
|
+
// Verify that an unpacked TypedDict doesn't overlap any keyword parameters.
|
280
|
+
if (paramDetails.hasUnpackedTypedDict) {
|
281
|
+
const kwargsIndex = functionTypeResult.functionType.details.parameters.length - 1;
|
282
|
+
const kwargsType = types_1.FunctionType.getEffectiveParameterType(functionTypeResult.functionType, kwargsIndex);
|
283
|
+
if ((0, types_1.isClass)(kwargsType) && kwargsType.details.typedDictEntries) {
|
284
|
+
const overlappingEntries = new Set();
|
285
|
+
kwargsType.details.typedDictEntries.forEach((_, name) => {
|
286
|
+
if (keywordNames.has(name)) {
|
287
|
+
overlappingEntries.add(name);
|
288
|
+
}
|
289
|
+
});
|
290
|
+
if (overlappingEntries.size > 0) {
|
291
|
+
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.overlappingKeywordArgs().format({
|
292
|
+
names: [...overlappingEntries.values()].join(', '),
|
293
|
+
}), (_a = node.parameters[kwargsIndex].typeAnnotation) !== null && _a !== void 0 ? _a : node.parameters[kwargsIndex]);
|
294
|
+
}
|
295
|
+
}
|
296
|
+
}
|
273
297
|
// Check for invalid use of ParamSpec P.args and P.kwargs.
|
274
298
|
const paramSpecParams = functionTypeResult.functionType.details.parameters.filter((param) => {
|
275
299
|
if (param.typeAnnotation && (0, types_1.isTypeVar)(param.type) && (0, types_1.isParamSpec)(param.type)) {
|
@@ -284,7 +308,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
284
308
|
}
|
285
309
|
// If this is a stub, ensure that the return type is specified.
|
286
310
|
if (this._fileInfo.isStubFile) {
|
287
|
-
const returnAnnotation = node.returnTypeAnnotation || ((
|
311
|
+
const returnAnnotation = node.returnTypeAnnotation || ((_b = node.functionAnnotationComment) === null || _b === void 0 ? void 0 : _b.returnTypeAnnotation);
|
288
312
|
if (!returnAnnotation) {
|
289
313
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportUnknownParameterType, diagnosticRules_1.DiagnosticRule.reportUnknownParameterType, localize_1.Localizer.Diagnostic.returnTypeUnknown(), node.name);
|
290
314
|
}
|
@@ -514,7 +538,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
514
538
|
}
|
515
539
|
else {
|
516
540
|
// There is no return expression, so "None" is assumed.
|
517
|
-
returnTypeResult = { type:
|
541
|
+
returnTypeResult = { type: this._evaluator.getNoneType() };
|
518
542
|
}
|
519
543
|
// If the enclosing function is async and a generator, the return
|
520
544
|
// statement is not allowed to have an argument. A syntax error occurs
|
@@ -591,7 +615,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
591
615
|
var _a;
|
592
616
|
const yieldTypeResult = node.expression
|
593
617
|
? this._evaluator.getTypeResult(node.expression)
|
594
|
-
: { type:
|
618
|
+
: { type: this._evaluator.getNoneType() };
|
595
619
|
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
620
|
return true;
|
597
621
|
}
|
@@ -633,7 +657,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
633
657
|
const diagAddendum = new diagnostic_1.DiagnosticAddendum();
|
634
658
|
(0, typeUtils_1.doForEachSubtype)(exceptionType, (subtype) => {
|
635
659
|
subtype = this._evaluator.makeTopLevelTypeVarsConcrete(subtype);
|
636
|
-
if (!(0, types_1.isAnyOrUnknown)(subtype) && !(0,
|
660
|
+
if (!(0, types_1.isAnyOrUnknown)(subtype) && !(0, typeUtils_1.isNoneInstance)(subtype)) {
|
637
661
|
if ((0, types_1.isClass)(subtype)) {
|
638
662
|
if (!(0, typeUtils_1.derivesFromClassRecursive)(subtype, baseExceptionType, /* ignoreUnknown */ false)) {
|
639
663
|
diagAddendum.addMessage(localize_1.Localizer.Diagnostic.exceptionTypeIncorrect().format({
|
@@ -1077,7 +1101,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1077
1101
|
return undefined;
|
1078
1102
|
}
|
1079
1103
|
// Invoke the __bool__ method on the type.
|
1080
|
-
const boolReturnType = this._evaluator.
|
1104
|
+
const boolReturnType = this._evaluator.getTypeOfMagicMethodCall(expandedSubtype, '__bool__', [], node,
|
1081
1105
|
/* inferenceContext */ undefined);
|
1082
1106
|
if (!boolReturnType || (0, types_1.isAnyOrUnknown)(boolReturnType)) {
|
1083
1107
|
return undefined;
|
@@ -1252,7 +1276,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1252
1276
|
// operation have overlapping types.
|
1253
1277
|
_validateComparisonTypesForIsOperator(node) {
|
1254
1278
|
const rightType = this._evaluator.getType(node.rightExpression);
|
1255
|
-
if (!rightType || !(0,
|
1279
|
+
if (!rightType || !(0, typeUtils_1.isNoneInstance)(rightType)) {
|
1256
1280
|
return;
|
1257
1281
|
}
|
1258
1282
|
const leftType = this._evaluator.getType(node.leftExpression);
|
@@ -1262,7 +1286,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1262
1286
|
let foundMatchForNone = false;
|
1263
1287
|
(0, typeUtils_1.doForEachSubtype)(leftType, (subtype) => {
|
1264
1288
|
subtype = this._evaluator.makeTopLevelTypeVarsConcrete(subtype);
|
1265
|
-
if (this._evaluator.assignType(subtype,
|
1289
|
+
if (this._evaluator.assignType(subtype, this._evaluator.getNoneType())) {
|
1266
1290
|
foundMatchForNone = true;
|
1267
1291
|
}
|
1268
1292
|
});
|
@@ -1359,7 +1383,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1359
1383
|
if ((0, types_1.isModule)(leftType) || (0, types_1.isModule)(rightType)) {
|
1360
1384
|
return (0, types_1.isTypeSame)(leftType, rightType);
|
1361
1385
|
}
|
1362
|
-
if ((0,
|
1386
|
+
if ((0, typeUtils_1.isNoneInstance)(leftType) || (0, typeUtils_1.isNoneInstance)(rightType)) {
|
1363
1387
|
return (0, types_1.isTypeSame)(leftType, rightType);
|
1364
1388
|
}
|
1365
1389
|
const isLeftCallable = (0, types_1.isFunction)(leftType) || (0, types_1.isOverloadedFunction)(leftType);
|
@@ -1468,7 +1492,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1468
1492
|
// Determines whether the specified type is one that should trigger
|
1469
1493
|
// an "unused" value diagnostic.
|
1470
1494
|
_isTypeValidForUnusedValueTest(type) {
|
1471
|
-
return !(0,
|
1495
|
+
return !(0, typeUtils_1.isNoneInstance)(type) && !(0, types_1.isNever)(type) && !(0, types_1.isAnyOrUnknown)(type);
|
1472
1496
|
}
|
1473
1497
|
// Verifies that each local type variable is used more than once.
|
1474
1498
|
_validateFunctionTypeVarUsage(node, functionTypeResult) {
|
@@ -2638,22 +2662,22 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
2638
2662
|
case 1 /* Unknown */:
|
2639
2663
|
case 0 /* Unbound */:
|
2640
2664
|
break;
|
2641
|
-
case
|
2642
|
-
|
2643
|
-
|
2644
|
-
|
2665
|
+
case 6 /* Class */:
|
2666
|
+
if ((0, typeUtils_1.isNoneInstance)(subtype)) {
|
2667
|
+
isSupported = false;
|
2668
|
+
}
|
2669
|
+
else if (subtype.isTypeArgumentExplicit && !subtype.includeSubclasses) {
|
2670
|
+
// If it's a class, make sure that it has not been given explicit
|
2671
|
+
// type arguments. This will result in a TypeError exception.
|
2645
2672
|
isSupported = false;
|
2646
2673
|
}
|
2647
2674
|
break;
|
2648
|
-
case
|
2649
|
-
isSupported = types_1.TypeBase.isInstantiable(subtype);
|
2650
|
-
break;
|
2651
|
-
case 5 /* Function */:
|
2675
|
+
case 4 /* Function */:
|
2652
2676
|
if (!types_1.TypeBase.isInstantiable(subtype) || subtype.isCallableWithTypeArgs) {
|
2653
2677
|
isSupported = false;
|
2654
2678
|
}
|
2655
2679
|
break;
|
2656
|
-
case
|
2680
|
+
case 8 /* Union */:
|
2657
2681
|
isSupported = this._isTypeSupportedTypeForIsInstance(subtype, isInstanceCheck);
|
2658
2682
|
break;
|
2659
2683
|
default:
|
@@ -3105,14 +3129,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3105
3129
|
const returnAnnotation = node.returnTypeAnnotation || ((_a = node.functionAnnotationComment) === null || _a === void 0 ? void 0 : _a.returnTypeAnnotation);
|
3106
3130
|
const declaredReturnType = functionType.details.declaredReturnType;
|
3107
3131
|
if (returnAnnotation && declaredReturnType) {
|
3108
|
-
if (!(0,
|
3132
|
+
if (!(0, typeUtils_1.isNoneInstance)(declaredReturnType) && !(0, types_1.isNever)(declaredReturnType)) {
|
3109
3133
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.initMustReturnNone(), returnAnnotation);
|
3110
3134
|
}
|
3111
3135
|
}
|
3112
3136
|
else {
|
3113
3137
|
const inferredReturnType = this._evaluator.getFunctionInferredReturnType(functionType);
|
3114
3138
|
if (!(0, types_1.isNever)(inferredReturnType) &&
|
3115
|
-
!(0,
|
3139
|
+
!(0, typeUtils_1.isNoneInstance)(inferredReturnType) &&
|
3116
3140
|
!(0, types_1.isAnyOrUnknown)(inferredReturnType)) {
|
3117
3141
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.initMustReturnNone(), node.name);
|
3118
3142
|
}
|
@@ -3161,7 +3185,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3161
3185
|
// type doesn't allow it. Skip this check for abstract methods.
|
3162
3186
|
const diagAddendum = new diagnostic_1.DiagnosticAddendum();
|
3163
3187
|
// If the declared type isn't compatible with 'None', flag an error.
|
3164
|
-
if (!this._evaluator.assignType(declaredReturnType,
|
3188
|
+
if (!this._evaluator.assignType(declaredReturnType, this._evaluator.getNoneType(), diagAddendum)) {
|
3165
3189
|
// If the function consists entirely of "...", assume that it's
|
3166
3190
|
// an abstract method or a protocol method and don't require that
|
3167
3191
|
// the return type matches. This check can also be skipped for an overload.
|
@@ -3289,7 +3313,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3289
3313
|
if (!types_1.ClassType.isDataClass(classType)) {
|
3290
3314
|
return;
|
3291
3315
|
}
|
3292
|
-
const postInitMember = (0, typeUtils_1.lookUpClassMember)(classType, '__post_init__', 2 /* SkipBaseClasses */ |
|
3316
|
+
const postInitMember = (0, typeUtils_1.lookUpClassMember)(classType, '__post_init__', 2 /* SkipBaseClasses */ | 64 /* DeclaredTypesOnly */);
|
3293
3317
|
// If there's no __post_init__ method, there's nothing to check.
|
3294
3318
|
if (!postInitMember) {
|
3295
3319
|
return;
|
@@ -3603,35 +3627,34 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3603
3627
|
});
|
3604
3628
|
}
|
3605
3629
|
// Validates that the __init__ and __new__ method signatures are consistent.
|
3606
|
-
_validateConstructorConsistency(classType) {
|
3607
|
-
|
3608
|
-
const
|
3609
|
-
if (
|
3630
|
+
_validateConstructorConsistency(classType, errorNode) {
|
3631
|
+
// If the class has a custom metaclass with a __call__ method, skip this check.
|
3632
|
+
const callMethodResult = (0, constructors_1.getBoundCallMethod)(this._evaluator, errorNode, classType);
|
3633
|
+
if (callMethodResult) {
|
3610
3634
|
return;
|
3611
3635
|
}
|
3612
|
-
|
3613
|
-
|
3614
|
-
|
3615
|
-
!
|
3636
|
+
const newMethodResult = (0, constructors_1.getBoundNewMethod)(this._evaluator, errorNode, classType);
|
3637
|
+
if (!newMethodResult ||
|
3638
|
+
newMethodResult.typeErrors ||
|
3639
|
+
!newMethodResult.classType ||
|
3640
|
+
!(0, types_1.isClass)(newMethodResult.classType)) {
|
3616
3641
|
return;
|
3617
3642
|
}
|
3618
|
-
|
3619
|
-
|
3620
|
-
|
3621
|
-
|
3622
|
-
|
3623
|
-
|
3624
|
-
return;
|
3625
|
-
}
|
3643
|
+
const initMethodResult = (0, constructors_1.getBoundInitMethod)(this._evaluator, errorNode, types_1.ClassType.cloneAsInstance(classType));
|
3644
|
+
if (!initMethodResult ||
|
3645
|
+
initMethodResult.typeErrors ||
|
3646
|
+
!initMethodResult.classType ||
|
3647
|
+
!(0, types_1.isClass)(initMethodResult.classType)) {
|
3648
|
+
return;
|
3626
3649
|
}
|
3627
|
-
|
3628
|
-
|
3650
|
+
// If both the __new__ and __init__ come from subclasses, don't bother
|
3651
|
+
// checking for this class.
|
3652
|
+
if (!types_1.ClassType.isSameGenericClass(initMethodResult.classType, classType) &&
|
3653
|
+
!types_1.ClassType.isSameGenericClass(newMethodResult.classType, classType)) {
|
3629
3654
|
return;
|
3630
3655
|
}
|
3631
|
-
newMemberType =
|
3632
|
-
|
3633
|
-
/* treatConstructorAsClassMember */ true);
|
3634
|
-
if (!newMemberType) {
|
3656
|
+
let newMemberType = newMethodResult.type;
|
3657
|
+
if (!(0, types_1.isFunction)(newMemberType) && !(0, types_1.isOverloadedFunction)(newMemberType)) {
|
3635
3658
|
return;
|
3636
3659
|
}
|
3637
3660
|
if ((0, types_1.isOverloadedFunction)(newMemberType)) {
|
@@ -3641,14 +3664,10 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3641
3664
|
return;
|
3642
3665
|
}
|
3643
3666
|
}
|
3644
|
-
let initMemberType =
|
3667
|
+
let initMemberType = initMethodResult.type;
|
3645
3668
|
if (!(0, types_1.isFunction)(initMemberType) && !(0, types_1.isOverloadedFunction)(initMemberType)) {
|
3646
3669
|
return;
|
3647
3670
|
}
|
3648
|
-
initMemberType = this._evaluator.bindFunctionToClassOrObject(types_1.ClassType.cloneAsInstance(classType), initMemberType);
|
3649
|
-
if (!initMemberType) {
|
3650
|
-
return;
|
3651
|
-
}
|
3652
3671
|
if ((0, types_1.isOverloadedFunction)(initMemberType)) {
|
3653
3672
|
// Find the implementation, not the overloaded signatures.
|
3654
3673
|
initMemberType = types_1.OverloadedFunctionType.getImplementation(initMemberType);
|
@@ -3656,9 +3675,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3656
3675
|
return;
|
3657
3676
|
}
|
3658
3677
|
}
|
3659
|
-
if (!(0, types_1.isFunction)(initMemberType) || !(0, types_1.isFunction)(newMemberType)) {
|
3660
|
-
return;
|
3661
|
-
}
|
3662
3678
|
// If either of the functions has a default parameter signature
|
3663
3679
|
// (* args: Any, ** kwargs: Any), don't proceed with the check.
|
3664
3680
|
if (types_1.FunctionType.hasDefaultParameters(initMemberType) || types_1.FunctionType.hasDefaultParameters(newMemberType)) {
|
@@ -3681,9 +3697,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3681
3697
|
/* diag */ undefined,
|
3682
3698
|
/* destTypeVarContext */ undefined,
|
3683
3699
|
/* srcTypeVarContext */ undefined, 32 /* SkipFunctionReturnTypeCheck */)) {
|
3684
|
-
const displayOnInit = types_1.ClassType.isSameGenericClass(
|
3685
|
-
const initDecl =
|
3686
|
-
const newDecl =
|
3700
|
+
const displayOnInit = types_1.ClassType.isSameGenericClass(initMethodResult.classType, classType);
|
3701
|
+
const initDecl = initMemberType.details.declaration;
|
3702
|
+
const newDecl = newMemberType.details.declaration;
|
3687
3703
|
if (initDecl && newDecl) {
|
3688
3704
|
const mainDecl = displayOnInit ? initDecl : newDecl;
|
3689
3705
|
const mainDeclNode = mainDecl.node.nodeType === 28 /* Function */ ? mainDecl.node.name : mainDecl.node;
|
@@ -3697,14 +3713,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3697
3713
|
type: newSignature,
|
3698
3714
|
}));
|
3699
3715
|
const diagnostic = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportInconsistentConstructor, diagnosticRules_1.DiagnosticRule.reportInconsistentConstructor, localize_1.Localizer.Diagnostic.constructorParametersMismatch().format({
|
3700
|
-
classType: this._evaluator.printType(types_1.ClassType.cloneAsInstance(displayOnInit ?
|
3716
|
+
classType: this._evaluator.printType(types_1.ClassType.cloneAsInstance(displayOnInit ? initMethodResult.classType : newMethodResult.classType)),
|
3701
3717
|
}) + diagAddendum.getString(), mainDeclNode);
|
3702
3718
|
if (diagnostic) {
|
3703
3719
|
const secondaryDecl = displayOnInit ? newDecl : initDecl;
|
3704
3720
|
diagnostic.addRelatedInfo((displayOnInit
|
3705
3721
|
? localize_1.Localizer.DiagnosticAddendum.newMethodLocation()
|
3706
3722
|
: localize_1.Localizer.DiagnosticAddendum.initMethodLocation()).format({
|
3707
|
-
type: this._evaluator.printType(types_1.ClassType.cloneAsInstance(displayOnInit ?
|
3723
|
+
type: this._evaluator.printType(types_1.ClassType.cloneAsInstance(displayOnInit ? newMethodResult.classType : initMethodResult.classType)),
|
3708
3724
|
}), secondaryDecl.path, secondaryDecl.range);
|
3709
3725
|
}
|
3710
3726
|
}
|
@@ -3973,7 +3989,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3973
3989
|
});
|
3974
3990
|
}
|
3975
3991
|
_validateOverrideDecoratorPresent(symbol, overrideType, baseMember) {
|
3976
|
-
var _a;
|
3977
3992
|
// Skip this check if disabled.
|
3978
3993
|
if (this._fileInfo.diagnosticRuleSet.reportImplicitOverride === 'none') {
|
3979
3994
|
return;
|
@@ -3986,12 +4001,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3986
4001
|
overrideFunction = types_1.OverloadedFunctionType.getImplementation(overrideType);
|
3987
4002
|
}
|
3988
4003
|
else if ((0, types_1.isClassInstance)(overrideType) && types_1.ClassType.isPropertyClass(overrideType)) {
|
3989
|
-
|
3990
|
-
|
3991
|
-
const fgetType = (_a = this._evaluator.getDeclaredTypeOfSymbol(fgetSymbol)) === null || _a === void 0 ? void 0 : _a.type;
|
3992
|
-
if (fgetType && (0, types_1.isFunction)(fgetType)) {
|
3993
|
-
overrideFunction = fgetType;
|
3994
|
-
}
|
4004
|
+
if (overrideType.fgetFunction) {
|
4005
|
+
overrideFunction = overrideType.fgetFunction;
|
3995
4006
|
}
|
3996
4007
|
}
|
3997
4008
|
if (!(overrideFunction === null || overrideFunction === void 0 ? void 0 : overrideFunction.details.declaration) || types_1.FunctionType.isOverridden(overrideFunction)) {
|
@@ -4016,7 +4027,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4016
4027
|
// decorator. In this case, an error is reported because no base class has declared
|
4017
4028
|
// a method of the same name.
|
4018
4029
|
_validateOverrideDecoratorNotPresent(symbol, overrideType) {
|
4019
|
-
var _a;
|
4020
4030
|
let overrideFunction;
|
4021
4031
|
if ((0, types_1.isFunction)(overrideType)) {
|
4022
4032
|
overrideFunction = overrideType;
|
@@ -4025,12 +4035,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4025
4035
|
overrideFunction = types_1.OverloadedFunctionType.getImplementation(overrideType);
|
4026
4036
|
}
|
4027
4037
|
else if ((0, types_1.isClassInstance)(overrideType) && types_1.ClassType.isPropertyClass(overrideType)) {
|
4028
|
-
|
4029
|
-
|
4030
|
-
const fgetType = (_a = this._evaluator.getDeclaredTypeOfSymbol(fgetSymbol)) === null || _a === void 0 ? void 0 : _a.type;
|
4031
|
-
if (fgetType && (0, types_1.isFunction)(fgetType)) {
|
4032
|
-
overrideFunction = fgetType;
|
4033
|
-
}
|
4038
|
+
if (overrideType.fgetFunction) {
|
4039
|
+
overrideFunction = overrideType.fgetFunction;
|
4034
4040
|
}
|
4035
4041
|
}
|
4036
4042
|
if (!(overrideFunction === null || overrideFunction === void 0 ? void 0 : overrideFunction.details.declaration) || !types_1.FunctionType.isOverridden(overrideFunction)) {
|
@@ -4064,8 +4070,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4064
4070
|
return;
|
4065
4071
|
}
|
4066
4072
|
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,
|
4073
|
+
const childClassSelf = types_1.ClassType.cloneAsInstance((0, typeUtils_1.selfSpecializeClass)(childClassType));
|
4074
|
+
const baseType = (0, typeUtils_1.partiallySpecializeType)(this._evaluator.getEffectiveTypeOfSymbol(baseClassAndSymbol.symbol), baseClass, childClassSelf);
|
4075
|
+
overrideType = (0, typeUtils_1.partiallySpecializeType)(overrideType, childClassType, childClassSelf);
|
4069
4076
|
if ((0, types_1.isFunction)(baseType) || (0, types_1.isOverloadedFunction)(baseType)) {
|
4070
4077
|
const diagAddendum = new diagnostic_1.DiagnosticAddendum();
|
4071
4078
|
if ((0, types_1.isFunction)(overrideType) || (0, types_1.isOverloadedFunction)(overrideType)) {
|
@@ -4147,16 +4154,20 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4147
4154
|
}
|
4148
4155
|
}
|
4149
4156
|
else {
|
4150
|
-
const basePropFields = baseType.details.fields;
|
4151
|
-
const subclassPropFields = overrideType.details.fields;
|
4152
4157
|
const baseClassType = baseClass;
|
4153
|
-
|
4158
|
+
const propMethodInfo = [
|
4159
|
+
['fget', (c) => c.fgetFunction],
|
4160
|
+
['fset', (c) => c.fsetFunction],
|
4161
|
+
['fdel', (c) => c.fdelFunction],
|
4162
|
+
];
|
4163
|
+
propMethodInfo.forEach((info) => {
|
4154
4164
|
const diagAddendum = new diagnostic_1.DiagnosticAddendum();
|
4155
|
-
const
|
4156
|
-
const
|
4165
|
+
const [methodName, methodAccessor] = info;
|
4166
|
+
const baseClassPropMethod = methodAccessor(baseType);
|
4167
|
+
const subclassPropMethod = methodAccessor(overrideType);
|
4157
4168
|
// Is the method present on the base class but missing in the subclass?
|
4158
4169
|
if (baseClassPropMethod) {
|
4159
|
-
const baseClassMethodType = (0, typeUtils_1.partiallySpecializeType)(
|
4170
|
+
const baseClassMethodType = (0, typeUtils_1.partiallySpecializeType)(baseClassPropMethod, baseClassType);
|
4160
4171
|
if ((0, types_1.isFunction)(baseClassMethodType)) {
|
4161
4172
|
if (!subclassPropMethod) {
|
4162
4173
|
// The method is missing.
|
@@ -4176,7 +4187,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4176
4187
|
}
|
4177
4188
|
}
|
4178
4189
|
else {
|
4179
|
-
const subclassMethodType = (0, typeUtils_1.partiallySpecializeType)(
|
4190
|
+
const subclassMethodType = (0, typeUtils_1.partiallySpecializeType)(subclassPropMethod, childClassType);
|
4180
4191
|
if ((0, types_1.isFunction)(subclassMethodType)) {
|
4181
4192
|
if (!this._evaluator.validateOverrideMethod(baseClassMethodType, subclassMethodType, childClassType, diagAddendum.createAddendum())) {
|
4182
4193
|
diagAddendum.addMessage(localize_1.Localizer.DiagnosticAddendum.propertyMethodIncompatible().format({
|
@@ -4290,7 +4301,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4290
4301
|
// Performs checks on a function that is located within a class
|
4291
4302
|
// and has been determined not to be a property accessor.
|
4292
4303
|
_validateMethod(node, functionType, classNode) {
|
4293
|
-
var _a, _b
|
4304
|
+
var _a, _b;
|
4294
4305
|
const classTypeInfo = this._evaluator.getTypeOfClass(classNode);
|
4295
4306
|
const classType = classTypeInfo === null || classTypeInfo === void 0 ? void 0 : classTypeInfo.classType;
|
4296
4307
|
if (node.name && classType) {
|
@@ -4307,32 +4318,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4307
4318
|
// __new__ overrides should have a "cls" parameter.
|
4308
4319
|
if (node.parameters.length === 0 ||
|
4309
4320
|
!node.parameters[0].name ||
|
4310
|
-
!['cls', '_cls', '__cls', '__mcls', 'mcls', 'mcs'].some((name) => node.parameters[0].name.value === name)) {
|
4321
|
+
!['cls', '_cls', '__cls', '__mcls', 'mcls', 'mcs', 'metacls'].some((name) => node.parameters[0].name.value === name)) {
|
4311
4322
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportSelfClsParameterName, diagnosticRules_1.DiagnosticRule.reportSelfClsParameterName, localize_1.Localizer.Diagnostic.newClsParam(), node.parameters.length > 0 ? node.parameters[0] : node.name);
|
4312
4323
|
}
|
4313
4324
|
if (classType) {
|
4314
4325
|
this._validateClsSelfParameterType(functionType, classType, /* isCls */ true);
|
4315
4326
|
}
|
4316
4327
|
}
|
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_') {
|
4328
|
+
else if (((_b = node.name) === null || _b === void 0 ? void 0 : _b.value) === '_generate_next_value_') {
|
4336
4329
|
// Skip this check for _generate_next_value_.
|
4337
4330
|
}
|
4338
4331
|
else if (types_1.FunctionType.isStaticMethod(functionType)) {
|
@@ -4420,7 +4413,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4420
4413
|
// it could be combined with other classes in a multi-inheritance
|
4421
4414
|
// situation that effectively adds new superclasses that we don't know
|
4422
4415
|
// about statically.
|
4423
|
-
let effectiveFlags =
|
4416
|
+
let effectiveFlags = 16 /* SkipInstanceMembers */ | 1 /* SkipOriginalClass */;
|
4424
4417
|
if (types_1.ClassType.isFinal(classType)) {
|
4425
4418
|
effectiveFlags |= 4 /* SkipObjectBaseClass */;
|
4426
4419
|
}
|
@@ -4593,7 +4586,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4593
4586
|
else if ((0, types_1.isClassInstance)(exceptionType)) {
|
4594
4587
|
const iterableType = (_b = (_a = this._evaluator.getTypeOfIterator({ type: exceptionType },
|
4595
4588
|
/* isAsync */ false,
|
4596
|
-
/* errorNode */
|
4589
|
+
/* errorNode */ except.typeExpression,
|
4590
|
+
/* emitNotIterableError */ false)) === null || _a === void 0 ? void 0 : _a.type) !== null && _b !== void 0 ? _b : types_1.UnknownType.create();
|
4597
4591
|
(0, typeUtils_1.doForEachSubtype)(iterableType, (subtype) => {
|
4598
4592
|
if ((0, types_1.isAnyOrUnknown)(subtype)) {
|
4599
4593
|
sawUnknownExceptionType = true;
|