From 8daba0ea6faa537dedc34a51310aa50cc5ba92bd Mon Sep 17 00:00:00 2001 From: medusalix Date: Tue, 12 Jan 2021 16:36:57 +0100 Subject: [PATCH 1/8] Fix non-iterable `visitorKeys` --- rules/prefer-default-parameters.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/rules/prefer-default-parameters.js b/rules/prefer-default-parameters.js index 165d003555..e0c32ae05d 100644 --- a/rules/prefer-default-parameters.js +++ b/rules/prefer-default-parameters.js @@ -33,7 +33,14 @@ const containsCallExpression = (source, node) => { return true; } - for (const key of source.visitorKeys[node.type]) { + const keys = source.visitorKeys[node.type]; + + // Assume it contains a call expression if no visitor keys exist + if (!keys) { + return true; + } + + for (const key of keys) { const value = node[key]; if (Array.isArray(value)) { From 1de3f538faa1fd6022f6af3776c35af3fbc174be Mon Sep 17 00:00:00 2001 From: medusalix Date: Tue, 12 Jan 2021 19:23:33 +0100 Subject: [PATCH 2/8] Add babel test --- test/prefer-default-parameters.js | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) mode change 100644 => 100755 test/prefer-default-parameters.js diff --git a/test/prefer-default-parameters.js b/test/prefer-default-parameters.js old mode 100644 new mode 100755 index 14926d757c..6afde71f8b --- a/test/prefer-default-parameters.js +++ b/test/prefer-default-parameters.js @@ -1,13 +1,5 @@ -import test from 'ava'; -import avaRuleTester from 'eslint-ava-rule-tester'; import {outdent} from 'outdent'; -import rule from '../rules/prefer-default-parameters.js'; - -const ruleTester = avaRuleTester(test, { - parserOptions: { - ecmaVersion: 2020 - } -}); +import {test} from './utils/test.js'; const invalidTestCase = ({code, suggestions}) => { if (!suggestions) { @@ -33,7 +25,7 @@ const invalidTestCase = ({code, suggestions}) => { }; }; -ruleTester.run('prefer-default-parameters', rule, { +test({ valid: [ 'function abc(foo = { bar: 123 }) { }', 'function abc({ bar } = { bar: 123 }) { }', @@ -655,3 +647,16 @@ ruleTester.run('prefer-default-parameters', rule, { }) ] }); + +test.babel({ + valid: [ + // See 'containsCallExpression' in rule + outdent` + function abc(foo, bar) { + const { baz, ...rest } = bar; + foo = foo || 123; + } + ` + ], + invalid: [] +}); From 8b6b3a161e0eb4898cd60827d839fdce9e030874 Mon Sep 17 00:00:00 2001 From: medusalix Date: Tue, 12 Jan 2021 19:57:22 +0100 Subject: [PATCH 3/8] Revert file mode --- test/prefer-default-parameters.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 test/prefer-default-parameters.js diff --git a/test/prefer-default-parameters.js b/test/prefer-default-parameters.js old mode 100755 new mode 100644 From 3279eecf3a2f0818988707be4b1f589297b92d66 Mon Sep 17 00:00:00 2001 From: medusalix Date: Tue, 12 Jan 2021 20:21:42 +0100 Subject: [PATCH 4/8] Update comment --- rules/prefer-default-parameters.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rules/prefer-default-parameters.js b/rules/prefer-default-parameters.js index e0c32ae05d..25cebd2ab3 100644 --- a/rules/prefer-default-parameters.js +++ b/rules/prefer-default-parameters.js @@ -35,7 +35,8 @@ const containsCallExpression = (source, node) => { const keys = source.visitorKeys[node.type]; - // Assume it contains a call expression if no visitor keys exist + // The Babel AST has an `ExperimentalRestProperty` node without visitor keys. + // We have to assume that the node might contain a call expression. if (!keys) { return true; } From 76f106e8d4238709c17332e7b4232260630af4c2 Mon Sep 17 00:00:00 2001 From: medusalix Date: Sun, 24 Jan 2021 16:01:58 +0100 Subject: [PATCH 5/8] Use `eslint-visitor-keys` as fallback --- rules/prefer-default-parameters.js | 11 ++++------- test/prefer-default-parameters.js | 3 ++- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/rules/prefer-default-parameters.js b/rules/prefer-default-parameters.js index 25cebd2ab3..5ae7a14a6f 100644 --- a/rules/prefer-default-parameters.js +++ b/rules/prefer-default-parameters.js @@ -1,4 +1,5 @@ 'use strict'; +const evk = require('eslint-visitor-keys'); const {findVariable} = require('eslint-utils'); const getDocumentationUrl = require('./utils/get-documentation-url'); @@ -33,13 +34,9 @@ const containsCallExpression = (source, node) => { return true; } - const keys = source.visitorKeys[node.type]; - - // The Babel AST has an `ExperimentalRestProperty` node without visitor keys. - // We have to assume that the node might contain a call expression. - if (!keys) { - return true; - } + // The Babel AST doesn't have visitor keys for certain types of nodes + // Use `getKeys` from `eslint-visitor-keys` in those cases + const keys = source.visitorKeys[node.type] || evk.getKeys(node); for (const key of keys) { const value = node[key]; diff --git a/test/prefer-default-parameters.js b/test/prefer-default-parameters.js index 6afde71f8b..315ec49455 100644 --- a/test/prefer-default-parameters.js +++ b/test/prefer-default-parameters.js @@ -650,7 +650,8 @@ test({ test.babel({ valid: [ - // See 'containsCallExpression' in rule + // `ExperimentalRestProperty` doesn't have a corresponding entry in `source.visitorKeys` + // This test verifies that the fallback to `eslint-visitor-keys` is working correctly outdent` function abc(foo, bar) { const { baz, ...rest } = bar; From 926409073937fa3f3f59bf8d3ef9f9dc7f890d2b Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 24 Jan 2021 23:31:05 +0800 Subject: [PATCH 6/8] Fix tests, rename varibale, add comment --- rules/prefer-default-parameters.js | 5 +++-- test/prefer-default-parameters.js | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/rules/prefer-default-parameters.js b/rules/prefer-default-parameters.js index 5ae7a14a6f..46dce94d98 100644 --- a/rules/prefer-default-parameters.js +++ b/rules/prefer-default-parameters.js @@ -1,5 +1,5 @@ 'use strict'; -const evk = require('eslint-visitor-keys'); +const eslintVisitorKeys = require('eslint-visitor-keys'); const {findVariable} = require('eslint-utils'); const getDocumentationUrl = require('./utils/get-documentation-url'); @@ -36,7 +36,8 @@ const containsCallExpression = (source, node) => { // The Babel AST doesn't have visitor keys for certain types of nodes // Use `getKeys` from `eslint-visitor-keys` in those cases - const keys = source.visitorKeys[node.type] || evk.getKeys(node); + // TODO: Remove this when we drop support for `babel-eslint` #1040 + const keys = source.visitorKeys[node.type] || eslintVisitorKeys.getKeys(node); for (const key of keys) { const value = node[key]; diff --git a/test/prefer-default-parameters.js b/test/prefer-default-parameters.js index 315ec49455..80e444c622 100644 --- a/test/prefer-default-parameters.js +++ b/test/prefer-default-parameters.js @@ -648,7 +648,7 @@ test({ ] }); -test.babel({ +test.babelLegacy({ valid: [ // `ExperimentalRestProperty` doesn't have a corresponding entry in `source.visitorKeys` // This test verifies that the fallback to `eslint-visitor-keys` is working correctly From 1378c5e71fa50764a9cb1bf9d72cd3e047e45408 Mon Sep 17 00:00:00 2001 From: fisker Date: Mon, 25 Jan 2021 00:32:49 +0800 Subject: [PATCH 7/8] Use `eslintVisitorKeys.KEYS` --- rules/prefer-default-parameters.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/prefer-default-parameters.js b/rules/prefer-default-parameters.js index 46dce94d98..6017e35f1c 100644 --- a/rules/prefer-default-parameters.js +++ b/rules/prefer-default-parameters.js @@ -37,7 +37,7 @@ const containsCallExpression = (source, node) => { // The Babel AST doesn't have visitor keys for certain types of nodes // Use `getKeys` from `eslint-visitor-keys` in those cases // TODO: Remove this when we drop support for `babel-eslint` #1040 - const keys = source.visitorKeys[node.type] || eslintVisitorKeys.getKeys(node); + const keys = source.visitorKeys[node.type] || eslintVisitorKeys.KEYS[node.type]; for (const key of keys) { const value = node[key]; From 1d69b54aa78f644f7e004a8abdccbe0e3e44d67b Mon Sep 17 00:00:00 2001 From: medusalix Date: Sun, 24 Jan 2021 19:22:06 +0100 Subject: [PATCH 8/8] Add more tests --- rules/prefer-default-parameters.js | 2 +- test/prefer-default-parameters.js | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/rules/prefer-default-parameters.js b/rules/prefer-default-parameters.js index 6017e35f1c..ecd5be19ce 100644 --- a/rules/prefer-default-parameters.js +++ b/rules/prefer-default-parameters.js @@ -35,7 +35,7 @@ const containsCallExpression = (source, node) => { } // The Babel AST doesn't have visitor keys for certain types of nodes - // Use `getKeys` from `eslint-visitor-keys` in those cases + // Use `eslint-visitor-keys` in those cases // TODO: Remove this when we drop support for `babel-eslint` #1040 const keys = source.visitorKeys[node.type] || eslintVisitorKeys.KEYS[node.type]; diff --git a/test/prefer-default-parameters.js b/test/prefer-default-parameters.js index 80e444c622..859ae62dd2 100644 --- a/test/prefer-default-parameters.js +++ b/test/prefer-default-parameters.js @@ -650,13 +650,24 @@ test({ test.babelLegacy({ valid: [ - // `ExperimentalRestProperty` doesn't have a corresponding entry in `source.visitorKeys` - // This test verifies that the fallback to `eslint-visitor-keys` is working correctly + // These tests verify that the fallback to `eslint-visitor-keys` is working correctly outdent` function abc(foo, bar) { const { baz, ...rest } = bar; foo = foo || 123; } + `, + outdent` + function abc(foo, bar) { + const baz = foo?.bar; + foo = foo || 123; + } + `, + outdent` + function abc(foo, bar) { + import('foo'); + foo = foo || 123; + } ` ], invalid: []