@zzzen/pyright-internal 1.2.0-dev.20230806 → 1.2.0-dev.20230820
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/backgroundAnalysisProgram.d.ts +6 -5
- package/dist/analyzer/backgroundAnalysisProgram.js +6 -5
- package/dist/analyzer/backgroundAnalysisProgram.js.map +1 -1
- package/dist/analyzer/binder.js +8 -2
- package/dist/analyzer/binder.js.map +1 -1
- package/dist/analyzer/checker.d.ts +1 -0
- package/dist/analyzer/checker.js +79 -8
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/codeFlowEngine.js +5 -5
- package/dist/analyzer/codeFlowEngine.js.map +1 -1
- package/dist/analyzer/constraintSolver.d.ts +1 -0
- package/dist/analyzer/constraintSolver.js +30 -23
- package/dist/analyzer/constraintSolver.js.map +1 -1
- package/dist/analyzer/dataClasses.js +242 -236
- package/dist/analyzer/dataClasses.js.map +1 -1
- package/dist/analyzer/decorators.js +8 -8
- package/dist/analyzer/decorators.js.map +1 -1
- package/dist/analyzer/enums.js +12 -0
- package/dist/analyzer/enums.js.map +1 -1
- package/dist/analyzer/importResolver.js +3 -1
- package/dist/analyzer/importResolver.js.map +1 -1
- package/dist/analyzer/namedTuples.js +6 -0
- package/dist/analyzer/namedTuples.js.map +1 -1
- package/dist/analyzer/operations.d.ts +1 -1
- package/dist/analyzer/operations.js +2 -2
- package/dist/analyzer/operations.js.map +1 -1
- package/dist/analyzer/packageTypeVerifier.js +4 -1
- package/dist/analyzer/packageTypeVerifier.js.map +1 -1
- package/dist/analyzer/parameterUtils.d.ts +2 -1
- package/dist/analyzer/parameterUtils.js +15 -0
- package/dist/analyzer/parameterUtils.js.map +1 -1
- package/dist/analyzer/patternMatching.js +3 -3
- package/dist/analyzer/patternMatching.js.map +1 -1
- package/dist/analyzer/program.d.ts +4 -1
- package/dist/analyzer/program.js +8 -10
- package/dist/analyzer/program.js.map +1 -1
- package/dist/analyzer/protocols.js +42 -20
- package/dist/analyzer/protocols.js.map +1 -1
- package/dist/analyzer/service.d.ts +3 -0
- package/dist/analyzer/service.js +37 -2
- package/dist/analyzer/service.js.map +1 -1
- package/dist/analyzer/typeEvaluator.js +279 -141
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +6 -2
- package/dist/analyzer/typeEvaluatorTypes.js +10 -2
- package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
- package/dist/analyzer/typeGuards.js +9 -6
- package/dist/analyzer/typeGuards.js.map +1 -1
- package/dist/analyzer/typePrinter.js +4 -1
- package/dist/analyzer/typePrinter.js.map +1 -1
- package/dist/analyzer/typeUtils.d.ts +1 -0
- package/dist/analyzer/typeUtils.js +47 -29
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/analyzer/types.d.ts +3 -1
- package/dist/analyzer/types.js +3 -1
- package/dist/analyzer/types.js.map +1 -1
- package/dist/backgroundAnalysis.d.ts +2 -1
- package/dist/backgroundAnalysis.js +2 -2
- package/dist/backgroundAnalysis.js.map +1 -1
- package/dist/backgroundAnalysisBase.d.ts +3 -3
- package/dist/backgroundAnalysisBase.js +3 -3
- package/dist/backgroundAnalysisBase.js.map +1 -1
- package/dist/backgroundThreadBase.d.ts +7 -6
- package/dist/backgroundThreadBase.js +20 -6
- package/dist/backgroundThreadBase.js.map +1 -1
- package/dist/common/console.js.map +1 -1
- package/dist/common/extensibility.d.ts +2 -18
- package/dist/common/extensibility.js.map +1 -1
- package/dist/common/fileSystem.d.ts +1 -1
- package/dist/common/pathUtils.d.ts +1 -0
- package/dist/common/pathUtils.js +19 -5
- package/dist/common/pathUtils.js.map +1 -1
- package/dist/common/realFileSystem.d.ts +1 -1
- package/dist/common/realFileSystem.js +12 -8
- package/dist/common/realFileSystem.js.map +1 -1
- package/dist/common/serviceProvider.d.ts +15 -0
- package/dist/common/serviceProvider.js +37 -0
- package/dist/common/serviceProvider.js.map +1 -0
- package/dist/common/serviceProviderExtensions.d.ts +16 -0
- package/dist/common/serviceProviderExtensions.js +27 -0
- package/dist/common/serviceProviderExtensions.js.map +1 -0
- package/dist/languageServerBase.d.ts +6 -5
- package/dist/languageServerBase.js +8 -6
- package/dist/languageServerBase.js.map +1 -1
- package/dist/languageService/navigationUtils.js +1 -1
- package/dist/languageService/navigationUtils.js.map +1 -1
- package/dist/localization/localize.d.ts +25 -4
- package/dist/localization/localize.js +8 -2
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.cs.json +4 -3
- package/dist/localization/package.nls.de.json +4 -3
- package/dist/localization/package.nls.en-us.json +17 -11
- package/dist/localization/package.nls.es.json +4 -3
- package/dist/localization/package.nls.fr.json +4 -3
- package/dist/localization/package.nls.it.json +4 -3
- package/dist/localization/package.nls.ja.json +4 -3
- package/dist/localization/package.nls.ko.json +4 -3
- package/dist/localization/package.nls.pl.json +4 -3
- package/dist/localization/package.nls.pt-br.json +4 -3
- package/dist/localization/package.nls.qps-ploc.json +3 -2
- package/dist/localization/package.nls.ru.json +4 -3
- package/dist/localization/package.nls.tr.json +4 -3
- package/dist/localization/package.nls.zh-cn.json +4 -3
- package/dist/localization/package.nls.zh-tw.json +3 -2
- package/dist/nodeMain.js +2 -1
- package/dist/nodeMain.js.map +1 -1
- package/dist/parser/parser.d.ts +1 -0
- package/dist/parser/parser.js +80 -20
- package/dist/parser/parser.js.map +1 -1
- package/dist/pyrightFileSystem.d.ts +3 -1
- package/dist/pyrightFileSystem.js.map +1 -1
- package/dist/readonlyAugmentedFileSystem.d.ts +1 -1
- package/dist/readonlyAugmentedFileSystem.js +2 -2
- package/dist/readonlyAugmentedFileSystem.js.map +1 -1
- package/dist/server.js +8 -2
- package/dist/server.js.map +1 -1
- package/dist/tests/harness/fourslash/runner.js +1 -1
- package/dist/tests/harness/fourslash/runner.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 +6 -1
- package/dist/tests/harness/fourslash/testState.js.map +1 -1
- package/dist/tests/harness/vfs/filesystem.d.ts +2 -2
- package/dist/tests/harness/vfs/filesystem.js +1 -1
- package/dist/tests/harness/vfs/filesystem.js.map +1 -1
- package/dist/tests/service.test.js +65 -0
- package/dist/tests/service.test.js.map +1 -1
- package/dist/tests/testUtils.js +6 -1
- package/dist/tests/testUtils.js.map +1 -1
- package/dist/tests/typeEvaluator1.test.js +4 -4
- package/dist/tests/typeEvaluator1.test.js.map +1 -1
- package/dist/tests/typeEvaluator2.test.js +9 -1
- package/dist/tests/typeEvaluator2.test.js.map +1 -1
- package/dist/tests/typeEvaluator3.test.js +7 -3
- package/dist/tests/typeEvaluator3.test.js.map +1 -1
- package/dist/tests/typeEvaluator4.test.js +10 -2
- package/dist/tests/typeEvaluator4.test.js.map +1 -1
- package/dist/tests/typeEvaluator5.test.js +10 -2
- package/dist/tests/typeEvaluator5.test.js.map +1 -1
- package/dist/tests/zipfs.test.js +8 -5
- package/dist/tests/zipfs.test.js.map +1 -1
- package/package.json +1 -1
package/dist/analyzer/checker.js
CHANGED
@@ -47,6 +47,7 @@ const parseNodes_1 = require("../parser/parseNodes");
|
|
47
47
|
const stringTokenUtils_1 = require("../parser/stringTokenUtils");
|
48
48
|
const AnalyzerNodeInfo = __importStar(require("./analyzerNodeInfo"));
|
49
49
|
const declaration_1 = require("./declaration");
|
50
|
+
const declarationUtils_1 = require("./declarationUtils");
|
50
51
|
const importResolver_1 = require("./importResolver");
|
51
52
|
const importStatementUtils_1 = require("./importStatementUtils");
|
52
53
|
const parameterUtils_1 = require("./parameterUtils");
|
@@ -211,6 +212,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
211
212
|
this._validateBaseClassOverrides(classTypeResult.classType);
|
212
213
|
this._validateSlotsClassVarConflict(classTypeResult.classType);
|
213
214
|
}
|
215
|
+
this._validateMultipleInheritanceBaseClasses(classTypeResult.classType, node.name);
|
214
216
|
this._validateMultipleInheritanceCompatibility(classTypeResult.classType, node.name);
|
215
217
|
this._validateConstructorConsistency(classTypeResult.classType);
|
216
218
|
this._validateFinalMemberOverrides(classTypeResult.classType);
|
@@ -339,12 +341,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
339
341
|
if (param.typeAnnotationComment) {
|
340
342
|
this.walk(param.typeAnnotationComment);
|
341
343
|
}
|
344
|
+
// Look for method parameters that are typed with TypeVars that have the wrong variance.
|
342
345
|
if (functionTypeResult) {
|
343
346
|
const annotationNode = param.typeAnnotation || param.typeAnnotationComment;
|
344
347
|
if (annotationNode && index < functionTypeResult.functionType.details.parameters.length) {
|
345
348
|
const paramType = functionTypeResult.functionType.details.parameters[index].type;
|
346
349
|
const exemptMethods = ['__init__', '__new__'];
|
347
|
-
if (
|
350
|
+
if (containingClassNode &&
|
351
|
+
(0, types_1.isTypeVar)(paramType) &&
|
348
352
|
paramType.details.declaredVariance === 3 /* Covariant */ &&
|
349
353
|
!paramType.details.isSynthesized &&
|
350
354
|
!exemptMethods.some((name) => name === functionTypeResult.functionType.details.name)) {
|
@@ -629,6 +633,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
629
633
|
var _a, _b, _c, _d;
|
630
634
|
const yieldFromType = this._evaluator.getType(node.expression) || types_1.UnknownType.create();
|
631
635
|
let yieldType;
|
636
|
+
let sendType;
|
632
637
|
if ((0, types_1.isClassInstance)(yieldFromType) && types_1.ClassType.isBuiltIn(yieldFromType, 'Coroutine')) {
|
633
638
|
// Handle the case of old-style (pre-await) coroutines.
|
634
639
|
yieldType = types_1.UnknownType.create();
|
@@ -642,13 +647,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
642
647
|
const generatorTypeArgs = (0, typeUtils_1.getGeneratorTypeArgs)(yieldType);
|
643
648
|
if (generatorTypeArgs) {
|
644
649
|
yieldType = generatorTypeArgs.length >= 1 ? generatorTypeArgs[0] : types_1.UnknownType.create();
|
650
|
+
sendType = generatorTypeArgs.length >= 2 ? generatorTypeArgs[1] : undefined;
|
645
651
|
}
|
646
652
|
else {
|
647
653
|
yieldType =
|
648
654
|
(_d = (_c = this._evaluator.getTypeOfIterator({ type: yieldFromType }, /* isAsync */ false, node)) === null || _c === void 0 ? void 0 : _c.type) !== null && _d !== void 0 ? _d : types_1.UnknownType.create();
|
649
655
|
}
|
650
656
|
}
|
651
|
-
this._validateYieldType(node, yieldType);
|
657
|
+
this._validateYieldType(node, yieldType, sendType);
|
652
658
|
return true;
|
653
659
|
}
|
654
660
|
visitRaise(node) {
|
@@ -957,6 +963,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
957
963
|
});
|
958
964
|
}
|
959
965
|
else {
|
966
|
+
this._evaluator.evaluateTypesForStatement(node);
|
960
967
|
const importInfo = AnalyzerNodeInfo.getImportInfo(node.module);
|
961
968
|
if (importInfo &&
|
962
969
|
importInfo.isImportFound &&
|
@@ -1824,7 +1831,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
1824
1831
|
else if ((0, types_1.isClassInstance)(exceptionType)) {
|
1825
1832
|
const iterableType = (_b = (_a = this._evaluator.getTypeOfIterator({ type: exceptionType }, /* isAsync */ false, errorNode)) === null || _a === void 0 ? void 0 : _a.type) !== null && _b !== void 0 ? _b : types_1.UnknownType.create();
|
1826
1833
|
resultingExceptionType = (0, typeUtils_1.mapSubtypes)(iterableType, (subtype) => {
|
1827
|
-
if ((0, types_1.isAnyOrUnknown)(subtype)) {
|
1834
|
+
if ((0, types_1.isAnyOrUnknown)(subtype) || (0, types_1.isNever)(subtype)) {
|
1828
1835
|
return subtype;
|
1829
1836
|
}
|
1830
1837
|
if ((0, types_1.isInstantiableClass)(subtype)) {
|
@@ -3611,6 +3618,68 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3611
3618
|
}
|
3612
3619
|
}
|
3613
3620
|
}
|
3621
|
+
// Verifies that classes that have more than one base class do not have
|
3622
|
+
// have conflicting type arguments.
|
3623
|
+
_validateMultipleInheritanceBaseClasses(classType, errorNode) {
|
3624
|
+
// Skip this check if the class has only one base class or one or more
|
3625
|
+
// of the base classes are Any.
|
3626
|
+
const filteredBaseClasses = [];
|
3627
|
+
for (const baseClass of classType.details.baseClasses) {
|
3628
|
+
if (!(0, types_1.isClass)(baseClass)) {
|
3629
|
+
return;
|
3630
|
+
}
|
3631
|
+
if (!types_1.ClassType.isBuiltIn(baseClass, ['Generic', 'Protocol', 'object'])) {
|
3632
|
+
filteredBaseClasses.push(baseClass);
|
3633
|
+
}
|
3634
|
+
}
|
3635
|
+
if (filteredBaseClasses.length < 2) {
|
3636
|
+
return;
|
3637
|
+
}
|
3638
|
+
const diagAddendum = new diagnostic_1.DiagnosticAddendum();
|
3639
|
+
for (const baseClass of filteredBaseClasses) {
|
3640
|
+
const typeVarContext = (0, typeUtils_1.buildTypeVarContextFromSpecializedClass)(baseClass);
|
3641
|
+
for (const baseClassMroClass of baseClass.details.mro) {
|
3642
|
+
// There's no need to check for conflicts if this class isn't generic.
|
3643
|
+
if ((0, types_1.isClass)(baseClassMroClass) && baseClassMroClass.details.typeParameters.length > 0) {
|
3644
|
+
const specializedBaseClassMroClass = (0, typeUtils_1.applySolvedTypeVars)(baseClassMroClass, typeVarContext);
|
3645
|
+
// Find the corresponding class in the derived class's MRO list.
|
3646
|
+
const matchingMroClass = classType.details.mro.find((mroClass) => (0, types_1.isClass)(mroClass) && types_1.ClassType.isSameGenericClass(mroClass, specializedBaseClassMroClass));
|
3647
|
+
if (matchingMroClass && (0, types_1.isInstantiableClass)(matchingMroClass)) {
|
3648
|
+
const matchingMroObject = types_1.ClassType.cloneAsInstance(matchingMroClass);
|
3649
|
+
const baseClassMroObject = types_1.ClassType.cloneAsInstance(specializedBaseClassMroClass);
|
3650
|
+
// If the types match exactly, we can shortcut the remainder of the MRO chain.
|
3651
|
+
// if (isTypeSame(matchingMroObject, baseClassMroObject)) {
|
3652
|
+
// break;
|
3653
|
+
// }
|
3654
|
+
if (!this._evaluator.assignType(matchingMroObject, baseClassMroObject)) {
|
3655
|
+
const diag = new diagnostic_1.DiagnosticAddendum();
|
3656
|
+
const baseClassObject = (0, typeUtils_1.convertToInstance)(baseClass);
|
3657
|
+
if ((0, types_1.isTypeSame)(baseClassObject, baseClassMroObject)) {
|
3658
|
+
diag.addMessage(localize_1.Localizer.DiagnosticAddendum.baseClassIncompatible().format({
|
3659
|
+
baseClass: this._evaluator.printType(baseClassObject),
|
3660
|
+
type: this._evaluator.printType(matchingMroObject),
|
3661
|
+
}));
|
3662
|
+
}
|
3663
|
+
else {
|
3664
|
+
diag.addMessage(localize_1.Localizer.DiagnosticAddendum.baseClassIncompatibleSubclass().format({
|
3665
|
+
baseClass: this._evaluator.printType(baseClassObject),
|
3666
|
+
subclass: this._evaluator.printType(baseClassMroObject),
|
3667
|
+
type: this._evaluator.printType(matchingMroObject),
|
3668
|
+
}));
|
3669
|
+
}
|
3670
|
+
diagAddendum.addAddendum(diag);
|
3671
|
+
// Break out of the inner loop so we don't report any redundant errors for this base class.
|
3672
|
+
break;
|
3673
|
+
}
|
3674
|
+
}
|
3675
|
+
}
|
3676
|
+
}
|
3677
|
+
}
|
3678
|
+
if (!diagAddendum.isEmpty()) {
|
3679
|
+
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.baseClassIncompatible().format({ type: classType.details.name }) +
|
3680
|
+
diagAddendum.getString(), errorNode);
|
3681
|
+
}
|
3682
|
+
}
|
3614
3683
|
// Validates that any methods and variables in multiple base classes are
|
3615
3684
|
// compatible with each other.
|
3616
3685
|
_validateMultipleInheritanceCompatibility(classType, errorNode) {
|
@@ -3888,6 +3957,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
3888
3957
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.overriddenMethodNotFound().format({ name: funcNode.name.value }), funcNode.name);
|
3889
3958
|
}
|
3890
3959
|
_validateBaseClassOverride(baseClassAndSymbol, overrideSymbol, overrideType, childClassType, memberName) {
|
3960
|
+
var _a, _b;
|
3891
3961
|
if (!(0, types_1.isInstantiableClass)(baseClassAndSymbol.classType)) {
|
3892
3962
|
return;
|
3893
3963
|
}
|
@@ -4051,7 +4121,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4051
4121
|
const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleVariableOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleVariableOverride, localize_1.Localizer.Diagnostic.symbolOverridden().format({
|
4052
4122
|
name: memberName,
|
4053
4123
|
className: baseClassAndSymbol.classType.details.name,
|
4054
|
-
}) + diagAddendum.getString(), lastDecl.node);
|
4124
|
+
}) + diagAddendum.getString(), (_a = (0, declarationUtils_1.getNameNodeForDeclaration)(lastDecl)) !== null && _a !== void 0 ? _a : lastDecl.node);
|
4055
4125
|
const origDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(baseClassAndSymbol.symbol);
|
4056
4126
|
if (diag && origDecl) {
|
4057
4127
|
diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.overriddenSymbol(), origDecl.path, origDecl.range);
|
@@ -4093,7 +4163,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4093
4163
|
const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleVariableOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleVariableOverride, unformattedMessage.format({
|
4094
4164
|
name: memberName,
|
4095
4165
|
className: baseClassAndSymbol.classType.details.name,
|
4096
|
-
}), lastDecl.node);
|
4166
|
+
}), (_b = (0, declarationUtils_1.getNameNodeForDeclaration)(lastDecl)) !== null && _b !== void 0 ? _b : lastDecl.node);
|
4097
4167
|
const origDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(baseClassAndSymbol.symbol);
|
4098
4168
|
if (diag && origDecl) {
|
4099
4169
|
diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.overriddenSymbol(), origDecl.path, origDecl.range);
|
@@ -4336,7 +4406,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4336
4406
|
}
|
4337
4407
|
// Determines whether a yield or yield from node is compatible with the
|
4338
4408
|
// return type annotation of the containing function.
|
4339
|
-
_validateYieldType(node, yieldType) {
|
4409
|
+
_validateYieldType(node, yieldType, sendType) {
|
4340
4410
|
var _a;
|
4341
4411
|
const enclosingFunctionNode = ParseTreeUtils.getEnclosingFunction(node);
|
4342
4412
|
if (!enclosingFunctionNode || !enclosingFunctionNode.returnTypeAnnotation) {
|
@@ -4371,7 +4441,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4371
4441
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.noReturnContainsYield(), node);
|
4372
4442
|
return;
|
4373
4443
|
}
|
4374
|
-
const
|
4444
|
+
const generatorTypeArgs = [yieldType, sendType !== null && sendType !== void 0 ? sendType : types_1.UnknownType.create(), types_1.UnknownType.create()];
|
4445
|
+
const specializedGenerator = types_1.ClassType.cloneAsInstance(types_1.ClassType.cloneForSpecialization(generatorType, generatorTypeArgs, /* isTypeArgumentExplicit */ true));
|
4375
4446
|
const diagAddendum = new diagnostic_1.DiagnosticAddendum();
|
4376
4447
|
if (!this._evaluator.assignType(declaredReturnType, specializedGenerator, diagAddendum)) {
|
4377
4448
|
const errorMessage = enclosingFunctionNode.isAsync
|
@@ -4441,7 +4512,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
|
|
4441
4512
|
}
|
4442
4513
|
});
|
4443
4514
|
// Were all of the exception types overridden?
|
4444
|
-
if (typesOfThisExcept.length === overriddenExceptionCount) {
|
4515
|
+
if (typesOfThisExcept.length > 0 && typesOfThisExcept.length === overriddenExceptionCount) {
|
4445
4516
|
this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.Localizer.Diagnostic.unreachableExcept() + diagAddendum.getString(), except.typeExpression);
|
4446
4517
|
this._evaluator.addUnreachableCode(except, except.exceptSuite);
|
4447
4518
|
}
|