From 13e59e757e23087990a3c1f02f1c79bfef4c7d80 Mon Sep 17 00:00:00 2001 From: Evgeny Stepanovych Date: Wed, 29 Sep 2021 11:13:46 +0300 Subject: [PATCH 1/2] fix(eslint-plugin): [no-confusing-void-expression] Optional chaining breaks the rule --- .../eslint-plugin/src/rules/no-confusing-void-expression.ts | 5 +++++ .../tests/rules/no-confusing-void-expression.test.ts | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/no-confusing-void-expression.ts b/packages/eslint-plugin/src/rules/no-confusing-void-expression.ts index fd4e97e7360a..0579fb442541 100644 --- a/packages/eslint-plugin/src/rules/no-confusing-void-expression.ts +++ b/packages/eslint-plugin/src/rules/no-confusing-void-expression.ts @@ -268,6 +268,11 @@ export default util.createRule({ } } + if (parent.type === AST_NODE_TYPES.ChainExpression) { + // e.g. `console?.log('foo')` + return findInvalidAncestor(parent); + } + // any other parent is invalid return parent; } diff --git a/packages/eslint-plugin/tests/rules/no-confusing-void-expression.test.ts b/packages/eslint-plugin/tests/rules/no-confusing-void-expression.test.ts index 3586c3388f4f..823252322575 100644 --- a/packages/eslint-plugin/tests/rules/no-confusing-void-expression.test.ts +++ b/packages/eslint-plugin/tests/rules/no-confusing-void-expression.test.ts @@ -22,11 +22,12 @@ ruleTester.run('no-confusing-void-expression', rule, { valid: [ ...batchedSingleLineTests({ code: ` - () => Math.random(); console.log('foo'); + () => Math.random(); foo && console.log(foo); foo || console.log(foo); foo ? console.log(true) : console.log(false); + console?.log?.('foo'); `, }), @@ -69,6 +70,7 @@ ruleTester.run('no-confusing-void-expression', rule, { (console.log('foo') && true) || false; (cond && console.log('ok')) || console.log('error'); !console.log('foo'); + const x = console?.log?.('foo'); `, errors: [ { line: 2, column: 11, messageId: 'invalidVoidExpr' }, @@ -80,6 +82,7 @@ ruleTester.run('no-confusing-void-expression', rule, { { line: 8, column: 10, messageId: 'invalidVoidExpr' }, { line: 9, column: 18, messageId: 'invalidVoidExpr' }, { line: 10, column: 10, messageId: 'invalidVoidExpr' }, + { line: 11, column: 19, messageId: 'invalidVoidExpr' }, ], }), From 39f6554d266d8ee614eedf53d6d0596438b24697 Mon Sep 17 00:00:00 2001 From: Evgeny Stepanovych Date: Wed, 29 Sep 2021 11:41:16 +0300 Subject: [PATCH 2/2] fix(eslint-plugin): [no-confusing-void-expression] Optional chaining breaks the rule --- .../no-confusing-void-expression.test.ts | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/eslint-plugin/tests/rules/no-confusing-void-expression.test.ts b/packages/eslint-plugin/tests/rules/no-confusing-void-expression.test.ts index 823252322575..e0bdd183a0ee 100644 --- a/packages/eslint-plugin/tests/rules/no-confusing-void-expression.test.ts +++ b/packages/eslint-plugin/tests/rules/no-confusing-void-expression.test.ts @@ -22,12 +22,12 @@ ruleTester.run('no-confusing-void-expression', rule, { valid: [ ...batchedSingleLineTests({ code: ` - console.log('foo'); () => Math.random(); + console.log('foo'); foo && console.log(foo); foo || console.log(foo); foo ? console.log(true) : console.log(false); - console?.log?.('foo'); + console?.log('foo'); `, }), @@ -62,6 +62,7 @@ ruleTester.run('no-confusing-void-expression', rule, { ...batchedSingleLineTests({ code: ` const x = console.log('foo'); + const x = console?.log('foo'); console.error(console.log('foo')); [console.log('foo')]; ({ x: console.log('foo') }); @@ -70,19 +71,18 @@ ruleTester.run('no-confusing-void-expression', rule, { (console.log('foo') && true) || false; (cond && console.log('ok')) || console.log('error'); !console.log('foo'); - const x = console?.log?.('foo'); `, errors: [ { line: 2, column: 11, messageId: 'invalidVoidExpr' }, - { line: 3, column: 23, messageId: 'invalidVoidExpr' }, - { line: 4, column: 10, messageId: 'invalidVoidExpr' }, - { line: 5, column: 15, messageId: 'invalidVoidExpr' }, - { line: 6, column: 14, messageId: 'invalidVoidExpr' }, - { line: 7, column: 9, messageId: 'invalidVoidExpr' }, - { line: 8, column: 10, messageId: 'invalidVoidExpr' }, - { line: 9, column: 18, messageId: 'invalidVoidExpr' }, - { line: 10, column: 10, messageId: 'invalidVoidExpr' }, - { line: 11, column: 19, messageId: 'invalidVoidExpr' }, + { line: 3, column: 19, messageId: 'invalidVoidExpr' }, + { line: 4, column: 23, messageId: 'invalidVoidExpr' }, + { line: 5, column: 10, messageId: 'invalidVoidExpr' }, + { line: 6, column: 15, messageId: 'invalidVoidExpr' }, + { line: 7, column: 14, messageId: 'invalidVoidExpr' }, + { line: 8, column: 9, messageId: 'invalidVoidExpr' }, + { line: 9, column: 10, messageId: 'invalidVoidExpr' }, + { line: 10, column: 18, messageId: 'invalidVoidExpr' }, + { line: 11, column: 10, messageId: 'invalidVoidExpr' }, ], }),