diff --git a/tests/rules/check-throws-tag-type.test.js b/tests/rules/check-throws-tag-type.test.js index ac84639..4aef604 100644 --- a/tests/rules/check-throws-tag-type.test.js +++ b/tests/rules/check-throws-tag-type.test.js @@ -1742,6 +1742,178 @@ ruleTester.run( { messageId: 'throwTypeMismatch' }, ], }, + { + code: ` + class TrueGetterError extends Error {} + class TrueSetterError extends Error {} + class FalseGetterError extends Error {} + class FalseSetterError extends Error {} + + function foo() { + if (Math.random() > 0.5) { + return { + flag: true, + /** + * @throws {TrueGetterError} + */ + get value() { + throw new TrueGetterError(); + }, + /** + * @throws {TrueSetterError} + */ + set value(v: any) { + throw new TrueSetterError(); + }, + } as const; + } else { + return { + flag: false, + /** + * @throws {FalseGetterError} + */ + get value() { + throw new FalseGetterError(); + }, + /** + * @throws {FalseSetterError} + */ + set value(v: any) { + throw new FalseSetterError(); + }, + } as const; + } + } + + /** + * @throws {TrueGetterError} + */ + function bar() { + const result = foo(); + if (!result.flag) { + result.value; + } + } + + /** + * @throws {FalseGetterError} + */ + function baz() { + const result = foo(); + if (result.flag) { + result.value; + } + } + + /** + * @throws {TrueSetterError} + */ + function qux() { + const result = foo(); + if (!result.flag) { + result.value = 42; + } + } + + /** + * @throws {FalseSetterError} + */ + function quux() { + const result = foo(); + if (result.flag) { + result.value = 42; + } + } + `, + output: ` + class TrueGetterError extends Error {} + class TrueSetterError extends Error {} + class FalseGetterError extends Error {} + class FalseSetterError extends Error {} + + function foo() { + if (Math.random() > 0.5) { + return { + flag: true, + /** + * @throws {TrueGetterError} + */ + get value() { + throw new TrueGetterError(); + }, + /** + * @throws {TrueSetterError} + */ + set value(v: any) { + throw new TrueSetterError(); + }, + } as const; + } else { + return { + flag: false, + /** + * @throws {FalseGetterError} + */ + get value() { + throw new FalseGetterError(); + }, + /** + * @throws {FalseSetterError} + */ + set value(v: any) { + throw new FalseSetterError(); + }, + } as const; + } + } + + /** + * @throws {FalseGetterError} + */ + function bar() { + const result = foo(); + if (!result.flag) { + result.value; + } + } + + /** + * @throws {TrueGetterError} + */ + function baz() { + const result = foo(); + if (result.flag) { + result.value; + } + } + + /** + * @throws {FalseSetterError} + */ + function qux() { + const result = foo(); + if (!result.flag) { + result.value = 42; + } + } + + /** + * @throws {TrueSetterError} + */ + function quux() { + const result = foo(); + if (result.flag) { + result.value = 42; + } + } + `, + errors: [ + { messageId: 'throwTypeMismatch' }, + { messageId: 'throwTypeMismatch' }, + { messageId: 'throwTypeMismatch' }, + { messageId: 'throwTypeMismatch' }, + ], + }, ], }, ); diff --git a/tests/rules/no-undocumented-throws.test.js b/tests/rules/no-undocumented-throws.test.js index 16d4f83..794b756 100644 --- a/tests/rules/no-undocumented-throws.test.js +++ b/tests/rules/no-undocumented-throws.test.js @@ -4023,6 +4023,166 @@ ruleTester.run( { messageId: 'missingThrowsTag' }, ], }, + { + code: ` + class TrueGetterError extends Error {} + class TrueSetterError extends Error {} + class FalseGetterError extends Error {} + class FalseSetterError extends Error {} + + function foo() { + if (Math.random() > 0.5) { + return { + flag: true, + /** + * @throws {TrueGetterError} + */ + get value() { + throw new TrueGetterError(); + }, + /** + * @throws {TrueSetterError} + */ + set value(v: any) { + throw new TrueSetterError(); + }, + } as const; + } else { + return { + flag: false, + /** + * @throws {FalseGetterError} + */ + get value() { + throw new FalseGetterError(); + }, + /** + * @throws {FalseSetterError} + */ + set value(v: any) { + throw new FalseSetterError(); + }, + } as const; + } + } + + function bar() { + const result = foo(); + if (!result.flag) { + result.value; + } + } + + function baz() { + const result = foo(); + if (result.flag) { + result.value; + } + } + + function qux() { + const result = foo(); + if (!result.flag) { + result.value = 42; + } + } + + function quux() { + const result = foo(); + if (result.flag) { + result.value = 42; + } + } + `, + output: ` + class TrueGetterError extends Error {} + class TrueSetterError extends Error {} + class FalseGetterError extends Error {} + class FalseSetterError extends Error {} + + function foo() { + if (Math.random() > 0.5) { + return { + flag: true, + /** + * @throws {TrueGetterError} + */ + get value() { + throw new TrueGetterError(); + }, + /** + * @throws {TrueSetterError} + */ + set value(v: any) { + throw new TrueSetterError(); + }, + } as const; + } else { + return { + flag: false, + /** + * @throws {FalseGetterError} + */ + get value() { + throw new FalseGetterError(); + }, + /** + * @throws {FalseSetterError} + */ + set value(v: any) { + throw new FalseSetterError(); + }, + } as const; + } + } + + /** + * @throws {FalseGetterError} + */ + function bar() { + const result = foo(); + if (!result.flag) { + result.value; + } + } + + /** + * @throws {TrueGetterError} + */ + function baz() { + const result = foo(); + if (result.flag) { + result.value; + } + } + + /** + * @throws {FalseSetterError} + */ + function qux() { + const result = foo(); + if (!result.flag) { + result.value = 42; + } + } + + /** + * @throws {TrueSetterError} + */ + function quux() { + const result = foo(); + if (result.flag) { + result.value = 42; + } + } + `, + errors: [ + { messageId: 'missingThrowsTag' }, + { messageId: 'missingThrowsTag' }, + { messageId: 'missingThrowsTag' }, + { messageId: 'missingThrowsTag' }, + ], + }, { code: ` const foo = {