From d8f8161d850630ec67c34daf819d4ed67e1fe752 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Fri, 10 May 2024 21:50:12 +0800 Subject: [PATCH] Fix edge cases when add `new` to calls (#2352) --- ...witch-call-expression-to-new-expression.js | 2 + test/new-for-builtins.mjs | 41 ++-- test/snapshots/new-for-builtins.mjs.md | 191 ++++++++++-------- test/snapshots/new-for-builtins.mjs.snap | Bin 3034 -> 3075 bytes test/snapshots/throw-new-error.mjs.md | 27 +++ test/snapshots/throw-new-error.mjs.snap | Bin 1238 -> 1330 bytes test/throw-new-error.mjs | 5 + 7 files changed, 162 insertions(+), 104 deletions(-) diff --git a/rules/fix/switch-call-expression-to-new-expression.js b/rules/fix/switch-call-expression-to-new-expression.js index fc3073527c..813e3dfdf0 100644 --- a/rules/fix/switch-call-expression-to-new-expression.js +++ b/rules/fix/switch-call-expression-to-new-expression.js @@ -1,8 +1,10 @@ 'use strict'; const {isParenthesized} = require('../utils/parentheses.js'); const shouldAddParenthesesToNewExpressionCallee = require('../utils/should-add-parentheses-to-new-expression-callee.js'); +const fixSpaceAroundKeyword = require('./fix-space-around-keywords.js'); function * switchCallExpressionToNewExpression(node, sourceCode, fixer) { + yield * fixSpaceAroundKeyword(fixer, node, sourceCode); yield fixer.insertTextBefore(node, 'new '); const {callee} = node; diff --git a/test/new-for-builtins.mjs b/test/new-for-builtins.mjs index fa042643da..f737fc28e1 100644 --- a/test/new-for-builtins.mjs +++ b/test/new-for-builtins.mjs @@ -231,26 +231,31 @@ test.snapshot({ 'const foo = new Number(\'123\')', 'const foo = new String()', 'const foo = new Symbol()', - ` - function varCheck() { - { - var WeakMap = function() {}; - } - // This should not reported - return WeakMap() + outdent` + function varCheck() { + { + var WeakMap = function() {}; } - function constCheck() { - { - const Array = function() {}; - } - return Array() + // This should not reported + return WeakMap() + } + function constCheck() { + { + const Array = function() {}; } - function letCheck() { - { - let Map = function() {}; - } - return Map() + return Array() + } + function letCheck() { + { + let Map = function() {}; } - `, + return Map() + } + `, + outdent` + function foo() { + return(globalThis).Map() + } + `, ], }); diff --git a/test/snapshots/new-for-builtins.mjs.md b/test/snapshots/new-for-builtins.mjs.md index df6ce0dce8..196f2cb928 100644 --- a/test/snapshots/new-for-builtins.mjs.md +++ b/test/snapshots/new-for-builtins.mjs.md @@ -1267,105 +1267,124 @@ Generated by [AVA](https://avajs.dev). > Input `␊ - 1 |␊ - 2 | function varCheck() {␊ - 3 | {␊ - 4 | var WeakMap = function() {};␊ - 5 | }␊ - 6 | // This should not reported␊ - 7 | return WeakMap()␊ - 8 | }␊ - 9 | function constCheck() {␊ - 10 | {␊ - 11 | const Array = function() {};␊ - 12 | }␊ - 13 | return Array()␊ - 14 | }␊ - 15 | function letCheck() {␊ - 16 | {␊ - 17 | let Map = function() {};␊ - 18 | }␊ - 19 | return Map()␊ - 20 | }␊ - 21 | ␊ + 1 | function varCheck() {␊ + 2 | {␊ + 3 | var WeakMap = function() {};␊ + 4 | }␊ + 5 | // This should not reported␊ + 6 | return WeakMap()␊ + 7 | }␊ + 8 | function constCheck() {␊ + 9 | {␊ + 10 | const Array = function() {};␊ + 11 | }␊ + 12 | return Array()␊ + 13 | }␊ + 14 | function letCheck() {␊ + 15 | {␊ + 16 | let Map = function() {};␊ + 17 | }␊ + 18 | return Map()␊ + 19 | }␊ ` > Output `␊ - 1 |␊ - 2 | function varCheck() {␊ - 3 | {␊ - 4 | var WeakMap = function() {};␊ - 5 | }␊ - 6 | // This should not reported␊ - 7 | return WeakMap()␊ - 8 | }␊ - 9 | function constCheck() {␊ - 10 | {␊ - 11 | const Array = function() {};␊ - 12 | }␊ - 13 | return new Array()␊ - 14 | }␊ - 15 | function letCheck() {␊ - 16 | {␊ - 17 | let Map = function() {};␊ - 18 | }␊ - 19 | return new Map()␊ - 20 | }␊ - 21 | ␊ + 1 | function varCheck() {␊ + 2 | {␊ + 3 | var WeakMap = function() {};␊ + 4 | }␊ + 5 | // This should not reported␊ + 6 | return WeakMap()␊ + 7 | }␊ + 8 | function constCheck() {␊ + 9 | {␊ + 10 | const Array = function() {};␊ + 11 | }␊ + 12 | return new Array()␊ + 13 | }␊ + 14 | function letCheck() {␊ + 15 | {␊ + 16 | let Map = function() {};␊ + 17 | }␊ + 18 | return new Map()␊ + 19 | }␊ ` > Error 1/2 `␊ - 1 |␊ - 2 | function varCheck() {␊ - 3 | {␊ - 4 | var WeakMap = function() {};␊ - 5 | }␊ - 6 | // This should not reported␊ - 7 | return WeakMap()␊ - 8 | }␊ - 9 | function constCheck() {␊ - 10 | {␊ - 11 | const Array = function() {};␊ - 12 | }␊ - > 13 | return Array()␊ - | ^^^^^^^ Use \`new Array()\` instead of \`Array()\`.␊ - 14 | }␊ - 15 | function letCheck() {␊ - 16 | {␊ - 17 | let Map = function() {};␊ - 18 | }␊ - 19 | return Map()␊ - 20 | }␊ - 21 | ␊ + 1 | function varCheck() {␊ + 2 | {␊ + 3 | var WeakMap = function() {};␊ + 4 | }␊ + 5 | // This should not reported␊ + 6 | return WeakMap()␊ + 7 | }␊ + 8 | function constCheck() {␊ + 9 | {␊ + 10 | const Array = function() {};␊ + 11 | }␊ + > 12 | return Array()␊ + | ^^^^^^^ Use \`new Array()\` instead of \`Array()\`.␊ + 13 | }␊ + 14 | function letCheck() {␊ + 15 | {␊ + 16 | let Map = function() {};␊ + 17 | }␊ + 18 | return Map()␊ + 19 | }␊ ` > Error 2/2 `␊ - 1 |␊ - 2 | function varCheck() {␊ - 3 | {␊ - 4 | var WeakMap = function() {};␊ - 5 | }␊ - 6 | // This should not reported␊ - 7 | return WeakMap()␊ - 8 | }␊ - 9 | function constCheck() {␊ - 10 | {␊ - 11 | const Array = function() {};␊ - 12 | }␊ - 13 | return Array()␊ - 14 | }␊ - 15 | function letCheck() {␊ - 16 | {␊ - 17 | let Map = function() {};␊ - 18 | }␊ - > 19 | return Map()␊ - | ^^^^^ Use \`new Map()\` instead of \`Map()\`.␊ - 20 | }␊ - 21 | ␊ + 1 | function varCheck() {␊ + 2 | {␊ + 3 | var WeakMap = function() {};␊ + 4 | }␊ + 5 | // This should not reported␊ + 6 | return WeakMap()␊ + 7 | }␊ + 8 | function constCheck() {␊ + 9 | {␊ + 10 | const Array = function() {};␊ + 11 | }␊ + 12 | return Array()␊ + 13 | }␊ + 14 | function letCheck() {␊ + 15 | {␊ + 16 | let Map = function() {};␊ + 17 | }␊ + > 18 | return Map()␊ + | ^^^^^ Use \`new Map()\` instead of \`Map()\`.␊ + 19 | }␊ + ` + +## invalid(60): function foo() { return(globalThis).Map() } + +> Input + + `␊ + 1 | function foo() {␊ + 2 | return(globalThis).Map()␊ + 3 | }␊ + ` + +> Output + + `␊ + 1 | function foo() {␊ + 2 | return new (globalThis).Map()␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + 1 | function foo() {␊ + > 2 | return(globalThis).Map()␊ + | ^^^^^^^^^^^^^^^^^^ Use \`new Map()\` instead of \`Map()\`.␊ + 3 | }␊ ` diff --git a/test/snapshots/new-for-builtins.mjs.snap b/test/snapshots/new-for-builtins.mjs.snap index 51412c8f5e439f7b20fa69baaa7e29935aae547d..c47a5dd2d2232d58e352205ae246e8040d0de4bf 100644 GIT binary patch literal 3075 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 RApKpG&j5clQs-V-000&y29p2) literal 3034 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 diff --git a/test/snapshots/throw-new-error.mjs.md b/test/snapshots/throw-new-error.mjs.md index 8e36df5d8e..903b034a02 100644 --- a/test/snapshots/throw-new-error.mjs.md +++ b/test/snapshots/throw-new-error.mjs.md @@ -534,3 +534,30 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^ Use \`new\` when creating an error.␊ 3 | });␊ ` + +## invalid(26): function foo() { return[globalThis][0].Error('message'); } + +> Input + + `␊ + 1 | function foo() {␊ + 2 | return[globalThis][0].Error('message');␊ + 3 | }␊ + ` + +> Output + + `␊ + 1 | function foo() {␊ + 2 | return new [globalThis][0].Error('message');␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + 1 | function foo() {␊ + > 2 | return[globalThis][0].Error('message');␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use \`new\` when creating an error.␊ + 3 | }␊ + ` diff --git a/test/snapshots/throw-new-error.mjs.snap b/test/snapshots/throw-new-error.mjs.snap index aa2b8ade04c70672ba986fdc3a834abce7a90778..84e6045ed9ea5795e0597b5f57238aaf01cbb28e 100644 GIT binary patch literal 1330 zcmV-21ST?XkUNy%X)OlZGZwh_8TnLsa6G&xrhIclPYu8L!tiev6cI?w#Mv-aB{q?{>oz z&7<(ot8aMZMjn54#r01d&uv*X`%4ye198e82Z0DI+YNo^IP8ij{OwJvHRWeHFl1oGWVPY_xMx)xF3yW6_8y4na{J*_D(;N+UKDCro2UjWQ?(M zHv0WM`mz0xvzIzJCW;mnBy}(kX6Ug+@T4pt<+*5*J2>`1c){KC!0cY z7xMc6)|SX9C^iVMDNwRv#BvDg9l#=$1elr7T#wPLC1^aiQPrLo)5fQS6rTGay{_O< zubt;pdrFSZNDUA?R6<_En-Ej+7KQ z)4`QZ5%kEc2?qN_XB>-lxMm=ACnohpLh4aJj6~1Os|qPIShK39sMW#YjzUfAg6ss? zIKYmuFdn#BI96hg>j}rNh1hn2ZRb}rO4D;kT2M3}fJsH6X);2feQ@dkP};@JbWWY5 zwwiE#xc$gX)YOAB;vzkmw#eUuv--vK;G~PxSr5fCrnIwGr<936Ifn+M!)>T#KtoK+X8S{jf1RZB5g zP}O1yJ~=x)JM$ywm6o09?FC3FaHgSS0FE+1Y8)JX0BWe#BAdr+keVD6_IICZVSNnQ zehBN8I*QaiP=2J4Qq+j)1<1b#OerbNXfDsAoDVE36_VLgK95=Tw9lhuWq3&sMAik9 zpKub*CXog=e|GB>J7$xwA#<`Ds*BVzjYs}krWh=!mfcI<-pZ?gheuC5(Qv%It{Ym0 zw;^k=fV)6JV?x1P2b=pUOwvn7^$gsOfT}L3iNn=Qj8_xJa!BY$t`}BwlQtnTT2Z{e z0<)UR+u*39{yTV{0(EnOIoQu}2kPk}L8hds7^WRCT2VW&31%x)`Iu;!pTF7d|KOjz zV5ko!n5OWZWAJzY)jDamtL<**Uwc4OeDt zjhzpIQrp*ou+NKzO}%h8g~pBkCms8(KT7$7Z%tnF;3Qlwem%-&t{#Xd$$=OQeeJ&A zj9lTfwh)#*-2SK^_y?V&$Q~Z7#^11HsvGP=Jqp=x(<3a|2yzE<1&UWh9fAe~+{+bk oxJ}bW#r^*m_W!SvF7DQ}3r+34v4Kr>6qJMTALw`hi3=hC0B>)Pb^rhX literal 1238 zcmV;{1S$JLRzVR|A(1ezEyg;Mu*KOU1y>)4wGN4Q?TBm^~gbLj% z7*pAt
=zRGsmm9?)B{{rGIllVW8o7m^C@41WXB=}vVe82bH=g!Y_&-tHj%NOna z=vY`M{dwvAg%1{z z=fcH>4=;RFW6WVED5`PaZE>GJ4GxC!SXKwwBFF+>lyhplLL+-|2&|_}Ecp__zNAu21n6u)fK(3@fni&x5>`yj@TSRxl?0fn&|FK=tYv6?uhr1*7t_M$gcP28AibvGQRN88 z1^qJsl-H7orh;@ch4dLf8iaCwF4OmQ#~oCe|b6yXu^m$>UK)%%Z$|HVHAsjnO6fsW-w<}Pf=@v!)=9{)&urwX;7VOG>hjcyj3al_=$eRVb$t$ZIM+klS;|Pf7a2%0YOSTR>yvsu#wDq`5Q!c8jWG#(H`K+ZF%qeTJ z44>>Bo*f6V`$o&obbA3(3Y@9wNWf7BNR5NTPe2XTT4b}h261Ggu)FhA3+q#e_G6f@ z)KR4Fg7T_DN>L-GS0MipFy*8)qnW&qvOln_+>p#Z=lfVxpZ9&VtO76Tfynw`@(XsN z#US$FX3uV&V#jRq8nPt2Gj)|*rtv7B%M^n-<+8ik?X5ie_jvrRFIukuyzfPp;WlIq zCU6HRXiO-W>tJ(Fg-Lqps2+pcK2X&KHLz>VJag5l}Y=Sc3fwSD=|s5@bl4jA2>*x;*o@H=)a!Ptq3VDf5CwANng|G3kEubLUEhX*EP9wWmmJ^`i-~ah8sm*FR;er zFSEB@Ax_V^bB$K#-MMI%V_Psp#;4#YVCR~{qlnLn`}Z05q(w^R@