From da7a0458d46d88ba33a81b8806edd94313077e29 Mon Sep 17 00:00:00 2001 From: Chiawen Chen Date: Sun, 8 Mar 2020 18:39:06 +0800 Subject: [PATCH] [Fix] `no-unused-state`: handle optional chaining Fixes #2515 --- lib/rules/no-unused-state.js | 2 +- tests/helpers/parsers.js | 10 +++++++- tests/lib/rules/jsx-no-comment-textnodes.js | 13 ++--------- tests/lib/rules/no-unused-state.js | 26 +++++++++++++++++++-- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/lib/rules/no-unused-state.js b/lib/rules/no-unused-state.js index 05bc08b29a..e05ef73cd4 100644 --- a/lib/rules/no-unused-state.js +++ b/lib/rules/no-unused-state.js @@ -415,7 +415,7 @@ module.exports = { handleAssignment(node.id, node.init); }, - MemberExpression(node) { + 'MemberExpression, OptionalMemberExpression'(node) { if (!classInfo) { return; } diff --git a/tests/helpers/parsers.js b/tests/helpers/parsers.js index be4994e0e0..73b7a2248a 100644 --- a/tests/helpers/parsers.js +++ b/tests/helpers/parsers.js @@ -1,11 +1,19 @@ 'use strict'; const path = require('path'); +const semver = require('semver'); +const version = require('eslint/package.json').version; const NODE_MODULES = '../../node_modules'; module.exports = { BABEL_ESLINT: path.join(__dirname, NODE_MODULES, 'babel-eslint'), TYPESCRIPT_ESLINT: path.join(__dirname, NODE_MODULES, 'typescript-eslint-parser'), - '@TYPESCRIPT_ESLINT': path.join(__dirname, NODE_MODULES, '@typescript-eslint/parser') + '@TYPESCRIPT_ESLINT': path.join(__dirname, NODE_MODULES, '@typescript-eslint/parser'), + TS: function TS(tests) { + if (semver.satisfies(version, '>= 5')) { + return tests; + } + return []; + } }; diff --git a/tests/lib/rules/jsx-no-comment-textnodes.js b/tests/lib/rules/jsx-no-comment-textnodes.js index a01f5de1e3..20fcd9171e 100644 --- a/tests/lib/rules/jsx-no-comment-textnodes.js +++ b/tests/lib/rules/jsx-no-comment-textnodes.js @@ -9,20 +9,11 @@ // Requirements // ------------------------------------------------------------------------------ -const semver = require('semver'); -const version = require('eslint/package.json').version; const RuleTester = require('eslint').RuleTester; const rule = require('../../../lib/rules/jsx-no-comment-textnodes'); const parsers = require('../../helpers/parsers'); -function TS(tests) { - if (semver.satisfies(version, '>= 5')) { - return tests; - } - return []; -} - const parserOptions = { ecmaVersion: 2018, sourceType: 'module', @@ -182,7 +173,7 @@ ruleTester.run('jsx-no-comment-textnodes', rule, { code: '
/* TODO: Write perfect code */
', parser: parsers.BABEL_ESLINT } - ].concat(TS([ + ].concat(parsers.TS([ { code: ` class Comp1 extends Component { @@ -388,7 +379,7 @@ ruleTester.run('jsx-no-comment-textnodes', rule, { parser: parsers.BABEL_ESLINT, errors: [{message: 'Comments inside children section of tag should be placed inside braces'}] } - ].concat(TS([ + ].concat(parsers.TS([ { code: ` class Comp1 extends Component { diff --git a/tests/lib/rules/no-unused-state.js b/tests/lib/rules/no-unused-state.js index f6ded949bd..bc6b4caf55 100644 --- a/tests/lib/rules/no-unused-state.js +++ b/tests/lib/rules/no-unused-state.js @@ -25,7 +25,7 @@ function getErrorMessages(unusedFields) { } eslintTester.run('no-unused-state', rule, { - valid: [ + valid: [].concat( `function StatelessFnUnaffectedTest(props) { return ; };`, @@ -231,6 +231,28 @@ eslintTester.run('no-unused-state', rule, { } }`, parser: parsers.BABEL_ESLINT + }, parsers.TS([{ + code: ` + class OptionalChaining extends React.Component { + constructor() { + this.state = { foo: 0 }; + } + render() { + return ; + } + }`, + parser: parsers['@TYPESCRIPT_ESLINT'] + }]), { + code: ` + class OptionalChaining extends React.Component { + constructor() { + this.state = { foo: 0 }; + } + render() { + return ; + } + }`, + parser: parsers.BABEL_ESLINT }, `class VariableDeclarationTest extends React.Component { constructor() { @@ -795,7 +817,7 @@ eslintTester.run('no-unused-state', rule, { `, parser: parsers.TYPESCRIPT_ESLINT } - ], + ), invalid: [ {