From 4a4bc324bfd902b61efe905fef80fcd3ab54182f Mon Sep 17 00:00:00 2001 From: fisker Date: Sat, 23 Jan 2021 14:10:42 +0800 Subject: [PATCH 1/6] `prefer-spread`: Add a useful suggestion for `.concat` fix --- rules/prefer-spread.js | 29 ++++++++--- test/prefer-spread.js | 4 +- test/snapshots/prefer-spread.js.md | 72 ++++++++++++++++++++++++--- test/snapshots/prefer-spread.js.snap | Bin 3829 -> 4029 bytes 4 files changed, 90 insertions(+), 15 deletions(-) diff --git a/rules/prefer-spread.js b/rules/prefer-spread.js index bca7942c49..0c374547ed 100644 --- a/rules/prefer-spread.js +++ b/rules/prefer-spread.js @@ -1,5 +1,5 @@ 'use strict'; -const {isParenthesized, getStaticValue, isCommaToken} = require('eslint-utils'); +const {isParenthesized, getStaticValue, isCommaToken, hasSideEffect} = require('eslint-utils'); const getDocumentationUrl = require('./utils/get-documentation-url'); const methodSelector = require('./utils/method-selector'); const needsSemicolon = require('./utils/needs-semicolon'); @@ -10,11 +10,13 @@ const ERROR_ARRAY_FROM = 'array-from'; const ERROR_ARRAY_CONCAT = 'array-concat'; const SUGGESTION_CONCAT_ARGUMENT_IS_SPREADABLE = 'argument-is-spreadable'; const SUGGESTION_CONCAT_ARGUMENT_IS_NOT_SPREADABLE = 'argument-is-not-spreadable'; +const SUGGESTION_CONCAT_TEST_ARGUMENT = 'test-argument'; const messages = { [ERROR_ARRAY_FROM]: 'Prefer the spread operator over `Array.from(…)`.', [ERROR_ARRAY_CONCAT]: 'Prefer the spread operator over `Array#concat(…)`.', [SUGGESTION_CONCAT_ARGUMENT_IS_SPREADABLE]: 'First argument is an `array`.', - [SUGGESTION_CONCAT_ARGUMENT_IS_NOT_SPREADABLE]: 'First argument is not an `array`.' + [SUGGESTION_CONCAT_ARGUMENT_IS_NOT_SPREADABLE]: 'First argument is not an `array`.', + [SUGGESTION_CONCAT_TEST_ARGUMENT]: 'Use `Array.isArray(…)` test first argument.' }; const arrayFromCallSelector = [ @@ -90,13 +92,18 @@ function fixConcat(node, sourceCode, fixableArguments) { const lastArgument = nonEmptyArguments[nonEmptyArguments.length - 1]; let text = nonEmptyArguments - .map(({node, isArrayLiteral, isSpreadable}) => { + .map(({node, isArrayLiteral, isSpreadable, testArgument}) => { if (isArrayLiteral) { return getArrayLiteralElementsText(node, node === lastArgument.node); } const [start, end] = getParenthesizedRange(node, sourceCode); let text = sourceCode.text.slice(start, end); + + if (testArgument) { + return `...(Array.isArray(${text}) ? ${text} : [text])`; + } + if (isSpreadable) { if ( !isParenthesized(node, sourceCode) && @@ -269,7 +276,7 @@ const create = context => { } const fixableArgumentsAfterFirstArgument = getConcatFixableArguments(restArguments, scope); - problem.suggest = [ + const suggestions = [ { messageId: SUGGESTION_CONCAT_ARGUMENT_IS_SPREADABLE, isSpreadable: true @@ -278,7 +285,16 @@ const create = context => { messageId: SUGGESTION_CONCAT_ARGUMENT_IS_NOT_SPREADABLE, isSpreadable: false } - ].map(({messageId, isSpreadable}) => ({ + ]; + + if (!hasSideEffect(firstArgument, sourceCode)) { + suggestions.push({ + messageId: SUGGESTION_CONCAT_TEST_ARGUMENT, + testArgument: true + }); + } + + problem.suggest = suggestions.map(({messageId, isSpreadable, testArgument}) => ({ messageId, fix: fixConcat( node, @@ -287,7 +303,8 @@ const create = context => { [ { node: firstArgument, - isSpreadable + isSpreadable, + testArgument }, ...fixableArgumentsAfterFirstArgument ] diff --git a/test/prefer-spread.js b/test/prefer-spread.js index 7e7b662a40..5d065158f0 100644 --- a/test/prefer-spread.js +++ b/test/prefer-spread.js @@ -225,6 +225,8 @@ test.snapshot({ [EMPTY_STRING_IN_ARRAY], [[EMPTY_STRING_IN_ARRAY_OF_ARRAY]] ) - ` + `, + '[].concat((a.b.c), 2)', + '[].concat(a.b(), 2)' ] }); diff --git a/test/snapshots/prefer-spread.js.md b/test/snapshots/prefer-spread.js.md index 8101a29648..b4903e8a26 100644 --- a/test/snapshots/prefer-spread.js.md +++ b/test/snapshots/prefer-spread.js.md @@ -832,12 +832,16 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/2: First argument is an `array`.␊ + Suggestion 1/3: First argument is an `array`.␊ 1 | [...foo, ...bar]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/2: First argument is not an `array`.␊ + Suggestion 2/3: First argument is not an `array`.␊ 1 | [...foo, bar]␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 3/3: Use `Array.isArray(…)` test first argument.␊ + 1 | [...foo, ...(Array.isArray(bar) ? bar : [text])]␊ ` ## Invalid #24 @@ -944,12 +948,16 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/2: First argument is an `array`.␊ + Suggestion 1/3: First argument is an `array`.␊ 1 | [...foo, 2, ...bar]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/2: First argument is not an `array`.␊ + Suggestion 2/3: First argument is not an `array`.␊ 1 | [...foo, 2, bar]␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 3/3: Use `Array.isArray(…)` test first argument.␊ + 1 | [...foo, 2, ...(Array.isArray(bar) ? bar : [text])]␊ ` ## Invalid #30 @@ -978,12 +986,16 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/2: First argument is an `array`.␊ + Suggestion 1/3: First argument is an `array`.␊ 1 | [...foo, ...bar, 2, 3]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/2: First argument is not an `array`.␊ + Suggestion 2/3: First argument is not an `array`.␊ 1 | [...foo, bar, 2, 3]␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 3/3: Use `Array.isArray(…)` test first argument.␊ + 1 | [...foo, ...(Array.isArray(bar) ? bar : [text]), 2, 3]␊ ` ## Invalid #32 @@ -996,12 +1008,16 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/2: First argument is an `array`.␊ + Suggestion 1/3: First argument is an `array`.␊ 1 | [...foo, ...bar, 2, 3].concat(baz)␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/2: First argument is not an `array`.␊ + Suggestion 2/3: First argument is not an `array`.␊ 1 | [...foo, bar, 2, 3].concat(baz)␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 3/3: Use `Array.isArray(…)` test first argument.␊ + 1 | [...foo, ...(Array.isArray(bar) ? bar : [text]), 2, 3].concat(baz)␊ ` ## Invalid #33 @@ -1266,3 +1282,43 @@ Generated by [AVA](https://avajs.dev). 11 | [[EMPTY_STRING_IN_ARRAY_OF_ARRAY]]␊ 12 | )␊ ` + +## Invalid #48 + 1 | [].concat((a.b.c), 2) + +> Error 1/1 + + `␊ + > 1 | [].concat((a.b.c), 2)␊ + | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/3: First argument is an `array`.␊ + 1 | [...(a.b.c), 2]␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 2/3: First argument is not an `array`.␊ + 1 | [(a.b.c), 2]␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 3/3: Use `Array.isArray(…)` test first argument.␊ + 1 | [...(Array.isArray((a.b.c)) ? (a.b.c) : [text]), 2]␊ + ` + +## Invalid #49 + 1 | [].concat(a.b(), 2) + +> Error 1/1 + + `␊ + > 1 | [].concat(a.b(), 2)␊ + | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/2: First argument is an `array`.␊ + 1 | [...a.b(), 2]␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 2/2: First argument is not an `array`.␊ + 1 | [a.b(), 2]␊ + ` diff --git a/test/snapshots/prefer-spread.js.snap b/test/snapshots/prefer-spread.js.snap index 0eebd4b5a440b05d367e4546cb79637dfe42e0eb..bd6ddcab28a4593f5e008ff9dd0419fec52220fb 100644 GIT binary patch literal 4029 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 From 05f0bd1947e5d489570a050668d39cb9da507837 Mon Sep 17 00:00:00 2001 From: fisker Date: Sat, 23 Jan 2021 14:17:24 +0800 Subject: [PATCH 2/6] Fix template --- rules/prefer-spread.js | 2 +- test/snapshots/prefer-spread.js.md | 10 +++++----- test/snapshots/prefer-spread.js.snap | Bin 4029 -> 4034 bytes 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rules/prefer-spread.js b/rules/prefer-spread.js index 0c374547ed..abb1361b2d 100644 --- a/rules/prefer-spread.js +++ b/rules/prefer-spread.js @@ -101,7 +101,7 @@ function fixConcat(node, sourceCode, fixableArguments) { let text = sourceCode.text.slice(start, end); if (testArgument) { - return `...(Array.isArray(${text}) ? ${text} : [text])`; + return `...(Array.isArray(${text}) ? ${text} : [${text}])`; } if (isSpreadable) { diff --git a/test/snapshots/prefer-spread.js.md b/test/snapshots/prefer-spread.js.md index b4903e8a26..eabd0c7eb0 100644 --- a/test/snapshots/prefer-spread.js.md +++ b/test/snapshots/prefer-spread.js.md @@ -841,7 +841,7 @@ Generated by [AVA](https://avajs.dev). ␊ --------------------------------------------------------------------------------␊ Suggestion 3/3: Use `Array.isArray(…)` test first argument.␊ - 1 | [...foo, ...(Array.isArray(bar) ? bar : [text])]␊ + 1 | [...foo, ...(Array.isArray(bar) ? bar : [bar])]␊ ` ## Invalid #24 @@ -957,7 +957,7 @@ Generated by [AVA](https://avajs.dev). ␊ --------------------------------------------------------------------------------␊ Suggestion 3/3: Use `Array.isArray(…)` test first argument.␊ - 1 | [...foo, 2, ...(Array.isArray(bar) ? bar : [text])]␊ + 1 | [...foo, 2, ...(Array.isArray(bar) ? bar : [bar])]␊ ` ## Invalid #30 @@ -995,7 +995,7 @@ Generated by [AVA](https://avajs.dev). ␊ --------------------------------------------------------------------------------␊ Suggestion 3/3: Use `Array.isArray(…)` test first argument.␊ - 1 | [...foo, ...(Array.isArray(bar) ? bar : [text]), 2, 3]␊ + 1 | [...foo, ...(Array.isArray(bar) ? bar : [bar]), 2, 3]␊ ` ## Invalid #32 @@ -1017,7 +1017,7 @@ Generated by [AVA](https://avajs.dev). ␊ --------------------------------------------------------------------------------␊ Suggestion 3/3: Use `Array.isArray(…)` test first argument.␊ - 1 | [...foo, ...(Array.isArray(bar) ? bar : [text]), 2, 3].concat(baz)␊ + 1 | [...foo, ...(Array.isArray(bar) ? bar : [bar]), 2, 3].concat(baz)␊ ` ## Invalid #33 @@ -1302,7 +1302,7 @@ Generated by [AVA](https://avajs.dev). ␊ --------------------------------------------------------------------------------␊ Suggestion 3/3: Use `Array.isArray(…)` test first argument.␊ - 1 | [...(Array.isArray((a.b.c)) ? (a.b.c) : [text]), 2]␊ + 1 | [...(Array.isArray((a.b.c)) ? (a.b.c) : [(a.b.c)]), 2]␊ ` ## Invalid #49 diff --git a/test/snapshots/prefer-spread.js.snap b/test/snapshots/prefer-spread.js.snap index bd6ddcab28a4593f5e008ff9dd0419fec52220fb..475994289b924ef24dc1f438b4c7604455573f95 100644 GIT binary patch literal 4034 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 literal 4029 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 Date: Mon, 25 Jan 2021 09:40:01 +0800 Subject: [PATCH 3/6] Improve message --- rules/prefer-spread.js | 2 +- test/snapshots/prefer-spread.js.md | 10 +++++----- test/snapshots/prefer-spread.js.snap | Bin 4034 -> 4032 bytes 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rules/prefer-spread.js b/rules/prefer-spread.js index abb1361b2d..18e24d577e 100644 --- a/rules/prefer-spread.js +++ b/rules/prefer-spread.js @@ -16,7 +16,7 @@ const messages = { [ERROR_ARRAY_CONCAT]: 'Prefer the spread operator over `Array#concat(…)`.', [SUGGESTION_CONCAT_ARGUMENT_IS_SPREADABLE]: 'First argument is an `array`.', [SUGGESTION_CONCAT_ARGUMENT_IS_NOT_SPREADABLE]: 'First argument is not an `array`.', - [SUGGESTION_CONCAT_TEST_ARGUMENT]: 'Use `Array.isArray(…)` test first argument.' + [SUGGESTION_CONCAT_TEST_ARGUMENT]: 'Test first argument with `Array.isArray(…)`.' }; const arrayFromCallSelector = [ diff --git a/test/snapshots/prefer-spread.js.md b/test/snapshots/prefer-spread.js.md index eabd0c7eb0..c335328f7a 100644 --- a/test/snapshots/prefer-spread.js.md +++ b/test/snapshots/prefer-spread.js.md @@ -840,7 +840,7 @@ Generated by [AVA](https://avajs.dev). 1 | [...foo, bar]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 3/3: Use `Array.isArray(…)` test first argument.␊ + Suggestion 3/3: Test first argument with `Array.isArray(…)`.␊ 1 | [...foo, ...(Array.isArray(bar) ? bar : [bar])]␊ ` @@ -956,7 +956,7 @@ Generated by [AVA](https://avajs.dev). 1 | [...foo, 2, bar]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 3/3: Use `Array.isArray(…)` test first argument.␊ + Suggestion 3/3: Test first argument with `Array.isArray(…)`.␊ 1 | [...foo, 2, ...(Array.isArray(bar) ? bar : [bar])]␊ ` @@ -994,7 +994,7 @@ Generated by [AVA](https://avajs.dev). 1 | [...foo, bar, 2, 3]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 3/3: Use `Array.isArray(…)` test first argument.␊ + Suggestion 3/3: Test first argument with `Array.isArray(…)`.␊ 1 | [...foo, ...(Array.isArray(bar) ? bar : [bar]), 2, 3]␊ ` @@ -1016,7 +1016,7 @@ Generated by [AVA](https://avajs.dev). 1 | [...foo, bar, 2, 3].concat(baz)␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 3/3: Use `Array.isArray(…)` test first argument.␊ + Suggestion 3/3: Test first argument with `Array.isArray(…)`.␊ 1 | [...foo, ...(Array.isArray(bar) ? bar : [bar]), 2, 3].concat(baz)␊ ` @@ -1301,7 +1301,7 @@ Generated by [AVA](https://avajs.dev). 1 | [(a.b.c), 2]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 3/3: Use `Array.isArray(…)` test first argument.␊ + Suggestion 3/3: Test first argument with `Array.isArray(…)`.␊ 1 | [...(Array.isArray((a.b.c)) ? (a.b.c) : [(a.b.c)]), 2]␊ ` diff --git a/test/snapshots/prefer-spread.js.snap b/test/snapshots/prefer-spread.js.snap index 475994289b924ef24dc1f438b4c7604455573f95..992a78e7f36f58acfd2487a6b603faab270976c8 100644 GIT binary patch literal 4032 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 literal 4034 zcmV;z4?XZfRzVmO>BB zSDLA4R+^f5^Fc55qDEKE2fk2@j7rm9+&Ob*VbAXD3bI>U_pbhb?EcT3Ip6oqeBXTY zIBQz~5CbF&)0(|9BeU_l-LjbtA=g!zul3Wvdu?id(e>Cj;?J&gb(*%bRybQ{IgDNI0t^U`3 z&;Bj-GKksV2^Jw6b@256X^)oiTzoY_?s3z-x(Q}?5Xf8wY)4?W?=PxYygaMl_BUfZ zCS1G+F?))je@g)TZVp+p_4;hLobO(EIrJw*HpFZ{Hv#1j1E7doDyj19aQR00niPPDwyV?b8`F?)t!P8%dowaeDD58#9~7EEx1=3B>GN0{J5V4E&&UV{vi6;4m-cIFBh2Jt1ai5csu2 zB`!~SYU!TO*>MHmPyF!q3;7VU{RlQA#B_=Ybw8OoyGSALQ8fS8hahIJ5lm_iz_6j7 z9X|bL**kHrLANs27VLzWEhSj$0YF@<<1uG${CZkHIl6giQD6MZdi`@6`Jcv#q=Y%t46X+~rbc)t7VQ z7PczAm9`%BB%UoM=-mO8_$EZ*(kI0G+fFZdjqmoEC&cV9g1rcd!~1*R+12Cy4M(T! zPJHW0cZk`u1j9Q5pw3HTZsY}=e?0l-p4(3+41t)PK~Ra1nk(gsU#|IN^nCy6hOaW_ zLCl7B5>SP}6<&<0$hbOYZ04%#V=gp9ZOgN6-U6m0Xg)b|WwKv(wa=JGcip<0mnp&Q zi$2J2+ox~7cI@^K9}hnq*4pR5Wr*322*P~h`GvpE^l=O9xUl^oh}l~N`fjMTB$)-?2kx~C z3s3H#$tw+zVD{W&0L+hm^!XHZZ&k{Bn+g;jhYmo@D!L2!3Ss`>qRU6V^r}2|VDqc* zm0x-UVz!!KtQ3`4^L^Nh=l3U827l3|{P&ViB$z$v55RMJ-xejoZt2l^dsa1Z{idA+ zvlrw5EMC91*Wuj6AIipsfBkK4uS*ilMg#z`tn^^mb&ugI6Wv2UYUz0`1Y&j!!6Ag@ z1CEDJ?)u&OsdKM)Ti5gU5{OyXKmo5HtUjjS>$Q8(UiI-NrJimVw?NE(NYGsgz`Bmz z{h83$zB}XbZvVKG9#Id1;E?;7Ti^q`Yc+p>%*4iZ_HZ*F&j^C5Mguh^8-VleCpbd z1P5bvJth+mU$fnM7 zYsQ@Qmtb}a!oCk8i~W@+9t+SdORHJ^^Xm|^UlN1`1F(PJmGnbr*!U~&pNe?6BIyjo zY$ibk!ht1~2NT#`(TBFWr!45adltlOpFRT4A$T5tVz|BmGs<3lsbHXMhT-9Rwp2>{9p zb{1Y`3*Oz=S$0^pBRvITb^$^AFr-h^mnE#)@9n3msyjv=YC9TYmL+Ht4#4@Jwp}=N z)HN!u=HDG2$m)4mOv#$LFyo7M$w@Dv&DRH^$ z9nwzOyDSgI6rR0Kur30Co0AJh{TmGRZuN|Id&b$~uOMbi2vm^(eCu;?m2Yg+H&gnL zDbKk%6pi#eJB^@y6pDN`LtK(FYkpkbqPX3_pqKswF{>h2kMOh5Q5zGpy=do9lxB6^^nAH$mK)CmVrmVayInKr;O+gz;D_4e5GBcP2 zIfMSOuA+;{uHob&t4PslQ`812`YPvt%g}ucy2O9R;}0`J&!usC#*o1=ITQ7qI+f8) zA~`6r$(B<&ZouO{X(HFj=jaGeL4jC1;Y=)9v+G z*PeF%xW?wDr*k<5jZVub15|yPXpKI{z^L`3Z$x> zL4RxYWa~6X>N-@=AiAJhoxzr{e}$wfUedT6jX&B+*0DJD&%2hGG%@x4e7 z8Pktfhv~~Cpg*jPrkBVgqDi%=0RKpxjtS!{K&>|&T?s;0Lis0R%MH~`;8^r<{Xlg} zhBQ?dtIOsL85(W6xK8*Quu*9^u2c{_O|Q$A)>bW}S1tI*c-p6)t|B~#;-3-~5fnX` zkqXjI;HEJeEhAQ1#^e!e%3zL8ez8+ADYD#>RJd|^lA4HADMl~juU3!)*(SXpgH#z9`j$jqYoEF!D% zKGQp-yx3?gKru*Oce|xG*iDHJ<|CGn^z<^bZ>D96L9izN<^ z7MJf;TONBaq7!npsa%>y%caU0ZEjYUTvU^sNmFO#aB?P4PJaS&Qrk~vS+k5?!duj~ z^7Ylef$E1-^{)*&xTR^Gu`%tAZtsoiY*A-ro(kqEY;FEmAO4rf>O335vx4>cpO5oD z1NpDYK>jP;>?|&z#0Bo(FsLYRX|otNfRbD$p?H?`!1-zsEngL?bgFDMf+D8!fwg{x zrnS~MK;tt#9O~z(9ekHwp1MoPkwj zt0ziPq8b*?3=8(3(}c}(()*|*IerF1Jn zj=CX^rKc^Hx0tj~kd4vUo~>nNPN++3?3@tQ;AC^cDEd78fkVnlD-(a`3Mw{d!Ypkj z?3jtLacY8+bv)sfB74cqS8S{#`uV1bKEAJ^dA{A$7-{quG6(nP+g)1c9WAD5xU5vB zKAlO(n9SU%7+8Hkxak8L+`C%X-Nh`Wm$VgiHhvOkWkuSgzmfKHNT=&gOLe;CiCZT> zN!$dB0VP1AyQn75PohUN$2jx-?3+rRy$h3f$IRUsTW)RP$W!a*$PV`5mbIHEX68$@ zShW)NOISNCS~aLG)9AiJX-xacA*V==26I zH8w@3=W_U2BcEyFAFP7EB$cX>95|y&P6%X~o{Sp(F;6hp8Qq*xqfnbsE1B(DZRKfp zH9;G*9>dbxL+t!!vDIF}z~=D&YtnUoBsE!{meq4vx-p_U$MW#~7X3|)!sa{C`mrs+ z&84OW5YwU4>O?4qGS1d#3S>8jayNA-GvUTrdQ*^N79b}WJ;_?swX}j0yGBFz&V!8G z=MLXLd63O=VL)@RXpP?;531(|IZGc?O&u^m5s?1CQ{qC}lo;3ORCD6?lrs@lQbE&A z2y8+}2@CYE)=4i$_FgJ|>Z`d|V=5S;}rTEj;o2H1-WoxJIW6PqxyM1WH=skgO!r)?vQ? zg>!t) z{uv?1Y&dl_R$}dlXx&np!xn-=L`g~QQ5d{)&syyK8*?7>sX@N&S}YC#;1Z5G0Z^Yq zUX;aS$1PS;Gf9I!m$PpsiEDJKOtN+DP6s2md_N?G_I`*1Ul5TzV!6FQ&u*=)0{(fD zjH7LCI7Ac=(`>(P5U9tgTw__s$Q4XG$Ab{9t^XmOm#iJ)xqm%2+`^6yVj1TJoBkCW zekoQr#~t);f-kLwtu&=XM{P-&`90KTYjiWwj_&v={T?`cQ;+WO6*^V)?r7RR20eP7 zobf}Q)6cBqaHMI3GRCfhOPXyS*sbeC()M}S2X2oQwDw3~ovS%$oiIQVVBb#2SLjq) z(^@(&-@YxKm+$;KCx}w<#y50AZBp(eO82xn-rskapKWuPZ|LaWXifT>Xp*W+5oU{% zayk99ST2i8LG?stWl8<~{bV+WJh*|PmhJlLHyqmdG+Or_Cc106DNHP95MHTb@1yKO zin3-EG+etztK(gFyiELRn8neu>GgaW%+c?GJxO2h!iP9(4~de6FJawF98c)SLbm{$ z)rM25rG^#pVNj9oc4#{4nb7*I28^f8w(PgfKwWOZrhDLVYzYum<5ZE{bk@&Uyx~cm z_2WsugO7-!d{k_3>cl%;RN7+M$}!6U_kS-ogFZQx owIL5T|Jcn;UgjZ28YpL!=4-u_B}bv0y}HzY0Y1)JqdZRl07yCMumAu6 From 5abcce7d19b1fbdeefac15e55b367f43c5b3ddf6 Mon Sep 17 00:00:00 2001 From: fisker Date: Mon, 25 Jan 2021 09:49:25 +0800 Subject: [PATCH 4/6] Add another suggestion to spread all --- rules/prefer-spread.js | 46 +++++++++++------ test/snapshots/prefer-spread.js.md | 74 +++++++++++++++++++-------- test/snapshots/prefer-spread.js.snap | Bin 4032 -> 4106 bytes 3 files changed, 82 insertions(+), 38 deletions(-) diff --git a/rules/prefer-spread.js b/rules/prefer-spread.js index 18e24d577e..60771ca4d1 100644 --- a/rules/prefer-spread.js +++ b/rules/prefer-spread.js @@ -11,12 +11,14 @@ const ERROR_ARRAY_CONCAT = 'array-concat'; const SUGGESTION_CONCAT_ARGUMENT_IS_SPREADABLE = 'argument-is-spreadable'; const SUGGESTION_CONCAT_ARGUMENT_IS_NOT_SPREADABLE = 'argument-is-not-spreadable'; const SUGGESTION_CONCAT_TEST_ARGUMENT = 'test-argument'; +const SUGGESTION_CONCAT_SPREAD_ALL_ARGUMENTS = 'spread-all-arguments'; const messages = { [ERROR_ARRAY_FROM]: 'Prefer the spread operator over `Array.from(…)`.', [ERROR_ARRAY_CONCAT]: 'Prefer the spread operator over `Array#concat(…)`.', [SUGGESTION_CONCAT_ARGUMENT_IS_SPREADABLE]: 'First argument is an `array`.', [SUGGESTION_CONCAT_ARGUMENT_IS_NOT_SPREADABLE]: 'First argument is not an `array`.', - [SUGGESTION_CONCAT_TEST_ARGUMENT]: 'Test first argument with `Array.isArray(…)`.' + [SUGGESTION_CONCAT_TEST_ARGUMENT]: 'Test first argument with `Array.isArray(…)`.', + [SUGGESTION_CONCAT_SPREAD_ALL_ARGUMENTS]: 'Spread all unknown arguments`.' }; const arrayFromCallSelector = [ @@ -294,22 +296,32 @@ const create = context => { }); } - problem.suggest = suggestions.map(({messageId, isSpreadable, testArgument}) => ({ - messageId, - fix: fixConcat( - node, - sourceCode, - // When apply suggestion, we also merge fixable arguments after the first one - [ - { - node: firstArgument, - isSpreadable, - testArgument - }, - ...fixableArgumentsAfterFirstArgument - ] - ) - })); + problem.suggest = [ + ...suggestions.map(({messageId, isSpreadable, testArgument}) => ({ + messageId, + fix: fixConcat( + node, + sourceCode, + // When apply suggestion, we also merge fixable arguments after the first one + [ + { + node: firstArgument, + isSpreadable, + testArgument + }, + ...fixableArgumentsAfterFirstArgument + ] + ) + })), + { + messageId: SUGGESTION_CONCAT_SPREAD_ALL_ARGUMENTS, + fix: fixConcat( + node, + sourceCode, + node.arguments.map(node => getConcatArgumentSpreadable(node, scope) || {node, isSpreadable: true}) + ) + } + ]; context.report(problem); } diff --git a/test/snapshots/prefer-spread.js.md b/test/snapshots/prefer-spread.js.md index c335328f7a..8abc6d975e 100644 --- a/test/snapshots/prefer-spread.js.md +++ b/test/snapshots/prefer-spread.js.md @@ -832,16 +832,20 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/3: First argument is an `array`.␊ + Suggestion 1/4: First argument is an `array`.␊ 1 | [...foo, ...bar]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/3: First argument is not an `array`.␊ + Suggestion 2/4: First argument is not an `array`.␊ 1 | [...foo, bar]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 3/3: Test first argument with `Array.isArray(…)`.␊ + Suggestion 3/4: Test first argument with `Array.isArray(…)`.␊ 1 | [...foo, ...(Array.isArray(bar) ? bar : [bar])]␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 4/4: Spread all unknown arguments`.␊ + 1 | [...foo, ...bar]␊ ` ## Invalid #24 @@ -948,16 +952,20 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/3: First argument is an `array`.␊ + Suggestion 1/4: First argument is an `array`.␊ 1 | [...foo, 2, ...bar]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/3: First argument is not an `array`.␊ + Suggestion 2/4: First argument is not an `array`.␊ 1 | [...foo, 2, bar]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 3/3: Test first argument with `Array.isArray(…)`.␊ + Suggestion 3/4: Test first argument with `Array.isArray(…)`.␊ 1 | [...foo, 2, ...(Array.isArray(bar) ? bar : [bar])]␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 4/4: Spread all unknown arguments`.␊ + 1 | [...foo, 2, ...bar]␊ ` ## Invalid #30 @@ -986,16 +994,20 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/3: First argument is an `array`.␊ + Suggestion 1/4: First argument is an `array`.␊ 1 | [...foo, ...bar, 2, 3]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/3: First argument is not an `array`.␊ + Suggestion 2/4: First argument is not an `array`.␊ 1 | [...foo, bar, 2, 3]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 3/3: Test first argument with `Array.isArray(…)`.␊ + Suggestion 3/4: Test first argument with `Array.isArray(…)`.␊ 1 | [...foo, ...(Array.isArray(bar) ? bar : [bar]), 2, 3]␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 4/4: Spread all unknown arguments`.␊ + 1 | [...foo, ...bar, 2, 3]␊ ` ## Invalid #32 @@ -1008,16 +1020,20 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/3: First argument is an `array`.␊ + Suggestion 1/4: First argument is an `array`.␊ 1 | [...foo, ...bar, 2, 3].concat(baz)␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/3: First argument is not an `array`.␊ + Suggestion 2/4: First argument is not an `array`.␊ 1 | [...foo, bar, 2, 3].concat(baz)␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 3/3: Test first argument with `Array.isArray(…)`.␊ + Suggestion 3/4: Test first argument with `Array.isArray(…)`.␊ 1 | [...foo, ...(Array.isArray(bar) ? bar : [bar]), 2, 3].concat(baz)␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 4/4: Spread all unknown arguments`.␊ + 1 | [...foo, ...bar, 2, 3, ...baz]␊ ` ## Invalid #33 @@ -1030,12 +1046,16 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/2: First argument is an `array`.␊ + Suggestion 1/3: First argument is an `array`.␊ 1 | async function a() {return [...(await bar)]}␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/2: First argument is not an `array`.␊ + Suggestion 2/3: First argument is not an `array`.␊ 1 | async function a() {return [await bar]}␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 3/3: Spread all unknown arguments`.␊ + 1 | async function a() {return [...(await bar)]}␊ ` ## Invalid #34 @@ -1048,12 +1068,16 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/2: First argument is an `array`.␊ + Suggestion 1/3: First argument is an `array`.␊ 1 | async function a() {return [...((await bar))]}␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/2: First argument is not an `array`.␊ + Suggestion 2/3: First argument is not an `array`.␊ 1 | async function a() {return [((await bar))]}␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 3/3: Spread all unknown arguments`.␊ + 1 | async function a() {return [...((await bar))]}␊ ` ## Invalid #35 @@ -1293,16 +1317,20 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/3: First argument is an `array`.␊ + Suggestion 1/4: First argument is an `array`.␊ 1 | [...(a.b.c), 2]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/3: First argument is not an `array`.␊ + Suggestion 2/4: First argument is not an `array`.␊ 1 | [(a.b.c), 2]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 3/3: Test first argument with `Array.isArray(…)`.␊ + Suggestion 3/4: Test first argument with `Array.isArray(…)`.␊ 1 | [...(Array.isArray((a.b.c)) ? (a.b.c) : [(a.b.c)]), 2]␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 4/4: Spread all unknown arguments`.␊ + 1 | [...(a.b.c), 2]␊ ` ## Invalid #49 @@ -1315,10 +1343,14 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/2: First argument is an `array`.␊ + Suggestion 1/3: First argument is an `array`.␊ 1 | [...a.b(), 2]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/2: First argument is not an `array`.␊ + Suggestion 2/3: First argument is not an `array`.␊ 1 | [a.b(), 2]␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 3/3: Spread all unknown arguments`.␊ + 1 | [...a.b(), 2]␊ ` diff --git a/test/snapshots/prefer-spread.js.snap b/test/snapshots/prefer-spread.js.snap index 992a78e7f36f58acfd2487a6b603faab270976c8..280223db457ed092e042c27f6e4ad2c54a244f44 100644 GIT binary patch literal 4106 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 From dd451d3987efbb915295c7f06d8466d2acc8cca5 Mon Sep 17 00:00:00 2001 From: fisker Date: Mon, 25 Jan 2021 09:53:48 +0800 Subject: [PATCH 5/6] Only suggest spread all when multiple arguments are unknown --- rules/prefer-spread.js | 41 ++++++++--------- test/snapshots/prefer-spread.js.md | 64 ++++++++------------------- test/snapshots/prefer-spread.js.snap | Bin 4106 -> 4082 bytes 3 files changed, 39 insertions(+), 66 deletions(-) diff --git a/rules/prefer-spread.js b/rules/prefer-spread.js index 60771ca4d1..7542a07125 100644 --- a/rules/prefer-spread.js +++ b/rules/prefer-spread.js @@ -296,32 +296,33 @@ const create = context => { }); } - problem.suggest = [ - ...suggestions.map(({messageId, isSpreadable, testArgument}) => ({ - messageId, - fix: fixConcat( - node, - sourceCode, - // When apply suggestion, we also merge fixable arguments after the first one - [ - { - node: firstArgument, - isSpreadable, - testArgument - }, - ...fixableArgumentsAfterFirstArgument - ] - ) - })), - { + problem.suggest = suggestions.map(({messageId, isSpreadable, testArgument}) => ({ + messageId, + fix: fixConcat( + node, + sourceCode, + // When apply suggestion, we also merge fixable arguments after the first one + [ + { + node: firstArgument, + isSpreadable, + testArgument + }, + ...fixableArgumentsAfterFirstArgument + ] + ) + })); + + if (fixableArgumentsAfterFirstArgument.length < restArguments.length) { + problem.suggest.push({ messageId: SUGGESTION_CONCAT_SPREAD_ALL_ARGUMENTS, fix: fixConcat( node, sourceCode, node.arguments.map(node => getConcatArgumentSpreadable(node, scope) || {node, isSpreadable: true}) ) - } - ]; + }); + } context.report(problem); } diff --git a/test/snapshots/prefer-spread.js.md b/test/snapshots/prefer-spread.js.md index 8abc6d975e..720f171a20 100644 --- a/test/snapshots/prefer-spread.js.md +++ b/test/snapshots/prefer-spread.js.md @@ -832,20 +832,16 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/4: First argument is an `array`.␊ + Suggestion 1/3: First argument is an `array`.␊ 1 | [...foo, ...bar]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/4: First argument is not an `array`.␊ + Suggestion 2/3: First argument is not an `array`.␊ 1 | [...foo, bar]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 3/4: Test first argument with `Array.isArray(…)`.␊ + Suggestion 3/3: Test first argument with `Array.isArray(…)`.␊ 1 | [...foo, ...(Array.isArray(bar) ? bar : [bar])]␊ - ␊ - --------------------------------------------------------------------------------␊ - Suggestion 4/4: Spread all unknown arguments`.␊ - 1 | [...foo, ...bar]␊ ` ## Invalid #24 @@ -952,20 +948,16 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/4: First argument is an `array`.␊ + Suggestion 1/3: First argument is an `array`.␊ 1 | [...foo, 2, ...bar]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/4: First argument is not an `array`.␊ + Suggestion 2/3: First argument is not an `array`.␊ 1 | [...foo, 2, bar]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 3/4: Test first argument with `Array.isArray(…)`.␊ + Suggestion 3/3: Test first argument with `Array.isArray(…)`.␊ 1 | [...foo, 2, ...(Array.isArray(bar) ? bar : [bar])]␊ - ␊ - --------------------------------------------------------------------------------␊ - Suggestion 4/4: Spread all unknown arguments`.␊ - 1 | [...foo, 2, ...bar]␊ ` ## Invalid #30 @@ -994,20 +986,16 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/4: First argument is an `array`.␊ + Suggestion 1/3: First argument is an `array`.␊ 1 | [...foo, ...bar, 2, 3]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/4: First argument is not an `array`.␊ + Suggestion 2/3: First argument is not an `array`.␊ 1 | [...foo, bar, 2, 3]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 3/4: Test first argument with `Array.isArray(…)`.␊ + Suggestion 3/3: Test first argument with `Array.isArray(…)`.␊ 1 | [...foo, ...(Array.isArray(bar) ? bar : [bar]), 2, 3]␊ - ␊ - --------------------------------------------------------------------------------␊ - Suggestion 4/4: Spread all unknown arguments`.␊ - 1 | [...foo, ...bar, 2, 3]␊ ` ## Invalid #32 @@ -1046,16 +1034,12 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/3: First argument is an `array`.␊ + Suggestion 1/2: First argument is an `array`.␊ 1 | async function a() {return [...(await bar)]}␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/3: First argument is not an `array`.␊ + Suggestion 2/2: First argument is not an `array`.␊ 1 | async function a() {return [await bar]}␊ - ␊ - --------------------------------------------------------------------------------␊ - Suggestion 3/3: Spread all unknown arguments`.␊ - 1 | async function a() {return [...(await bar)]}␊ ` ## Invalid #34 @@ -1068,16 +1052,12 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/3: First argument is an `array`.␊ + Suggestion 1/2: First argument is an `array`.␊ 1 | async function a() {return [...((await bar))]}␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/3: First argument is not an `array`.␊ + Suggestion 2/2: First argument is not an `array`.␊ 1 | async function a() {return [((await bar))]}␊ - ␊ - --------------------------------------------------------------------------------␊ - Suggestion 3/3: Spread all unknown arguments`.␊ - 1 | async function a() {return [...((await bar))]}␊ ` ## Invalid #35 @@ -1317,20 +1297,16 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/4: First argument is an `array`.␊ + Suggestion 1/3: First argument is an `array`.␊ 1 | [...(a.b.c), 2]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/4: First argument is not an `array`.␊ + Suggestion 2/3: First argument is not an `array`.␊ 1 | [(a.b.c), 2]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 3/4: Test first argument with `Array.isArray(…)`.␊ + Suggestion 3/3: Test first argument with `Array.isArray(…)`.␊ 1 | [...(Array.isArray((a.b.c)) ? (a.b.c) : [(a.b.c)]), 2]␊ - ␊ - --------------------------------------------------------------------------------␊ - Suggestion 4/4: Spread all unknown arguments`.␊ - 1 | [...(a.b.c), 2]␊ ` ## Invalid #49 @@ -1343,14 +1319,10 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 1/3: First argument is an `array`.␊ + Suggestion 1/2: First argument is an `array`.␊ 1 | [...a.b(), 2]␊ ␊ --------------------------------------------------------------------------------␊ - Suggestion 2/3: First argument is not an `array`.␊ + Suggestion 2/2: First argument is not an `array`.␊ 1 | [a.b(), 2]␊ - ␊ - --------------------------------------------------------------------------------␊ - Suggestion 3/3: Spread all unknown arguments`.␊ - 1 | [...a.b(), 2]␊ ` diff --git a/test/snapshots/prefer-spread.js.snap b/test/snapshots/prefer-spread.js.snap index 280223db457ed092e042c27f6e4ad2c54a244f44..36a7f7fe3f968b0c95a886211df810c99b9bef3a 100644 GIT binary patch literal 4082 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 Date: Mon, 25 Jan 2021 10:02:19 +0800 Subject: [PATCH 6/6] Fix "spread all suggestion" --- rules/prefer-spread.js | 5 ++- test/prefer-spread.js | 4 ++- test/snapshots/prefer-spread.js.md | 48 +++++++++++++++++++++++++++ test/snapshots/prefer-spread.js.snap | Bin 4082 -> 4222 bytes 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/rules/prefer-spread.js b/rules/prefer-spread.js index 7542a07125..554a1bc915 100644 --- a/rules/prefer-spread.js +++ b/rules/prefer-spread.js @@ -313,7 +313,10 @@ const create = context => { ) })); - if (fixableArgumentsAfterFirstArgument.length < restArguments.length) { + if ( + fixableArgumentsAfterFirstArgument.length < restArguments.length && + restArguments.every(({type}) => type !== 'SpreadElement') + ) { problem.suggest.push({ messageId: SUGGESTION_CONCAT_SPREAD_ALL_ARGUMENTS, fix: fixConcat( diff --git a/test/prefer-spread.js b/test/prefer-spread.js index 5d065158f0..cffbd95b06 100644 --- a/test/prefer-spread.js +++ b/test/prefer-spread.js @@ -227,6 +227,8 @@ test.snapshot({ ) `, '[].concat((a.b.c), 2)', - '[].concat(a.b(), 2)' + '[].concat(a.b(), 2)', + 'foo.concat(bar, 2, [3, 4], baz, 5, [6, 7])', + 'foo.concat(bar, 2, 3, ...baz)' ] }); diff --git a/test/snapshots/prefer-spread.js.md b/test/snapshots/prefer-spread.js.md index 720f171a20..eec2c36fb9 100644 --- a/test/snapshots/prefer-spread.js.md +++ b/test/snapshots/prefer-spread.js.md @@ -1326,3 +1326,51 @@ Generated by [AVA](https://avajs.dev). Suggestion 2/2: First argument is not an `array`.␊ 1 | [a.b(), 2]␊ ` + +## Invalid #50 + 1 | foo.concat(bar, 2, [3, 4], baz, 5, [6, 7]) + +> Error 1/1 + + `␊ + > 1 | foo.concat(bar, 2, [3, 4], baz, 5, [6, 7])␊ + | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/4: First argument is an `array`.␊ + 1 | [...foo, ...bar, 2, 3, 4].concat(baz, 5, [6, 7])␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 2/4: First argument is not an `array`.␊ + 1 | [...foo, bar, 2, 3, 4].concat(baz, 5, [6, 7])␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 3/4: Test first argument with `Array.isArray(…)`.␊ + 1 | [...foo, ...(Array.isArray(bar) ? bar : [bar]), 2, 3, 4].concat(baz, 5, [6, 7])␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 4/4: Spread all unknown arguments`.␊ + 1 | [...foo, ...bar, 2, 3, 4, ...baz, 5, 6, 7]␊ + ` + +## Invalid #51 + 1 | foo.concat(bar, 2, 3, ...baz) + +> Error 1/1 + + `␊ + > 1 | foo.concat(bar, 2, 3, ...baz)␊ + | ^^^^^^ Prefer the spread operator over `Array#concat(…)`.␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 1/3: First argument is an `array`.␊ + 1 | [...foo, ...bar, 2, 3].concat(...baz)␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 2/3: First argument is not an `array`.␊ + 1 | [...foo, bar, 2, 3].concat(...baz)␊ + ␊ + --------------------------------------------------------------------------------␊ + Suggestion 3/3: Test first argument with `Array.isArray(…)`.␊ + 1 | [...foo, ...(Array.isArray(bar) ? bar : [bar]), 2, 3].concat(...baz)␊ + ` diff --git a/test/snapshots/prefer-spread.js.snap b/test/snapshots/prefer-spread.js.snap index 36a7f7fe3f968b0c95a886211df810c99b9bef3a..42167ccdb759d43952612c75cca3481fa924c07f 100644 GIT binary patch literal 4222 zcmV-^5P|PORzVwNGuA&(^%@ce3*o3b92P;jLkb zZ~Qv|=lB1REiW2-^{1ZeM2M|$0Kl#HmYR8q+Bikut~d4D|2#+`wiY7`TEIguA296F z_k#>T;tMVkcmHi!r_p0Q9zfrI(hj z%o?!mtthw2XYWvmEx@RT@V**dwB_;~=bT?&el_%WSvG~(DrXKaxd0%Gdqq^^-s$|6 z%4vf;6}>i+LhLDwd2Ipkzwu{`L$~%LeD{Y3RR_9^pb+~lhQ1vDAyM<+yfSe8!kM%8 z-M(F&eSt#kc8rkr06bgcT)j`}P;%$HHdlHN@c|TK=VFLE05G7(v&$wOi@oCY!|%#O zWo;^j*aVEr5QEdovsa&7`uY0I)=>+Gy>*B}tmJ79$03G(T)uwm)&W6b9`cE9c?0`U zi1q2n;RwXg^Lfv`vinPBV)3t2KDqUBA%)l~jOSeei0Tp*>T*1DPN_`VyL7?5e^7`m z!tihdU}TJYr^Bb0zZd5ea6RLl;_Vb-r(*=U0}$8tSk$R2_fG1jMYb+4^{=B4I}W1^ zV!R^w?KK-01UYPSdqR2VI87n;9>!`9SmLddmF4IEwPc`A>7UEypV&bm_G1ijCjjC% zbw8I`^Yy&AMQzKkr>%uOiDk!OoMua$4wgCe3--L$>FMap4oZ*VnL<|v1Q%>Xk61bRUN(c+h?N=hPCtBf1X0@ zO$@yc08`|yJ0-I!UiWzr^yA0_>q{uaF2lGBkslu-`||o>W#{Q1UH(e*yqgHIxjo?s z^6Wh1{jy%wrODaP2Tz?2C1cq#jO<5&Dy*R*mv-BE;C4>`)*KUS7Eefc-agIW49>!&e4LMO=G>V+#w_hxguF1ayX91RV?8iX|v2pLhT6wwG zlGQsuX;b;H`EOH*U5RlYVpGuKp`pW{tGZdKaANvA`G7)f_h1gIAhx!h;}tb)Nm+%Vj*H&Vbza?s zAALoLT?MiC<3U?}<=^%6(=Jb|d-IPsD8%l-=otpUzP%UHzc|IjU)XVC;8T~9PEm-B z#rPIte^K>;1ZHRC7h7CX7Ixh=n?fud&Y=wA@K=-GTheCJdxxH-%I4m6V<^P_f}tD$ zK>3Cx+ut95vE5I1;x-R+KR{84-G&i25SBPHt3%rtilbF`7R){QYw!^YvFk9R2LbTi z-TY&hil=N}ShINGtiX}WDa5{xF(3kf@3(!>Zp*!WAFMnZADU6I?ihvGVvNASa8@ne zUUHEs{%~(s$w9>j=_wRqwHOZ|ev0_|5To?o_*~76&V#<_FpffOkqh*b>ba0H_AhjZbnXI>CZeXmD{`Q6)PQi#2YQ4k5hl|QF`*8Pw} zt!HpYdEbfx=xtcG9AoJ)0Ip6e9{Vkb@oYO@vn}Jtt>06K-G<>g9Dr+H2iA0pjX0e* zctT~))fgBZuxv8M1BjZsXosZCx|=Hu6E0F*kmzkb5lj zt?=AQA$AXje-!lEC;o_kaUi`~?0)q1=ceKGO`q{CPk?i!(XNBcL}_YhL_mSB=n(2>r`nf9j(t$(K%CeDrG9I zoubky^;#XRodz!?4bth9GkkDG=jQxdk|g6jj|yppADE`q8XlOe)Jf?8DXoyw$;y0d zJ=Up@l|N3gx#{Vu9KBkrq2+#oA#|i#m!qeZy7b&^l}1mib7-Z8PExY6z~^J5%VaXB zs+5L5>-A(BG>7WiRL}sjpc<{-lCY0MQUxpNSonobPgAd8j^)mRzvT-CZX~`3s==B} ztEIzOHQAEzN&vhP%2tOOI7U5L#lV_%LzO8R;#6&{He037P;1g9{K5H8V4>1*R4HfP zG@UkETwk?>Ts1e0Cy_o)9MRl!2yR5Az=FaD(_&8A$*LK&T0`@dme2**8igjRhMTE@ zs3KR9!7uSYR#TBAX@mQgv;9HP3nm%dx4glB2S|-wsMTDzs2>(YnKMI^LZ{_wQc(9+ zilJ?EDt)ewGrm}vr&R0NZUcv!oDtal9fRF1)M8YFK_|JS(5(51AFEARi$w+#*Be+V zOBSOV9cZgZB;fw`+khI};)6rlxB{~VG zBW@ZB6xcV@G?K%D8ombF#Ktq4_got}29X=dN&*up&50_tNpM}mpTCDbH+pP*V(i#4 zBSsE`6S=oHo?uL`CXN`HIB3k6LGgxS3d_Y3M@90>2iBKIqZiT%xtdf}np&eumC~Br ztSl+7CMlh!%*s(oX@4pC32=~Felo*1HMLU2TGX=gP1U}c>W35cuXj4ArAeK!CG8Gx z?+fd6Y_Kv*1+f&eHv6p~`;BLHmJMcE&id@v{_IzO_E)(-`zzV(3@RW;1sZP{Sd_K2 zz{d?C1eZzBpCvtXyjn_%SGg+fDq0;#5L5opTCXB$Ew?X?<$Mv<(^OE#0J=A=2*rBW zyG`~Y6DoA^=5OcpH1eqIWl5+lW}5y+E-rMzY)@wYFhVlfkDNSUy05@ADX0)usw@QR_mB*JwiGl71g zaiEXxYi^uxH8sW<#tY8Dec5&wH;fL)8ERElD&3UM#6?Vk;j|T)eL%SJ1Df5t9IZaY zOr;lf;B_`Oi8HfsZq(m!``M(^^&*8jJqq}(Q<%hWf~A1qpy6FalNTnDy_szWb7S^R zC1&qj@@|{lowhWrO$PGxrVV5pkKs1;dpiR2C7P^SaoakKl@_g<)s|`Gu|jA}>&ev3 zBt17;^4AF(Gs!eh4?sTHCTaQ{3wvM*XrTpdgh}bX@OzMy?q{|BZpV9KtlCC$b_~?YP;~P zHr)`@sPw`m_gtRKWDD|Fs|n$Vm2F2clu6Rcp0$vr{B;gnG{Z+VsAgCG>5+-mGT$U{ zNLXstDdAsP$Ao`n2**cA{)yc?6*Ggt|2nmT-;uIF5{@kdKTAU!Abcc@dMdz5>r9(h?nyM0gL; z%d~jfB_00smU};Rv_U-l$yR7r!A57}_R;I$^Q5#l?3~_$j-$d&!<8{~9aK`V-(|I~ zGl;Y`$vkv>tR}Tb0%KpzLF$BlGC%8fLbgJ?(wfxL1%=ja>4HN0*ExZgIkvo^6Y6tF zJ5joi+3>W{sC16SsIZbqysOO*oa8I+YJ_V)FbSe){x zbp*96*VnY^(88z1y7xBHU8BmQV^wFWfu{Y6;#lC?OLpkXTt$y{>#NChm-T0 z_&Twz-y|MRUY|v;0o1={fEQ}Hby~hZAs)@AHUo>*h7+nKx)rRsBSCj7G#&A+f~G89 zO(HE0SZ`m9xH^bT_t5iL5#Uv0SDxH>k%~6?8v(>cDzrvr1yS@=a0Dq-xHOU#Iiz}D_+)0^{f;m2xb@({WhvA>j-3%4c+ UE96``Yjvsr0RdL1s##V501QGfUH||9 literal 4082 zcmVo;%QYGJ0$gmLH1<00000000B+ zTMJxNMHinPOA!qpDIg+V!EzVZg#|={Kt#brQxj1Mudu)cmdCCwi>Qd2`A8GWM+!ac zWohQC%rrCO%haA4Y4~YoqJoN1X=$1j-`u&g%ii7D1!T9je&6c<$L{~moqNuiIcLs1 z?#mqkhzF7-neCq*eK4}4eEFV=-`)*`fdBL%C`ITn-m~_rr<11nR34~3`u?>T31+L? zp)0#@hIYIA_nHw8n@t4PgKH%~cSyJ?|9o0fNi; zIekZ`Zv6K2`0`a>{Q6uB#Ox`82igPBb#v;xwHbqM^!{Mo3jrs*rbEn@5=3=CCB6vk z4mxlBRk5OU;^lAeeN}?lY8L?92X1LtkfKct9^B_={f^%cK+N7C$U_$J)GLRMypa3k zmH+JX7~V-IgP2`UpmYVGmxuo^do+y4^4es%`(?K)?Jzrq;7fwZod96A@2j}5d{y4i z?Jvf==bpI1hs?()`Bm4lw?4tzI?f?w!fB#d{jwD?2IsS_(MRg+s zVm6uJBEs;@s{A!4mVdY*r$hYWkuM&Cn3dfv;3z`uJ5?LDZ5tXI>8YIRUKBkDV%D#R zfKL!&&lNrR^lU~UH~L*>UTD$ z;qwKFOS)A3n7JPHB%Yl_aEdQ+Doo)rB+UE!-cNW=>;H)d#OyVKG%o;B#trwrzH8vl zSHCFQo$}fPZV2eSnUk}SAHhuLU!$xhjZ3lobp|J)V4gkgPJDGK`oXvZkzIW%&q2&)5Y!?}SN7Z`n_K;i-=Cr1jNQMX9AZ|& z2*^d4ofNM4^v91?UNhgm_?hM*cL`?ee374cdyUw7a6o-UTK+>}kIY1p@$3*k0jCk> z!}_R%q|@S!1DDkha4zOxmrCn>iGACA!j9+y&QmAv}%9kMfY)QQ`{on@8nSz1~J<% zP=FR;)rcceGyHy7KXbvw{;v$WRthn@lOS3Nzzc_U?|JSX`JU=XyDE>)XEsC3W)OUZ z@QT*}e+b)>uOx$l3Da9t8qbLA|=>_vj4U;s82 z#P`+&7aYC*Sh;-N>eU-{L&0ooOrjW7KA9K>u9!9|39d(UTmbdpUvzw=o1 zT^CYMLd^CYB48y#WoiBXWOi5FM_b&|7x&pc4`TK#!Q){7eEiw8H8m&BVlWipZ{h^$5i5 zc!KK))nz-%YuU25_V$q-2!1mw9b#4)DWDSJ+nCP}u`1u!A8fedHSDAAlOSeYq6F+k zIQ`4k?~Z-p8k5+#I`O^OhlfDSUL$y7C;&Cb&qigOepvFz8~wX4?AJ91Vsh&>yp1-plX15Xyj1}-E!XKF@`dxT*<>OaEZ|uH&_oQ%$+2aJUamd3#2b_&b?gZT= zU0fMP$;@Gr=h-lx6|B$yypR7G$bVG^@?Ys@XK?`~F3^0# zprX8`&0^dLN^+Ts;#ul#=c^U8d{wB@sj}5*ikQmV*7|9h)=KBnSSc1!J%d9s1~CJf z;0U6(F>LY|*$DFxZ~b;bPm_qsUzSBUVx+mxB*YhRdRCFInl43&YGf2sTp~v`^V7^M znL@{96sB{=D>AV*u-uUInivgLCudqzm5pYyZ=2mi=~jXqO+y?@Pg^W+F=?M58>6v3 zTg%FvP@CD-IU%aS$>xMH^m+Pihm^HeCjQP9RBX#esM%vFIoo)av)#+a>Zk>`;aT6>DlmLzHqME!Ul^)F; zApf~ zO#8{y*J65ZvgEHbYs^&3d3q3z!4BzY!-;5loSrGr>hxSjLb_JR74Wl0KGVcMSOtGc zDpesla7LAu9LO?*7!~?so?yOWaC1tHLTv`EWVUOym8aR&1l`Pf3`=hhvGbe7R(lBp zJHY1Gq?`OmYO*{nYvHnVTSRq^<>BTQ{Y{O+mN?P+u`R*PrKScD)1lMqM5ur=&bDL< zWH*O$Gj%94;ig)8Q;=g8AoC2KWG(7iTEU53Be<1Y{6U6|TZiwTP$g?-PhS|&94uNe zFIw9+@q=2pkI&KvRZ|ZPPy}S%_MEt!HYdh4I@P4OC*|yhm0Zwt7Xq8m5y?$&k=14z zavDx=zQ$K53YmOC@$wiY9kH|RAPX(BWPWp3k^axw-EBpTYEsRq;?rLyR@-8eSwJFE z^FfJx%2M{LY4M5Qsj+W-!ZkWoe6p38BvTR-hvX%>&@u!X4_N&}4ji^N8xb8i zbS8(lJY?w1e&6bYh2oy~hom)g%ckkb|L2wFhspjivr41L=4am$=uzlj9ewG>0t)hl$b><8c_gd(T?z{u{C$^Vva(?OH4j0pJpjIR(&?gI<&c zWXCO7QgcbYu8^~DE{SV&s$82(=XlX z2DyXYPv}c)VJl53(NbGdW_}N~+1lJpwBtLzO5fWK-_+wfe1%RGy}eA^N3TQAlQX`k zbNZTf9F8=NP{z=8a7nWb1iN*eVYIy-_O{z&4Xr(rS?6jFS| zvl6&GE*;e~EH6*$>+dVGIpo1tDQelSuVurbjZd3(A84YxhAUzcIKA*%72AxmODM{k zRnU6v+N_Ru(-AZA>tPnh%VxLmg)m3I3-$ng!3!VcG#(TsD__FGmpGo#kA`jrHmi-I zR7(vj;sc=~-R;nH)N`RNSq+#*n{C-|qk+2If=zeZ<5(#WRpV5V+;rB@SiI#)o%Q2M zzk`p7qI^_raO%W6OH|ro*~&4?0nNV~n@yjbQD2UA%t{&_P$|A+ZDK}URkL?jo7tL& kn}6(PCQtJaBMp=@O7pc|%95i{&R$*We{h