From b9f5126632dd2909face3d6a39f73266b148a202 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 12:26:19 +0800 Subject: [PATCH 01/32] Add `prefer-destructuring-in-parameters` rule --- .../prefer-destructuring-in-parameters.md | 17 ++ index.js | 1 + readme.md | 2 + rules/prefer-destructuring-in-parameters.js | 183 ++++++++++++++++++ test/prefer-destructuring-in-parameters.js | 29 +++ .../prefer-destructuring-in-parameters.js.md | 85 ++++++++ ...prefer-destructuring-in-parameters.js.snap | Bin 0 -> 439 bytes 7 files changed, 317 insertions(+) create mode 100644 docs/rules/prefer-destructuring-in-parameters.md create mode 100644 rules/prefer-destructuring-in-parameters.js create mode 100644 test/prefer-destructuring-in-parameters.js create mode 100644 test/snapshots/prefer-destructuring-in-parameters.js.md create mode 100644 test/snapshots/prefer-destructuring-in-parameters.js.snap diff --git a/docs/rules/prefer-destructuring-in-parameters.md b/docs/rules/prefer-destructuring-in-parameters.md new file mode 100644 index 0000000000..ddf3b1fadc --- /dev/null +++ b/docs/rules/prefer-destructuring-in-parameters.md @@ -0,0 +1,17 @@ +# Prefer destructuring in parameters over accessing properties. + + + +This rule is fixable. + +## Fail + +```js +const foo = 'unicorn'; +``` + +## Pass + +```js +const foo = 'πŸ¦„'; +``` diff --git a/index.js b/index.js index d3247f14f6..ebec97db92 100644 --- a/index.js +++ b/index.js @@ -88,6 +88,7 @@ module.exports = { 'unicorn/prefer-array-some': 'error', 'unicorn/prefer-date-now': 'error', 'unicorn/prefer-default-parameters': 'error', + 'unicorn/prefer-destructuring-in-parameters': 'error', 'unicorn/prefer-dom-node-append': 'error', 'unicorn/prefer-dom-node-dataset': 'error', 'unicorn/prefer-dom-node-remove': 'error', diff --git a/readme.md b/readme.md index c68f804dcc..bab51ba8c1 100644 --- a/readme.md +++ b/readme.md @@ -80,6 +80,7 @@ Configure it in `package.json`. "unicorn/prefer-array-some": "error", "unicorn/prefer-date-now": "error", "unicorn/prefer-default-parameters": "error", + "unicorn/prefer-destructuring-in-parameters": "error", "unicorn/prefer-dom-node-append": "error", "unicorn/prefer-dom-node-dataset": "error", "unicorn/prefer-dom-node-remove": "error", @@ -158,6 +159,7 @@ Configure it in `package.json`. - [prefer-array-some](docs/rules/prefer-array-some.md) - Prefer `.some(…)` over `.find(…)`. - [prefer-date-now](docs/rules/prefer-date-now.md) - Prefer `Date.now()` to get the number of milliseconds since the Unix Epoch. *(fixable)* - [prefer-default-parameters](docs/rules/prefer-default-parameters.md) - Prefer default parameters over reassignment. *(fixable)* +- [prefer-destructuring-in-parameters](docs/rules/prefer-destructuring-in-parameters.md) - Prefer destructuring in parameters over accessing properties. *(fixable)* - [prefer-dom-node-append](docs/rules/prefer-dom-node-append.md) - Prefer `Node#append()` over `Node#appendChild()`. *(fixable)* - [prefer-dom-node-dataset](docs/rules/prefer-dom-node-dataset.md) - Prefer using `.dataset` on DOM elements over `.setAttribute(…)`. *(fixable)* - [prefer-dom-node-remove](docs/rules/prefer-dom-node-remove.md) - Prefer `childNode.remove()` over `parentNode.removeChild(childNode)`. *(fixable)* diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js new file mode 100644 index 0000000000..a9e3657818 --- /dev/null +++ b/rules/prefer-destructuring-in-parameters.js @@ -0,0 +1,183 @@ +'use strict'; +const {upperFirst} = require('lodash'); +const {findVariable, isNotOpeningParenToken} = require('eslint-utils'); +const getDocumentationUrl = require('./utils/get-documentation-url'); +const avoidCapture = require('./utils/avoid-capture'); + +const MESSAGE_ID = 'prefer-destructuring-in-parameters'; +const messages = { + [MESSAGE_ID]: '`{{member}}` should be destructed in parameter `{{parameter}}`.' +}; + +const indexVariableNamePrefixes = ['first', 'second']; + +function getMemberExpressionProperty(node) { + const {parent} = node; + if (parent.type !== 'MemberExpression') { + return; + } + + const {computed, optional, object, property} = parent; + + if (optional || object !== node) { + return; + } + + if (computed) { + if (property.type !== 'Literal') { + return; + } + + const index = property.value; + if ( + typeof index !== 'number' || + !Number.isInteger(index) || + !(index >= 0 && index < indexVariableNamePrefixes.length) + ) { + return; + } + + return index; + } + + if (property.type === 'Identifier') { + return property.name; + } +} + +function fix({sourceCode, parameter, memberExpressions, isIndex}) { + function * fixArrowFunctionParentheses(fixer) { + const functionNode = parameter.parent; + if ( + functionNode.type === 'ArrowFunctionExpression' && + functionNode.params.length === 1 && + isNotOpeningParenToken(sourceCode.getFirstToken(parameter)) + ) { + yield fixer.insertTextBefore(parameter, '('); + yield fixer.insertTextAfter(parameter, ')'); + } + } + + function fixParameter(fixer) { + let text; + if (isIndex) { + const variables = []; + for (const [index, {variable}] of memberExpressions.entries()) { + variables[index] = variable; + } + + text = `[${variables.join(', ')}]`; + } else { + const variables = [...memberExpressions.keys()]; + + text = `{${variables.join(', ')}}` + } + + return fixer.replaceText(parameter, text); + } + + return function * (fixer) { + yield * fixArrowFunctionParentheses(fixer); + yield fixParameter(fixer); + + for (const {variable, expressions} of memberExpressions.values()) { + for (const expression of expressions) { + yield fixer.replaceText(expression, variable); + } + } + }; +} + +const create = context => { + const {ecmaVersion} = context.parserOptions; + const sourceCode = context.getSourceCode(); + return { + ':function > Identifier.params'(parameter) { + const scope = context.getScope(); + const {name} = parameter; + const variable = findVariable(scope, parameter); + const identifiers = variable.references.map(({identifier}) => identifier); + + const memberExpressions = new Map(); + let lastPropertyType; + let firstExpression; + for (const identifier of identifiers) { + const property = getMemberExpressionProperty(identifier); + const propertyType = typeof property; + if ( + propertyType === 'undefined' || + (lastPropertyType && propertyType !== lastPropertyType) + ) { + return; + } + + const memberExpression = identifier.parent; + + if (memberExpressions.has(property)) { + memberExpressions.get(property).expressions.push(memberExpression); + } else { + memberExpressions.set(property, {expressions: [memberExpression]}); + } + + lastPropertyType = propertyType; + firstExpression = ( + firstExpression && firstExpression.node.range[0] < memberExpression.range[0] + ) ? + firstExpression : + {node: memberExpression, property}; + } + + if (memberExpressions.size === 0) { + return; + } + + const isIndex = lastPropertyType === 'number'; + const scopes = [ + variable.scope, + ...variable.references.map(({from}) => from) + ]; + for (const [property, data] of memberExpressions.entries()) { + let variableName; + if (isIndex) { + const index = indexVariableNamePrefixes[property]; + variableName = avoidCapture(`${index}ElementOf${upperFirst(name)}`, scopes, ecmaVersion); + } else { + variableName = avoidCapture(property, scopes, ecmaVersion); + if (variableName !== property) { + return; + } + } + + data.variable = variableName; + } + + const {node, property} = firstExpression; + context.report({ + node, + messageId: MESSAGE_ID, + data: { + member: isIndex ? `${name}[${property}]` : `${name}.${property}`, + parameter: name + }, + fix: fix({ + sourceCode, + parameter, + memberExpressions, + isIndex + }) + }); + } + } +}; + +module.exports = { + create, + meta: { + type: 'suggestion', + docs: { + url: getDocumentationUrl(__filename) + }, + fixable: 'code', + messages + } +}; diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js new file mode 100644 index 0000000000..1ef668e01b --- /dev/null +++ b/test/prefer-destructuring-in-parameters.js @@ -0,0 +1,29 @@ +import {outdent} from 'outdent'; +import {test} from './utils/test.js'; + +test.snapshot({ + valid: [ + 'const foo = bar => bar', + 'const foo = function bar(baz) {return bar.name}', + 'const foo = ({bar}) => bar', + 'const foo = bar => bar[3]', + 'const foo = bar => bar[1.5]', + 'const foo = bar => bar[-1]', + 'const foo = bar => bar[0xFF]', + 'const foo = bar => bar[null]', + 'const foo = bar => bar[1n]', + 'const foo = bar => bar["baz"]', + 'const foo = bar => bar.length && bar[0]', + 'const foo = bar => bar.default', + 'const foo = bar => bar.function', + ], + invalid: [ + 'const foo = bar => bar[0]', + 'const foo = bar => bar[0] === firstElementOfBar', + 'const foo = (bar) => bar[0]', + 'const foo = (bar, {baz}) => bar[0] === baz', + 'const foo = bar => bar[0b01]', + 'const foo = bar => bar.length', + 'const foo = bar => bar.baz' + ] +}); diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.md b/test/snapshots/prefer-destructuring-in-parameters.js.md new file mode 100644 index 0000000000..0f73a35c0b --- /dev/null +++ b/test/snapshots/prefer-destructuring-in-parameters.js.md @@ -0,0 +1,85 @@ +# Snapshot report for `test/prefer-destructuring-in-parameters.js` + +The actual snapshot is saved in `prefer-destructuring-in-parameters.js.snap`. + +Generated by [AVA](https://avajs.dev). + +## Invalid #1 + 1 | const foo = bar => bar[0] + +> Output + + `␊ + 1 | const foo = ([firstElementOfBar]) => firstElementOfBar␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => bar[0]␊ + | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ + ` + +## Invalid #2 + 1 | const foo = bar => bar[0] === firstElementOfBar + +> Output + + `␊ + 1 | const foo = ([firstElementOfBar_]) => firstElementOfBar_ === firstElementOfBar␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => bar[0] === firstElementOfBar␊ + | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ + ` + +## Invalid #3 + 1 | const foo = bar => bar[0b01] + +> Output + + `␊ + 1 | const foo = ([, secondElementOfBar]) => secondElementOfBar␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => bar[0b01]␊ + | ^^^^^^^^^ `bar[1]` should be destructed in parameter `bar`.␊ + ` + +## Invalid #4 + 1 | const foo = bar => bar.length + +> Output + + `␊ + 1 | const foo = ({length}) => length␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => bar.length␊ + | ^^^^^^^^^^ `bar.length` should be destructed in parameter `bar`.␊ + ` + +## Invalid #5 + 1 | const foo = bar => bar.baz + +> Output + + `␊ + 1 | const foo = ({baz}) => baz␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => bar.baz␊ + | ^^^^^^^ `bar.baz` should be destructed in parameter `bar`.␊ + ` diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.snap b/test/snapshots/prefer-destructuring-in-parameters.js.snap new file mode 100644 index 0000000000000000000000000000000000000000..270cd3a898c19c6c2fc92a7065f50bc7e64e0212 GIT binary patch literal 439 zcmV;o0Z9HqRzV00000000Bq zz`(%3%1~?A_OtY+_#A&j%h@}YGyY;?00AE;J`2S4Mu*S*=J!cl>9lyMrc*-^6Ihg) z5rQWG@vKeF(~laQmq}T9;n@C;hviIQ(JxTk12l5k@q9-q)6XAu^FN+pOpSQW1Qxvm z#mUSJ3=bkU-FS1>YUP}_+*ZE!l4qH~qLZOmoCRnb13TDljI0cTjCNcK3Wf?b3d#9- z#U%=9`S}XA3L4RAnMK7Vt~sf>sd**-X-3Db_y86TqtH0bJ<~-m6TWn(g~!Z z4Pt?IDFEfMfH*KvNPwtIP$>mNi8lZDorj)O;O0qQz%F*O3Y0yNi6~^ zP0&MifCe_tROh7TrI%#Xf_(sCqw1>1>uf!!76ML(J0Gf^TrY$X7a#FBA|zhH*4CCl zJTY}L5Q-=qrqDS0oUr;`N1-?sD3XGi95KaF&8sBf%_IXuf=LqYEkm-srGzzACM8xu hk|dCUs=f?=dIYH_eBv7S_iE006QD!DIjc literal 0 HcmV?d00001 From c1f16d56a4b416f8d3a4ec2ff5a3d32d2bdb9166 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 13:07:25 +0800 Subject: [PATCH 02/32] Check effects --- rules/prefer-destructuring-in-parameters.js | 63 +++++- test/prefer-destructuring-in-parameters.js | 29 ++- .../prefer-destructuring-in-parameters.js.md | 205 +++++++++++++++++- ...prefer-destructuring-in-parameters.js.snap | Bin 439 -> 1048 bytes 4 files changed, 284 insertions(+), 13 deletions(-) diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index a9e3657818..699c196e63 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -11,18 +11,63 @@ const messages = { const indexVariableNamePrefixes = ['first', 'second']; -function getMemberExpressionProperty(node) { +function isNodeEffectThis(node) { const {parent} = node; - if (parent.type !== 'MemberExpression') { + if ( + parent.type === 'ChainExpression' && + parent.expression === node + ) { + return isNodeEffectThis(parent); + } + + if ( + (parent.type === 'CallExpression' || parent.type === 'NewExpression') && + parent.callee === node + ) { + return true; + } + + return false; +} + +function isModifyingNode(node) { + const {parent} = node; + + if ( + parent.type === 'AssignmentExpression' && + parent.left === node + ) { + return true; + } + + if ( + parent.type === 'UpdateExpression' && + parent.argument === node + ) { + return true; + } + + + return false; +} + +function getMemberExpressionProperty(node) { + const memberExpression = node.parent; + if ( + memberExpression.type !== 'MemberExpression' || + isNodeEffectThis(memberExpression) || + isModifyingNode(memberExpression) + ) { return; } - const {computed, optional, object, property} = parent; + const {computed, optional, object, property} = memberExpression; if (optional || object !== node) { return; } + let propertyOrIndex; if (computed) { if (property.type !== 'Literal') { return; @@ -37,12 +82,16 @@ function getMemberExpressionProperty(node) { return; } - return index; - } + propertyOrIndex = index; + } else { + if (property.type !== 'Identifier') { + return; + } - if (property.type === 'Identifier') { - return property.name; + propertyOrIndex = property.name; } + + return propertyOrIndex; } function fix({sourceCode, parameter, memberExpressions, isIndex}) { diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index 1ef668e01b..551c3c5fc7 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -6,7 +6,7 @@ test.snapshot({ 'const foo = bar => bar', 'const foo = function bar(baz) {return bar.name}', 'const foo = ({bar}) => bar', - 'const foo = bar => bar[3]', + 'const foo = bar => bar[2]', 'const foo = bar => bar[1.5]', 'const foo = bar => bar[-1]', 'const foo = bar => bar[0xFF]', @@ -16,14 +16,37 @@ test.snapshot({ 'const foo = bar => bar.length && bar[0]', 'const foo = bar => bar.default', 'const foo = bar => bar.function', + 'const foo = bar => bar.baz()', + 'const foo = bar => bar[0]()', + 'const foo = bar => new bar.Baz()', + 'const foo = bar => new bar[0]()', + 'const foo = bar => bar.baz = 1', + 'const foo = bar => bar[0] = 1', + 'const foo = bar => bar.baz += 1', + 'const foo = bar => bar.baz *= 1', + 'const foo = bar => bar.baz **= 1', + 'const foo = bar => bar.baz ||= true', + 'const foo = bar => ++bar.baz', + 'const foo = bar => bar.baz++', + 'const foo = bar => bar[0]++', ], invalid: [ 'const foo = bar => bar[0]', - 'const foo = bar => bar[0] === firstElementOfBar', 'const foo = (bar) => bar[0]', + 'const foo = bar => bar[(1)]', + 'const foo = bar => bar[0] === firstElementOfBar', + 'const foo = (bar, baz) => bar[0] === baz.firstElementOfBar', 'const foo = (bar, {baz}) => bar[0] === baz', 'const foo = bar => bar[0b01]', 'const foo = bar => bar.length', - 'const foo = bar => bar.baz' + 'const foo = bar => bar.baz', + 'const foo = bar => x = bar.baz', + 'const foo = bar => bar.baz.x = 1', + 'const foo = bar => x = bar[0]', + 'const foo = bar => x(bar.baz)', + 'const foo = bar => x(bar[0])', + 'const foo = bar => new X(bar.baz)', + 'const foo = bar => new X(bar[0])', + 'const foo = bar => x += bar.baz' ] }); diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.md b/test/snapshots/prefer-destructuring-in-parameters.js.md index 0f73a35c0b..e25cf46b6b 100644 --- a/test/snapshots/prefer-destructuring-in-parameters.js.md +++ b/test/snapshots/prefer-destructuring-in-parameters.js.md @@ -21,6 +21,38 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #2 + 1 | const foo = (bar) => bar[0] + +> Output + + `␊ + 1 | const foo = (([firstElementOfBar])) => firstElementOfBar␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = (bar) => bar[0]␊ + | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ + ` + +## Invalid #3 + 1 | const foo = bar => bar[(1)] + +> Output + + `␊ + 1 | const foo = ([, secondElementOfBar]) => secondElementOfBar␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => bar[(1)]␊ + | ^^^^^^^^ `bar[1]` should be destructed in parameter `bar`.␊ + ` + +## Invalid #4 1 | const foo = bar => bar[0] === firstElementOfBar > Output @@ -36,7 +68,46 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ ` -## Invalid #3 +## Invalid #5 + 1 | const foo = (bar, baz) => bar[0] === baz.firstElementOfBar + +> Output + + `␊ + 1 | const foo = ([firstElementOfBar], baz) => firstElementOfBar === baz.firstElementOfBar␊ + ` + +> Error 1/2 + + `␊ + > 1 | const foo = (bar, baz) => bar[0] === baz.firstElementOfBar␊ + | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ + ` + +> Error 2/2 + + `␊ + > 1 | const foo = (bar, baz) => bar[0] === baz.firstElementOfBar␊ + | ^^^^^^^^^^^^^^^^^^^^^ `baz.firstElementOfBar` should be destructed in parameter `baz`.␊ + ` + +## Invalid #6 + 1 | const foo = (bar, {baz}) => bar[0] === baz + +> Output + + `␊ + 1 | const foo = ([firstElementOfBar], {baz}) => firstElementOfBar === baz␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = (bar, {baz}) => bar[0] === baz␊ + | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ + ` + +## Invalid #7 1 | const foo = bar => bar[0b01] > Output @@ -52,7 +123,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^ `bar[1]` should be destructed in parameter `bar`.␊ ` -## Invalid #4 +## Invalid #8 1 | const foo = bar => bar.length > Output @@ -68,7 +139,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^ `bar.length` should be destructed in parameter `bar`.␊ ` -## Invalid #5 +## Invalid #9 1 | const foo = bar => bar.baz > Output @@ -83,3 +154,131 @@ Generated by [AVA](https://avajs.dev). > 1 | const foo = bar => bar.baz␊ | ^^^^^^^ `bar.baz` should be destructed in parameter `bar`.␊ ` + +## Invalid #10 + 1 | const foo = bar => x = bar.baz + +> Output + + `␊ + 1 | const foo = ({baz}) => x = baz␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => x = bar.baz␊ + | ^^^^^^^ `bar.baz` should be destructed in parameter `bar`.␊ + ` + +## Invalid #11 + 1 | const foo = bar => bar.baz.x = 1 + +> Output + + `␊ + 1 | const foo = ({baz}) => baz.x = 1␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => bar.baz.x = 1␊ + | ^^^^^^^ `bar.baz` should be destructed in parameter `bar`.␊ + ` + +## Invalid #12 + 1 | const foo = bar => x = bar[0] + +> Output + + `␊ + 1 | const foo = ([firstElementOfBar]) => x = firstElementOfBar␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => x = bar[0]␊ + | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ + ` + +## Invalid #13 + 1 | const foo = bar => x(bar.baz) + +> Output + + `␊ + 1 | const foo = ({baz}) => x(baz)␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => x(bar.baz)␊ + | ^^^^^^^ `bar.baz` should be destructed in parameter `bar`.␊ + ` + +## Invalid #14 + 1 | const foo = bar => x(bar[0]) + +> Output + + `␊ + 1 | const foo = ([firstElementOfBar]) => x(firstElementOfBar)␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => x(bar[0])␊ + | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ + ` + +## Invalid #15 + 1 | const foo = bar => new X(bar.baz) + +> Output + + `␊ + 1 | const foo = ({baz}) => new X(baz)␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => new X(bar.baz)␊ + | ^^^^^^^ `bar.baz` should be destructed in parameter `bar`.␊ + ` + +## Invalid #16 + 1 | const foo = bar => new X(bar[0]) + +> Output + + `␊ + 1 | const foo = ([firstElementOfBar]) => new X(firstElementOfBar)␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => new X(bar[0])␊ + | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ + ` + +## Invalid #17 + 1 | const foo = bar => x += bar.baz + +> Output + + `␊ + 1 | const foo = ({baz}) => x += baz␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => x += bar.baz␊ + | ^^^^^^^ `bar.baz` should be destructed in parameter `bar`.␊ + ` diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.snap b/test/snapshots/prefer-destructuring-in-parameters.js.snap index 270cd3a898c19c6c2fc92a7065f50bc7e64e0212..69d1cae2c86613e53fed829a776e50e9e3a50091 100644 GIT binary patch delta 1030 zcmV+h1o`{71DFVZK~_N^Q*L2!b7*gLAa*he0sx-T5Tzj)B@#5Cxn`|D_BbDl2mk;8 z000033t(bk5M*G#68`tZ+BG6sk{_EKIrioQ1%bdEicbQuYS>bXvoeCu;Up*8mt^rB zWde&%f?|1Q1_nd+<&!`1Di&jCg7z+b~$Dy*RdG-~n7{V2-toIAA zV*-nMLGd*Z{ov^X!ADM&OV3sOJpRSt2NPJ7hZTaS0dc;$X^G#<`LB;k9IfgTUATY= zEP4!zz1SFk7z(xrL|$X6@LhMl%Kn|;pD-q{=nN>9WoKZhHEjD?dQ*IkzoF&q9m^Si zF@Z%hq4*UL_bAoLSkBOF$h7)?iZ!sVn+YuH#{t35fOzI#g?yfz(7io6>TOf^vDz_# zMNK&&csCI5DLo?(2`_ zgGD*GA$SuMxAHJBT$(m*;+H?K-_J=YblDzx4d`o-=q@Ps<4D8^v!^p}Y$f(Js zpkSy&P@|BXpI2O>kd~jXV5^`}os?KrtEpgXr;wLgt`MOCC={mxMN(XIQgc)DO8nED z5{qKNKEo78HLnu42Z2i#sp9;*lVXVgO@(QA&g<4Uf zfz|Cfsd?!o84%|~*r>Yd@dmseR14vdhq@o4o?I{ZVogCWQFYbePk9Jkgc2Xc?pGq{epK~k1YJ&hH#=Z+Gq${$iV4&w1S=DNN<9-soM+;3_$D4)2;ui6QzxEg0a8(hX$p<~?np{R zR%l>Ipw+My1Zr5IONpppDfN^qDV~Bf$_RLjsezbg9Upy zgU0<2Tt$omp`sLTD;~lmPz6#e6H>clg{@{ssvoR>*idEwapj)&z;V9_s7+ygX!a@p~GM=8_KA9eFTo?%Rl zc+CVBy#vL`%nS?lvI3gro!PeH6Ks+&ZG7yR=9H!7X`kb)(T}Pof6)2K| znH(|2QO&C);LRihLxM>X?kz*Iy`_XTRVF1?L6RhpfvUa?e|iL|C*){IN(8DT!OZ{& L?I;%3#{>WX=j*wW From ff01e569df62845ef6b18a90c84e9d4ca2439a40 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 13:17:15 +0800 Subject: [PATCH 03/32] Style --- rules/prefer-destructuring-in-parameters.js | 9 +++--- test/prefer-destructuring-in-parameters.js | 11 +++++-- .../prefer-destructuring-in-parameters.js.md | 28 ++++++++++++++++++ ...prefer-destructuring-in-parameters.js.snap | Bin 1048 -> 1155 bytes 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index 699c196e63..26fbacfef8 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -47,7 +47,6 @@ function isModifyingNode(node) { return true; } - return false; } @@ -119,7 +118,7 @@ function fix({sourceCode, parameter, memberExpressions, isIndex}) { } else { const variables = [...memberExpressions.keys()]; - text = `{${variables.join(', ')}}` + text = `{${variables.join(', ')}}`; } return fixer.replaceText(parameter, text); @@ -170,8 +169,8 @@ const create = context => { lastPropertyType = propertyType; firstExpression = ( - firstExpression && firstExpression.node.range[0] < memberExpression.range[0] - ) ? + firstExpression && firstExpression.node.range[0] < memberExpression.range[0] + ) ? firstExpression : {node: memberExpression, property}; } @@ -216,7 +215,7 @@ const create = context => { }) }); } - } + }; }; module.exports = { diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index 551c3c5fc7..2c9a074d85 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -28,7 +28,7 @@ test.snapshot({ 'const foo = bar => bar.baz ||= true', 'const foo = bar => ++bar.baz', 'const foo = bar => bar.baz++', - 'const foo = bar => bar[0]++', + 'const foo = bar => bar[0]++' ], invalid: [ 'const foo = bar => bar[0]', @@ -47,6 +47,13 @@ test.snapshot({ 'const foo = bar => x(bar[0])', 'const foo = bar => new X(bar.baz)', 'const foo = bar => new X(bar[0])', - 'const foo = bar => x += bar.baz' + 'const foo = bar => x += bar.baz', + outdent` + class X { + foo(bar) { + this.baz = bar.baz; + } + } + ` ] }); diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.md b/test/snapshots/prefer-destructuring-in-parameters.js.md index e25cf46b6b..505e440cf4 100644 --- a/test/snapshots/prefer-destructuring-in-parameters.js.md +++ b/test/snapshots/prefer-destructuring-in-parameters.js.md @@ -282,3 +282,31 @@ Generated by [AVA](https://avajs.dev). > 1 | const foo = bar => x += bar.baz␊ | ^^^^^^^ `bar.baz` should be destructed in parameter `bar`.␊ ` + +## Invalid #18 + 1 | class X { + 2 | foo(bar) { + 3 | this.baz = bar.baz; + 4 | } + 5 | } + +> Output + + `␊ + 1 | class X {␊ + 2 | foo({baz}) {␊ + 3 | this.baz = baz;␊ + 4 | }␊ + 5 | }␊ + ` + +> Error 1/1 + + `␊ + 1 | class X {␊ + 2 | foo(bar) {␊ + > 3 | this.baz = bar.baz;␊ + | ^^^^^^^ `bar.baz` should be destructed in parameter `bar`.␊ + 4 | }␊ + 5 | }␊ + ` diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.snap b/test/snapshots/prefer-destructuring-in-parameters.js.snap index 69d1cae2c86613e53fed829a776e50e9e3a50091..9ec375e25841d75bc8d3c484aeb735de7db23086 100644 GIT binary patch delta 864 zcmV-m1E2hu2!jbSK~_N^Q*L2!b7*gLAa*he0suEP6d%0E98?gm^%q6sg32F@2mk;8 z00003D`H|`5Mr@1GXZ}u`?`Etq|!Wpx2VOpuWa@G%>)(|=YrrPK)k2)j8v@g3lZOw z$5-iG3S7km78U1);AKF3x{zUu?2fPtC!Q~eQLR5O%nTM4Sc#C?x0S6_+Ta<>xEd zDri(EC05mHD%jd7@f5tB^Dv;DbfS$QviY*1)Lxb0u&OU z8WI$WGxAGwQWSrZQWa8Ci%W`1lS@)l6f*M^3KEMFb5l!Fi@<6V^iW*H=!DH9(K-sn zsX&nw*PPVc)Vvb^G^fO(Sg_A9#Zk?x#O*;K6>X4YU>J+rZ*g(R{)#q?CD&W3_~WMn zGj15Gal5>NsA!>9lxSdedroRzdPxSv`4Bd$u6n!yuLpnCLOA51?uV!+*9*Q_Q&n1K zQE>@MlG0H?#0iG1f~_sc3stCDs25un0>uxqS>U7=3pap3UV?iclIje|PIYPoQk?>( ze;DiVBs&OGkDwQ5oAQuCwMq}O%7jwSgc0YNcpSco2Ny#4J;~IG zr&)khlwq1eW4}9+5|I@e7!qhTYz2WD7U)tUDp*QAu;QVG?KyP%9HsyN8LbiGx&EY8Yw~(ZM96e+dBA$Oim!5&!_0-gU+R delta 756 zcmV<4D8^v z!^p}Y$f(JspkSy_qmZ1RS6rfymY=U+tDsSxlvq`(sbFiTke6Dn5TOC&YH}fKV`^sL zvcu4qlvsqUr$`U1PXP#O6mWt#2vA6XYDiEh&d4v#Nl{2jRY*xKE-5NaE=f&M$jnnH zNGwXsO)W_+0;_*b&_i(%qZ2ldMC&LNrvgP%Tys)$Q}asv)0`5EV!=Mc6h}3$61N9| zRJ1{ofnh9ezs1EN`zzWomRxVC;*XyS%(!8!#_jS7qN0UbQKEs>?K!D==_MHu=R?@2 zy6W);ydG2w;gE;AAEKUIFZg0jRcV<;#U&_7N=E?^Cm4US3bwW&FI1sspz0kjE9N| z)F%Wh6H0$Q6Goh8;&J#U9$X0F_asv%o@N13QHE&>js5OON<>y@U`U|VuoVPqSfERZ zs9-7elq)Hof;7qqc#Nrmm}VUz-%-zpu|(Itpe7C8x>t`t%AJk7HinsvS{Gw6kU*GF zCs3G<(7~k`jz$9@hhZ_7NH0~P$Fn-2=7u(w_7gb1vL~=vR@^tpWg2r-t1}5dZ*i5Kch= From d36b11220aeffc314243069e78ad09974ee11bdf Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 15:16:40 +0800 Subject: [PATCH 04/32] Refactor --- rules/prefer-destructuring-in-parameters.js | 112 +++++++++++--------- 1 file changed, 59 insertions(+), 53 deletions(-) diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index 26fbacfef8..b6cb14f287 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -50,7 +50,7 @@ function isModifyingNode(node) { return false; } -function getMemberExpressionProperty(node) { +function getMemberExpression(node) { const memberExpression = node.parent; if ( memberExpression.type !== 'MemberExpression' || @@ -66,7 +66,7 @@ function getMemberExpressionProperty(node) { return; } - let propertyOrIndex; + const data = {}; if (computed) { if (property.type !== 'Literal') { return; @@ -81,19 +81,22 @@ function getMemberExpressionProperty(node) { return; } - propertyOrIndex = index; + data.type = 'index'; + data.index = index; } else { if (property.type !== 'Identifier') { return; } - propertyOrIndex = property.name; + data.type = 'property'; + data.property = property.name; } - return propertyOrIndex; + data.node = memberExpression; + return data; } -function fix({sourceCode, parameter, memberExpressions, isIndex}) { +function fix({sourceCode, parameter, properties, type}) { function * fixArrowFunctionParentheses(fixer) { const functionNode = parameter.parent; if ( @@ -107,30 +110,27 @@ function fix({sourceCode, parameter, memberExpressions, isIndex}) { } function fixParameter(fixer) { - let text; - if (isIndex) { - const variables = []; - for (const [index, {variable}] of memberExpressions.entries()) { - variables[index] = variable; + const variables = []; + for (const [indexOrProperty, {variable}] of properties.entries()) { + if (type === 'index') { + variables[indexOrProperty] = variable; + } else { + variables.push(variable); } - - text = `[${variables.join(', ')}]`; - } else { - const variables = [...memberExpressions.keys()]; - - text = `{${variables.join(', ')}}`; } - return fixer.replaceText(parameter, text); + const text = variables.join(', '); + + return fixer.replaceText(parameter, type === 'index' ? `[${text}]` : `{${text}}`); } return function * (fixer) { yield * fixArrowFunctionParentheses(fixer); yield fixParameter(fixer); - for (const {variable, expressions} of memberExpressions.values()) { - for (const expression of expressions) { - yield fixer.replaceText(expression, variable); + for (const {variable, expressions} of properties.values()) { + for (const {node} of expressions) { + yield fixer.replaceText(node, variable); } } }; @@ -146,52 +146,59 @@ const create = context => { const variable = findVariable(scope, parameter); const identifiers = variable.references.map(({identifier}) => identifier); - const memberExpressions = new Map(); - let lastPropertyType; + const properties = new Map(); + let propertyType; let firstExpression; for (const identifier of identifiers) { - const property = getMemberExpressionProperty(identifier); - const propertyType = typeof property; - if ( - propertyType === 'undefined' || - (lastPropertyType && propertyType !== lastPropertyType) - ) { + const memberExpression = getMemberExpression(identifier); + if (!memberExpression) { return; } - const memberExpression = identifier.parent; - - if (memberExpressions.has(property)) { - memberExpressions.get(property).expressions.push(memberExpression); + const {node, type} = memberExpression; + if (propertyType) { + // Avoid case like `foo[0] === foo.length` + if (type !== propertyType) { + return; + } } else { - memberExpressions.set(property, {expressions: [memberExpression]}); + propertyType = type; } - lastPropertyType = propertyType; - firstExpression = ( - firstExpression && firstExpression.node.range[0] < memberExpression.range[0] - ) ? - firstExpression : - {node: memberExpression, property}; + if ( + !firstExpression || + node.range[0] < firstExpression.node.range[0] + ) { + firstExpression = memberExpression; + } + + const indexOrProperty = memberExpression[type]; + if (properties.has(indexOrProperty)) { + properties.get(indexOrProperty).expressions.push(memberExpression); + } else { + properties.set(indexOrProperty, {expressions: [memberExpression]}); + } } - if (memberExpressions.size === 0) { + if (properties.size === 0) { return; } - const isIndex = lastPropertyType === 'number'; const scopes = [ variable.scope, ...variable.references.map(({from}) => from) ]; - for (const [property, data] of memberExpressions.entries()) { + for (const [indexOrProperty, data] of properties.entries()) { let variableName; - if (isIndex) { - const index = indexVariableNamePrefixes[property]; - variableName = avoidCapture(`${index}ElementOf${upperFirst(name)}`, scopes, ecmaVersion); + if (propertyType === 'index') { + variableName = avoidCapture( + `${indexVariableNamePrefixes[indexOrProperty]}ElementOf${upperFirst(name)}`, + scopes, + ecmaVersion + ); } else { - variableName = avoidCapture(property, scopes, ecmaVersion); - if (variableName !== property) { + variableName = avoidCapture(indexOrProperty, scopes, ecmaVersion); + if (variableName !== indexOrProperty) { return; } } @@ -199,19 +206,18 @@ const create = context => { data.variable = variableName; } - const {node, property} = firstExpression; context.report({ - node, + node: firstExpression.node, messageId: MESSAGE_ID, data: { - member: isIndex ? `${name}[${property}]` : `${name}.${property}`, + member: `${name}${propertyType === 'index' ? `[${firstExpression.index}]` : `.${firstExpression.property}`}`, parameter: name }, fix: fix({ sourceCode, parameter, - memberExpressions, - isIndex + properties, + type: propertyType }) }); } From db2d17a22c39baed00aa1f729dcc6e367cedf00e Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 15:39:07 +0800 Subject: [PATCH 05/32] More tests --- rules/prefer-destructuring-in-parameters.js | 2 + test/prefer-destructuring-in-parameters.js | 81 +++-- .../prefer-destructuring-in-parameters.js.md | 289 +++++++++++++++--- ...prefer-destructuring-in-parameters.js.snap | Bin 1155 -> 1955 bytes 4 files changed, 307 insertions(+), 65 deletions(-) diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index b6cb14f287..5ea6d23df3 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -13,6 +13,8 @@ const indexVariableNamePrefixes = ['first', 'second']; function isNodeEffectThis(node) { const {parent} = node; + + /* istanbul ignore next: Not sure if this is needed */ if ( parent.type === 'ChainExpression' && parent.expression === node diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index 2c9a074d85..08b0affdda 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -4,6 +4,9 @@ import {test} from './utils/test.js'; test.snapshot({ valid: [ 'const foo = bar => bar', + 'const foo = () => {}', + 'const foo = () => foo.x', + 'const foo = (bar, baz) => foo.x', 'const foo = function bar(baz) {return bar.name}', 'const foo = ({bar}) => bar', 'const foo = bar => bar[2]', @@ -12,22 +15,24 @@ test.snapshot({ 'const foo = bar => bar[0xFF]', 'const foo = bar => bar[null]', 'const foo = bar => bar[1n]', - 'const foo = bar => bar["baz"]', + 'const foo = bar => bar["x"]', 'const foo = bar => bar.length && bar[0]', + 'const foo = bar => bar?.x', + 'const foo = bar => x[bar]', 'const foo = bar => bar.default', 'const foo = bar => bar.function', - 'const foo = bar => bar.baz()', + 'const foo = bar => bar.x()', 'const foo = bar => bar[0]()', - 'const foo = bar => new bar.Baz()', + 'const foo = bar => new bar.X()', 'const foo = bar => new bar[0]()', - 'const foo = bar => bar.baz = 1', + 'const foo = bar => bar.x = 1', 'const foo = bar => bar[0] = 1', - 'const foo = bar => bar.baz += 1', - 'const foo = bar => bar.baz *= 1', - 'const foo = bar => bar.baz **= 1', - 'const foo = bar => bar.baz ||= true', - 'const foo = bar => ++bar.baz', - 'const foo = bar => bar.baz++', + 'const foo = bar => bar.x += 1', + 'const foo = bar => bar.x *= 1', + 'const foo = bar => bar.x **= 1', + 'const foo = bar => bar.x ||= true', + 'const foo = bar => ++bar.x', + 'const foo = bar => bar.x++', 'const foo = bar => bar[0]++' ], invalid: [ @@ -36,24 +41,60 @@ test.snapshot({ 'const foo = bar => bar[(1)]', 'const foo = bar => bar[0] === firstElementOfBar', 'const foo = (bar, baz) => bar[0] === baz.firstElementOfBar', - 'const foo = (bar, {baz}) => bar[0] === baz', + 'const foo = (bar, {x}) => bar[0] === x', 'const foo = bar => bar[0b01]', 'const foo = bar => bar.length', - 'const foo = bar => bar.baz', - 'const foo = bar => x = bar.baz', + 'const foo = bar => bar.x', + 'const foo = bar => bar.$ === bar._', + 'const foo = bar => a = bar.x', + 'const foo = bar => {const a = a = bar.x;}', 'const foo = bar => bar.baz.x = 1', 'const foo = bar => x = bar[0]', - 'const foo = bar => x(bar.baz)', - 'const foo = bar => x(bar[0])', - 'const foo = bar => new X(bar.baz)', - 'const foo = bar => new X(bar[0])', - 'const foo = bar => x += bar.baz', + 'const foo = bar => a(bar.x)', + 'const foo = bar => a(bar[0])', + 'const foo = bar => new A(bar.x)', + 'const foo = bar => new A(bar[0])', + 'const foo = bar => a += bar.x', + 'function foo (bar) {return bar.x}', + 'const foo = function (bar) {return bar.x}', outdent` - class X { + class A { foo(bar) { - this.baz = bar.baz; + this.x = bar.x; } } + `, + outdent` + const A = class { + foo(bar) { + this.x = bar.x; + } + } + `, + outdent` + const a = { + foo(bar) { + a.x = bar.x; + } + } + `, + // Not sure if we should have a limitation on property numbers + outdent` + function foo(bar, baz) { + return [ + bar.$, + bar.a, bar.b, bar.c, bar.d, bar.e, bar.f, bar.g, bar.h, + bar.i, bar.j, bar.k, bar.l, bar.m, bar.n, bar.o, bar.p, + bar.q, bar.r, bar.s, bar.t, bar.u, bar.v, bar.w, bar.x, + bar.y, bar.z, + + baz._, + baz.A, baz.B, baz.C, baz.D, baz.E, baz.F, baz.G, baz.H, + baz.I, baz.J, baz.K, baz.L, baz.M, baz.N, baz.O, baz.P, + baz.Q, baz.R, baz.S, baz.T, baz.U, baz.V, baz.W, baz.X, + baz.Y, baz.Z + ] + } ` ] }); diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.md b/test/snapshots/prefer-destructuring-in-parameters.js.md index 505e440cf4..4925a37545 100644 --- a/test/snapshots/prefer-destructuring-in-parameters.js.md +++ b/test/snapshots/prefer-destructuring-in-parameters.js.md @@ -92,19 +92,19 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #6 - 1 | const foo = (bar, {baz}) => bar[0] === baz + 1 | const foo = (bar, {x}) => bar[0] === x > Output `␊ - 1 | const foo = ([firstElementOfBar], {baz}) => firstElementOfBar === baz␊ + 1 | const foo = ([firstElementOfBar], {x}) => firstElementOfBar === x␊ ` > Error 1/1 `␊ - > 1 | const foo = (bar, {baz}) => bar[0] === baz␊ - | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ + > 1 | const foo = (bar, {x}) => bar[0] === x␊ + | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ ` ## Invalid #7 @@ -140,38 +140,70 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #9 - 1 | const foo = bar => bar.baz + 1 | const foo = bar => bar.x > Output `␊ - 1 | const foo = ({baz}) => baz␊ + 1 | const foo = ({x}) => x␊ ` > Error 1/1 `␊ - > 1 | const foo = bar => bar.baz␊ - | ^^^^^^^ `bar.baz` should be destructed in parameter `bar`.␊ + > 1 | const foo = bar => bar.x␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` ## Invalid #10 - 1 | const foo = bar => x = bar.baz + 1 | const foo = bar => bar.$ === bar._ > Output `␊ - 1 | const foo = ({baz}) => x = baz␊ + 1 | const foo = ({$, _}) => $ === _␊ ` > Error 1/1 `␊ - > 1 | const foo = bar => x = bar.baz␊ - | ^^^^^^^ `bar.baz` should be destructed in parameter `bar`.␊ + > 1 | const foo = bar => bar.$ === bar._␊ + | ^^^^^ `bar.$` should be destructed in parameter `bar`.␊ ` ## Invalid #11 + 1 | const foo = bar => a = bar.x + +> Output + + `␊ + 1 | const foo = ({x}) => a = x␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => a = bar.x␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ + ` + +## Invalid #12 + 1 | const foo = bar => {const a = a = bar.x;} + +> Output + + `␊ + 1 | const foo = ({x}) => {const a = a = x;}␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => {const a = a = bar.x;}␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ + ` + +## Invalid #13 1 | const foo = bar => bar.baz.x = 1 > Output @@ -187,7 +219,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ `bar.baz` should be destructed in parameter `bar`.␊ ` -## Invalid #12 +## Invalid #14 1 | const foo = bar => x = bar[0] > Output @@ -203,99 +235,131 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ ` -## Invalid #13 - 1 | const foo = bar => x(bar.baz) +## Invalid #15 + 1 | const foo = bar => a(bar.x) > Output `␊ - 1 | const foo = ({baz}) => x(baz)␊ + 1 | const foo = ({x}) => a(x)␊ ` > Error 1/1 `␊ - > 1 | const foo = bar => x(bar.baz)␊ - | ^^^^^^^ `bar.baz` should be destructed in parameter `bar`.␊ + > 1 | const foo = bar => a(bar.x)␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #14 - 1 | const foo = bar => x(bar[0]) +## Invalid #16 + 1 | const foo = bar => a(bar[0]) > Output `␊ - 1 | const foo = ([firstElementOfBar]) => x(firstElementOfBar)␊ + 1 | const foo = ([firstElementOfBar]) => a(firstElementOfBar)␊ ` > Error 1/1 `␊ - > 1 | const foo = bar => x(bar[0])␊ + > 1 | const foo = bar => a(bar[0])␊ | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ ` -## Invalid #15 - 1 | const foo = bar => new X(bar.baz) +## Invalid #17 + 1 | const foo = bar => new A(bar.x) > Output `␊ - 1 | const foo = ({baz}) => new X(baz)␊ + 1 | const foo = ({x}) => new A(x)␊ ` > Error 1/1 `␊ - > 1 | const foo = bar => new X(bar.baz)␊ - | ^^^^^^^ `bar.baz` should be destructed in parameter `bar`.␊ + > 1 | const foo = bar => new A(bar.x)␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #16 - 1 | const foo = bar => new X(bar[0]) +## Invalid #18 + 1 | const foo = bar => new A(bar[0]) > Output `␊ - 1 | const foo = ([firstElementOfBar]) => new X(firstElementOfBar)␊ + 1 | const foo = ([firstElementOfBar]) => new A(firstElementOfBar)␊ ` > Error 1/1 `␊ - > 1 | const foo = bar => new X(bar[0])␊ + > 1 | const foo = bar => new A(bar[0])␊ | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ ` -## Invalid #17 - 1 | const foo = bar => x += bar.baz +## Invalid #19 + 1 | const foo = bar => a += bar.x > Output `␊ - 1 | const foo = ({baz}) => x += baz␊ + 1 | const foo = ({x}) => a += x␊ ` > Error 1/1 `␊ - > 1 | const foo = bar => x += bar.baz␊ - | ^^^^^^^ `bar.baz` should be destructed in parameter `bar`.␊ + > 1 | const foo = bar => a += bar.x␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #18 - 1 | class X { +## Invalid #20 + 1 | function foo (bar) {return bar.x} + +> Output + + `␊ + 1 | function foo ({x}) {return x}␊ + ` + +> Error 1/1 + + `␊ + > 1 | function foo (bar) {return bar.x}␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ + ` + +## Invalid #21 + 1 | const foo = function (bar) {return bar.x} + +> Output + + `␊ + 1 | const foo = function ({x}) {return x}␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = function (bar) {return bar.x}␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ + ` + +## Invalid #22 + 1 | class A { 2 | foo(bar) { - 3 | this.baz = bar.baz; + 3 | this.x = bar.x; 4 | } 5 | } > Output `␊ - 1 | class X {␊ - 2 | foo({baz}) {␊ - 3 | this.baz = baz;␊ + 1 | class A {␊ + 2 | foo({x}) {␊ + 3 | this.x = x;␊ 4 | }␊ 5 | }␊ ` @@ -303,10 +367,145 @@ Generated by [AVA](https://avajs.dev). > Error 1/1 `␊ - 1 | class X {␊ + 1 | class A {␊ 2 | foo(bar) {␊ - > 3 | this.baz = bar.baz;␊ - | ^^^^^^^ `bar.baz` should be destructed in parameter `bar`.␊ + > 3 | this.x = bar.x;␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ 4 | }␊ 5 | }␊ ` + +## Invalid #23 + 1 | const A = class { + 2 | foo(bar) { + 3 | this.x = bar.x; + 4 | } + 5 | } + +> Output + + `␊ + 1 | const A = class {␊ + 2 | foo({x}) {␊ + 3 | this.x = x;␊ + 4 | }␊ + 5 | }␊ + ` + +> Error 1/1 + + `␊ + 1 | const A = class {␊ + 2 | foo(bar) {␊ + > 3 | this.x = bar.x;␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ + 4 | }␊ + 5 | }␊ + ` + +## Invalid #24 + 1 | const a = { + 2 | foo(bar) { + 3 | a.x = bar.x; + 4 | } + 5 | } + +> Output + + `␊ + 1 | const a = {␊ + 2 | foo({x}) {␊ + 3 | a.x = x;␊ + 4 | }␊ + 5 | }␊ + ` + +> Error 1/1 + + `␊ + 1 | const a = {␊ + 2 | foo(bar) {␊ + > 3 | a.x = bar.x;␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ + 4 | }␊ + 5 | }␊ + ` + +## Invalid #25 + 1 | function foo(bar, baz) { + 2 | return [ + 3 | bar.$, + 4 | bar.a, bar.b, bar.c, bar.d, bar.e, bar.f, bar.g, bar.h, + 5 | bar.i, bar.j, bar.k, bar.l, bar.m, bar.n, bar.o, bar.p, + 6 | bar.q, bar.r, bar.s, bar.t, bar.u, bar.v, bar.w, bar.x, + 7 | bar.y, bar.z, + 8 | + 9 | baz._, + 10 | baz.A, baz.B, baz.C, baz.D, baz.E, baz.F, baz.G, baz.H, + 11 | baz.I, baz.J, baz.K, baz.L, baz.M, baz.N, baz.O, baz.P, + 12 | baz.Q, baz.R, baz.S, baz.T, baz.U, baz.V, baz.W, baz.X, + 13 | baz.Y, baz.Z + 14 | ] + 15 | } + +> Output + + `␊ + 1 | function foo({$, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z}, {_, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z}) {␊ + 2 | return [␊ + 3 | $,␊ + 4 | a, b, c, d, e, f, g, h,␊ + 5 | i, j, k, l, m, n, o, p,␊ + 6 | q, r, s, t, u, v, w, x,␊ + 7 | y, z,␊ + 8 | ␊ + 9 | _,␊ + 10 | A, B, C, D, E, F, G, H,␊ + 11 | I, J, K, L, M, N, O, P,␊ + 12 | Q, R, S, T, U, V, W, X,␊ + 13 | Y, Z␊ + 14 | ]␊ + 15 | }␊ + ` + +> Error 1/2 + + `␊ + 1 | function foo(bar, baz) {␊ + 2 | return [␊ + > 3 | bar.$,␊ + | ^^^^^ `bar.$` should be destructed in parameter `bar`.␊ + 4 | bar.a, bar.b, bar.c, bar.d, bar.e, bar.f, bar.g, bar.h,␊ + 5 | bar.i, bar.j, bar.k, bar.l, bar.m, bar.n, bar.o, bar.p,␊ + 6 | bar.q, bar.r, bar.s, bar.t, bar.u, bar.v, bar.w, bar.x,␊ + 7 | bar.y, bar.z,␊ + 8 | ␊ + 9 | baz._,␊ + 10 | baz.A, baz.B, baz.C, baz.D, baz.E, baz.F, baz.G, baz.H,␊ + 11 | baz.I, baz.J, baz.K, baz.L, baz.M, baz.N, baz.O, baz.P,␊ + 12 | baz.Q, baz.R, baz.S, baz.T, baz.U, baz.V, baz.W, baz.X,␊ + 13 | baz.Y, baz.Z␊ + 14 | ]␊ + 15 | }␊ + ` + +> Error 2/2 + + `␊ + 1 | function foo(bar, baz) {␊ + 2 | return [␊ + 3 | bar.$,␊ + 4 | bar.a, bar.b, bar.c, bar.d, bar.e, bar.f, bar.g, bar.h,␊ + 5 | bar.i, bar.j, bar.k, bar.l, bar.m, bar.n, bar.o, bar.p,␊ + 6 | bar.q, bar.r, bar.s, bar.t, bar.u, bar.v, bar.w, bar.x,␊ + 7 | bar.y, bar.z,␊ + 8 | ␊ + > 9 | baz._,␊ + | ^^^^^ `baz._` should be destructed in parameter `baz`.␊ + 10 | baz.A, baz.B, baz.C, baz.D, baz.E, baz.F, baz.G, baz.H,␊ + 11 | baz.I, baz.J, baz.K, baz.L, baz.M, baz.N, baz.O, baz.P,␊ + 12 | baz.Q, baz.R, baz.S, baz.T, baz.U, baz.V, baz.W, baz.X,␊ + 13 | baz.Y, baz.Z␊ + 14 | ]␊ + 15 | }␊ + ` diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.snap b/test/snapshots/prefer-destructuring-in-parameters.js.snap index 9ec375e25841d75bc8d3c484aeb735de7db23086..3f196938dfcc6436dabcf7eeea7baafcf32ceeb3 100644 GIT binary patch literal 1955 zcmV;U2VD3;RzVEn6+nA_$bTP)cccySsFI?6!N*r3bB=)C(`7 zNey^_f=cj6Gy+oj!)QV{gqB1CffNG*8Z`zCq9S!>zPEJW?t5>yWiduK`SN@7>&*1~ z<~!yn>qE#bBx&D=<4$kPn3?zTg+0fQ)|4}n{mv(#So@;1Uq?vt7aMmzeAla&n!C;o zyODIXNP_L#ALRumqw_aS+CMV!^zu(f^lz@%)gTGBQx?YnLhe4dWkAKZOW!Lruj+7o zx7H*HcAYHA0|^B4TRWNzwUVKQ0tGSgHJRi<@f(Z66^+9QU|eK+vXO0BL!xEaG>s?pA#?TOM^uZAk^2E>^$Pxwr9%Uz+d^kp%mREDsJLr0wLN zmIsctzrO6FSGH%2t1XfQ`;06@ZYE@J4f*8u?fD0HpLuiH=%xch`UrNlEXJWIe=^y> zd&A5%JOAi&wTcH~)O_sR{2|lds>H+g5J2NrJs$ILZr5+Ru)j z{KT2g6F+&K>lYVoPm~0EN|q-^5OTO{s&Vbm#I1j=>8k0PoI6bt><(F`-opM<;ZfVR zC*OYd!g0rSNf%#PC<(S%mOF1H+ik2*p2X3TjPGU`t8G2!DjdRJpNLj-3Cq< zR9ifjD!b3_5j{)Nx?RHua`!N>B9tQ75bOvJgcS&(uH$Vd(&Y#h2$cv`2rdLSLa1wb zy9Q|wf)~Mu;73@AP>T@idfr}zv|0$TB~1$r1K!RSE1fn4VJgBjgdBuigy{&OVZz%p zke-R~D8ej+*$8tG@(@D9h_~kA$$5kkX^w+oQIHsJ=5;r1U7m#m0z z2~RLa$CzMsBEkNj;g&GkfWcPkc6og~(!dPH`T*N4%vs>F*Fv^2kg6Qg$W}jm2y;*O z0O7(^1G+@>7g7oXJt&0=Ri>zEU&wYIJ7a7)mG&yT%a`YvV(}CSgCcq5e5V)uf04Z`qInVWB=Zo@JP^vN{iPE*`nl%

MUfP9p~Z1a^ly=eia zZ6MPim)%AKmd~)t{xZ>o*2(%>kBv}UrwWMfG3Xr^ z#UEBv+*s&vdb~bmT^6Q9@XFb0Rjk603RY&FvK*`qSe4UzU6t?9^F^2&s`bm6jtAng z_*tskqRQIGu=L(2TVmAx@M@QRuELmX_V2NN#-}K+C$UWbuPDy>v3a#v!>z^Q0HE(} z>1nkpu5h=;EY~;)X2clL6oLsE@i(EkGEJo?)y&1aR&bsWtE1J;cp01Blk~M1BmR&Y z`%Y#=O?40J@i9vMsIFlY&#fqRsb1SEIWwbd3h^?mDCW=<*LTg({>YL1(%`V}35zI~7=BI}*G|^k)q_3|O>J0@vgipnkt*0UO+}>V!fj z<){Yz18MgtO^+$=*E~OZ>9g^AQC8o*=HgD48R;8MJHp1IM`FKa{u|$;)b2eYr!k`` pHHPP?t9^|MJ`sk#M@M-Kcr559<(OVQ0`$@^e*@K-(n}v7002PvzzzTa literal 1155 zcmV-}1bq8JRzV%hAH2vMR1mNA7e(WO${&je000000009k zVq#zrVqm`#{`bV%H6mG(ADbLG_T~cxfxsM!PXe)O*iwtLGJ?x$>PL)f~Rs1~u#oz}MSd@nqf~Ns-zPV|M-^=;0k4hY^>JweKfC(&m42r$j z7#Iq+2Si?Ds_gZmStyPs5NZ+S$b1^j=!Ph>>bM)e=&hYGoknu z5ceq6$ymc;`W&wzO5Uxj?0oY1{JI_hmx_p#bBfkjO@A$T_s zFZ;TDS)|fDf48W`x36sV{mldx73YHBBS5^T^o&%j@e2{(lgC%-Tnb#p1Qr$NhTvsD ze7cZfi|mfD3n!j0h*7OSFU$-U736{7-B8@e%fN7H+O&yZ{=9xaC#BG3d*n4>xPU|t zLvauv1H;WFX;R(i;|hu!cbzg*3wC7!i!OpSc#C?x0S6_+Ta<>xEdDri(EC05mHD%jd7@f5tB^Dv;DbfS$QviY*1)Lxb0u&OU8WI$WGxAGwQWTO>6;e`* zONvU9OHxx5GV>G)5{nXZQ%h2dz-klpP+Y|5gv}$-Its<9K#>&JoYdUZyb}L3r^KRI zu+K2XQO&Ew?LinC)adF80iZ+ZT*ITOi+mEy2vd)s7igREkV3Ue z59B68R9!XrQyxMWp~OeA`;`c~A60!BL6_6s%?{Yyj4iKdV$UV0rj_H!97wr>a1lmn zHn1Zy_Y>oxVgmIE!ODbE&x8@@nRpz&i3b-#_&v$giKkhBRFq+wLSw%>k`j>>8W<92 zHEace8W!kMA}Ux)J>>`UR8C@Xu|kAGHIQ!v2+V#Xjb&XSDGVo>&m6y4T9 zaTAbuEs$XfWYnTYtx25@-uhD-%+?hl#C;gH%^) V7-|yH!6c)92>{l}2K;go003162QB~r From c01b3020f64ce7f40ec203d0fac7bd5b7bdbcd29 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 15:43:17 +0800 Subject: [PATCH 06/32] Add another case --- test/prefer-destructuring-in-parameters.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index 08b0affdda..ece037dd9b 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -33,7 +33,10 @@ test.snapshot({ 'const foo = bar => bar.x ||= true', 'const foo = bar => ++bar.x', 'const foo = bar => bar.x++', - 'const foo = bar => bar[0]++' + 'const foo = bar => bar[0]++', + // Not sure if we should only allow `0`/`1` or just not against `no-unreadable-array-destructuring` rule + // Following case can write as `const foo = ([, second, third] => second + third)` + 'const foo = bar => bar[1] + bar[3]' ], invalid: [ 'const foo = bar => bar[0]', From 1a029a51cf4ec9dadad1109593851812e7c056b2 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 15:47:05 +0800 Subject: [PATCH 07/32] Add test --- test/prefer-destructuring-in-parameters.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index ece037dd9b..d20959701c 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -9,6 +9,7 @@ test.snapshot({ 'const foo = (bar, baz) => foo.x', 'const foo = function bar(baz) {return bar.name}', 'const foo = ({bar}) => bar', + 'const foo = ({bar}) => bar.x', 'const foo = bar => bar[2]', 'const foo = bar => bar[1.5]', 'const foo = bar => bar[-1]', From 7801f774d0e8eade45462e47b1d0b63d04f24a4b Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 15:47:38 +0800 Subject: [PATCH 08/32] Add more tests --- test/prefer-destructuring-in-parameters.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index d20959701c..108ffe9e25 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -10,6 +10,8 @@ test.snapshot({ 'const foo = function bar(baz) {return bar.name}', 'const foo = ({bar}) => bar', 'const foo = ({bar}) => bar.x', + 'const foo = ([,bar]) => bar', + 'const foo = ([bar]) => bar.x', 'const foo = bar => bar[2]', 'const foo = bar => bar[1.5]', 'const foo = bar => bar[-1]', From 72947d5e937fb00a46b013e6f9424f1c8ae830e5 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 15:55:53 +0800 Subject: [PATCH 09/32] Fix parentheses --- rules/prefer-destructuring-in-parameters.js | 2 +- test/prefer-destructuring-in-parameters.js | 2 ++ .../prefer-destructuring-in-parameters.js.md | 2 +- ...prefer-destructuring-in-parameters.js.snap | Bin 1955 -> 1942 bytes 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index 5ea6d23df3..0c4ef5c6b7 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -104,7 +104,7 @@ function fix({sourceCode, parameter, properties, type}) { if ( functionNode.type === 'ArrowFunctionExpression' && functionNode.params.length === 1 && - isNotOpeningParenToken(sourceCode.getFirstToken(parameter)) + isNotOpeningParenToken(sourceCode.getFirstToken(functionNode)) ) { yield fixer.insertTextBefore(parameter, '('); yield fixer.insertTextAfter(parameter, ')'); diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index 108ffe9e25..1b800e446c 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -12,6 +12,8 @@ test.snapshot({ 'const foo = ({bar}) => bar.x', 'const foo = ([,bar]) => bar', 'const foo = ([bar]) => bar.x', + 'const foo = (bar = {}) => bar.x', + 'const foo = (bar = baz) => bar.x', 'const foo = bar => bar[2]', 'const foo = bar => bar[1.5]', 'const foo = bar => bar[-1]', diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.md b/test/snapshots/prefer-destructuring-in-parameters.js.md index 4925a37545..791fe0c74a 100644 --- a/test/snapshots/prefer-destructuring-in-parameters.js.md +++ b/test/snapshots/prefer-destructuring-in-parameters.js.md @@ -26,7 +26,7 @@ Generated by [AVA](https://avajs.dev). > Output `␊ - 1 | const foo = (([firstElementOfBar])) => firstElementOfBar␊ + 1 | const foo = ([firstElementOfBar]) => firstElementOfBar␊ ` > Error 1/1 diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.snap b/test/snapshots/prefer-destructuring-in-parameters.js.snap index 3f196938dfcc6436dabcf7eeea7baafcf32ceeb3..b0136cf82592646805eaf2e1b76c0d78763f104d 100644 GIT binary patch literal 1942 zcmV;H2Wj|0RzV!>|FcOQ!g00000000B! zSb1zzMHrtxKe|tQUty34w&mqrRE%E#0@f@9nlMgy<$;es6xAnSS4V z#~g*-2pL2okL-#&w>fcE`s-H@ojFxeB$DFqN*IcvJ4(xagpAm~`HN>Bd*iQ_?U(yM zNLuR!&UWvK@~SA&8I2Q;4v9FI``N&rD~tEl2%K$`#C$&?BQNi`zxc<+?`P|lx0=tc z*9x57D9MO$LPjk)SoviSO>156(UZ0o_4!KRY?dVFM2YX4zQvlSdEC~R)G)B%#Cn0V z6E!GpqAVC^sDEYt@pbQvP0M||b==niX9xE}`COEY>&ZK>M9pk`Vli2IxbVy_fwR9! zQvLuTrWJ3QR~>Koy`awzb&(l8FA1D|SCZJ?Vy``Ov%VEvX&)Y|nshPZuMB~+PDyTx zQZ>8xq3fpe7j{NntId=b8VM~kK6svkVV4;&K{Gb>LEhb3|}!Mu_1P)<>_mOddyq#vcTEzC0Q0h$l4t{ zhHh(4DuqXXy>O$(vQOabQAr9S3E2~w)p))9wYI~xC!NBW?L^@0$C6CwOGxw2f9l7d zZh33TM;n?F<0^9m&aRdu;$cD#SCCJJHf4Ns@ccVVqU(Cr^`!%Up4p0%vFUNBK^a7Tv{fR*!klFrwGyY0X7Cqrh3s0FSpimpy;vgt5N4{cVA>rIK70<)7jM4XGd0?cS8I zW$&ANBa;NqMn8h`sVLn@Po7g@JxGM`OPB@#v`_niN6l@gi6dV+s6qZq_q~M~koI+JCh3Y&C zDHJACm_lJHg;WaDC`_j?gThP-vnV`EVK#*{3Uer=QLuVxnalG9 zzb-fEMGFo3D!|R!}S3E8)@OCcyK|ZJR!CqMAEHQ$?1V)qHVRIHZOh&L+p7*@Rg3Aj4%aZDncs4G=%90o?*h;Gm)N! z@GQb?gfxUX2;7?Fv$Z*0HEWb#r-)~aJoHNx=yW>BlMkv=)jb}^u&=xT7Ic1llIaoSSNRf? zb*ZBe)yHr7s5*7+r6GZrUeX@>ch!U$ZWBuMb~~i-lFO5mpY>eQQ3|uoQE0KpyF_hW zNgAo_)@rbPdR6wDoXABDAGqxLTppGylo^yOaY`?{ zbp@kXZUv}I)yh^$nHgYH2$f+uL5C*4yeoz#yR8Mt&W+09>Ym#pT>VdYS3+1ga2GW7 zQQGT=ZvZ~?cH&Jy=I7MT1TbEM17xPKQl;A7x=05~&(KBkW2#3@pH~29fVvXk1t1g$ zo#`@-*{NLZRG<&;NU)Bm&+2s;&?}z=?#MB~|Ls}~SoeNa#TC-ZN7bkwNIOO;dQ5h^ zX8F-YpFN=#Wz`*P&TnK%zP?ek!)q*hB=|e#z4#jC@808a8jI1!2JskmyKhnM2SU%+ c=m1XvtK4pqkLl7AKo|Y;FF@CIZXF*00G*}45dZ)H literal 1955 zcmV;U2VD3;RzVEn6+nA_$bTP)cccySsFI?6!N*r3bB=)C(`7 zNey^_f=cj6Gy+oj!)QV{gqB1CffNG*8Z`zCq9S!>zPEJW?t5>yWiduK`SN@7>&*1~ z<~!yn>qE#bBx&D=<4$kPn3?zTg+0fQ)|4}n{mv(#So@;1Uq?vt7aMmzeAla&n!C;o zyODIXNP_L#ALRumqw_aS+CMV!^zu(f^lz@%)gTGBQx?YnLhe4dWkAKZOW!Lruj+7o zx7H*HcAYHA0|^B4TRWNzwUVKQ0tGSgHJRi<@f(Z66^+9QU|eK+vXO0BL!xEaG>s?pA#?TOM^uZAk^2E>^$Pxwr9%Uz+d^kp%mREDsJLr0wLN zmIsctzrO6FSGH%2t1XfQ`;06@ZYE@J4f*8u?fD0HpLuiH=%xch`UrNlEXJWIe=^y> zd&A5%JOAi&wTcH~)O_sR{2|lds>H+g5J2NrJs$ILZr5+Ru)j z{KT2g6F+&K>lYVoPm~0EN|q-^5OTO{s&Vbm#I1j=>8k0PoI6bt><(F`-opM<;ZfVR zC*OYd!g0rSNf%#PC<(S%mOF1H+ik2*p2X3TjPGU`t8G2!DjdRJpNLj-3Cq< zR9ifjD!b3_5j{)Nx?RHua`!N>B9tQ75bOvJgcS&(uH$Vd(&Y#h2$cv`2rdLSLa1wb zy9Q|wf)~Mu;73@AP>T@idfr}zv|0$TB~1$r1K!RSE1fn4VJgBjgdBuigy{&OVZz%p zke-R~D8ej+*$8tG@(@D9h_~kA$$5kkX^w+oQIHsJ=5;r1U7m#m0z z2~RLa$CzMsBEkNj;g&GkfWcPkc6og~(!dPH`T*N4%vs>F*Fv^2kg6Qg$W}jm2y;*O z0O7(^1G+@>7g7oXJt&0=Ri>zEU&wYIJ7a7)mG&yT%a`YvV(}CSgCcq5e5V)uf04Z`qInVWB=Zo@JP^vN{iPE*`nl%

MUfP9p~Z1a^ly=eia zZ6MPim)%AKmd~)t{xZ>o*2(%>kBv}UrwWMfG3Xr^ z#UEBv+*s&vdb~bmT^6Q9@XFb0Rjk603RY&FvK*`qSe4UzU6t?9^F^2&s`bm6jtAng z_*tskqRQIGu=L(2TVmAx@M@QRuELmX_V2NN#-}K+C$UWbuPDy>v3a#v!>z^Q0HE(} z>1nkpu5h=;EY~;)X2clL6oLsE@i(EkGEJo?)y&1aR&bsWtE1J;cp01Blk~M1BmR&Y z`%Y#=O?40J@i9vMsIFlY&#fqRsb1SEIWwbd3h^?mDCW=<*LTg({>YL1(%`V}35zI~7=BI}*G|^k)q_3|O>J0@vgipnkt*0UO+}>V!fj z<){Yz18MgtO^+$=*E~OZ>9g^AQC8o*=HgD48R;8MJHp1IM`FKa{u|$;)b2eYr!k`` pHHPP?t9^|MJ`sk#M@M-Kcr559<(OVQ0`$@^e*@K-(n}v7002PvzzzTa From 86a33f471bae8818c210b7147aca3547a8eaf8ec Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 16:02:26 +0800 Subject: [PATCH 10/32] ignore unreachable --- rules/prefer-destructuring-in-parameters.js | 1 + 1 file changed, 1 insertion(+) diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index 0c4ef5c6b7..42fc39263d 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -86,6 +86,7 @@ function getMemberExpression(node) { data.type = 'index'; data.index = index; } else { + /* istanbul ignore next: `MemberExpression[computed=false].object` seems always `Identifier` */ if (property.type !== 'Identifier') { return; } From e7787589797c08655b780c6972e5c89d97a0f78e Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 16:06:21 +0800 Subject: [PATCH 11/32] More tests --- test/prefer-destructuring-in-parameters.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index 1b800e446c..1bde586d78 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -26,6 +26,7 @@ test.snapshot({ 'const foo = bar => x[bar]', 'const foo = bar => bar.default', 'const foo = bar => bar.function', + 'const foo = bar => bar.null', 'const foo = bar => bar.x()', 'const foo = bar => bar[0]()', 'const foo = bar => new bar.X()', @@ -41,7 +42,10 @@ test.snapshot({ 'const foo = bar => bar[0]++', // Not sure if we should only allow `0`/`1` or just not against `no-unreadable-array-destructuring` rule // Following case can write as `const foo = ([, second, third] => second + third)` - 'const foo = bar => bar[1] + bar[3]' + 'const foo = bar => bar[1] + bar[3]', + // Should we allow rename? + // Following case can write as `const foo = ({x: xOfBar}, x) => xOfBar === x` + 'const foo = (bar, x) => bar.x === x' ], invalid: [ 'const foo = bar => bar[0]', From 8a4bc33aee1bfaec5e2b899c790508b4f4cf6059 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 16:10:21 +0800 Subject: [PATCH 12/32] test `constructor` and `setter` --- test/prefer-destructuring-in-parameters.js | 21 +++++ .../prefer-destructuring-in-parameters.js.md | 86 +++++++++++++++++- ...prefer-destructuring-in-parameters.js.snap | Bin 1942 -> 2098 bytes 3 files changed, 106 insertions(+), 1 deletion(-) diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index 1bde586d78..827d5e6c8f 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -83,6 +83,20 @@ test.snapshot({ } } `, + outdent` + class A { + constructor(bar) { + this.x = bar.x; + } + } + `, + outdent` + class A { + set a(bar) { + this.x = bar.x; + } + } + `, outdent` const a = { foo(bar) { @@ -90,6 +104,13 @@ test.snapshot({ } } `, + outdent` + const a = { + set foo(bar) { + a.x = bar.x; + } + } + `, // Not sure if we should have a limitation on property numbers outdent` function foo(bar, baz) { diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.md b/test/snapshots/prefer-destructuring-in-parameters.js.md index 791fe0c74a..6660b1e11f 100644 --- a/test/snapshots/prefer-destructuring-in-parameters.js.md +++ b/test/snapshots/prefer-destructuring-in-parameters.js.md @@ -404,6 +404,62 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #24 + 1 | class A { + 2 | constructor(bar) { + 3 | this.x = bar.x; + 4 | } + 5 | } + +> Output + + `␊ + 1 | class A {␊ + 2 | constructor({x}) {␊ + 3 | this.x = x;␊ + 4 | }␊ + 5 | }␊ + ` + +> Error 1/1 + + `␊ + 1 | class A {␊ + 2 | constructor(bar) {␊ + > 3 | this.x = bar.x;␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ + 4 | }␊ + 5 | }␊ + ` + +## Invalid #25 + 1 | class A { + 2 | set a(bar) { + 3 | this.x = bar.x; + 4 | } + 5 | } + +> Output + + `␊ + 1 | class A {␊ + 2 | set a({x}) {␊ + 3 | this.x = x;␊ + 4 | }␊ + 5 | }␊ + ` + +> Error 1/1 + + `␊ + 1 | class A {␊ + 2 | set a(bar) {␊ + > 3 | this.x = bar.x;␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ + 4 | }␊ + 5 | }␊ + ` + +## Invalid #26 1 | const a = { 2 | foo(bar) { 3 | a.x = bar.x; @@ -431,7 +487,35 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #25 +## Invalid #27 + 1 | const a = { + 2 | set foo(bar) { + 3 | a.x = bar.x; + 4 | } + 5 | } + +> Output + + `␊ + 1 | const a = {␊ + 2 | set foo({x}) {␊ + 3 | a.x = x;␊ + 4 | }␊ + 5 | }␊ + ` + +> Error 1/1 + + `␊ + 1 | const a = {␊ + 2 | set foo(bar) {␊ + > 3 | a.x = bar.x;␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ + 4 | }␊ + 5 | }␊ + ` + +## Invalid #28 1 | function foo(bar, baz) { 2 | return [ 3 | bar.$, diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.snap b/test/snapshots/prefer-destructuring-in-parameters.js.snap index b0136cf82592646805eaf2e1b76c0d78763f104d..ddfd0191a72cfa758214deebd0a148ebfb213dc7 100644 GIT binary patch literal 2098 zcmV-22+j9FRzVCkGM5?Cu-t!iAv+uoKmW49y zoB7Ro_qX@nJ?EZt&;5AsClZoHCLVt2;7{-S&9|Ee`$ykJ`no6)&r}76I3|_vnsGcU z?eFXUkTHC76%w7OdI=bUu-o}$sSd(ly^CK?UA-WCZ+Us zj(G5qo$FKoL?!!#f>B(P+>vE3+pAI@aPG?Q&Zs@Tl}ffzLFyfZESp}_^~lVyB=CY>WYk?sANwl@ZC+wmI<4(W_IUnZurUNqe)9PJw+w^ zR|Ol=2>HdHJ!5zG<~PIm3txWI(Qt@L_PB!DbVA<#Re#UGKU(Hry4Sq#!ohKqsbqT; ztQ<+mf%Mh823npucg%mrL#Mt%sAP95VE6EGDSi9h%fIg*fA_0TCS|b9Ix5+pD=>^A zr1!Ibn;-t>uuTDNO^>;NBfAG@0-t{I6mFyJ-{!Btn z56&@c9hJ8CyDfvQgR|z%rIOvR!1O~x&Q|=za^UfuPknvXHY|N$+j1&dpMuPL2|0i2 zP$7&sdn9+(;fyBp;3_KFHU$&12)SH5t)%heVTL`UKHUH5zRUtDS)YROV+r~0i_86| zdOvgg?9ZnyUA==lsAL@q{>AZq<9ppjuXXOuv^=p(BREU32EX_DF|y)V|HF^zzey&5%8x2 zG@o_ifofT~8eH`bPm={|tYERa+)hue+iHOZJG7Xc=4Pwg>XbFBb3;{`t)_hi1DBOE zmZBzWv(@e{v&}X;E2TlJU)iuPDPRudi# zn9yW)xu6i*dHF}YoXqvY$sw4jf=PDQH@I@WTw8BG=YA|WKYy9VU;H7x(r1ZYw_FX; zZNboP<^0H3EKg3p(dnbBV!{*^-`PC&T6crPuB3%_r`7Fo+QB=-x@U-r2d}k7^OUwy zX@8^y5#LlXK`+snh5th9d$j}79B_-i1@X{&qQ2G-hN-QS1!VOo^p1z(^z#JqCqk2} zF(4-oPhw^UH4JJQSQuCt*cj9?sAtf?U_FCI22Bi_8Q2*(7_=~GW#Hr~oq?NyhrtF0 zZ4A5&HZt(}8MIe1C}c33!5jv285A*?$6!8#M;R0|C}B{_U;%@L3>GmcW3ZUP5(Y~d zEMu^o!3qZD3|2B&#b7mqHOlP9nW+S9g&=TZW;5|FCsDG7C8EMKSwX`jQDM5QpkbS+ z@UW~PjFiP0yeQ;MNmmKZm?z&gj29J*vVz7ahziokWR2kv70_rgE}|sO7Av4pCBIcu zRhRSN;KOA0sSayFU|8jnBMrqo7voBF)it7_a1R$XC~8qyP*_peP}HFacAY3UAiW+% zBZ?*z%_!_B94LZaE6S}%J5jh$xKVgeY(UY5BG~n!yb)=&5a2_a8yp6rTqs96cQ%SS zDCVLlLNO1;d=$Z9BFe=`m!K#`u>i$F6pK)lp$HBmQC@=dQWVQjEJv{dMLCLHfAjYm`Ul)hZ3QR>||MzPIUTV+Cq{U#L; zou>40HFI%A4D=IZb);iJyo{Y6Vyrkk>BYJ^xliJM&o`X9jxyFFREIrcuM8LbV9%P`kEA6~iKI0^;S= z%BWM3+*E6(BC(5#kd2?yPEUcpgVK|FhqokU(f4kFreR7Cd2nwY*6(%f)kFMTbUgu# z_xKUA65Xt`x?cSf5GggqFOu)my(WhFR)hoWR^3Aw(8K| zj9+V|seQ;*xrmh*^?yij#M`eWb9ud*AHITX+A*XprupbEjN{>(tNZk!m-SLL(Tl?w zkA1pc_qWA9y+lh>u`-)uAA(mT c;p@(0fyo-$rY4rJIx#xxKVRFDYK0;I0C?vXzyJUM literal 1942 zcmV;H2Wj|0RzV!>|FcOQ!g00000000B! zSb1zzMHrtxKe|tQUty34w&mqrRE%E#0@f@9nlMgy<$;es6xAnSS4V z#~g*-2pL2okL-#&w>fcE`s-H@ojFxeB$DFqN*IcvJ4(xagpAm~`HN>Bd*iQ_?U(yM zNLuR!&UWvK@~SA&8I2Q;4v9FI``N&rD~tEl2%K$`#C$&?BQNi`zxc<+?`P|lx0=tc z*9x57D9MO$LPjk)SoviSO>156(UZ0o_4!KRY?dVFM2YX4zQvlSdEC~R)G)B%#Cn0V z6E!GpqAVC^sDEYt@pbQvP0M||b==niX9xE}`COEY>&ZK>M9pk`Vli2IxbVy_fwR9! zQvLuTrWJ3QR~>Koy`awzb&(l8FA1D|SCZJ?Vy``Ov%VEvX&)Y|nshPZuMB~+PDyTx zQZ>8xq3fpe7j{NntId=b8VM~kK6svkVV4;&K{Gb>LEhb3|}!Mu_1P)<>_mOddyq#vcTEzC0Q0h$l4t{ zhHh(4DuqXXy>O$(vQOabQAr9S3E2~w)p))9wYI~xC!NBW?L^@0$C6CwOGxw2f9l7d zZh33TM;n?F<0^9m&aRdu;$cD#SCCJJHf4Ns@ccVVqU(Cr^`!%Up4p0%vFUNBK^a7Tv{fR*!klFrwGyY0X7Cqrh3s0FSpimpy;vgt5N4{cVA>rIK70<)7jM4XGd0?cS8I zW$&ANBa;NqMn8h`sVLn@Po7g@JxGM`OPB@#v`_niN6l@gi6dV+s6qZq_q~M~koI+JCh3Y&C zDHJACm_lJHg;WaDC`_j?gThP-vnV`EVK#*{3Uer=QLuVxnalG9 zzb-fEMGFo3D!|R!}S3E8)@OCcyK|ZJR!CqMAEHQ$?1V)qHVRIHZOh&L+p7*@Rg3Aj4%aZDncs4G=%90o?*h;Gm)N! z@GQb?gfxUX2;7?Fv$Z*0HEWb#r-)~aJoHNx=yW>BlMkv=)jb}^u&=xT7Ic1llIaoSSNRf? zb*ZBe)yHr7s5*7+r6GZrUeX@>ch!U$ZWBuMb~~i-lFO5mpY>eQQ3|uoQE0KpyF_hW zNgAo_)@rbPdR6wDoXABDAGqxLTppGylo^yOaY`?{ zbp@kXZUv}I)yh^$nHgYH2$f+uL5C*4yeoz#yR8Mt&W+09>Ym#pT>VdYS3+1ga2GW7 zQQGT=ZvZ~?cH&Jy=I7MT1TbEM17xPKQl;A7x=05~&(KBkW2#3@pH~29fVvXk1t1g$ zo#`@-*{NLZRG<&;NU)Bm&+2s;&?}z=?#MB~|Ls}~SoeNa#TC-ZN7bkwNIOO;dQ5h^ zX8F-YpFN=#Wz`*P&TnK%zP?ek!)q*hB=|e#z4#jC@808a8jI1!2JskmyKhnM2SU%+ c=m1XvtK4pqkLl7AKo|Y;FF@CIZXF*00G*}45dZ)H From e87ae3dc0debb3890591e72b24e15a045324fcc5 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 16:44:20 +0800 Subject: [PATCH 13/32] Fix functions has `"use strict"` --- rules/prefer-destructuring-in-parameters.js | 22 +++- test/prefer-destructuring-in-parameters.js | 105 ++++++++++++++++++++ 2 files changed, 124 insertions(+), 3 deletions(-) diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index 42fc39263d..a8ca4d6f5a 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -99,9 +99,8 @@ function getMemberExpression(node) { return data; } -function fix({sourceCode, parameter, properties, type}) { +function fix({sourceCode, functionNode, parameter, properties, type}) { function * fixArrowFunctionParentheses(fixer) { - const functionNode = parameter.parent; if ( functionNode.type === 'ArrowFunctionExpression' && functionNode.params.length === 1 && @@ -139,13 +138,29 @@ function fix({sourceCode, parameter, properties, type}) { }; } +function hasDirectiveInFunction(functionNode) { + const {body} = functionNode; + if (body.type !== 'BlockStatement') { + return false; + } + + return body.body.some(({directive}) => directive === 'use strict') +} + const create = context => { const {ecmaVersion} = context.parserOptions; const sourceCode = context.getSourceCode(); return { ':function > Identifier.params'(parameter) { + const {name, parent: functionNode} = parameter; + + // If "use strict" directive used, it should not reported + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Strict_Non_Simple_Params + if (hasDirectiveInFunction(functionNode)) { + return; + } + const scope = context.getScope(); - const {name} = parameter; const variable = findVariable(scope, parameter); const identifiers = variable.references.map(({identifier}) => identifier); @@ -218,6 +233,7 @@ const create = context => { }, fix: fix({ sourceCode, + functionNode, parameter, properties, type: propertyType diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index 827d5e6c8f..ea70ca2d88 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -131,3 +131,108 @@ test.snapshot({ ` ] }); + +// `babel` throws if these functions use destructed parameters, but `espree` don't, so we use it to run run tests. +test.babel({ + valid: [ + outdent` + function foo(bar) { + 'use strict'; + + return bar.x; + } + `, + outdent` + function foo(_, bar) { + "use strict"; // Double quoted, the same + + return bar.x; + } + `, + outdent` + const foo = bar => { + 'use strict'; + + return bar.x; + } + ` + ], + invalid: [ + { + code: outdent` + function outer() { + 'use strict'; + + function inner(bar) { + return bar.x; + } + } + `, + output: outdent` + function outer() { + 'use strict'; + + function inner({x}) { + return x; + } + } + `, + errors: 1 + }, + { + code: outdent` + function outer(bar) { + function inner() { + 'use strict'; + + return bar.x; + } + } + `, + output: outdent` + function outer({x}) { + function inner() { + 'use strict'; + + return x; + } + } + `, + errors: 1 + }, + { + code: outdent` + function foo(bar) { + ('use strict'); // This is not a directive + + return bar.x; + } + `, + output: outdent` + function foo({x}) { + ('use strict'); // This is not a directive + + return x; + } + `, + errors: 1 + }, + { + code: outdent` + function foo(bar) { + 'use strong'; // This is a directive, but not "use strict" + + return bar.x; + } + `, + output: outdent` + function foo({x}) { + 'use strong'; // This is a directive, but not "use strict" + + return x; + } + `, + errors: 1 + } + ] +}) From a8ed1185eefc76325df60857676af319f223793a Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 16:56:42 +0800 Subject: [PATCH 14/32] Fix `delete bar.x` --- rules/prefer-destructuring-in-parameters.js | 8 +++ test/prefer-destructuring-in-parameters.js | 3 ++ .../prefer-destructuring-in-parameters.js.md | 48 +++++++++++++++--- ...prefer-destructuring-in-parameters.js.snap | Bin 2098 -> 2187 bytes 4 files changed, 51 insertions(+), 8 deletions(-) diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index a8ca4d6f5a..bd33328bc6 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -49,6 +49,14 @@ function isModifyingNode(node) { return true; } + if ( + parent.type === 'UnaryExpression' && + parent.operator === 'delete' && + parent.argument === node + ) { + return true; + } + return false; } diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index ea70ca2d88..c84fc4f51d 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -40,6 +40,7 @@ test.snapshot({ 'const foo = bar => ++bar.x', 'const foo = bar => bar.x++', 'const foo = bar => bar[0]++', + 'const foo = bar => delete bar.x', // Not sure if we should only allow `0`/`1` or just not against `no-unreadable-array-destructuring` rule // Following case can write as `const foo = ([, second, third] => second + third)` 'const foo = bar => bar[1] + bar[3]', @@ -67,6 +68,8 @@ test.snapshot({ 'const foo = bar => new A(bar.x)', 'const foo = bar => new A(bar[0])', 'const foo = bar => a += bar.x', + 'const foo = bar => +bar.x', + 'const foo = bar => typeof bar.x', 'function foo (bar) {return bar.x}', 'const foo = function (bar) {return bar.x}', outdent` diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.md b/test/snapshots/prefer-destructuring-in-parameters.js.md index 6660b1e11f..add5949089 100644 --- a/test/snapshots/prefer-destructuring-in-parameters.js.md +++ b/test/snapshots/prefer-destructuring-in-parameters.js.md @@ -316,6 +316,38 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #20 + 1 | const foo = bar => +bar.x + +> Output + + `␊ + 1 | const foo = ({x}) => +x␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => +bar.x␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ + ` + +## Invalid #21 + 1 | const foo = bar => typeof bar.x + +> Output + + `␊ + 1 | const foo = ({x}) => typeof x␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => typeof bar.x␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ + ` + +## Invalid #22 1 | function foo (bar) {return bar.x} > Output @@ -331,7 +363,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #21 +## Invalid #23 1 | const foo = function (bar) {return bar.x} > Output @@ -347,7 +379,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #22 +## Invalid #24 1 | class A { 2 | foo(bar) { 3 | this.x = bar.x; @@ -375,7 +407,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #23 +## Invalid #25 1 | const A = class { 2 | foo(bar) { 3 | this.x = bar.x; @@ -403,7 +435,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #24 +## Invalid #26 1 | class A { 2 | constructor(bar) { 3 | this.x = bar.x; @@ -431,7 +463,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #25 +## Invalid #27 1 | class A { 2 | set a(bar) { 3 | this.x = bar.x; @@ -459,7 +491,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #26 +## Invalid #28 1 | const a = { 2 | foo(bar) { 3 | a.x = bar.x; @@ -487,7 +519,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #27 +## Invalid #29 1 | const a = { 2 | set foo(bar) { 3 | a.x = bar.x; @@ -515,7 +547,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #28 +## Invalid #30 1 | function foo(bar, baz) { 2 | return [ 3 | bar.$, diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.snap b/test/snapshots/prefer-destructuring-in-parameters.js.snap index ddfd0191a72cfa758214deebd0a148ebfb213dc7..7c9a10e612467c7a150a41a1f470179ea8d6d4c9 100644 GIT binary patch literal 2187 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 From 22cc069e17cf077460c9f3d69dc6ebc22b6aac94 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 16:58:41 +0800 Subject: [PATCH 15/32] One more test --- rules/prefer-destructuring-in-parameters.js | 2 +- test/prefer-destructuring-in-parameters.js | 3 +- .../prefer-destructuring-in-parameters.js.md | 32 +++++++++++++----- ...prefer-destructuring-in-parameters.js.snap | Bin 2187 -> 2236 bytes 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index bd33328bc6..1912732d00 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -152,7 +152,7 @@ function hasDirectiveInFunction(functionNode) { return false; } - return body.body.some(({directive}) => directive === 'use strict') + return body.body.some(({directive}) => directive === 'use strict'); } const create = context => { diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index c84fc4f51d..64e15e1614 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -70,6 +70,7 @@ test.snapshot({ 'const foo = bar => a += bar.x', 'const foo = bar => +bar.x', 'const foo = bar => typeof bar.x', + 'const foo = bar => delete bar.x.y', 'function foo (bar) {return bar.x}', 'const foo = function (bar) {return bar.x}', outdent` @@ -238,4 +239,4 @@ test.babel({ errors: 1 } ] -}) +}); diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.md b/test/snapshots/prefer-destructuring-in-parameters.js.md index add5949089..2fa505be71 100644 --- a/test/snapshots/prefer-destructuring-in-parameters.js.md +++ b/test/snapshots/prefer-destructuring-in-parameters.js.md @@ -348,6 +348,22 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #22 + 1 | const foo = bar => delete bar.x.y + +> Output + + `␊ + 1 | const foo = ({x}) => delete x.y␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => delete bar.x.y␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ + ` + +## Invalid #23 1 | function foo (bar) {return bar.x} > Output @@ -363,7 +379,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #23 +## Invalid #24 1 | const foo = function (bar) {return bar.x} > Output @@ -379,7 +395,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #24 +## Invalid #25 1 | class A { 2 | foo(bar) { 3 | this.x = bar.x; @@ -407,7 +423,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #25 +## Invalid #26 1 | const A = class { 2 | foo(bar) { 3 | this.x = bar.x; @@ -435,7 +451,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #26 +## Invalid #27 1 | class A { 2 | constructor(bar) { 3 | this.x = bar.x; @@ -463,7 +479,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #27 +## Invalid #28 1 | class A { 2 | set a(bar) { 3 | this.x = bar.x; @@ -491,7 +507,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #28 +## Invalid #29 1 | const a = { 2 | foo(bar) { 3 | a.x = bar.x; @@ -519,7 +535,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #29 +## Invalid #30 1 | const a = { 2 | set foo(bar) { 3 | a.x = bar.x; @@ -547,7 +563,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #30 +## Invalid #31 1 | function foo(bar, baz) { 2 | return [ 3 | bar.$, diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.snap b/test/snapshots/prefer-destructuring-in-parameters.js.snap index 7c9a10e612467c7a150a41a1f470179ea8d6d4c9..eaf0c3110d63b8fdf7761f98cd045f5a1cb598af 100644 GIT binary patch literal 2236 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 KN#Cg(B>(_a%3&e^ literal 2187 zcmV;62z2*BRzV1zqKFm}Ao!E|a|~Evyb?AvRZ&n-{QnQEK}1;Cx3B`cxVy;mugQqXM5k&r zH9ytpNPZ}7Ql}9+qLWEU$I&{8nkKcQwJ}ZA8OL_aG)iiQ-h0nm*=6^=U6(a=+MW64 zy!&zQ<(zxYJ@=mXVjm)8EJ^tAz|mRbU%9if_vY}2$=Ozk@L!sO;|vq@ZBtK=j`{oA z!y_X$Rvd4X1REWO*v;^xo9#m?zF7TEK}OwK(^ornl3-6NSjncGxaLIdu|Y%6wnR;u zd2n6yN0MNlR}ddg$mDC`e>s(SegCGN4bdI1?j0!!cD{m78Kyk4Z&YF2W7R`eRz#3P z5qe3m^dZCLdOs3HAjAF;Rq6cP`KWOmZ&y)yMTSZ^YbT z`f#>T!DWW}#Zf13%U7;;B!1Ic{Pol~CBa5VBepU$=~{bg&X0I~nQq!^N8SqiRub%= z6y!h5dOhAedfJ}kjpp=QCkL%)eo+$aF$H;#5VEbkeaxF()2m?IwW~di=HrrJI}~Kc z5V9jF*AjJOdwNvwp{>8au&q-P>>COe#S-%KmY+WNMcQZYUn#15&UP)G_2BF~3UcEJ z*)PxBe0uXOsqNWcztpp9Jkx`-TNI3Vl=V2gCw2R)@}X_Lm;ZHb=eaYIVCN|4X6TH~ zZ@XQ+^SWO0{q-y6A>>oZiws!UIlLWh0K>`pGP9nta4;w^c!X^v_ z&_N@VS}k@5n5^f<>-{tR!dhP>&%^Lo>aGlo)J%16U)44FdLS1l8YK z{)1xCxftx_)|yHql*nL|?G9T_sY5n`*#gxDo1sc}$TrclIK@+yY+u?JP_WC4G3Hdt zRkFpg%#>}g6$*pAdC&Rk)JosvkQ2>p@>85tQ+ zQxuD>!s1iHUX5t3c8(4~H*!ET2vXkhIpSv%4$JHUX3a4wB=k&be+J;lk? zbxvp8k2%-G9-d+kO&;?~FB9#FnJRqZ%>EM#W2P&nM@A0RR&6E!7RLV(*V0sDDRr2w z7VZtPdkhpxD3nq#QjjT_D3nnsr(mYAjzR^6N(xmJEEKF1swu3eU}L$2f`dX0g$)#H zDL5(AQK)aC&`?Ani$XSq*%anb$e}Qo!aNG|DJ-C{kisGgizzIju$00w3d5IP`JB}x6Mee zLs5aE5=9jX3koX=ch~avdZcYA>?j;4YEW!IQH#Re^}Jn&w673gOPb;y2E3gmRyrjc z#cULFP~@PPi((!M_b}n@1xPPMu?WRt6iZMnMX?Npdl>Qd3Zz$}cp616iaZp06su6U zhZ%3@BYl6u4ZOqce>_|=y~3sc24i%98?0Vzu>a3+3wvDaGGgH8wr78*`c1^(I*hfi zA)&Z~Bxq|r$xCgG>#OJ<$n_}{if8&PDNJUY-QitNc+sA7)%vgrZ%M9#LZg~+U23tI zNDaD}7^~%peom;?zJ+V7|AV&lc0ZMz-!g8X%dQX1m?9NxibT1lZKU)9@n@yVEce;= z1pzve-Jz8@^!l4n+%r0*ExydfbJsPGo7DlsHEilxXp+BUI~2-h-OIUQNb>qaa^M%JB+M0>FE>MzRwnx}>TYmo z2h$E;d9rV8P(c++fBAlEtKu)dd;OgC4eAb4_P(EsR;YY7&%-c&+t$i`hQJcvcA`CN zzm#WC&v*AF*%bzS){EL$^{nT`ke}<$YwG8}Yi_sm-}i+60zD*wAa#EantCbS?}sI} z*Sz;oa(nnW=Uz4~eh2cCXr+xB*VnsWlKf@c(CyywnkB2(XRsPS$Aq6xV4+B)i_|j% ze Date: Thu, 21 Jan 2021 17:08:29 +0800 Subject: [PATCH 16/32] Improve coverage --- test/prefer-destructuring-in-parameters.js | 1 + .../prefer-destructuring-in-parameters.js.md | 56 +++++++++++------- ...prefer-destructuring-in-parameters.js.snap | Bin 2236 -> 2268 bytes 3 files changed, 37 insertions(+), 20 deletions(-) diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index 64e15e1614..4ba7e98ccf 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -59,6 +59,7 @@ test.snapshot({ 'const foo = bar => bar.length', 'const foo = bar => bar.x', 'const foo = bar => bar.$ === bar._', + 'const foo = bar => bar.x + bar.x', 'const foo = bar => a = bar.x', 'const foo = bar => {const a = a = bar.x;}', 'const foo = bar => bar.baz.x = 1', diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.md b/test/snapshots/prefer-destructuring-in-parameters.js.md index 2fa505be71..f3362c629d 100644 --- a/test/snapshots/prefer-destructuring-in-parameters.js.md +++ b/test/snapshots/prefer-destructuring-in-parameters.js.md @@ -172,6 +172,22 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #11 + 1 | const foo = bar => bar.x + bar.x + +> Output + + `␊ + 1 | const foo = ({x}) => x + x␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => bar.x + bar.x␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ + ` + +## Invalid #12 1 | const foo = bar => a = bar.x > Output @@ -187,7 +203,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #12 +## Invalid #13 1 | const foo = bar => {const a = a = bar.x;} > Output @@ -203,7 +219,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #13 +## Invalid #14 1 | const foo = bar => bar.baz.x = 1 > Output @@ -219,7 +235,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ `bar.baz` should be destructed in parameter `bar`.␊ ` -## Invalid #14 +## Invalid #15 1 | const foo = bar => x = bar[0] > Output @@ -235,7 +251,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ ` -## Invalid #15 +## Invalid #16 1 | const foo = bar => a(bar.x) > Output @@ -251,7 +267,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #16 +## Invalid #17 1 | const foo = bar => a(bar[0]) > Output @@ -267,7 +283,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ ` -## Invalid #17 +## Invalid #18 1 | const foo = bar => new A(bar.x) > Output @@ -283,7 +299,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #18 +## Invalid #19 1 | const foo = bar => new A(bar[0]) > Output @@ -299,7 +315,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ ` -## Invalid #19 +## Invalid #20 1 | const foo = bar => a += bar.x > Output @@ -315,7 +331,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #20 +## Invalid #21 1 | const foo = bar => +bar.x > Output @@ -331,7 +347,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #21 +## Invalid #22 1 | const foo = bar => typeof bar.x > Output @@ -347,7 +363,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #22 +## Invalid #23 1 | const foo = bar => delete bar.x.y > Output @@ -363,7 +379,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #23 +## Invalid #24 1 | function foo (bar) {return bar.x} > Output @@ -379,7 +395,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #24 +## Invalid #25 1 | const foo = function (bar) {return bar.x} > Output @@ -395,7 +411,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #25 +## Invalid #26 1 | class A { 2 | foo(bar) { 3 | this.x = bar.x; @@ -423,7 +439,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #26 +## Invalid #27 1 | const A = class { 2 | foo(bar) { 3 | this.x = bar.x; @@ -451,7 +467,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #27 +## Invalid #28 1 | class A { 2 | constructor(bar) { 3 | this.x = bar.x; @@ -479,7 +495,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #28 +## Invalid #29 1 | class A { 2 | set a(bar) { 3 | this.x = bar.x; @@ -507,7 +523,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #29 +## Invalid #30 1 | const a = { 2 | foo(bar) { 3 | a.x = bar.x; @@ -535,7 +551,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #30 +## Invalid #31 1 | const a = { 2 | set foo(bar) { 3 | a.x = bar.x; @@ -563,7 +579,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #31 +## Invalid #32 1 | function foo(bar, baz) { 2 | return [ 3 | bar.$, diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.snap b/test/snapshots/prefer-destructuring-in-parameters.js.snap index eaf0c3110d63b8fdf7761f98cd045f5a1cb598af..62f7dfbd12500ec899720a04143c4e8635c7eea2 100644 GIT binary patch literal 2268 zcmV<22qX7FRzV1z1Oz39#GqEe6NCiH&4z6-3KUXQKoLQsVi5!uc2N{|VRwP$Pl?lFT6Gc= zCruT!H8DX)O`0a+Oh~5F#)KFnj*d#2OwwpfuxT<=@?&gF)BEmuEBo`_+jU)2rhPNt zoOi#y_wG6OoO6HPEgVA#knweGm%ezY@coUD(LGQ+>tlh4Pl1Fp4C7BnjI*shU3YAL z$o$~^3q;`Tm;l5khPcALv)`T;@p0+l$srx+-JQ{bSdCxN=`{dh@BO zi;rmq&OR<-Y9JwZm-IKi5)^i7LwMo?Pp`e@sKD7J65eOflw|E%VcVP7yZNyyizRxG zz}bi~h%Scvru}|OdT;Q0^R|mUN%hHZ2%H^|P!>c;{_vESVvc9`zn%By)hlUzOjD8F zAt5!Gkm@}|C4A4&_1T2Jl{Odn9 z(XwAGnwWfV$M_I|voUudjxxM(Vc(uN4n8uNp7Wb8-~C|X>jG!*h(zpSIP!r$P8-%V zP!zf8$&ARE#|6%wkg#kLA%FR`@wrKpw?ywd-*x`sKaVRCIQvTp;gi`vCI9Vg@cFL6 z-YY%&NBZ(K0%r{p!ln??|MFJ{Z>?<{c=UjE>(I)mGXiI4N$6#GtDd|Vb)@iQ|0lmI ziQ6!6dmv|HeuOwKVfR!*PHv@BPqbN|Iz0WSf1G=!?|{JB?$m6Tz1%<8 zxU})Mw0l+voE?-<8b!!EG5LRg{=?zU%+%B!bWcycz}Y`Y_*pa|Llq}7Ubz~S9GLT7 z?xe`w%-15jOTvQbtj0gzJN4qhzSzSBzx~t3@Y9C`&bCPy3xs^umGDCLS@$&HLz6+*}$It0I`@Y{TaCY*Yh;D{J62fPYfFKePkQoM`g*K=( z87)?*GMOM9;)|=Q%@%7`jiJ_Hv=&s&(V15zKzat~;@y5o2y^Pr7M9`GU4_n!joC|a z(y9dZkHD(PKBfGDa;#bomNlk^8a-4PKyR>E%?*`SgC44lP^UBNY7JI{nO7~>IBRjI zoKdZ|cF72vi_#4ql-Afh>&*4g*nHJ^j;tFfSPYEOyL-Z&ckZuQ*(5%+6-nAv$~KkS zA9RG)XGh#E>xftiW$24oNKa3PGUrAus=8~ijrdmP!2-%a#oLV9n4NZ{gmJIF6`eOsn3E{7#uxnq{V63!On~Yo=RKL}1 zur`>DU~6}3B0NMS^_|<=gAm<*pP8OtDhU~+*gx~W#}dQq^mOH`fKHjR&$EY zxo(~MOl9+Gb{!Q%Z}G6&d0gslbl7v8jM1^bZ)MC+7!%60k@B1|_lZoXPGe&=Y-x;0 z76~zNXR;TU3E)wp-Yd=k%yh?Ixlht0dqYES$X}}J1r&Pcz%m67mhoj=-Lb;2RHh5` zm_jc%+20Gi3|`EDG5aawyEFuz*4?g@qLIC@i9oPoaRqVhT$rJV;?Fg=G|$ zQz)dcg2K-!6j4|y`2@#P+W!=b1P*5`72lI_N|d)mtT2;TP%ufXa6hl0V4GNB7Ox;0 z$&0gDQIsj1E)zLz5`R}PUaX+y6%sYh#^vRLtjqcI zQlV>+9o7u{u=0}>Hx#4O#{8_b^d`q7sE3g#kqsiq$9_T_={SkzR{p9f}$h zwJ3}zOeh>(E0*h#Hlwhhu%c){(TJi6g`?}max>C$A;5-I;}`~FIg^jHW)6zEDCVKa zLXnLk2Zdvph~))H=b~7MA`itP6!|C$P&kH>SYCqkgD94wScYObib51CP&kH}SS~{P z=7bx#hui;nxMaA6i)(^0+RFrM;R*Kt8Eyd!l{d>4gB5(=hHqEdhTD7oFK@-=zaA=_ zr9{;{oTplq_iU139uBkq+Iq&Qe#iya4Yca#XS+wd(EA2Al{3_}PIOaS<%=h;?uFid zQ9M^^+bYJn&iDQB6N>v`?07Wnhy$jpc`eb!V`gQKC3^CfKRmU{>jNlXY84Nl;@s-t z48BwOP-^en;ZQ2yp?c{0X|@nv`vEj{Q`+Uh72B=f>sY~^{JdBxakzjJ5ayK5}MV&%%t?D;{oGRllHLyP)xO&FZ(D8wpUZO(xR? zW63`sQo4vY-H(a@RlRDnHrE+URjx6*UfGjU18)|7|3s?%Wha}F?4KQ5_>gLyTeYcY q*+?t(EVFAbPJpB20$uJlXT-ANcx{3g_vb!bpZ^ClrF)I@B>(_NS8I6y literal 2236 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 KN#Cg(B>(_a%3&e^ From 297216207f06074b6943307850a32d5ffc56064f Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 17:16:20 +0800 Subject: [PATCH 17/32] Test private fields --- rules/prefer-destructuring-in-parameters.js | 1 - test/prefer-destructuring-in-parameters.js | 9 +++++++++ test/utils/test.js | 3 ++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index 1912732d00..afa94ef355 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -94,7 +94,6 @@ function getMemberExpression(node) { data.type = 'index'; data.index = index; } else { - /* istanbul ignore next: `MemberExpression[computed=false].object` seems always `Identifier` */ if (property.type !== 'Identifier') { return; } diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index 4ba7e98ccf..38a5d15528 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -160,6 +160,15 @@ test.babel({ return bar.x; } + `, + outdent` + class A { + #x = 1; + + foo(bar) { + return bar.#x; + }; + } ` ], invalid: [ diff --git a/test/utils/test.js b/test/utils/test.js index 9472b7cff6..5615fde046 100644 --- a/test/utils/test.js +++ b/test/utils/test.js @@ -44,7 +44,8 @@ runTest.babel = tests => runTest({ parserOpts: { plugins: [ 'jsx', - 'classProperties' + 'classProperties', + 'classPrivateProperties' ] } } From d8f8ab537dd109ad070d21bb7a4db64e5d3bd29e Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 17:24:51 +0800 Subject: [PATCH 18/32] Fix crash on typescript parser --- rules/prefer-destructuring-in-parameters.js | 6 +++++- test/prefer-destructuring-in-parameters.js | 11 +++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index afa94ef355..ec91dd375a 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -111,7 +111,11 @@ function fix({sourceCode, functionNode, parameter, properties, type}) { if ( functionNode.type === 'ArrowFunctionExpression' && functionNode.params.length === 1 && - isNotOpeningParenToken(sourceCode.getFirstToken(functionNode)) + isNotOpeningParenToken( + functionNode.typeParameters ? + sourceCode.getTokenAfter(functionNode.typeParameters) : + sourceCode.getFirstToken(functionNode) + ) ) { yield fixer.insertTextBefore(parameter, '('); yield fixer.insertTextAfter(parameter, ')'); diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index 38a5d15528..b7458840f4 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -250,3 +250,14 @@ test.babel({ } ] }); + +test.typescript({ + valid: [], + invalid: [ + { + code: 'const foo = (e) => e.key', + output: 'const foo = ({key}) => key', + errors: 1 + } + ] +}); From c5c62b1cdc5966df0a8e32fa337bb369a0d8d2ce Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 17:25:57 +0800 Subject: [PATCH 19/32] Simplify --- rules/prefer-destructuring-in-parameters.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index ec91dd375a..ee161ea54e 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -111,11 +111,8 @@ function fix({sourceCode, functionNode, parameter, properties, type}) { if ( functionNode.type === 'ArrowFunctionExpression' && functionNode.params.length === 1 && - isNotOpeningParenToken( - functionNode.typeParameters ? - sourceCode.getTokenAfter(functionNode.typeParameters) : - sourceCode.getFirstToken(functionNode) - ) + !functionNode.typeParameters && + isNotOpeningParenToken(sourceCode.getFirstToken(functionNode)) ) { yield fixer.insertTextBefore(parameter, '('); yield fixer.insertTextAfter(parameter, ')'); From 14cad623fe04cd717025cf6133fe50aac97b005d Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 17:28:34 +0800 Subject: [PATCH 20/32] Test curried --- test/prefer-destructuring-in-parameters.js | 2 + .../prefer-destructuring-in-parameters.js.md | 58 ++++++++++++++++-- ...prefer-destructuring-in-parameters.js.snap | Bin 2268 -> 2384 bytes 3 files changed, 54 insertions(+), 6 deletions(-) diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index b7458840f4..6b24c3d143 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -74,6 +74,8 @@ test.snapshot({ 'const foo = bar => delete bar.x.y', 'function foo (bar) {return bar.x}', 'const foo = function (bar) {return bar.x}', + 'const foo = bar => baz => bar.x === baz.y', + 'const foo = bar => baz => bar.x === baz.x', outdent` class A { foo(bar) { diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.md b/test/snapshots/prefer-destructuring-in-parameters.js.md index f3362c629d..ea960d1815 100644 --- a/test/snapshots/prefer-destructuring-in-parameters.js.md +++ b/test/snapshots/prefer-destructuring-in-parameters.js.md @@ -412,6 +412,52 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #26 + 1 | const foo = bar => baz => bar.x === baz.y + +> Output + + `␊ + 1 | const foo = ({x}) => ({y}) => x === y␊ + ` + +> Error 1/2 + + `␊ + > 1 | const foo = bar => baz => bar.x === baz.y␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ + ` + +> Error 2/2 + + `␊ + > 1 | const foo = bar => baz => bar.x === baz.y␊ + | ^^^^^ `baz.y` should be destructed in parameter `baz`.␊ + ` + +## Invalid #27 + 1 | const foo = bar => baz => bar.x === baz.x + +> Output + + `␊ + 1 | const foo = ({x}) => baz => x === baz.x␊ + ` + +> Error 1/2 + + `␊ + > 1 | const foo = bar => baz => bar.x === baz.x␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ + ` + +> Error 2/2 + + `␊ + > 1 | const foo = bar => baz => bar.x === baz.x␊ + | ^^^^^ `baz.x` should be destructed in parameter `baz`.␊ + ` + +## Invalid #28 1 | class A { 2 | foo(bar) { 3 | this.x = bar.x; @@ -439,7 +485,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #27 +## Invalid #29 1 | const A = class { 2 | foo(bar) { 3 | this.x = bar.x; @@ -467,7 +513,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #28 +## Invalid #30 1 | class A { 2 | constructor(bar) { 3 | this.x = bar.x; @@ -495,7 +541,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #29 +## Invalid #31 1 | class A { 2 | set a(bar) { 3 | this.x = bar.x; @@ -523,7 +569,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #30 +## Invalid #32 1 | const a = { 2 | foo(bar) { 3 | a.x = bar.x; @@ -551,7 +597,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #31 +## Invalid #33 1 | const a = { 2 | set foo(bar) { 3 | a.x = bar.x; @@ -579,7 +625,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #32 +## Invalid #34 1 | function foo(bar, baz) { 2 | return [ 3 | bar.$, diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.snap b/test/snapshots/prefer-destructuring-in-parameters.js.snap index 62f7dfbd12500ec899720a04143c4e8635c7eea2..6a95d64a2da8ac6afdf76bd5264eb54ac328dcf5 100644 GIT binary patch literal 2384 zcmV-W39t4+RzVgdrNVWMP0M4EEr2rb!XJwW00000000B! zS_@EA*BL%sL;^-fG!boh{1S)|j)ZN*C=3_~FBL&!1Q7)m*cB9ZVRwP$C159Lf;MUx z6BKLfM5B&cCyh!cB+VpkCDsfUYc!L#5}(*kG7~i>K04{S=bROG_ujiJtPa!e%s2l% zALktY|D5kU@7+HNp&;~ldHuB;&6)pP3voMoa$dM1An}*MafaaW(>`O&t4^1nNcBt| zoqiDslpW>9u#UiI+mag@&C{Q``5nZy`_`lgl)cQciBuVqxqH^-yt8WDp9IQgaaG@MEo8v_@mVE`hSIb3FMN$Gc^8@@E?EY$|-ls9v{Ona~#9& z@d%|~pK>JVWODcCX`kJ@9n(cxP-Oc!ntTw_rv1UYCt~ucOP^M@rtL7#6e#-zN6iF; zN_K7geusZ+<><}&1K&m;aT6$eh$D6)LgmL6W`7}=7aZ!To%5~Fy-b0!uW^if0-@Tp zu_u1iT1Vm0&~A8o$|Z zhc%T%|8T-%(VA9)ve!78Cn2u3Pv45HW z8G*8){tSBw{!)S7_wUR+)qVBX%R?G_Cc0C0VgSR39Ge0W>aD7~dp7Zd?sHX(t0u%u z&k`v6F-I~W^kq=`zYc$Wy(K<6dK=!gw?d$7J4fhLg!;exd++-PyMm8qw12#I?CC=S zWpg;L5`5DU_FnRvIaQ5qhd2DYvnN!btbY*0y99UpuH=V!qVymCdJAoA@_b96tjE&~ zhY9|3`G@PLyDsY2o;+LB()H6$fwCx=;Z*{6x?GQ>h%x{ zp*h+TgVB^!swvaxOc~k)wP8gV#KwU-)b0;q-d5F_z2oevD^MF)Ve*g@xgw1GM<7`w zf4TGr`7CQb7>o6lrA1Jnfg+93WT-4OX^Nmk2jyymx=drz7--h~2x~88afva)OtP9| z2scCI8puNwd1$bzUFbm0R8QOztBXsm>M+`;{VT$Y}Y0q2N zS0mrIRAU8^sul8`n``+oMXH9Z$Z3*_491YhL>UaRv9XY6U8q*k_Xt)-e9ChW0qdmT zp*la$;yl$%{D5kV8WR~ILzd-Mq+Icc5M-!i&y{L)D^10$@7S|-sYd0l<3$|nj)%kY z54HcMD@})?bv5k4OyyK#-9_t>QXsXKc+6aiwGlN+Go`DhOJR%a-I8#S6m!zSTH7WM zQEGCXrW)eyR-p#@kXQl7E0K$u*KNL)_iEyZ)yR}si`34I_%`IYW}8v3mLKvDWxQK@ zPFtxfG?nOev?qAD292rGpaZi_RLvGOT9;vg@G{iN2FEIN#pt-?CjK8=hv;&n#!!Hv z5JM3L4F)ZSl^BXKlweqeVKs(Q3}qN}81xv*F;rkMki{2+2}31@Dh$;a%ou7g)HYzK z%fk?lApyfn7!olgVMxZ1f*}>dTnzIt%*T+1VF8A83>g>}VpxRXWekfkynE?h2%0|}^_YC*DMl2|H4>1MI6f#r9jD{I4Gb@=H+;w8Qgwd;*SA8%a$IN_Y(wJGmOgb|e%nX*1m|n!_mzi12%qz?+VJ4HAEM^AFOiX7p z`r*h8?B(`9E|)kvx!4XcLO;L`0YG^_)E zo9xMI#2oacPsDtOT%;)_HGw(8<~Y)%u-I^51}h1VK1 zyAyu9#PL8S$HQ%$Hpn|2?#N+RIJ?5>Ws;u1WtT~D9sVeG<4F%PC9}5~4!$H%JnG$lAL8h9 z0+&fm`Gt2&rp_L8rn{RhSc>M-1WXi2nj&(d;KLDF6VA C@RghZ literal 2268 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 From 11b6d2316f2db9f627c6f498114f352e25272d71 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 17:47:06 +0800 Subject: [PATCH 21/32] Add docs --- .../prefer-destructuring-in-parameters.md | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/docs/rules/prefer-destructuring-in-parameters.md b/docs/rules/prefer-destructuring-in-parameters.md index ddf3b1fadc..88f9896b74 100644 --- a/docs/rules/prefer-destructuring-in-parameters.md +++ b/docs/rules/prefer-destructuring-in-parameters.md @@ -1,17 +1,38 @@ -# Prefer destructuring in parameters over accessing properties. +# Prefer destructuring in parameters over accessing properties - +Makes your code shorter and nicer. This rule is fixable. ## Fail ```js -const foo = 'unicorn'; +const getObjectProperty = object => object.property; +``` + +```js +const removeEmptyValues = object => Object.fromEntries( + Object.entries(object).filter(keyValuePair => Boolean(keyValuePair[1])) +); ``` ## Pass ```js -const foo = 'πŸ¦„'; +const getFoo = ({property}) => property; +``` + +```js +const removeEmptyValues = object => Object.fromEntries( + Object.entries(object).filter(([, value]) => Boolean(value)) +); +``` + +```js +// Used property and index together +function foo(array) { + if (array.length > 0) { + return bar(array[0]); + } +} ``` From 69212097d36bd5bd6274cf23edf064944c2f2c50 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 18:06:21 +0800 Subject: [PATCH 22/32] Fix async function --- rules/prefer-destructuring-in-parameters.js | 8 +--- .../has-parentheses-around-parameter-list.js | 23 +++++++++ test/prefer-destructuring-in-parameters.js | 2 + .../prefer-destructuring-in-parameters.js.md | 44 +++++++++++++++--- ...prefer-destructuring-in-parameters.js.snap | Bin 2384 -> 2499 bytes 5 files changed, 65 insertions(+), 12 deletions(-) create mode 100644 rules/utils/has-parentheses-around-parameter-list.js diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index ee161ea54e..72bcc27b9e 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -3,6 +3,7 @@ const {upperFirst} = require('lodash'); const {findVariable, isNotOpeningParenToken} = require('eslint-utils'); const getDocumentationUrl = require('./utils/get-documentation-url'); const avoidCapture = require('./utils/avoid-capture'); +const hasParenthesesAroundParameterList = require('./utils/has-parentheses-around-parameter-list'); const MESSAGE_ID = 'prefer-destructuring-in-parameters'; const messages = { @@ -108,12 +109,7 @@ function getMemberExpression(node) { function fix({sourceCode, functionNode, parameter, properties, type}) { function * fixArrowFunctionParentheses(fixer) { - if ( - functionNode.type === 'ArrowFunctionExpression' && - functionNode.params.length === 1 && - !functionNode.typeParameters && - isNotOpeningParenToken(sourceCode.getFirstToken(functionNode)) - ) { + if (!hasParenthesesAroundParameterList(functionNode, sourceCode)) { yield fixer.insertTextBefore(parameter, '('); yield fixer.insertTextAfter(parameter, ')'); } diff --git a/rules/utils/has-parentheses-around-parameter-list.js b/rules/utils/has-parentheses-around-parameter-list.js new file mode 100644 index 0000000000..f45beec5be --- /dev/null +++ b/rules/utils/has-parentheses-around-parameter-list.js @@ -0,0 +1,23 @@ +'use strict'; +const {isOpeningParenToken} = require('eslint-utils'); + +/** +Check if function has parentheses around parameters list. + +@param {Node} node - The AST node to check. +@param {SourceCode} sourceCode - The source code object. +@returns {boolean} +*/ +function hasParenthesesAroundParameterList(node, sourceCode) { + if ( + node.type !== 'ArrowFunctionExpression' || + node.params.length !== 1 + ) { + return true; + } + + const [onlyArgument] = node.params; + return isOpeningParenToken(sourceCode.getTokenBefore(onlyArgument)); +} + +module.exports = hasParenthesesAroundParameterList; diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index 6b24c3d143..52e785297b 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -76,6 +76,8 @@ test.snapshot({ 'const foo = function (bar) {return bar.x}', 'const foo = bar => baz => bar.x === baz.y', 'const foo = bar => baz => bar.x === baz.x', + 'const foo = async bar => await bar.x', + 'const foo = async (bar) => await bar.x', outdent` class A { foo(bar) { diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.md b/test/snapshots/prefer-destructuring-in-parameters.js.md index ea960d1815..c09cc9db45 100644 --- a/test/snapshots/prefer-destructuring-in-parameters.js.md +++ b/test/snapshots/prefer-destructuring-in-parameters.js.md @@ -458,6 +458,38 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #28 + 1 | const foo = async bar => await bar.x + +> Output + + `␊ + 1 | const foo = async ({x}) => await x␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = async bar => await bar.x␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ + ` + +## Invalid #29 + 1 | const foo = async (bar) => await bar.x + +> Output + + `␊ + 1 | const foo = async ({x}) => await x␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = async (bar) => await bar.x␊ + | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ + ` + +## Invalid #30 1 | class A { 2 | foo(bar) { 3 | this.x = bar.x; @@ -485,7 +517,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #29 +## Invalid #31 1 | const A = class { 2 | foo(bar) { 3 | this.x = bar.x; @@ -513,7 +545,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #30 +## Invalid #32 1 | class A { 2 | constructor(bar) { 3 | this.x = bar.x; @@ -541,7 +573,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #31 +## Invalid #33 1 | class A { 2 | set a(bar) { 3 | this.x = bar.x; @@ -569,7 +601,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #32 +## Invalid #34 1 | const a = { 2 | foo(bar) { 3 | a.x = bar.x; @@ -597,7 +629,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #33 +## Invalid #35 1 | const a = { 2 | set foo(bar) { 3 | a.x = bar.x; @@ -625,7 +657,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #34 +## Invalid #36 1 | function foo(bar, baz) { 2 | return [ 3 | bar.$, diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.snap b/test/snapshots/prefer-destructuring-in-parameters.js.snap index 6a95d64a2da8ac6afdf76bd5264eb54ac328dcf5..1accbaeb772ae19242624008c4d85163ce8b2a28 100644 GIT binary patch literal 2499 zcmV;!2|V^eRzVY00000000B! zS_xEC*BQP%Tmp&>#^aI-{y~T!SLzsTTn;3tfGeOTD1yMi3_1!kFf+igiJBCx%ZVBr zH?-DMjT%f+6PHF38x!MFEje0a5>rWHjm9*dMx)l2p7d^mv%L3a97pR(=A7^R?|pOc zo$tT*fB(D7Txo|;Bq26m`u*%Kha|>A zJC2cA1x5uv#3q>WQ;TVnSvSy^bYgm0D@n=NpW;ECS9>lMGZ!(8)<3)=>k4n8a~_R)tp zb`Ydq?X^4Nc=C}G6OOjt8qq|&rtAfQUj-50!q@yE&Gvrvfq5H0ZT!df;}T=f3Cs^h zNLTjaq1Bn)&U|*c@1S=NZaXS5wnboZCxi@}*InNbwxq1X3RB~i;kyGQ#vTwz?Tk># z-t^3mB-_MSo2#C>652|-p0eu%`h*}sIXpdKi{OCYmpfHygMOSXPKtMx5(E+YH2K*sjy&Qaf!wVr>6#j$H&t_Fv!maB+F_ z@*h5cn^_ClRTaU;pB2ed6%p>+t4nr4nP)BREh-1H>}!se82eX&oJfRPZwBR!ZOz$Vm;6!l zLF2e<5@X*Gm>fm4T)27lRMUCWg5zg&^-VwgR$}aCfqsu86o@*q%ofldg$5)B18ATI z3QR_e6$(uzh==H`LW9|2O)AnC>y6g5!jW3@j2MVd0By9}7cs$3&Dnwz+?vbRnt5e% zku`8e4EaSMMPxrY>;rkcXdYN*naYZEkgo@w-eNVE6thH1c3mkM;Xbo1dIn|REAsOwwqTK^l zjfqop!oTi}l#MD37Cm8f?t$gbJGWP%jv)CXv31kCqi*q&LpA&f@a|KZ7d94Jm0o0wwh^te53EguWmR0I z$F$*xj3KS`zbqMnq?(rkt6XC*O0CO{`U*&Nd#}_gyTmJaez*9kd)w3(mKh7I29uGg z5s!*lZ!I$$!RGQf%(st-a~&T4q7Ktk>v<&n;euSuw@FiXWrbXD-LC7COa63iypwBM zBCaj$oG_7(ryCGG2c zkzjQCBGMAr;#{)%Je9O5>M)h}CyNIp+{tRfjdpIULdG*bQubM&%9PJvD~WKmL2;go z2b8E!l~ktR|IZb~QsosyTW{a-8sfo=CX0s^gvaH>-9}P|ch2N0c$3Q}KI%?NzgC?@ zQS}O~++*LzdO467?4j!R9TV;nx(nspr9peU9S5&HhpvB|{e@b}sJ{Io*0T4P%lm4% z$_TpDh*#xMs%5r$$6MhqqlB^XLEkf+mv!HS^_Lpg>D z3^ojv7^-T?W1EX15yMCfqcDudkc1%_Lkfm57{+24hhaR12^c0~NX3wbAsxdc43jZT z!SD=*XE9`8n2KQ#a!c(nM(0vaGmu>?I8O^`SOJAzpaqzdK?>bL3vj1tztB78Hht}BWQIIX zk{xoETgl>Bwp$bI-O9G9n4>&8ecZij8yZ@X4i7Q;+!S!5<3`U-AvZI*aU42&Z{YN7 zZsu@P#7!|bMs7^pI1VknFXgnE8w)p9ZpyeR=ca-i$Dyb9m7JCf0lG8c7zXq{k@a-k zNNz@PGn$(uZj!l4;l?pc=>1qukK<-MHxsy-$W1CYY1}x55xt+p>B-zo;pQ1`p5-Qk zo2lG5h8exjH*gQPA9=VWxP^=B14igO*x&l8hMW2nP3$(_-f8sa$VF|Z(#whG z{oX+JdMO7^8>rq2blX6cKNC_|&CxlIhZSA5vcF=6GvzOTCKSU1@!=UA+`H`@dL5Z*^kc&v+Pv$E(|PlEj+c81q0U-p_)T=~)`&%@$> zz4B_<-nPSPSiV8^(eu*-BfWngl)8y_`S4`s)~>I~O*IGDAodP&0MF8~_hZj6=}uBI zKeF=h2N2Z_>9#{JPyYh(Td1j@+F2`0^rk}Bp_!}ffT-ZzMyNjqNdC;8#9!M~h3y7t zoNLvn2iNUd>cM4KPs80u{VB@FPre^&Emt|zdH@cz{Qch-xpNSQJ>6(cj2C}>@!_8@ N{{#0*7Ht(P008!x-XH(~ literal 2384 zcmV-W39t4+RzVgdrNVWMP0M4EEr2rb!XJwW00000000B! zS_@EA*BL%sL;^-fG!boh{1S)|j)ZN*C=3_~FBL&!1Q7)m*cB9ZVRwP$C159Lf;MUx z6BKLfM5B&cCyh!cB+VpkCDsfUYc!L#5}(*kG7~i>K04{S=bROG_ujiJtPa!e%s2l% zALktY|D5kU@7+HNp&;~ldHuB;&6)pP3voMoa$dM1An}*MafaaW(>`O&t4^1nNcBt| zoqiDslpW>9u#UiI+mag@&C{Q``5nZy`_`lgl)cQciBuVqxqH^-yt8WDp9IQgaaG@MEo8v_@mVE`hSIb3FMN$Gc^8@@E?EY$|-ls9v{Ona~#9& z@d%|~pK>JVWODcCX`kJ@9n(cxP-Oc!ntTw_rv1UYCt~ucOP^M@rtL7#6e#-zN6iF; zN_K7geusZ+<><}&1K&m;aT6$eh$D6)LgmL6W`7}=7aZ!To%5~Fy-b0!uW^if0-@Tp zu_u1iT1Vm0&~A8o$|Z zhc%T%|8T-%(VA9)ve!78Cn2u3Pv45HW z8G*8){tSBw{!)S7_wUR+)qVBX%R?G_Cc0C0VgSR39Ge0W>aD7~dp7Zd?sHX(t0u%u z&k`v6F-I~W^kq=`zYc$Wy(K<6dK=!gw?d$7J4fhLg!;exd++-PyMm8qw12#I?CC=S zWpg;L5`5DU_FnRvIaQ5qhd2DYvnN!btbY*0y99UpuH=V!qVymCdJAoA@_b96tjE&~ zhY9|3`G@PLyDsY2o;+LB()H6$fwCx=;Z*{6x?GQ>h%x{ zp*h+TgVB^!swvaxOc~k)wP8gV#KwU-)b0;q-d5F_z2oevD^MF)Ve*g@xgw1GM<7`w zf4TGr`7CQb7>o6lrA1Jnfg+93WT-4OX^Nmk2jyymx=drz7--h~2x~88afva)OtP9| z2scCI8puNwd1$bzUFbm0R8QOztBXsm>M+`;{VT$Y}Y0q2N zS0mrIRAU8^sul8`n``+oMXH9Z$Z3*_491YhL>UaRv9XY6U8q*k_Xt)-e9ChW0qdmT zp*la$;yl$%{D5kV8WR~ILzd-Mq+Icc5M-!i&y{L)D^10$@7S|-sYd0l<3$|nj)%kY z54HcMD@})?bv5k4OyyK#-9_t>QXsXKc+6aiwGlN+Go`DhOJR%a-I8#S6m!zSTH7WM zQEGCXrW)eyR-p#@kXQl7E0K$u*KNL)_iEyZ)yR}si`34I_%`IYW}8v3mLKvDWxQK@ zPFtxfG?nOev?qAD292rGpaZi_RLvGOT9;vg@G{iN2FEIN#pt-?CjK8=hv;&n#!!Hv z5JM3L4F)ZSl^BXKlweqeVKs(Q3}qN}81xv*F;rkMki{2+2}31@Dh$;a%ou7g)HYzK z%fk?lApyfn7!olgVMxZ1f*}>dTnzIt%*T+1VF8A83>g>}VpxRXWekfkynE?h2%0|}^_YC*DMl2|H4>1MI6f#r9jD{I4Gb@=H+;w8Qgwd;*SA8%a$IN_Y(wJGmOgb|e%nX*1m|n!_mzi12%qz?+VJ4HAEM^AFOiX7p z`r*h8?B(`9E|)kvx!4XcLO;L`0YG^_)E zo9xMI#2oacPsDtOT%;)_HGw(8<~Y)%u-I^51}h1VK1 zyAyu9#PL8S$HQ%$Hpn|2?#N+RIJ?5>Ws;u1WtT~D9sVeG<4F%PC9}5~4!$H%JnG$lAL8h9 z0+&fm`Gt2&rp_L8rn{RhSc>M-1WXi2nj&(d;KLDF6VA C@RghZ From 66ad0af2031462cd9066e4899ff5b76717ecf51a Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 18:09:16 +0800 Subject: [PATCH 23/32] Style --- rules/prefer-destructuring-in-parameters.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index 72bcc27b9e..881773219a 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -1,6 +1,6 @@ 'use strict'; const {upperFirst} = require('lodash'); -const {findVariable, isNotOpeningParenToken} = require('eslint-utils'); +const {findVariable} = require('eslint-utils'); const getDocumentationUrl = require('./utils/get-documentation-url'); const avoidCapture = require('./utils/avoid-capture'); const hasParenthesesAroundParameterList = require('./utils/has-parentheses-around-parameter-list'); From 76fcf7f0f202e6f78a451e1f8678e7e8e86a5167 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 18:13:20 +0800 Subject: [PATCH 24/32] Minor refactor --- rules/prefer-destructuring-in-parameters.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index 881773219a..e3125ab7f4 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -134,8 +134,8 @@ function fix({sourceCode, functionNode, parameter, properties, type}) { yield * fixArrowFunctionParentheses(fixer); yield fixParameter(fixer); - for (const {variable, expressions} of properties.values()) { - for (const {node} of expressions) { + for (const {variable, memberExpressions} of properties.values()) { + for (const node of memberExpressions) { yield fixer.replaceText(node, variable); } } @@ -196,9 +196,9 @@ const create = context => { const indexOrProperty = memberExpression[type]; if (properties.has(indexOrProperty)) { - properties.get(indexOrProperty).expressions.push(memberExpression); + properties.get(indexOrProperty).memberExpressions.push(node); } else { - properties.set(indexOrProperty, {expressions: [memberExpression]}); + properties.set(indexOrProperty, {memberExpressions: [node]}); } } From 3b879a0163c35a751e49ffa4c66bd605dbe44b6d Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 18:17:25 +0800 Subject: [PATCH 25/32] Rename --- rules/prefer-destructuring-in-parameters.js | 4 ++-- ...eter-list.js => has-parentheses-around-parameters-list.js} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename rules/utils/{has-parentheses-around-parameter-list.js => has-parentheses-around-parameters-list.js} (89%) diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index e3125ab7f4..edd35cf244 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -3,7 +3,7 @@ const {upperFirst} = require('lodash'); const {findVariable} = require('eslint-utils'); const getDocumentationUrl = require('./utils/get-documentation-url'); const avoidCapture = require('./utils/avoid-capture'); -const hasParenthesesAroundParameterList = require('./utils/has-parentheses-around-parameter-list'); +const hasParenthesesAroundParametersList = require('./utils/has-parentheses-around-parameters-list'); const MESSAGE_ID = 'prefer-destructuring-in-parameters'; const messages = { @@ -109,7 +109,7 @@ function getMemberExpression(node) { function fix({sourceCode, functionNode, parameter, properties, type}) { function * fixArrowFunctionParentheses(fixer) { - if (!hasParenthesesAroundParameterList(functionNode, sourceCode)) { + if (!hasParenthesesAroundParametersList(functionNode, sourceCode)) { yield fixer.insertTextBefore(parameter, '('); yield fixer.insertTextAfter(parameter, ')'); } diff --git a/rules/utils/has-parentheses-around-parameter-list.js b/rules/utils/has-parentheses-around-parameters-list.js similarity index 89% rename from rules/utils/has-parentheses-around-parameter-list.js rename to rules/utils/has-parentheses-around-parameters-list.js index f45beec5be..7ef81710eb 100644 --- a/rules/utils/has-parentheses-around-parameter-list.js +++ b/rules/utils/has-parentheses-around-parameters-list.js @@ -8,7 +8,7 @@ Check if function has parentheses around parameters list. @param {SourceCode} sourceCode - The source code object. @returns {boolean} */ -function hasParenthesesAroundParameterList(node, sourceCode) { +function hasParenthesesAroundParametersList(node, sourceCode) { if ( node.type !== 'ArrowFunctionExpression' || node.params.length !== 1 From 51ab3bbd75f025fbf470b994b857d9e671d5a5f5 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 18:23:33 +0800 Subject: [PATCH 26/32] Exclude `NewExpression` from `isNodeEffectThis` --- rules/prefer-destructuring-in-parameters.js | 2 +- .../has-parentheses-around-parameters-list.js | 2 +- test/prefer-destructuring-in-parameters.js | 4 +- .../prefer-destructuring-in-parameters.js.md | 68 +++++++++++++----- ...prefer-destructuring-in-parameters.js.snap | Bin 2499 -> 2588 bytes 5 files changed, 54 insertions(+), 22 deletions(-) diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index edd35cf244..426304cd31 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -24,7 +24,7 @@ function isNodeEffectThis(node) { } if ( - (parent.type === 'CallExpression' || parent.type === 'NewExpression') && + parent.type === 'CallExpression' && parent.callee === node ) { return true; diff --git a/rules/utils/has-parentheses-around-parameters-list.js b/rules/utils/has-parentheses-around-parameters-list.js index 7ef81710eb..a96bf422fd 100644 --- a/rules/utils/has-parentheses-around-parameters-list.js +++ b/rules/utils/has-parentheses-around-parameters-list.js @@ -20,4 +20,4 @@ function hasParenthesesAroundParametersList(node, sourceCode) { return isOpeningParenToken(sourceCode.getTokenBefore(onlyArgument)); } -module.exports = hasParenthesesAroundParameterList; +module.exports = hasParenthesesAroundParametersList; diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index 52e785297b..aff878f8a7 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -29,8 +29,6 @@ test.snapshot({ 'const foo = bar => bar.null', 'const foo = bar => bar.x()', 'const foo = bar => bar[0]()', - 'const foo = bar => new bar.X()', - 'const foo = bar => new bar[0]()', 'const foo = bar => bar.x = 1', 'const foo = bar => bar[0] = 1', 'const foo = bar => bar.x += 1', @@ -66,6 +64,8 @@ test.snapshot({ 'const foo = bar => x = bar[0]', 'const foo = bar => a(bar.x)', 'const foo = bar => a(bar[0])', + 'const foo = bar => new bar.X()', + 'const foo = bar => new bar[0]()', 'const foo = bar => new A(bar.x)', 'const foo = bar => new A(bar[0])', 'const foo = bar => a += bar.x', diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.md b/test/snapshots/prefer-destructuring-in-parameters.js.md index c09cc9db45..12133433b4 100644 --- a/test/snapshots/prefer-destructuring-in-parameters.js.md +++ b/test/snapshots/prefer-destructuring-in-parameters.js.md @@ -284,6 +284,38 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #18 + 1 | const foo = bar => new bar.X() + +> Output + + `␊ + 1 | const foo = ({X}) => new X()␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => new bar.X()␊ + | ^^^^^ `bar.X` should be destructed in parameter `bar`.␊ + ` + +## Invalid #19 + 1 | const foo = bar => new bar[0]() + +> Output + + `␊ + 1 | const foo = ([firstElementOfBar]) => new firstElementOfBar()␊ + ` + +> Error 1/1 + + `␊ + > 1 | const foo = bar => new bar[0]()␊ + | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ + ` + +## Invalid #20 1 | const foo = bar => new A(bar.x) > Output @@ -299,7 +331,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #19 +## Invalid #21 1 | const foo = bar => new A(bar[0]) > Output @@ -315,7 +347,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ `bar[0]` should be destructed in parameter `bar`.␊ ` -## Invalid #20 +## Invalid #22 1 | const foo = bar => a += bar.x > Output @@ -331,7 +363,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #21 +## Invalid #23 1 | const foo = bar => +bar.x > Output @@ -347,7 +379,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #22 +## Invalid #24 1 | const foo = bar => typeof bar.x > Output @@ -363,7 +395,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #23 +## Invalid #25 1 | const foo = bar => delete bar.x.y > Output @@ -379,7 +411,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #24 +## Invalid #26 1 | function foo (bar) {return bar.x} > Output @@ -395,7 +427,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #25 +## Invalid #27 1 | const foo = function (bar) {return bar.x} > Output @@ -411,7 +443,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #26 +## Invalid #28 1 | const foo = bar => baz => bar.x === baz.y > Output @@ -434,7 +466,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `baz.y` should be destructed in parameter `baz`.␊ ` -## Invalid #27 +## Invalid #29 1 | const foo = bar => baz => bar.x === baz.x > Output @@ -457,7 +489,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `baz.x` should be destructed in parameter `baz`.␊ ` -## Invalid #28 +## Invalid #30 1 | const foo = async bar => await bar.x > Output @@ -473,7 +505,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #29 +## Invalid #31 1 | const foo = async (bar) => await bar.x > Output @@ -489,7 +521,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `bar.x` should be destructed in parameter `bar`.␊ ` -## Invalid #30 +## Invalid #32 1 | class A { 2 | foo(bar) { 3 | this.x = bar.x; @@ -517,7 +549,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #31 +## Invalid #33 1 | const A = class { 2 | foo(bar) { 3 | this.x = bar.x; @@ -545,7 +577,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #32 +## Invalid #34 1 | class A { 2 | constructor(bar) { 3 | this.x = bar.x; @@ -573,7 +605,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #33 +## Invalid #35 1 | class A { 2 | set a(bar) { 3 | this.x = bar.x; @@ -601,7 +633,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #34 +## Invalid #36 1 | const a = { 2 | foo(bar) { 3 | a.x = bar.x; @@ -629,7 +661,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #35 +## Invalid #37 1 | const a = { 2 | set foo(bar) { 3 | a.x = bar.x; @@ -657,7 +689,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #36 +## Invalid #38 1 | function foo(bar, baz) { 2 | return [ 3 | bar.$, diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.snap b/test/snapshots/prefer-destructuring-in-parameters.js.snap index 1accbaeb772ae19242624008c4d85163ce8b2a28..3360629fc253d6dc183713eabe0d946397c3d8ef 100644 GIT binary patch literal 2588 zcmV+%3gh)bRzVFM@jAiL8;|AjbAX9GeJ&Pj!33I`>rB(TSZWJ~s7& zfEas5M3%oGgr@cUcv$Z%E0%4`sh{+>20)B$5RuVI5F#}1#2)L_?VDMDe!6pg@!lH5 z*o`6vQERSme!TdrnVYiWY)yriR;UnTbt1l}HSUf*9j7)l9yuNnwpN%l12H!KF^=N| z{j(2O?gn-L)+FZmt9BgTFw;`Km5NVY9j@7Z(u>e4jX|6$*hK08u-A;u1QlH&+L z*^X(Mr;&BaA5K)oU+s2JgBbf%SB}*L^Mo;Ry6a5?t9F#0jK4YmkN%8(r5ne+5RT$d zK`8GYDm12_di79`%R0-Bg$og5e=kDaLlCNxyBxi(|Mv0+;WroM-H3e`F?Ozq%LKKm zMR&^2_E?*u8ntHUdwzEjV~0J>v7KPydCjLIdfZLW_usN_W73`rh_RPNn13z^OT*^( z8udn0ebMM!M*~vlzl<2$EW+56Xuf%K?{{~PDTTgQF5jss+KU)_NJRE8$gBv1$6L%l zjLKf}#ekHmll6$PZ;FWRMaE{yvckeyyXszBfA!A$XM5`rV~a)HBG`6e(}ur(_}ZDc z3BUQ_i!Zw$LX4fzo8u(G&M$Qls-VgfnW2l{P=^k0M2r>sa4aG?F!_Grz8~x9x=8-#L&KiaPVe+-Rk{ysmaY7`fa?OdJr*IFXEpBpUe~f)O)Aq4>obVH__LeAbK_pNkJmAMsT~#roan zKSGTCyNEgch`jh)bNx2G>ZRD!GXs-~{)HI3P6Q4Ygp1v849v-TZ(sLw3AP@_wZVw7 zFNqi)L9|{QwQc;$tcto-TbF*f^F$>clk*(gz^MCOyk> zh2Z|BTh~wRzF>T@v01lh_kY$S#*XUGv6sMK=**&{Ux3ifZ(R?)e zglUmkg+(T_Wn78ARBy1P6eem-IZ+U&25qFv7g3JgStYC`zsehvhpfRlQA!5RYO{${ z_136oq>N(I#PqN_DP8VH=@_efojW)UNpfqzthW#)yk1-?}9|6i@cQ1GFxkNbEm6f`c}r}|+V<|r@;y6+4y}CLcpyPznuCT3v>6~lB4X&7c;cmab3Lpp{G44D{aiu*I)Q^l<( zixPZG4af9(7|$@IEuj^LvkEdM(F!A21sU6Dg^{cRHIfx$Ns-D?jLxN;YA}12F`iaX zu?jMyKr1jK17(JTR^Ud{aiJw2c{uHa#+b5X#Bjte~(g`?@(D-lrrhq7!#7DsAEm_ADcLSlK4nnQ`%z1e%x=!&+#bYr^q40? zY1sL(lk<6Stq12+Zq9^#H5D4qrXp8nE^^r$gYp!iUn{q(cdoY$S3q>oRlM+>jRaasD}Sez1_zJxRcYmC!Hh|=w<*oKYx z!?^%yyPk9Y-vLvP_F^>o;(AW0`}{}YdQSS9nJmQC8w;kB%CS|A@+xaY00000000B! zS_xEC*BQP%Tmp&>#^aI-{y~T!SLzsTTn;3tfGeOTD1yMi3_1!kFf+igiJBCx%ZVBr zH?-DMjT%f+6PHF38x!MFEje0a5>rWHjm9*dMx)l2p7d^mv%L3a97pR(=A7^R?|pOc zo$tT*fB(D7Txo|;Bq26m`u*%Kha|>A zJC2cA1x5uv#3q>WQ;TVnSvSy^bYgm0D@n=NpW;ECS9>lMGZ!(8)<3)=>k4n8a~_R)tp zb`Ydq?X^4Nc=C}G6OOjt8qq|&rtAfQUj-50!q@yE&Gvrvfq5H0ZT!df;}T=f3Cs^h zNLTjaq1Bn)&U|*c@1S=NZaXS5wnboZCxi@}*InNbwxq1X3RB~i;kyGQ#vTwz?Tk># z-t^3mB-_MSo2#C>652|-p0eu%`h*}sIXpdKi{OCYmpfHygMOSXPKtMx5(E+YH2K*sjy&Qaf!wVr>6#j$H&t_Fv!maB+F_ z@*h5cn^_ClRTaU;pB2ed6%p>+t4nr4nP)BREh-1H>}!se82eX&oJfRPZwBR!ZOz$Vm;6!l zLF2e<5@X*Gm>fm4T)27lRMUCWg5zg&^-VwgR$}aCfqsu86o@*q%ofldg$5)B18ATI z3QR_e6$(uzh==H`LW9|2O)AnC>y6g5!jW3@j2MVd0By9}7cs$3&Dnwz+?vbRnt5e% zku`8e4EaSMMPxrY>;rkcXdYN*naYZEkgo@w-eNVE6thH1c3mkM;Xbo1dIn|REAsOwwqTK^l zjfqop!oTi}l#MD37Cm8f?t$gbJGWP%jv)CXv31kCqi*q&LpA&f@a|KZ7d94Jm0o0wwh^te53EguWmR0I z$F$*xj3KS`zbqMnq?(rkt6XC*O0CO{`U*&Nd#}_gyTmJaez*9kd)w3(mKh7I29uGg z5s!*lZ!I$$!RGQf%(st-a~&T4q7Ktk>v<&n;euSuw@FiXWrbXD-LC7COa63iypwBM zBCaj$oG_7(ryCGG2c zkzjQCBGMAr;#{)%Je9O5>M)h}CyNIp+{tRfjdpIULdG*bQubM&%9PJvD~WKmL2;go z2b8E!l~ktR|IZb~QsosyTW{a-8sfo=CX0s^gvaH>-9}P|ch2N0c$3Q}KI%?NzgC?@ zQS}O~++*LzdO467?4j!R9TV;nx(nspr9peU9S5&HhpvB|{e@b}sJ{Io*0T4P%lm4% z$_TpDh*#xMs%5r$$6MhqqlB^XLEkf+mv!HS^_Lpg>D z3^ojv7^-T?W1EX15yMCfqcDudkc1%_Lkfm57{+24hhaR12^c0~NX3wbAsxdc43jZT z!SD=*XE9`8n2KQ#a!c(nM(0vaGmu>?I8O^`SOJAzpaqzdK?>bL3vj1tztB78Hht}BWQIIX zk{xoETgl>Bwp$bI-O9G9n4>&8ecZij8yZ@X4i7Q;+!S!5<3`U-AvZI*aU42&Z{YN7 zZsu@P#7!|bMs7^pI1VknFXgnE8w)p9ZpyeR=ca-i$Dyb9m7JCf0lG8c7zXq{k@a-k zNNz@PGn$(uZj!l4;l?pc=>1qukK<-MHxsy-$W1CYY1}x55xt+p>B-zo;pQ1`p5-Qk zo2lG5h8exjH*gQPA9=VWxP^=B14igO*x&l8hMW2nP3$(_-f8sa$VF|Z(#whG z{oX+JdMO7^8>rq2blX6cKNC_|&CxlIhZSA5vcF=6GvzOTCKSU1@!=UA+`H`@dL5Z*^kc&v+Pv$E(|PlEj+c81q0U-p_)T=~)`&%@$> zz4B_<-nPSPSiV8^(eu*-BfWngl)8y_`S4`s)~>I~O*IGDAodP&0MF8~_hZj6=}uBI zKeF=h2N2Z_>9#{JPyYh(Td1j@+F2`0^rk}Bp_!}ffT-ZzMyNjqNdC;8#9!M~h3y7t zoNLvn2iNUd>cM4KPs80u{VB@FPre^&Emt|zdH@cz{Qch-xpNSQJ>6(cj2C}>@!_8@ N{{#0*7Ht(P008!x-XH(~ From 24f7d0b045e18f60c76806eadaba39b745108f41 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 18:30:42 +0800 Subject: [PATCH 27/32] Fix `hasParenthesesAroundParametersList` function --- .../has-parentheses-around-parameters-list.js | 6 ++- test/prefer-destructuring-in-parameters.js | 2 + .../prefer-destructuring-in-parameters.js.md | 44 +++++++++++++++--- ...prefer-destructuring-in-parameters.js.snap | Bin 2588 -> 2710 bytes 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/rules/utils/has-parentheses-around-parameters-list.js b/rules/utils/has-parentheses-around-parameters-list.js index a96bf422fd..48b2b54c4d 100644 --- a/rules/utils/has-parentheses-around-parameters-list.js +++ b/rules/utils/has-parentheses-around-parameters-list.js @@ -17,7 +17,11 @@ function hasParenthesesAroundParametersList(node, sourceCode) { } const [onlyArgument] = node.params; - return isOpeningParenToken(sourceCode.getTokenBefore(onlyArgument)); + const tokenBefore = sourceCode.getTokenBefore(onlyArgument); + return tokenBefore && + // `(` maybe not belong to function, example `array.map(x => x)` + tokenBefore.range[0] >= node.range[0] && + isOpeningParenToken(tokenBefore); } module.exports = hasParenthesesAroundParametersList; diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index aff878f8a7..291d772cf7 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -78,6 +78,8 @@ test.snapshot({ 'const foo = bar => baz => bar.x === baz.x', 'const foo = async bar => await bar.x', 'const foo = async (bar) => await bar.x', + 'array.map(foo => foo.x)', + 'foo => foo.x', outdent` class A { foo(bar) { diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.md b/test/snapshots/prefer-destructuring-in-parameters.js.md index 12133433b4..13274bc6bd 100644 --- a/test/snapshots/prefer-destructuring-in-parameters.js.md +++ b/test/snapshots/prefer-destructuring-in-parameters.js.md @@ -522,6 +522,38 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #32 + 1 | array.map(foo => foo.x) + +> Output + + `␊ + 1 | array.map(({x}) => x)␊ + ` + +> Error 1/1 + + `␊ + > 1 | array.map(foo => foo.x)␊ + | ^^^^^ `foo.x` should be destructed in parameter `foo`.␊ + ` + +## Invalid #33 + 1 | foo => foo.x + +> Output + + `␊ + 1 | ({x}) => x␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo => foo.x␊ + | ^^^^^ `foo.x` should be destructed in parameter `foo`.␊ + ` + +## Invalid #34 1 | class A { 2 | foo(bar) { 3 | this.x = bar.x; @@ -549,7 +581,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #33 +## Invalid #35 1 | const A = class { 2 | foo(bar) { 3 | this.x = bar.x; @@ -577,7 +609,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #34 +## Invalid #36 1 | class A { 2 | constructor(bar) { 3 | this.x = bar.x; @@ -605,7 +637,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #35 +## Invalid #37 1 | class A { 2 | set a(bar) { 3 | this.x = bar.x; @@ -633,7 +665,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #36 +## Invalid #38 1 | const a = { 2 | foo(bar) { 3 | a.x = bar.x; @@ -661,7 +693,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #37 +## Invalid #39 1 | const a = { 2 | set foo(bar) { 3 | a.x = bar.x; @@ -689,7 +721,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #38 +## Invalid #40 1 | function foo(bar, baz) { 2 | return [ 3 | bar.$, diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.snap b/test/snapshots/prefer-destructuring-in-parameters.js.snap index 3360629fc253d6dc183713eabe0d946397c3d8ef..5cbdcd6f438ef3a37aca696f008d32dcd1073266 100644 GIT binary patch literal 2710 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 Date: Thu, 21 Jan 2021 18:32:14 +0800 Subject: [PATCH 28/32] Add comment --- test/prefer-destructuring-in-parameters.js | 1 + .../prefer-destructuring-in-parameters.js.md | 30 ++++++++++++++---- ...prefer-destructuring-in-parameters.js.snap | Bin 2710 -> 2749 bytes 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/test/prefer-destructuring-in-parameters.js b/test/prefer-destructuring-in-parameters.js index 291d772cf7..2fe65f8382 100644 --- a/test/prefer-destructuring-in-parameters.js +++ b/test/prefer-destructuring-in-parameters.js @@ -79,6 +79,7 @@ test.snapshot({ 'const foo = async bar => await bar.x', 'const foo = async (bar) => await bar.x', 'array.map(foo => foo.x)', + 'array.map((foo => foo.x))', 'foo => foo.x', outdent` class A { diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.md b/test/snapshots/prefer-destructuring-in-parameters.js.md index 13274bc6bd..44430d51d8 100644 --- a/test/snapshots/prefer-destructuring-in-parameters.js.md +++ b/test/snapshots/prefer-destructuring-in-parameters.js.md @@ -538,6 +538,22 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #33 + 1 | array.map((foo => foo.x)) + +> Output + + `␊ + 1 | array.map((({x}) => x))␊ + ` + +> Error 1/1 + + `␊ + > 1 | array.map((foo => foo.x))␊ + | ^^^^^ `foo.x` should be destructed in parameter `foo`.␊ + ` + +## Invalid #34 1 | foo => foo.x > Output @@ -553,7 +569,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^ `foo.x` should be destructed in parameter `foo`.␊ ` -## Invalid #34 +## Invalid #35 1 | class A { 2 | foo(bar) { 3 | this.x = bar.x; @@ -581,7 +597,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #35 +## Invalid #36 1 | const A = class { 2 | foo(bar) { 3 | this.x = bar.x; @@ -609,7 +625,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #36 +## Invalid #37 1 | class A { 2 | constructor(bar) { 3 | this.x = bar.x; @@ -637,7 +653,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #37 +## Invalid #38 1 | class A { 2 | set a(bar) { 3 | this.x = bar.x; @@ -665,7 +681,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #38 +## Invalid #39 1 | const a = { 2 | foo(bar) { 3 | a.x = bar.x; @@ -693,7 +709,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #39 +## Invalid #40 1 | const a = { 2 | set foo(bar) { 3 | a.x = bar.x; @@ -721,7 +737,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #40 +## Invalid #41 1 | function foo(bar, baz) { 2 | return [ 3 | bar.$, diff --git a/test/snapshots/prefer-destructuring-in-parameters.js.snap b/test/snapshots/prefer-destructuring-in-parameters.js.snap index 5cbdcd6f438ef3a37aca696f008d32dcd1073266..022183169c11d7f1a903a7f4e6624e694631b8b4 100644 GIT binary patch literal 2749 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 D0xCs7 literal 2710 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 Q2VeI73u9(nUtlf(0BEd5 Date: Thu, 21 Jan 2021 18:35:39 +0800 Subject: [PATCH 29/32] Turn off rule on `run-rules-on-codebase` job --- test/run-rules-on-codebase/lint.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/run-rules-on-codebase/lint.js b/test/run-rules-on-codebase/lint.js index 308e37640a..0269ba179b 100644 --- a/test/run-rules-on-codebase/lint.js +++ b/test/run-rules-on-codebase/lint.js @@ -28,7 +28,10 @@ const eslint = new ESLint({ fn: false } } - ] + ], + + // TODO: enable this after #1045 merge + 'unicorn/prefer-destructuring-in-parameters': 'off' } } }); From 37e24d1558be0ffd946fa62f046ae4ef19bb6ef1 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 19:10:02 +0800 Subject: [PATCH 30/32] Fix crash on typescript projects --- rules/prefer-destructuring-in-parameters.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index 426304cd31..181961e8e1 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -166,6 +166,12 @@ const create = context => { const scope = context.getScope(); const variable = findVariable(scope, parameter); + + /* istanbul ignore next: This should not happen, but integration test fails on some typescript project, and can't reproduce in tests */ + if (!variable) { + return; + } + const identifiers = variable.references.map(({identifier}) => identifier); const properties = new Map(); From c7709e763f11e30ef69b270b3946d7c407be1442 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 21 Jan 2021 19:13:58 +0800 Subject: [PATCH 31/32] Extend fix range --- rules/prefer-destructuring-in-parameters.js | 4 ++++ ...r-destructuring-in-parameters-and-prevent-abbreviations.js | 1 + 2 files changed, 5 insertions(+) create mode 100644 test/integration/fixtures-local/conflicts-prefer-destructuring-in-parameters-and-prevent-abbreviations.js diff --git a/rules/prefer-destructuring-in-parameters.js b/rules/prefer-destructuring-in-parameters.js index 181961e8e1..bc1fe3ddbb 100644 --- a/rules/prefer-destructuring-in-parameters.js +++ b/rules/prefer-destructuring-in-parameters.js @@ -4,6 +4,7 @@ const {findVariable} = require('eslint-utils'); const getDocumentationUrl = require('./utils/get-documentation-url'); const avoidCapture = require('./utils/avoid-capture'); const hasParenthesesAroundParametersList = require('./utils/has-parentheses-around-parameters-list'); +const extendFixRange = require('./utils/extend-fix-range'); const MESSAGE_ID = 'prefer-destructuring-in-parameters'; const messages = { @@ -139,6 +140,9 @@ function fix({sourceCode, functionNode, parameter, properties, type}) { yield fixer.replaceText(node, variable); } } + + // Prevent possible conflicts + yield * extendFixRange(fixer, functionNode.range); }; } diff --git a/test/integration/fixtures-local/conflicts-prefer-destructuring-in-parameters-and-prevent-abbreviations.js b/test/integration/fixtures-local/conflicts-prefer-destructuring-in-parameters-and-prevent-abbreviations.js new file mode 100644 index 0000000000..c7eda1207d --- /dev/null +++ b/test/integration/fixtures-local/conflicts-prefer-destructuring-in-parameters-and-prevent-abbreviations.js @@ -0,0 +1 @@ +foo.forEach(btn => console.log(btn.name)) From 58e9d590e7473623bbbadf6cf3160ecfa9dbe929 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Fri, 22 Jan 2021 23:36:18 +0700 Subject: [PATCH 32/32] Update has-parentheses-around-parameters-list.js --- rules/utils/has-parentheses-around-parameters-list.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/utils/has-parentheses-around-parameters-list.js b/rules/utils/has-parentheses-around-parameters-list.js index 48b2b54c4d..33b0ab75ee 100644 --- a/rules/utils/has-parentheses-around-parameters-list.js +++ b/rules/utils/has-parentheses-around-parameters-list.js @@ -2,7 +2,7 @@ const {isOpeningParenToken} = require('eslint-utils'); /** -Check if function has parentheses around parameters list. +Check if a function has parentheses around its parameter list. @param {Node} node - The AST node to check. @param {SourceCode} sourceCode - The source code object. @@ -19,7 +19,7 @@ function hasParenthesesAroundParametersList(node, sourceCode) { const [onlyArgument] = node.params; const tokenBefore = sourceCode.getTokenBefore(onlyArgument); return tokenBefore && - // `(` maybe not belong to function, example `array.map(x => x)` + // `(` may not belong to the function. For example: `array.map(x => x)` tokenBefore.range[0] >= node.range[0] && isOpeningParenToken(tokenBefore); }