From 589bdb8ccb871d1aa8e04b320da8f0a5cccd6e8f Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 11 Nov 2024 00:39:05 +0000 Subject: [PATCH] .artifact/apidoc.html | 2 +- .artifact/asset_image_logo_128.png | Bin 6858 -> 6829 bytes .artifact/asset_image_logo_256.png | Bin 11955 -> 11971 bytes .artifact/asset_image_logo_32.png | Bin 2076 -> 2064 bytes .artifact/asset_image_logo_512.png | Bin 10858 -> 10858 bytes .artifact/asset_image_logo_64.png | Bin 3922 -> 3905 bytes .artifact/coverage/coverage_report.txt | 4 +- .artifact/coverage/index.html | 8 +- .artifact/coverage/jslint.mjs.html | 17001 ++++++++++--------- .artifact/coverage/test.mjs.html | 88 +- .artifact/coverage_sqlite3_js/lib/sqlite3.js.html | 22 +- .artifact/coverage_sqlite3_sh/lib/sqlite3.js.html | 22 +- .artifact/jslint_wrapper_vscode/jslint.mjs | 17 +- .artifact/jslint_wrapper_vscode/package.json | 2 +- .../vscode-jslint-2024.11.1.vsix | Bin 0 -> 88293 bytes .../vscode-jslint-2024.6.28.vsix | Bin 88214 -> 0 bytes ...reenshot_browser__2f.artifact_2fapidoc.html.png | Bin 64374 -> 56261 bytes ...artifact_2fcoverage_sqlite3_js_2findex.html.png | Bin 28898 -> 28614 bytes ...coverage_sqlite3_js_2flib_2fsqlite3.js.html.png | Bin 70063 -> 58394 bytes ...artifact_2fcoverage_sqlite3_sh_2findex.html.png | Bin 28898 -> 28607 bytes ...coverage_sqlite3_sh_2flib_2fsqlite3.js.html.png | Bin 70416 -> 57708 bytes ...ser__2f.artifact_2fjslint_report_hello.html.png | Bin 28675 -> 30970 bytes ...rowser__2fjslint_2fbranch-beta_2findex.html.png | Bin 81885 -> 75953 bytes ...ranch-beta_2fjslint_wrapper_codemirror.html.png | Bin 29503 -> 9954 bytes .artifact/screenshot_changelog.svg | 90 +- .artifact/screenshot_js_coverage_report_spawn.svg | 34 +- .artifact/screenshot_package_listing.svg | 14 +- .artifact/screenshot_sh_coverage_report_spawn.svg | 60 +- .artifact/screenshot_sh_install_download.svg | 2 +- .artifact/screenshot_sh_install_download.svg.sh | 2 +- .artifact/screenshot_sh_jslint_dir.svg | 32 +- .ci.sh | 2 +- CHANGELOG.md | 4 + README.md | 4 +- apidoc.html | 2 +- branch-beta/.artifact/apidoc.html | 2 +- branch-beta/.artifact/asset_image_logo_128.png | Bin 6858 -> 6829 bytes branch-beta/.artifact/asset_image_logo_256.png | Bin 11955 -> 11971 bytes branch-beta/.artifact/asset_image_logo_32.png | Bin 2076 -> 2064 bytes branch-beta/.artifact/asset_image_logo_512.png | Bin 10858 -> 10858 bytes branch-beta/.artifact/asset_image_logo_64.png | Bin 3922 -> 3905 bytes branch-beta/.artifact/coverage/coverage_report.txt | 4 +- branch-beta/.artifact/coverage/index.html | 8 +- branch-beta/.artifact/coverage/jslint.mjs.html | 17001 ++++++++++--------- branch-beta/.artifact/coverage/test.mjs.html | 88 +- .../coverage_sqlite3_js/lib/sqlite3.js.html | 22 +- .../coverage_sqlite3_sh/lib/sqlite3.js.html | 22 +- .../.artifact/jslint_wrapper_vscode/jslint.mjs | 17 +- .../.artifact/jslint_wrapper_vscode/package.json | 2 +- .../vscode-jslint-2024.11.1.vsix | Bin 0 -> 88293 bytes .../vscode-jslint-2024.6.28.vsix | Bin 88214 -> 0 bytes ...reenshot_browser__2f.artifact_2fapidoc.html.png | Bin 64374 -> 56261 bytes ...artifact_2fcoverage_sqlite3_js_2findex.html.png | Bin 28898 -> 28614 bytes ...coverage_sqlite3_js_2flib_2fsqlite3.js.html.png | Bin 70063 -> 58394 bytes ...artifact_2fcoverage_sqlite3_sh_2findex.html.png | Bin 28898 -> 28607 bytes ...coverage_sqlite3_sh_2flib_2fsqlite3.js.html.png | Bin 70416 -> 57708 bytes ...ser__2f.artifact_2fjslint_report_hello.html.png | Bin 28675 -> 30970 bytes ...rowser__2fjslint_2fbranch-beta_2findex.html.png | Bin 81885 -> 75953 bytes ...ranch-beta_2fjslint_wrapper_codemirror.html.png | Bin 29503 -> 9954 bytes branch-beta/.artifact/screenshot_changelog.svg | 90 +- .../screenshot_js_coverage_report_spawn.svg | 34 +- .../.artifact/screenshot_package_listing.svg | 14 +- .../screenshot_sh_coverage_report_spawn.svg | 60 +- .../.artifact/screenshot_sh_install_download.svg | 2 +- .../screenshot_sh_install_download.svg.sh | 2 +- branch-beta/.artifact/screenshot_sh_jslint_dir.svg | 32 +- branch-beta/.ci.sh | 2 +- branch-beta/CHANGELOG.md | 4 + branch-beta/README.md | 4 +- branch-beta/index.html | 6 +- branch-beta/jslint.js | 17 +- branch-beta/jslint.mjs | 17 +- branch-beta/jslint_ci.sh | 4 +- branch-beta/package.json | 2 +- index.html | 6 +- jslint.js | 17 +- jslint.mjs | 17 +- jslint_ci.sh | 4 +- package.json | 2 +- 79 files changed, 17517 insertions(+), 17397 deletions(-) --- .artifact/apidoc.html | 2 +- .artifact/asset_image_logo_128.png | Bin 6858 -> 6829 bytes .artifact/asset_image_logo_256.png | Bin 11955 -> 11971 bytes .artifact/asset_image_logo_32.png | Bin 2076 -> 2064 bytes .artifact/asset_image_logo_512.png | Bin 10858 -> 10858 bytes .artifact/asset_image_logo_64.png | Bin 3922 -> 3905 bytes .artifact/coverage/coverage_report.txt | 4 +- .artifact/coverage/index.html | 8 +- .artifact/coverage/jslint.mjs.html | 17001 ++++++++-------- .artifact/coverage/test.mjs.html | 88 +- .../coverage_sqlite3_js/lib/sqlite3.js.html | 22 +- .../coverage_sqlite3_sh/lib/sqlite3.js.html | 22 +- .artifact/jslint_wrapper_vscode/jslint.mjs | 17 +- .artifact/jslint_wrapper_vscode/package.json | 2 +- .../vscode-jslint-2024.11.1.vsix | Bin 0 -> 88293 bytes .../vscode-jslint-2024.6.28.vsix | Bin 88214 -> 0 bytes ...hot_browser__2f.artifact_2fapidoc.html.png | Bin 64374 -> 56261 bytes ...act_2fcoverage_sqlite3_js_2findex.html.png | Bin 28898 -> 28614 bytes ...age_sqlite3_js_2flib_2fsqlite3.js.html.png | Bin 70063 -> 58394 bytes ...act_2fcoverage_sqlite3_sh_2findex.html.png | Bin 28898 -> 28607 bytes ...age_sqlite3_sh_2flib_2fsqlite3.js.html.png | Bin 70416 -> 57708 bytes ...2f.artifact_2fjslint_report_hello.html.png | Bin 28675 -> 30970 bytes ...r__2fjslint_2fbranch-beta_2findex.html.png | Bin 81885 -> 75953 bytes ...-beta_2fjslint_wrapper_codemirror.html.png | Bin 29503 -> 9954 bytes .artifact/screenshot_changelog.svg | 90 +- .../screenshot_js_coverage_report_spawn.svg | 34 +- .artifact/screenshot_package_listing.svg | 14 +- .../screenshot_sh_coverage_report_spawn.svg | 60 +- .artifact/screenshot_sh_install_download.svg | 2 +- .../screenshot_sh_install_download.svg.sh | 2 +- .artifact/screenshot_sh_jslint_dir.svg | 32 +- .ci.sh | 2 +- CHANGELOG.md | 4 + README.md | 4 +- apidoc.html | 2 +- branch-beta/.artifact/apidoc.html | 2 +- .../.artifact/asset_image_logo_128.png | Bin 6858 -> 6829 bytes .../.artifact/asset_image_logo_256.png | Bin 11955 -> 11971 bytes branch-beta/.artifact/asset_image_logo_32.png | Bin 2076 -> 2064 bytes .../.artifact/asset_image_logo_512.png | Bin 10858 -> 10858 bytes branch-beta/.artifact/asset_image_logo_64.png | Bin 3922 -> 3905 bytes .../.artifact/coverage/coverage_report.txt | 4 +- branch-beta/.artifact/coverage/index.html | 8 +- .../.artifact/coverage/jslint.mjs.html | 17001 ++++++++-------- branch-beta/.artifact/coverage/test.mjs.html | 88 +- .../coverage_sqlite3_js/lib/sqlite3.js.html | 22 +- .../coverage_sqlite3_sh/lib/sqlite3.js.html | 22 +- .../jslint_wrapper_vscode/jslint.mjs | 17 +- .../jslint_wrapper_vscode/package.json | 2 +- .../vscode-jslint-2024.11.1.vsix | Bin 0 -> 88293 bytes .../vscode-jslint-2024.6.28.vsix | Bin 88214 -> 0 bytes ...hot_browser__2f.artifact_2fapidoc.html.png | Bin 64374 -> 56261 bytes ...act_2fcoverage_sqlite3_js_2findex.html.png | Bin 28898 -> 28614 bytes ...age_sqlite3_js_2flib_2fsqlite3.js.html.png | Bin 70063 -> 58394 bytes ...act_2fcoverage_sqlite3_sh_2findex.html.png | Bin 28898 -> 28607 bytes ...age_sqlite3_sh_2flib_2fsqlite3.js.html.png | Bin 70416 -> 57708 bytes ...2f.artifact_2fjslint_report_hello.html.png | Bin 28675 -> 30970 bytes ...r__2fjslint_2fbranch-beta_2findex.html.png | Bin 81885 -> 75953 bytes ...-beta_2fjslint_wrapper_codemirror.html.png | Bin 29503 -> 9954 bytes .../.artifact/screenshot_changelog.svg | 90 +- .../screenshot_js_coverage_report_spawn.svg | 34 +- .../.artifact/screenshot_package_listing.svg | 14 +- .../screenshot_sh_coverage_report_spawn.svg | 60 +- .../screenshot_sh_install_download.svg | 2 +- .../screenshot_sh_install_download.svg.sh | 2 +- .../.artifact/screenshot_sh_jslint_dir.svg | 32 +- branch-beta/.ci.sh | 2 +- branch-beta/CHANGELOG.md | 4 + branch-beta/README.md | 4 +- branch-beta/index.html | 6 +- branch-beta/jslint.js | 17 +- branch-beta/jslint.mjs | 17 +- branch-beta/jslint_ci.sh | 4 +- branch-beta/package.json | 2 +- index.html | 6 +- jslint.js | 17 +- jslint.mjs | 17 +- jslint_ci.sh | 4 +- package.json | 2 +- 79 files changed, 17517 insertions(+), 17397 deletions(-) create mode 100644 .artifact/jslint_wrapper_vscode/vscode-jslint-2024.11.1.vsix delete mode 100644 .artifact/jslint_wrapper_vscode/vscode-jslint-2024.6.28.vsix create mode 100644 branch-beta/.artifact/jslint_wrapper_vscode/vscode-jslint-2024.11.1.vsix delete mode 100644 branch-beta/.artifact/jslint_wrapper_vscode/vscode-jslint-2024.6.28.vsix diff --git a/.artifact/apidoc.html b/.artifact/apidoc.html index a7a87b72c..7fa347756 100644 --- a/.artifact/apidoc.html +++ b/.artifact/apidoc.html @@ -67,7 +67,7 @@
-

API Doc for JSLint (v2024.6.28)

+

API Doc for JSLint (v2024.11.1-beta)

Table of Contents

diff --git a/.artifact/asset_image_logo_128.png b/.artifact/asset_image_logo_128.png index 42483b97cc0f8d7be1605f5f8b08b334ecae7bcf..89d9185f47926f1bb5b306092db727b8ac799906 100644 GIT binary patch delta 6732 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 O2R&ETP%2X}{rEo)-baZNk`X=;E&niOwiNMDIke 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 literal 11955 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 LNkvXXu0mjf5JSIY diff --git a/.artifact/asset_image_logo_512.png b/.artifact/asset_image_logo_512.png index 85f2ca00256981ae7e36e04ca70068d26ed9fde1..585908e3ab820871f70b5da8fc8971373e723a36 100644 GIT binary patch literal 10858 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 literal 10858 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 L@0P1rKmUIKu?1@L diff --git a/.artifact/asset_image_logo_64.png b/.artifact/asset_image_logo_64.png index 9a6c139778314e600287d06d250f2951ce8b442e..633a86d5da1c9c5617676d3b93533c4a1b06ec98 100644 GIT binary patch delta 3820 zcmVE@vd4CHF03|eERiO<401ib-L_t(&-ql)rloZvO|Gs-~RdrW)&kQ39 zBM)^~QB*P*1ddM>S2>1NFuor-8y6x*Kvz6UA}+2Rm8e&}9!>ZY=_*w)s z@dd_=4-jQt9b^QRnV#;duIIhq{&Bl|ngM2}aR!om>dfi6^?y~}@AuvBb-((Mh=>Rg ziAX7hj4{Oj`{IjL>(;&f{`)Pht$Ejtr9=RN{WtV-g7Zu&HT=*+$Bh~_dBTLlhYnRl zq!eRJGmMC+lqz%2Ip4NpN7Lhvzx1a+6BBhyW)x= zg9b?{J25Dw0DnMp|J>TO^A|5}@94;+QeF@dQ6`nJEej721|lj1LEiNdF=-ij*Bww> zyI}V0$!DCQF#rG(k(82i{^-+BFKBA2&17P!i0B_q95rct)Dm-bX~iu_N!?K6B;|zyE#BHpX$xIsg6Y)qnqT_uU88)pfXq;|?GCZ~uJB z=;Mwe0ElByiuR}aR}4e|#y|)J_{)c%-2TW@8$bJ^Hf8V3W`8kn-uV+JN-2?uT3TB# zm^Di(<@&+tjUyM`G(BY}eYZdW4Dmqej~+y%h!7x=vR&7^{{H2!Hg8HLEYA5eOO_08 zXkY-)^ndu{*?caN^7tc$ExKuX(l9)?z&RJ3<6prLoO8}Sw~#cAMK?`9{)nNGl-XQI z(_@bT0Nc{iviglT(sqgg%%65i%1#DhC^#n~0O&^int+I6DJ!q?{O*)esxHK8H{#v2 z2sMG=JP5;-o&48nmok8~om&0on_F61_|ap>zJIo1LnPIt@uRPva<=CdH1|Dfj`m`V zF)L*Y%hZ=)nIvW9EK8FK%QO-uNTsA?jCH@FegkJL48q|<25*FjR1gvM9?GmWvR5~oOQ3Q*M>p>L^NUavGq0SSjuv&DMlR5 zUw?RQz2o_uF#<~B;GA)dt6u-JA^4lk&7!5Xl_AU6 z=7`}95XXAQ0D1JRtK9avwd;+T~rM*wCr@v}#sYI^!b z(-4|VhUkaU2}d3N@U7P!QdjHyJ!1eOM1O!d9x<#TZ6~5QZu#;{mM;_l!A@AUwyl(c zUb`Ix03goUfJ|yYCRLYC=^vak0KyXYfN0stg)5#~`s~Yt>T7FKw&2|08~`$Qa?|JA zu37ltSJ{q4GEvS6y0ZsFQmQs(+X)i@9M=_6N_~$r1nPz4y9x!QRONq5W?9rR0Dmxr zSh(V;Wxs!UU|pu*hldS5c$N)epCHl|FD@BQn{lu!ZP0zeIsJ>Pyl1ioR#2MpHAft_H^X%eO(w(a<4b4zO?m6WkWM4eIkP9X}TqQkB7{rwIAc8#X(d3VOomVa*fd|NVY z$FbDn=A29feg=Rjl?tLrC*(@0WWwCumYsH2)0URj5{6Qw+o!Ct9|17NRKdS+ z!uS(L9MPV4h2Q`nrAj9g+uJ&(-L<3(hJ9S6M+%+LmM`il{px%*Vid;>hYVbC>vhKr zKQ!kQG=^BpKE%)i0Ij&D5P#*1_mp^5KFb*MJ#SEb-HLfLkM17~dj(LgR_x5>x9@D< z(U#rOmi=;PyW{zc^=hSJ3dyd)~R>;>p)s z{5>!4uwE?I1;g@rGpF6z^zqi#nzS9qvJ=DIP0N4s9Kximqx`{yU|pl(G`mE9>7g1wVCcBS{&0zS1r@isL9QzqaTPO3K!kJHQx| zO2wsf1_5!#z!0Voh9STZhTxT=52DBrT*FpGV4Cm$Z_Cu5-hX%F&mVqw<0qD#w2}!! za4-$Q83AeTBPpd)oU?sUq3(8oh>+pjE2sYW=MVc~XeTU&=z6}pvpt)45ix0*J3AcB zJ0fQD?wrfcJLa&VK^P(;M~vOV)sxSBXY;3zz4Yqp4ey;k`q--{pE+b;eL9L9&u55? zVZje;?Bv`lr+*@2L~*rtjEz&K#8M8(q@P`Q^MFjTnoz#2l(N#P_3wQ&h`N+bKw&JU zlwJ^7hFE&bjB%q!26?x~AW%waovA;)uRZSw&U@Ga#($WXbH;w>m}R$Id+oi;zRupYJ=au10EvjIkgHlcu@k=4-CIciGx^H^x$SIIg~>6dhEP zUV6)nag8Ir4o8Sy)uXCVp`sfRTw{3fmTOk7e%&(7N^gpYUJ!og?+^RIKTZssLYe#W z8Gv&Zg@2K4S^qI-`hzQ1xqiSI*Oi+f3@@B`(zwQvUTz<`haSC98AIT>V@4i1u5lz0 zVTH3KAOs|(f`X3-mE1#T7-mrzW)jxCA6>5Liw`2IFbW)ZpSkZ20980O{W}W6&=2+) zhY^vLL|*wUmNtYjMoM{kr}Gg&0%C~ex+3k#jemBLNEHCe3zw5Nr9YzWWsN;jmI~spmXIHYL5b2b4a+cgmt6O(^nS%&0gy_W zne-FSuU)+I`GIvc-(+*MFFJSnh39&CM<ohhda+{4lZ; z*1qjPuZFgPU#@(9@qa#laBb%6j{NKk&;8Lw=QeIvR7#OjinPZ8fTU^M zGxG;0jylH4=F$Udo_uc2qLr)C$wbCZhH;#+lTWUGeZ_yja{Wc!SyUg@g%JHPY=6%= zS*OsRbNny_L@jZx(^f(tfz5D2Wm!5TUzTlZc znsi;-7B%UFX+~1o3G1u&j#vKtKA46ngi(`D zn5H5E1VxlEO`|5AFpX}Ecz+akOAt{h1+k2!gjg!25Ks{b&Mni>O&#U=N_y4pNp1fD z03gum9v~E(U@DKL#dHEXs~%MP7hvyEe18Jym+`j`;DB~BecMshM?Qp-kAJDOr@roG zp`w{otXRCUCr6~)(s(STA|;h72A@5?7>F?jf*XRDU9!&C`&6VDgi$OdLoBaYnF|$r z6qM5Ia>iKNwgI5vhgsJ{#&)e$74t*{V95M1igQjj?`9o0>$vTC#}C7jRLYcCIaAd< zGK3(U_}x*545%&mfx&q>7k?_YED!+^GS=aEg&+WcbjlXP8ydc8YjX*5jbo&wKtS#s2yg$h1%9OE`Q7kLU7FEnMMBfh^k3DkP z+-qmtv(yixF1ZlroRk6~KHl2u6ns54gdhWw7wY; zV<}G>JsP)s{`qBd=7dosmHPGk>%Tkl$a2e&ZYbGfGOVqtd~~d&tUL-rK5EFI#}?d} zFpRL&wAIaV1a>{<@9p?s)qL68=r&MIpzlhhEYmDR(N*&w_+;A-&nsL$dGcL1-iSo> z#rEw}XU&SE$PK~?jUyM`G~Kq7zFX*plk6nWhna6bU%A6jI)5h>oBj&k_5Z&7)#gnp z%M^z3?2;uz2M;c`T|T#V?d&`6tgo$gJpcH=8-B;MOO6|PBmqDaW8XT;DhDwJhCqN1 zH*UH8ktaX+bZa`9XzS=$eA{ih{k604^_R~)bH|b;f^*jo1ZU@rYdm{wp68J!J~6|9O% zj+IhfQlq~H9J{kr*?#~39`UFH{&3lV0000bbVXQnWMyG=WjbSWWnpw>05UK#G%YbP zEio}vFfckZH##*kD=;uRFfea7b_)Oi03~!qSaf7zbY(hiZ)9m^c>ppnGBhnQF)cAM iR4_0)GdDUlGAl4JIxsLEYR0}Tdfs;l0sx8D2BAGhjtK|^;Jp(S(AJ9VmVeSh!W@AutryWjheh=>Rg ziAYL`j4{NocJ5rUZr%HvH#fJm5CQR9APOzD5( zi9(2W3{pw}P=DMnU%U39`STC7wPjK%*AIy(lS){oiN^^85fywt?|6uqH1)jW)K*tN zHgo3W^Uqfp0046_c)avS4I+|62#`owj^p0(^pdxmK1(G`&iNaSjf3jy z7yv9-x_>mA&xJw^A3Sj0tf@&|cbx*~T;m-70*1yp=iGG)NkgAEYwGa9141FPxwZu_ zz6bzpTXXa34I9!{iUB-y^R+1}=?8(vIS~OsC*oHGL=*{8e#P@0DTR=S5X%n49kd7) zfyTKX1Su=|Pd8o10Mb@!^?UDaYi{PJj~eyPrhiSLkdwwV{KMrJx=ulH-=*d#FUA-% zQe5Yvgebo~4l)E_rYzkw6`5uldcpu9r4Wp<&R0}V;EV-+FsOgO&$sXTZ2Qh2 z2>R62XuoS};+%((yl`|q03aX{bjf`zmDZfS?wyUwPzZpCCN!MUt12A{5yu)L0z|H9 ztAEyS$~i7)i~tZJip1FZVg38|@?4L1B{f7O00abpi$>S4c=tnHxGo_gW+XJ1{R zYg}>35dAP5K6ucQ2X3$HUE3WDK!gYoMSrIatV>&oFp8RY?`HWz0T8T&S#4QTO6a!R zK>z^aoYiJhwV6~+I;FmF&HxBY+yj7_PCoU*>+@e**|(;uDrIS$>zo5XI+@tEYtJon z7Vh4EAdyVQIYDRkfJjnSrz|UB0D$c{nh-+$#~A{3L-L0T1%#0C&yradb&LQ^Lw{G? z_pZ)(esEHsUiaO2C1+Uhf@NzqZ20{bAAPa?mY@D?$$dXOp|&avMdv{i0f>MzWXJ$O zNU8Ollb4bbY3q&uS^qDuEI*;Pnj{G+tz=^2m92mf?l3DmrwOcHTqU_A@~ zh)A6zh{({j-FsWNZr^F9EFmN!GKPTQ*>30uCAVAI^Lrcs0w}vABF=fP;D6pWchS}_ zo0AzUiiA>kb?&H0`@b~+D5Ug)P+^c#CQV~sTmI(97i|41W+P&`{5Ro2*p02pJ^ z^)5ee)Tm+KIgoRdDGMP}33GqWzWMP5TfaI8!%?o%C51|8)|n#s3bbBUX`SvMBzh+*oS1zWz_QIod9NW>VX&RMv4_J3`|P8r|_fjX)m zgB>Wb0InCkUvNQ6T4R2(2GUQiTIx0Y!?NlFQ&K&CJ(zW?_6At!r5$QT1a zsp3GTymt#grB5xRSAT-nOe0|>spNt==WfC4+pq7XP2BmzU<`gO}y4?H>ZiA5VXe}8Ty6J|1DXdDb(<3%!t zED}-(sUpm=+yNp&hO@ta#Sfoc>;-|9Fd3rldiK87Y~Ddc%QW}3HjR#w)nS zBfnxhJ|X~>U4Qw0FuLK4MfXmd_QZ1q&+k>0Ubg1FU%#_4CX+;lrV-GAoHOhCOJ_{E zEU*iRMXeK3CX?p8SyK^U^@m&5ee~)2&7aq#Q$!RB(W@%u`T=Kb;g4<^clK~U?^GHD zy50fCn47cD898*(?AxZzU9>lw=M06Ev9%%sLnfrScYn&|)33kG%R8zXsg!{+76hTG zYtPP_I`he&uiCiT(6yXX06@l&Bvq%ah4obp0?Q!ZK$`K3``E8!f)SDpGd!oQijVA$oq`1)*Xw zVdx1%mmTDxB;*BwU!pV(-PHAtlIxt6?yuM_076P5lYVLC+WE^?_Nl4bm(9(*`r@fq zUF_yQPLF24bJMJ7n(XkN3N!yWM*p#`T7-hLmtKwqJ zhLmI&dODR1ynu10;t9*yUJ#&?H-HxeVSmo{g3wBsN4Epr8p;NKxoqY9*H-qe&g^Z= z&%Em5Tduy?Zp)>stCUXHX3|1RNm5Eueg^=OhCX-tjpvLQYG-rl+NzhAubH=OMLLdq|c7}bRky&yP{v$J;LK+g7p01%bLl}=}Er!|-N{C|)Y zU$j6FMmzqr|F$Q7{=t^d)0q^A3TnDN0N{w$Qk*w+&Go|@CXHX$_~`3%?pfFP==U!= zkBEXWoHqBlrmbIsl-Eo=_oL_k`ML|n<_oT&Y59VC-34RSjIyX61#l#5iRVF*Oc=UW zm99x!T2(q>7@-hW!u->Lwzodq41b1hXqsM?P8fzH0t88vFbusaoiOxHjJU^(yJZkj zN(qsOgn&p$DG^W-X`Gveu9`aH`Eq($med?i000EVg91Xa38v(=R3uOz?Ntvd{RB92 z6#q5>^vL-C58$|VGyS=vqL+LKB_C66Psh5Kh2rycykhZ>!#N_=mc}C?B!5XEWij|1 z_Q61mG0?cK@z^D+eEpb;6#XEKgkXsAisiXbu}48lwJv9jr7a5p3SN+PTx9IvT2(Pm zL;!}&3&JR8XY)?hcCxl}Aa8p?P?AbaiRCjD%_BqbgNbL2IH9(>;Q2b|aV}J9Ss)-n z#@cMR;QIiOPFdQZy1IR>t$%jG`(j7SX@dun7htLL#Ubd)Uo*{Z(P=CgdMYC_4HupI%2oK4HIOilKXxbM$TI_;n zXnauJNo-7geIx`Tta|?wC?3*FT27QSjb2shnslmHRVHETiu(@xUVlcJN%g8qCrty0 zDxL@6oVm7h_VCl6yJyN)^KLL^hx2cK>G z`^V;S#tdD5>FKADh=1;X=9!n4FHa_|Q~RIz;$wFubUi3FZFO=SfrF3vM>_sjG#`5# z)ds2v)W1SX(=ZBQc*8@_{9)HOu3NZ%^5nW9snHPy0` zo>SXw(a3xyt3u19n~qTwXJRbgAc0q*Y?KOU%v6i zqm7N#nM^1I0$wzFfLwqwyklFmDjtEJq#%$Au{Rog=5D~pE6}YzkUZbe;>B}e*3OnE7q;s@bSmZ zyLa1;Bcwbo?f0CqbSgEduI}81hD#<)IHiC8j_vpV2X=y(ul33}hll_G03~!qSaf7z zbY(hYa%Ew3WdJfTGBhnPHZ3waR5CC+GC4XlGb=DKIxsLa6CybP001R)MObuXVRU6W zZEs|0W_bWIFfuePFg7hRIaD$*Ix;yrG&3tOFgh?WMNXQ900000NkvXXu0mjfKulPc diff --git a/.artifact/coverage/coverage_report.txt b/.artifact/coverage/coverage_report.txt index 53e08ff46..18fd858a1 100644 --- a/.artifact/coverage/coverage_report.txt +++ b/.artifact/coverage/coverage_report.txt @@ -3,10 +3,10 @@ V8 Coverage Report | Files covered | Lines | Remaining | +----------------------------------+-------------------+-------------------+ | ./ | 100.00 % | | -| ******************************** | 13188 / 13188 | 0 / 13188 | +| ******************************** | 13199 / 13199 | 0 / 13199 | +----------------------------------+-------------------+-------------------+ | ./jslint.mjs | 100.00 % | | -| ******************************** | 11563 / 11563 | 0 / 11563 | +| ******************************** | 11574 / 11574 | 0 / 11574 | +----------------------------------+-------------------+-------------------+ | ./jslint_wrapper_cjs.cjs | 100.00 % | | | ******************************** | 49 / 49 | 0 / 49 | diff --git a/.artifact/coverage/index.html b/.artifact/coverage/index.html index 1d2a3b1b0..38a80ec05 100644 --- a/.artifact/coverage/index.html +++ b/.artifact/coverage/index.html @@ -143,11 +143,11 @@ 100.00 %
- 13188 / 13188 + 13199 / 13199
- 0 / 13188 + 0 / 13199 @@ -159,11 +159,11 @@ 100.00 %
- 11563 / 11563 + 11574 / 11574
- 0 / 11563 + 0 / 11574 diff --git a/.artifact/coverage/jslint.mjs.html b/.artifact/coverage/jslint.mjs.html index ed80466e7..9fa075156 100644 --- a/.artifact/coverage/jslint.mjs.html +++ b/.artifact/coverage/jslint.mjs.html @@ -143,11 +143,11 @@ 100.00 %
- 11563 / 11563 + 11574 / 11574
- 0 / 11563 + 0 / 11574 @@ -321,7 +321,7 @@
  164.      1    + "`abcdefghijklmnopqrstuvwxyz{|}~\u007f"
  165.      1);
-
  166.      1let jslint_edition = "v2024.6.28";
+
  166.      1let jslint_edition = "v2024.11.1-beta";
  167.      1let jslint_export;                      // The jslint object to be exported.
  168.      1let jslint_fudge = 1;                   // Fudge starting line and starting
  169.      1                                        // ... column to 1.
@@ -462,10 +462,10 @@
  304.      3    }
  305.    267}
  306.      1
-
  307.   1926function assertOrThrow(condition, message) {
-
  308.   1926
-
  309.   1926// This function will throw <message> if <condition> is falsy.
-
  310.   1926
+
  307.   1931function assertOrThrow(condition, message) {
+
  308.   1931
+
  309.   1931// This function will throw <message> if <condition> is falsy.
+
  310.   1931
  311.      4    if (!condition) {
  312.      4        throw (
  313.      4            (!message || typeof message === "string")
@@ -473,16 +473,16 @@
  315.      4            : message
  316.      4        );
  317.      4    }
-
  318.   1926}
+
  318.   1931}
  319.      1
-
  320.  93854function empty() {
-
  321.  93854
-
  322.  93854// The empty function produces a new empty object that inherits nothing. This is
-
  323.  93854// much better than '{}' because confusions around accidental method names like
-
  324.  93854// 'constructor' are completely avoided.
-
  325.  93854
-
  326.  93854    return Object.create(null);
-
  327.  93854}
+
  320.  94133function empty() {
+
  321.  94133
+
  322.  94133// The empty function produces a new empty object that inherits nothing. This is
+
  323.  94133// much better than '{}' because confusions around accidental method names like
+
  324.  94133// 'constructor' are completely avoided.
+
  325.  94133
+
  326.  94133    return Object.create(null);
+
  327.  94133}
  328.      1
  329.     59async function fsWriteFileWithParents(pathname, data) {
  330.     59
@@ -729,103 +729,103 @@
  571.    181    };
  572.    181}
  573.      1
-
  574.  14203function htmlEscape(str) {
-
  575.  14203
-
  576.  14203// This function will make <str> html-safe by escaping & < >.
-
  577.  14203
-
  578.  14203    return String(str).replace((
-
  579.  14203        /&/g
-
  580.  14203    ), "&amp;").replace((
-
  581.  14203        /</g
-
  582.  14203    ), "&lt;").replace((
-
  583.  14203        />/g
-
  584.  14203    ), "&gt;");
-
  585.  14203}
+
  574.  14214function htmlEscape(str) {
+
  575.  14214
+
  576.  14214// This function will make <str> html-safe by escaping & < >.
+
  577.  14214
+
  578.  14214    return String(str).replace((
+
  579.  14214        /&/g
+
  580.  14214    ), "&amp;").replace((
+
  581.  14214        /</g
+
  582.  14214    ), "&lt;").replace((
+
  583.  14214        />/g
+
  584.  14214    ), "&gt;");
+
  585.  14214}
  586.      1
-
  587.    666function jslint(
-
  588.    666    source = "",                // A text to analyze.
-
  589.    666    option_dict = empty(),      // An object whose keys correspond to option
-
  590.    666                                // ... names.
-
  591.    666    global_list = []            // An array of strings containing global
-
  592.    666                                // ... variables that the file is allowed
-
  593.    666                                // ... readonly access.
-
  594.    666) {
-
  595.    666
-
  596.    666// The jslint function itself.
-
  597.    666
-
  598.    666    let catch_list = [];        // The array containing all catch-blocks.
-
  599.    666    let catch_stack = [         // The stack of catch-blocks.
-
  600.    666        {
-
  601.    666            context: empty()
-
  602.    666        }
-
  603.    666    ];
-
  604.    666    let cause_dict = empty();   // The object of test-causes.
-
  605.    666    let directive_list = [];    // The directive comments.
-
  606.    666    let export_dict = empty();  // The exported names and values.
-
  607.    666    let function_list = [];     // The array containing all functions.
-
  608.    666    let function_stack = [];    // The stack of functions.
-
  609.    666    let global_dict = empty();  // The object containing the global
-
  610.    666                                // ... declarations.
-
  611.    666    let import_list = [];       // The array collecting all import-from strings.
-
  612.    666    let line_list = String(     // The array containing source lines.
-
  613.    666        "\n" + source
-
  614. 105158    ).split(jslint_rgx_crlf).map(function (line_source) {
-
  615. 105158        return {
-
  616. 105158            line_source
-
  617. 105158        };
-
  618. 105158    });
-
  619.    666    let mode_stop = false;      // true if JSLint cannot finish.
-
  620.    666    let property_dict = empty();        // The object containing the tallied
-
  621.    666                                        // ... property names.
-
  622.    666    let state = empty();        // jslint state-object to be passed between
-
  623.    666                                // jslint functions.
-
  624.    666    let syntax_dict = empty();  // The object containing the parser.
-
  625.    666    let tenure = empty();       // The predefined property registry.
-
  626.    666    let token_global = {        // The global object; the outermost context.
-
  627.    666        async: 0,
-
  628.    666        body: true,
-
  629.    666        context: empty(),
-
  630.    666        finally: 0,
-
  631.    666        from: 0,
-
  632.    666        id: "(global)",
-
  633.    666        level: 0,
-
  634.    666        line: jslint_fudge,
-
  635.    666        live: [],
-
  636.    666        loop: 0,
-
  637.    666        switch: 0,
-
  638.    666        thru: 0,
-
  639.    666        try: 0
-
  640.    666    };
-
  641.    666    let token_list = [];        // The array of tokens.
-
  642.    666    let warning_list = [];      // The array collecting all generated warnings.
-
  643.    666
-
  644.    666// Error reportage functions:
-
  645.    666
-
  646.   8034    function artifact(the_token) {
-
  647.   8034
-
  648.   8034// Return a string representing an artifact.
-
  649.   8034
-
  650.    254        the_token = the_token || state.token_nxt;
-
  651.   8034        return (
-
  652.   5259            (the_token.id === "(string)" || the_token.id === "(number)")
+
  587.    668function jslint(
+
  588.    668    source = "",                // A text to analyze.
+
  589.    668    option_dict = empty(),      // An object whose keys correspond to option
+
  590.    668                                // ... names.
+
  591.    668    global_list = []            // An array of strings containing global
+
  592.    668                                // ... variables that the file is allowed
+
  593.    668                                // ... readonly access.
+
  594.    668) {
+
  595.    668
+
  596.    668// The jslint function itself.
+
  597.    668
+
  598.    668    let catch_list = [];        // The array containing all catch-blocks.
+
  599.    668    let catch_stack = [         // The stack of catch-blocks.
+
  600.    668        {
+
  601.    668            context: empty()
+
  602.    668        }
+
  603.    668    ];
+
  604.    668    let cause_dict = empty();   // The object of test-causes.
+
  605.    668    let directive_list = [];    // The directive comments.
+
  606.    668    let export_dict = empty();  // The exported names and values.
+
  607.    668    let function_list = [];     // The array containing all functions.
+
  608.    668    let function_stack = [];    // The stack of functions.
+
  609.    668    let global_dict = empty();  // The object containing the global
+
  610.    668                                // ... declarations.
+
  611.    668    let import_list = [];       // The array collecting all import-from strings.
+
  612.    668    let line_list = String(     // The array containing source lines.
+
  613.    668        "\n" + source
+
  614. 105217    ).split(jslint_rgx_crlf).map(function (line_source) {
+
  615. 105217        return {
+
  616. 105217            line_source
+
  617. 105217        };
+
  618. 105217    });
+
  619.    668    let mode_stop = false;      // true if JSLint cannot finish.
+
  620.    668    let property_dict = empty();        // The object containing the tallied
+
  621.    668                                        // ... property names.
+
  622.    668    let state = empty();        // jslint state-object to be passed between
+
  623.    668                                // jslint functions.
+
  624.    668    let syntax_dict = empty();  // The object containing the parser.
+
  625.    668    let tenure = empty();       // The predefined property registry.
+
  626.    668    let token_global = {        // The global object; the outermost context.
+
  627.    668        async: 0,
+
  628.    668        body: true,
+
  629.    668        context: empty(),
+
  630.    668        finally: 0,
+
  631.    668        from: 0,
+
  632.    668        id: "(global)",
+
  633.    668        level: 0,
+
  634.    668        line: jslint_fudge,
+
  635.    668        live: [],
+
  636.    668        loop: 0,
+
  637.    668        switch: 0,
+
  638.    668        thru: 0,
+
  639.    668        try: 0
+
  640.    668    };
+
  641.    668    let token_list = [];        // The array of tokens.
+
  642.    668    let warning_list = [];      // The array collecting all generated warnings.
+
  643.    668
+
  644.    668// Error reportage functions:
+
  645.    668
+
  646.   8041    function artifact(the_token) {
+
  647.   8041
+
  648.   8041// Return a string representing an artifact.
+
  649.   8041
+
  650.    256        the_token = the_token || state.token_nxt;
+
  651.   8041        return (
+
  652.   5266            (the_token.id === "(string)" || the_token.id === "(number)")
  653.   2900            ? String(the_token.value)
-
  654.   5134            : the_token.id
-
  655.   8034        );
-
  656.   8034    }
-
  657.    666
-
  658.  31922    function is_equal(aa, bb) {
-
  659.  31922
-
  660.  31922// test_cause:
-
  661.  31922// ["0&&0", "is_equal", "", "", 0]
-
  662.  31922
-
  663.  31922        test_cause("");
-
  664.  31922
-
  665.  31922// Probably deadcode.
-
  666.  31922// if (aa === bb) {
-
  667.  31922//     return true;
-
  668.  31922// }
-
  669.  31922
-
  670.  31922        jslint_assert(!(aa === bb), `Expected !(aa === bb).`);
+
  654.   5141            : the_token.id
+
  655.   8041        );
+
  656.   8041    }
+
  657.    668
+
  658.  31957    function is_equal(aa, bb) {
+
  659.  31957
+
  660.  31957// test_cause:
+
  661.  31957// ["0&&0", "is_equal", "", "", 0]
+
  662.  31957
+
  663.  31957        test_cause("");
+
  664.  31957
+
  665.  31957// Probably deadcode.
+
  666.  31957// if (aa === bb) {
+
  667.  31957//     return true;
+
  668.  31957// }
+
  669.  31957
+
  670.  31957        jslint_assert(!(aa === bb), `Expected !(aa === bb).`);
  671.     27        if (Array.isArray(aa)) {
  672.     27            return (
  673.     27                Array.isArray(bb)
@@ -840,108 +840,108 @@
  682.     27                    return is_equal(value, bb[index]);
  683.     27                })
  684.     27            );
-
  685.  31895        }
-
  686.  31895
-
  687.  31895// Probably deadcode.
-
  688.  31895// if (Array.isArray(bb)) {
-
  689.  31895//     return false;
-
  690.  31895// }
-
  691.  31895
-
  692.  31895        jslint_assert(!Array.isArray(bb), `Expected !Array.isArray(bb).`);
-
  693.  31895        switch (aa.id === bb.id && aa.id) {
+
  685.  31930        }
+
  686.  31930
+
  687.  31930// Probably deadcode.
+
  688.  31930// if (Array.isArray(bb)) {
+
  689.  31930//     return false;
+
  690.  31930// }
+
  691.  31930
+
  692.  31930        jslint_assert(!Array.isArray(bb), `Expected !Array.isArray(bb).`);
+
  693.  31930        switch (aa.id === bb.id && aa.id) {
  694.     65        case "(number)":
-
  695.  23424        case "(string)":
-
  696.  23424            return aa.value === bb.value;
-
  697.  31922
-
  698.  31922// PR-394 - Bugfix
-
  699.  31922// Fix jslint falsely believing megastring literals `0` and `1` are similar.
-
  700.  31922
+
  695.  23429        case "(string)":
+
  696.  23429            return aa.value === bb.value;
+
  697.  31957
+
  698.  31957// PR-394 - Bugfix
+
  699.  31957// Fix jslint falsely believing megastring literals `0` and `1` are similar.
+
  700.  31957
  701.     15        case "`":
  702.     15            if (!is_equal(aa.value, bb.value)) {
  703.     15                return false;
  704.     15            }
  705.     15            break;
-
  706.   8468        }
-
  707.   8468        if (is_weird(aa) || is_weird(bb)) {
+
  706.   8498        }
+
  707.   8498        if (is_weird(aa) || is_weird(bb)) {
  708.     34
  709.     34// test_cause:
  710.     34// ["aa(/./)||{}", "is_equal", "false", "", 0]
  711.     34
  712.     34            test_cause("false");
  713.     34            return false;
-
  714.   8434        }
-
  715.   8434        if (aa.arity === bb.arity && aa.id === bb.id) {
-
  716.   2127            if (aa.id === "." || aa.id === "?.") {
-
  717.   2127
-
  718.   2127// test_cause:
-
  719.   2127// ["aa.bb&&aa.bb", "is_equal", "recurse_arity_id", "", 0]
-
  720.   2127// ["aa?.bb&&aa?.bb", "is_equal", "recurse_arity_id", "", 0]
-
  721.   2127
-
  722.   2127                test_cause("recurse_arity_id");
-
  723.   2127                return (
-
  724.   2127                    is_equal(aa.expression, bb.expression)
-
  725.   2127                    && is_equal(aa.name, bb.name)
-
  726.   2127                );
-
  727.   2127            }
-
  728.   2127            if (aa.arity === "unary") {
-
  729.   2127
-
  730.   2127// test_cause:
-
  731.   2127// ["+0&&+0", "is_equal", "recurse_unary", "", 0]
-
  732.   2127
-
  733.   2127                test_cause("recurse_unary");
-
  734.   2127                return is_equal(aa.expression, bb.expression);
-
  735.   2127            }
-
  736.   2127            if (aa.arity === "binary") {
-
  737.   2127
-
  738.   2127// test_cause:
-
  739.   2127// ["aa[0]&&aa[0]", "is_equal", "recurse_binary", "", 0]
-
  740.   2127
-
  741.   2127                test_cause("recurse_binary");
-
  742.   2127                return (
-
  743.   2127                    aa.id !== "("
-
  744.   2127                    && is_equal(aa.expression[0], bb.expression[0])
-
  745.   2127                    && is_equal(aa.expression[1], bb.expression[1])
-
  746.   2127                );
-
  747.   2127            }
-
  748.   2127            if (aa.arity === "ternary") {
-
  749.   2127
-
  750.   2127// test_cause:
-
  751.   2127// ["aa=(``?``:``)&&(``?``:``)", "is_equal", "recurse_ternary", "", 0]
-
  752.   2127
-
  753.   2127                test_cause("recurse_ternary");
-
  754.   2127                return (
-
  755.   2127                    is_equal(aa.expression[0], bb.expression[0])
-
  756.   2127                    && is_equal(aa.expression[1], bb.expression[1])
-
  757.   2127                    && is_equal(aa.expression[2], bb.expression[2])
-
  758.   2127                );
-
  759.   2127            }
-
  760.   2127
-
  761.   2127// Probably deadcode.
-
  762.   2127// if (aa.arity === "function" || aa.arity === "regexp") {
-
  763.   2127//     return false;
-
  764.   2127// }
-
  765.   2127
-
  766.   2127            jslint_assert(
-
  767.   2127                !(aa.arity === "function" || aa.arity === "regexp"),
-
  768.   2127                `Expected !(aa.arity === "function" || aa.arity === "regexp").`
-
  769.   2127            );
-
  770.   2127
-
  771.   2127// test_cause:
-
  772.   2127// ["undefined&&undefined", "is_equal", "true", "", 0]
-
  773.   2127
-
  774.   2127            test_cause("true");
-
  775.   2127            return true;
-
  776.   6307        }
-
  777.   6307
-
  778.   6307// test_cause:
-
  779.   6307// ["null&&undefined", "is_equal", "false", "", 0]
-
  780.   6307
-
  781.   6307        test_cause("false");
-
  782.   6307        return false;
-
  783.   6307    }
-
  784.    666
-
  785.  28677    function is_weird(thing) {
-
  786.  28677        switch (thing.id) {
+
  714.   8464        }
+
  715.   8464        if (aa.arity === bb.arity && aa.id === bb.id) {
+
  716.   2147            if (aa.id === "." || aa.id === "?.") {
+
  717.   2147
+
  718.   2147// test_cause:
+
  719.   2147// ["aa.bb&&aa.bb", "is_equal", "recurse_arity_id", "", 0]
+
  720.   2147// ["aa?.bb&&aa?.bb", "is_equal", "recurse_arity_id", "", 0]
+
  721.   2147
+
  722.   2147                test_cause("recurse_arity_id");
+
  723.   2147                return (
+
  724.   2147                    is_equal(aa.expression, bb.expression)
+
  725.   2147                    && is_equal(aa.name, bb.name)
+
  726.   2147                );
+
  727.   2147            }
+
  728.   2147            if (aa.arity === "unary") {
+
  729.   2147
+
  730.   2147// test_cause:
+
  731.   2147// ["+0&&+0", "is_equal", "recurse_unary", "", 0]
+
  732.   2147
+
  733.   2147                test_cause("recurse_unary");
+
  734.   2147                return is_equal(aa.expression, bb.expression);
+
  735.   2147            }
+
  736.   2147            if (aa.arity === "binary") {
+
  737.   2147
+
  738.   2147// test_cause:
+
  739.   2147// ["aa[0]&&aa[0]", "is_equal", "recurse_binary", "", 0]
+
  740.   2147
+
  741.   2147                test_cause("recurse_binary");
+
  742.   2147                return (
+
  743.   2147                    aa.id !== "("
+
  744.   2147                    && is_equal(aa.expression[0], bb.expression[0])
+
  745.   2147                    && is_equal(aa.expression[1], bb.expression[1])
+
  746.   2147                );
+
  747.   2147            }
+
  748.   2147            if (aa.arity === "ternary") {
+
  749.   2147
+
  750.   2147// test_cause:
+
  751.   2147// ["aa=(``?``:``)&&(``?``:``)", "is_equal", "recurse_ternary", "", 0]
+
  752.   2147
+
  753.   2147                test_cause("recurse_ternary");
+
  754.   2147                return (
+
  755.   2147                    is_equal(aa.expression[0], bb.expression[0])
+
  756.   2147                    && is_equal(aa.expression[1], bb.expression[1])
+
  757.   2147                    && is_equal(aa.expression[2], bb.expression[2])
+
  758.   2147                );
+
  759.   2147            }
+
  760.   2147
+
  761.   2147// Probably deadcode.
+
  762.   2147// if (aa.arity === "function" || aa.arity === "regexp") {
+
  763.   2147//     return false;
+
  764.   2147// }
+
  765.   2147
+
  766.   2147            jslint_assert(
+
  767.   2147                !(aa.arity === "function" || aa.arity === "regexp"),
+
  768.   2147                `Expected !(aa.arity === "function" || aa.arity === "regexp").`
+
  769.   2147            );
+
  770.   2147
+
  771.   2147// test_cause:
+
  772.   2147// ["undefined&&undefined", "is_equal", "true", "", 0]
+
  773.   2147
+
  774.   2147            test_cause("true");
+
  775.   2147            return true;
+
  776.   6317        }
+
  777.   6317
+
  778.   6317// test_cause:
+
  779.   6317// ["null&&undefined", "is_equal", "false", "", 0]
+
  780.   6317
+
  781.   6317        test_cause("false");
+
  782.   6317        return false;
+
  783.   6317    }
+
  784.    668
+
  785.  28763    function is_weird(thing) {
+
  786.  28763        switch (thing.id) {
  787.      1        case "(regexp)":
  788.      1            return true;
  789.      1        case "=>":
@@ -952,11 +952,11 @@
  794.     12            return true;
  795.      8        case "{":
  796.      8            return true;
-
  797.  28062        default:
-
  798.  28062            return false;
-
  799.  28677        }
-
  800.  28677    }
-
  801.    666
+
  797.  28148        default:
+
  798.  28148            return false;
+
  799.  28763        }
+
  800.  28763    }
+
  801.    668
  802.    106    function stop(code, the_token, a, b, c, d) {
  803.    106
  804.    106// Similar to warn and stop_at. If the token already had a warning, that
@@ -967,108 +967,108 @@
  809.    106        delete the_token.warning;
  810.    106        throw warn(code, the_token, a, b, c, d);
  811.    106    }
-
  812.    666
+
  812.    668
  813.     28    function stop_at(code, line, column, a, b, c, d) {
  814.     28
  815.     28// Same as warn_at, except that it stops the analysis.
  816.     28
  817.     28        throw warn_at(code, line, column, a, b, c, d);
  818.     28    }
-
  819.    666
-
  820. 339286    function test_cause(code, aa, column) {
-
  821. 339286
-
  822. 339286// This function will instrument <cause> to <cause_dict> for test-purposes.
-
  823. 339286
-
  824.   4856        if (option_dict.test_cause) {
-
  825.   4856            cause_dict[JSON.stringify([
-
  826.   4856                String(new Error().stack).replace((
-
  827.   4856                    /^    at (?:file|stop|stop_at|test_cause|warn|warn_at)\b.*?\n/gm
-
  828.   4856                ), "").match(
-
  829.   4856                    /\n    at ((?:Object\.\w+?_)?\w+?) /
-
  830.   4856                )[1].replace((
-
  831.   4856                    /^Object\./
-
  832.   4856                ), ""),
-
  833.   4856                code,
-
  834.   4856                String(
-
  835.   4856                    (aa === undefined || aa === token_global)
-
  836.   4856                    ? ""
-
  837.   4856                    : aa
-
  838.   4856                ),
-
  839.   4856                column || 0
-
  840.   4856            ])] = true;
-
  841.   4856        }
-
  842. 339286    }
-
  843.    666
-
  844.   1070    function warn(code, the_token, a, b, c, d) {
-
  845.   1070
-
  846.   1070// Same as warn_at, except the warning will be associated with a specific token.
-
  847.   1070// If there is already a warning on this token, suppress the new one. It is
-
  848.   1070// likely that the first warning will be the most meaningful.
-
  849.   1070
-
  850.   1070        let the_warning;
+
  819.    668
+
  820. 339547    function test_cause(code, aa, column) {
+
  821. 339547
+
  822. 339547// This function will instrument <cause> to <cause_dict> for test-purposes.
+
  823. 339547
+
  824.   4882        if (option_dict.test_cause) {
+
  825.   4882            cause_dict[JSON.stringify([
+
  826.   4882                String(new Error().stack).replace((
+
  827.   4882                    /^    at (?:file|stop|stop_at|test_cause|warn|warn_at)\b.*?\n/gm
+
  828.   4882                ), "").match(
+
  829.   4882                    /\n    at ((?:Object\.\w+?_)?\w+?) /
+
  830.   4882                )[1].replace((
+
  831.   4882                    /^Object\./
+
  832.   4882                ), ""),
+
  833.   4882                code,
+
  834.   4882                String(
+
  835.   4882                    (aa === undefined || aa === token_global)
+
  836.   4882                    ? ""
+
  837.   4882                    : aa
+
  838.   4882                ),
+
  839.   4882                column || 0
+
  840.   4882            ])] = true;
+
  841.   4882        }
+
  842. 339547    }
+
  843.    668
+
  844.   1075    function warn(code, the_token, a, b, c, d) {
+
  845.   1075
+
  846.   1075// Same as warn_at, except the warning will be associated with a specific token.
+
  847.   1075// If there is already a warning on this token, suppress the new one. It is
+
  848.   1075// likely that the first warning will be the most meaningful.
+
  849.   1075
+
  850.   1075        let the_warning;
  851.     20        the_token = the_token || state.token_nxt;
-
  852.   1070        the_warning = warn_at(
-
  853.   1070            code,
-
  854.   1070            the_token.line,
-
  855.    374            (the_token.from || 0) + jslint_fudge,
-
  856.    830            a || artifact(the_token),
-
  857.   1070            b,
-
  858.   1070            c,
-
  859.   1070            d
-
  860.   1070        );
-
  861.   1070
-
  862.   1070// Issue #408
-
  863.   1070// Warnings that should be ignored sometimes suppress legitimate warnings.
-
  864.   1070
+
  852.   1075        the_warning = warn_at(
+
  853.   1075            code,
+
  854.   1075            the_token.line,
+
  855.    376            (the_token.from || 0) + jslint_fudge,
+
  856.    835            a || artifact(the_token),
+
  857.   1075            b,
+
  858.   1075            c,
+
  859.   1075            d
+
  860.   1075        );
+
  861.   1075
+
  862.   1075// Issue #408
+
  863.   1075// Warnings that should be ignored sometimes suppress legitimate warnings.
+
  864.   1075
  865.     26        if (the_warning.directive_ignore_line) {
  866.     26            return the_warning;
-
  867.   1044        }
-
  868.   1044
-
  869.   1044// If there is already a warning on this token, suppress the new one. It is
-
  870.   1044// likely that the first warning will be the most meaningful.
-
  871.   1044
-
  872.   1044        if (the_token.warning) {
+
  867.   1049        }
+
  868.   1049
+
  869.   1049// If there is already a warning on this token, suppress the new one. It is
+
  870.   1049// likely that the first warning will be the most meaningful.
+
  871.   1049
+
  872.   1049        if (the_token.warning) {
  873.    192            warning_list.pop();
  874.    192            return the_warning;
-
  875.    852        }
-
  876.    852        the_token.warning = the_warning;
-
  877.    852        return the_warning;
-
  878.    852    }
-
  879.    666
-
  880.   1387    function warn_at(code, line, column, a, b, c, d) {
-
  881.   1387
-
  882.   1387// Report an error at some line and column of the program. The warning object
-
  883.   1387// resembles an exception.
-
  884.   1387
-
  885.   1387        let mm;
-
  886.   1387        let warning = Object.assign(empty(), {
-
  887.   1387            a,
-
  888.   1387            b,
-
  889.   1387            c,
-
  890.   1387            code,
-
  891.   1387
-
  892.   1387// Fudge column numbers in warning message.
-
  893.   1387
+
  875.    857        }
+
  876.    857        the_token.warning = the_warning;
+
  877.    857        return the_warning;
+
  878.    857    }
+
  879.    668
+
  880.   1394    function warn_at(code, line, column, a, b, c, d) {
+
  881.   1394
+
  882.   1394// Report an error at some line and column of the program. The warning object
+
  883.   1394// resembles an exception.
+
  884.   1394
+
  885.   1394        let mm;
+
  886.   1394        let warning = Object.assign(empty(), {
+
  887.   1394            a,
+
  888.   1394            b,
+
  889.   1394            c,
+
  890.   1394            code,
+
  891.   1394
+
  892.   1394// Fudge column numbers in warning message.
+
  893.   1394
  894.     27            column: column || jslint_fudge,
-
  895.   1387            d,
-
  896.   1387            line,
-
  897.   1387            line_source: "",
-
  898.   1387            name: "JSLintError"
-
  899.   1387        }, line_list[line]);
-
  900.   1387        warning.column = Math.max(
-
  901.   1387            Math.min(warning.column, warning.line_source.length),
-
  902.   1387            jslint_fudge
-
  903.   1387        );
-
  904.    921        test_cause(code, b || a, warning.column);
-
  905.   1387        switch (code) {
-
  906.   1387
-
  907.   1387// The bundle contains the raw text messages that are generated by jslint. It
-
  908.   1387// seems that they are all error messages and warnings. There are no "Atta
-
  909.   1387// boy!" or "You are so awesome!" messages. There is no positive reinforcement
-
  910.   1387// or encouragement. This relentless negativity can undermine self-esteem and
-
  911.   1387// wound the inner child. But if you accept it as sound advice rather than as
-
  912.   1387// personal criticism, it can make your programs better.
-
  913.   1387
+
  895.   1394            d,
+
  896.   1394            line,
+
  897.   1394            line_source: "",
+
  898.   1394            name: "JSLintError"
+
  899.   1394        }, line_list[line]);
+
  900.   1394        warning.column = Math.max(
+
  901.   1394            Math.min(warning.column, warning.line_source.length),
+
  902.   1394            jslint_fudge
+
  903.   1394        );
+
  904.    926        test_cause(code, b || a, warning.column);
+
  905.   1394        switch (code) {
+
  906.   1394
+
  907.   1394// The bundle contains the raw text messages that are generated by jslint. It
+
  908.   1394// seems that they are all error messages and warnings. There are no "Atta
+
  909.   1394// boy!" or "You are so awesome!" messages. There is no positive reinforcement
+
  910.   1394// or encouragement. This relentless negativity can undermine self-esteem and
+
  911.   1394// wound the inner child. But if you accept it as sound advice rather than as
+
  912.   1394// personal criticism, it can make your programs better.
+
  913.   1394
  914.      1        case "and":
  915.      1            mm = `The '&&' subexpression should be wrapped in parens.`;
  916.      1            break;
@@ -1102,9 +1102,9 @@
  944.     25        case "expected_a_at_b_c":
  945.     25            mm = `Expected '${a}' at column ${b}, not column ${c}.`;
  946.     25            break;
-
  947.    284        case "expected_a_b":
-
  948.    284            mm = `Expected '${a}' and instead saw '${b}'.`;
-
  949.    284            break;
+
  947.    286        case "expected_a_b":
+
  948.    286            mm = `Expected '${a}' and instead saw '${b}'.`;
+
  949.    286            break;
  950.     17        case "expected_a_b_before_c_d":
  951.     17            mm = `Expected ${a} '${b}' to be ordered before ${c} '${d}'.`;
  952.     17            break;
@@ -1149,15 +1149,15 @@
  991.      6                `Expected 'Object.freeze('. All export values should be frozen.`
  992.      6            );
  993.      6            break;
-
  994.   1387
-
  995.   1387// PR-378 - Relax warning "function_in_loop".
-
  996.   1387//
-
  997.   1387//         case "function_in_loop":
-
  998.   1387//             mm = `Don't create functions within a loop.`;
-
  999.   1387//             break;
-
 1000.   1387
-
 1001.   1387// PR-390 - Add numeric-separator check.
-
 1002.   1387
+
  994.   1394
+
  995.   1394// PR-378 - Relax warning "function_in_loop".
+
  996.   1394//
+
  997.   1394//         case "function_in_loop":
+
  998.   1394//             mm = `Don't create functions within a loop.`;
+
  999.   1394//             break;
+
 1000.   1394
+
 1001.   1394// PR-390 - Add numeric-separator check.
+
 1002.   1394
 1003.      7        case "illegal_num_separator":
 1004.      7            mm = `Illegal numeric separator '_' at column ${column}.`;
 1005.      7            break;
@@ -1179,13 +1179,13 @@
 1021.      3        case "missing_await_statement":
 1022.      3            mm = `Expected await statement in async function.`;
 1023.      3            break;
-
 1024.   1387
-
 1025.   1387// PR-347 - Disable warning "missing_browser".
-
 1026.   1387//
-
 1027.   1387//         case "missing_browser":
-
 1028.   1387//             mm = `/*global*/ requires the Assume a browser option.`;
-
 1029.   1387//             break;
-
 1030.   1387
+
 1024.   1394
+
 1025.   1394// PR-347 - Disable warning "missing_browser".
+
 1026.   1394//
+
 1027.   1394//         case "missing_browser":
+
 1028.   1394//             mm = `/*global*/ requires the Assume a browser option.`;
+
 1029.   1394//             break;
+
 1030.   1394
 1031.      1        case "missing_m":
 1032.      1            mm = `Expected 'm' flag on a multiline regular expression.`;
 1033.      1            break;
@@ -1243,9 +1243,9 @@
 1085.      2        case "unclosed_string":
 1086.      2            mm = `Unclosed string.`;
 1087.      2            break;
-
 1088.    133        case "undeclared_a":
-
 1089.    133            mm = `Undeclared '${a}'.`;
-
 1090.    133            break;
+
 1088.    137        case "undeclared_a":
+
 1089.    137            mm = `Undeclared '${a}'.`;
+
 1090.    137            break;
 1091.    237        case "unexpected_a":
 1092.    237            mm = `Unexpected '${a}'.`;
 1093.    237            break;
@@ -1264,16 +1264,16 @@
 1106.      2        case "unexpected_comment":
 1107.      2            mm = `Unexpected comment.`;
 1108.      2            break;
-
 1109.   1387
-
 1110.   1387// PR-347 - Disable warning "unexpected_directive_a".
-
 1111.   1387//
-
 1112.   1387//         case "unexpected_directive_a":
-
 1113.   1387//             mm = `When using modules, don't use directive '/\u002a${a}'.`;
-
 1114.   1387//             break;
-
 1115.   1387
-
 1116.    127        case "unexpected_expression_a":
-
 1117.    127            mm = `Unexpected expression '${a}' in statement position.`;
-
 1118.    127            break;
+
 1109.   1394
+
 1110.   1394// PR-347 - Disable warning "unexpected_directive_a".
+
 1111.   1394//
+
 1112.   1394//         case "unexpected_directive_a":
+
 1113.   1394//             mm = `When using modules, don't use directive '/\u002a${a}'.`;
+
 1114.   1394//             break;
+
 1115.   1394
+
 1116.    128        case "unexpected_expression_a":
+
 1117.    128            mm = `Unexpected expression '${a}' in statement position.`;
+
 1118.    128            break;
 1119.      4        case "unexpected_label_a":
 1120.      4            mm = `Unexpected label '${a}'.`;
 1121.      4            break;
@@ -1315,9 +1315,9 @@
 1157.      2        case "use_double":
 1158.      2            mm = `Use double quotes, not single quotes.`;
 1159.      2            break;
-
 1160.   1387
-
 1161.   1387// PR-386 - Fix issue #382 - Make fart-related warnings more readable.
-
 1162.   1387
+
 1160.   1394
+
 1161.   1394// PR-386 - Fix issue #382 - Make fart-related warnings more readable.
+
 1162.   1394
 1163.      4        case "use_function_not_fart":
 1164.      4            mm = (
 1165.      4                `Use 'function (...)', not '(...) =>' when arrow functions`
@@ -1357,9 +1357,9 @@
 1199.      1        case "wrap_condition":
 1200.      1            mm = `Wrap the condition in parens.`;
 1201.      1            break;
-
 1202.   1387
-
 1203.   1387// PR-386 - Fix issue #382 - Make fart-related warnings more readable.
-
 1204.   1387
+
 1202.   1394
+
 1203.   1394// PR-386 - Fix issue #382 - Make fart-related warnings more readable.
+
 1204.   1394
 1205.      1        case "wrap_fart_parameter":
 1206.      1            mm = `Wrap the parameter before '=>' in parens.`;
 1207.      1            break;
@@ -1376,15 +1376,15 @@
 1218.      1        case "wrap_unary":
 1219.      1            mm = `Wrap the unary expression in parens.`;
 1220.      1            break;
-
 1221.   1387        }
-
 1222.   1387
-
 1223.   1387// Validate mm.
-
 1224.   1387
-
 1225.   1387        jslint_assert(mm, code);
-
 1226.   1387        warning.message = mm;
-
 1227.   1387
-
 1228.   1387// PR-242 - Include stack_trace for jslint to debug itself for errors.
-
 1229.   1387
+
 1221.   1394        }
+
 1222.   1394
+
 1223.   1394// Validate mm.
+
 1224.   1394
+
 1225.   1394        jslint_assert(mm, code);
+
 1226.   1394        warning.message = mm;
+
 1227.   1394
+
 1228.   1394// PR-242 - Include stack_trace for jslint to debug itself for errors.
+
 1229.   1394
 1230.      6        if (option_dict.trace) {
 1231.      6            warning.stack_trace = new Error().stack;
 1232.      6        }
@@ -1395,122 +1395,122 @@
 1237.     41
 1238.     41            test_cause("directive_ignore_line");
 1239.     41            return warning;
-
 1240.   1346        }
-
 1241.   1346        warning_list.push(warning);
-
 1242.   1346        return warning;
-
 1243.   1346    }
-
 1244.    666
-
 1245.    666    try {
-
 1246.    666
-
 1247.    666// tokenize takes a source and produces from it an array of token objects.
-
 1248.    666// JavaScript is notoriously difficult to tokenize because of the horrible
-
 1249.    666// interactions between automatic semicolon insertion, regular expression
-
 1250.    666// literals, and now megastring literals. JSLint benefits from eliminating
-
 1251.    666// automatic semicolon insertion and nested megastring literals, which allows
-
 1252.    666// full tokenization to precede parsing.
-
 1253.    666
-
 1254.    666        option_dict = Object.assign(empty(), option_dict);
-
 1255.    666        Object.assign(state, {
-
 1256.    666            artifact,
-
 1257.    666            catch_list,
-
 1258.    666            catch_stack,
-
 1259.    666            directive_list,
-
 1260.    666            export_dict,
-
 1261.    666            function_list,
-
 1262.    666            function_stack,
-
 1263.    666            global_dict,
-
 1264.    666            global_list,
-
 1265.    666            import_list,
-
 1266.    666            is_equal,
-
 1267.    666            is_weird,
-
 1268.    666            line_list,
-
 1269.    666            mode_json: false,           // true if parsing JSON.
-
 1270.    666            mode_module: false,         // true if import or export was used.
-
 1271.    666            mode_property: false,       // true if directive /*property*/ is
-
 1272.    666                                        // ... used.
-
 1273.    666            mode_shebang: false,        // true if #! is seen on the first line.
-
 1274.    666            option_dict,
-
 1275.    666            property_dict,
-
 1276.    666            source,
-
 1277.    666            stop,
-
 1278.    666            stop_at,
-
 1279.    666            syntax_dict,
-
 1280.    666            tenure,
-
 1281.    666            test_cause,
-
 1282.    666            token_global,
-
 1283.    666            token_list,
-
 1284.    666            token_nxt: token_global,
-
 1285.    666            warn,
-
 1286.    666            warn_at,
-
 1287.    666            warning_list
-
 1288.    666        });
-
 1289.    666
-
 1290.    666// PHASE 1. Split <source> by newlines into <line_list>.
-
 1291.    666
-
 1292.    666        jslint_phase1_split(state);
-
 1293.    666        jslint_assert(catch_stack.length === 1, `catch_stack.length === 1.`);
-
 1294.    666        jslint_assert(
-
 1295.    666            function_stack.length === 0,
-
 1296.    666            `function_stack.length === 0.`
-
 1297.    666        );
-
 1298.    666
-
 1299.    666// PHASE 2. Lex <line_list> into <token_list>.
-
 1300.    666
-
 1301.    666        jslint_phase2_lex(state);
-
 1302.    666        jslint_assert(catch_stack.length === 1, `catch_stack.length === 1.`);
-
 1303.    666        jslint_assert(
-
 1304.    666            function_stack.length === 0,
-
 1305.    666            `function_stack.length === 0.`
-
 1306.    666        );
-
 1307.    666
-
 1308.    666// PHASE 3. Parse <token_list> into <token_tree> using the Pratt-parser.
-
 1309.    666
-
 1310.    666        jslint_phase3_parse(state);
-
 1311.    666        jslint_assert(catch_stack.length === 1, `catch_stack.length === 1.`);
-
 1312.    666        jslint_assert(
-
 1313.    666            function_stack.length === 0,
-
 1314.    666            `function_stack.length === 0.`
-
 1315.    666        );
-
 1316.    666
-
 1317.    666// PHASE 4. Walk <token_tree>, traversing all nodes of the tree. It is a
-
 1318.    666//          recursive traversal. Each node may be processed on the way down
-
 1319.    666//          (preaction) and on the way up (postaction).
-
 1320.    666
-
 1321.    516        if (!state.mode_json) {
-
 1322.    516            jslint_phase4_walk(state);
-
 1323.    531        }
-
 1324.    531        jslint_assert(catch_stack.length === 1, `catch_stack.length === 1.`);
-
 1325.    531        jslint_assert(
-
 1326.    531            function_stack.length === 0,
-
 1327.    531            `function_stack.length === 0.`
-
 1328.    531        );
-
 1329.    531
-
 1330.    531// PHASE 5. Check whitespace between tokens in <token_list>.
-
 1331.    531
-
 1332.    531        if (!state.mode_json && warning_list.length === 0) {
+
 1240.   1353        }
+
 1241.   1353        warning_list.push(warning);
+
 1242.   1353        return warning;
+
 1243.   1353    }
+
 1244.    668
+
 1245.    668    try {
+
 1246.    668
+
 1247.    668// tokenize takes a source and produces from it an array of token objects.
+
 1248.    668// JavaScript is notoriously difficult to tokenize because of the horrible
+
 1249.    668// interactions between automatic semicolon insertion, regular expression
+
 1250.    668// literals, and now megastring literals. JSLint benefits from eliminating
+
 1251.    668// automatic semicolon insertion and nested megastring literals, which allows
+
 1252.    668// full tokenization to precede parsing.
+
 1253.    668
+
 1254.    668        option_dict = Object.assign(empty(), option_dict);
+
 1255.    668        Object.assign(state, {
+
 1256.    668            artifact,
+
 1257.    668            catch_list,
+
 1258.    668            catch_stack,
+
 1259.    668            directive_list,
+
 1260.    668            export_dict,
+
 1261.    668            function_list,
+
 1262.    668            function_stack,
+
 1263.    668            global_dict,
+
 1264.    668            global_list,
+
 1265.    668            import_list,
+
 1266.    668            is_equal,
+
 1267.    668            is_weird,
+
 1268.    668            line_list,
+
 1269.    668            mode_json: false,           // true if parsing JSON.
+
 1270.    668            mode_module: false,         // true if import or export was used.
+
 1271.    668            mode_property: false,       // true if directive /*property*/ is
+
 1272.    668                                        // ... used.
+
 1273.    668            mode_shebang: false,        // true if #! is seen on the first line.
+
 1274.    668            option_dict,
+
 1275.    668            property_dict,
+
 1276.    668            source,
+
 1277.    668            stop,
+
 1278.    668            stop_at,
+
 1279.    668            syntax_dict,
+
 1280.    668            tenure,
+
 1281.    668            test_cause,
+
 1282.    668            token_global,
+
 1283.    668            token_list,
+
 1284.    668            token_nxt: token_global,
+
 1285.    668            warn,
+
 1286.    668            warn_at,
+
 1287.    668            warning_list
+
 1288.    668        });
+
 1289.    668
+
 1290.    668// PHASE 1. Split <source> by newlines into <line_list>.
+
 1291.    668
+
 1292.    668        jslint_phase1_split(state);
+
 1293.    668        jslint_assert(catch_stack.length === 1, `catch_stack.length === 1.`);
+
 1294.    668        jslint_assert(
+
 1295.    668            function_stack.length === 0,
+
 1296.    668            `function_stack.length === 0.`
+
 1297.    668        );
+
 1298.    668
+
 1299.    668// PHASE 2. Lex <line_list> into <token_list>.
+
 1300.    668
+
 1301.    668        jslint_phase2_lex(state);
+
 1302.    668        jslint_assert(catch_stack.length === 1, `catch_stack.length === 1.`);
+
 1303.    668        jslint_assert(
+
 1304.    668            function_stack.length === 0,
+
 1305.    668            `function_stack.length === 0.`
+
 1306.    668        );
+
 1307.    668
+
 1308.    668// PHASE 3. Parse <token_list> into <token_tree> using the Pratt-parser.
+
 1309.    668
+
 1310.    668        jslint_phase3_parse(state);
+
 1311.    668        jslint_assert(catch_stack.length === 1, `catch_stack.length === 1.`);
+
 1312.    668        jslint_assert(
+
 1313.    668            function_stack.length === 0,
+
 1314.    668            `function_stack.length === 0.`
+
 1315.    668        );
+
 1316.    668
+
 1317.    668// PHASE 4. Walk <token_tree>, traversing all nodes of the tree. It is a
+
 1318.    668//          recursive traversal. Each node may be processed on the way down
+
 1319.    668//          (preaction) and on the way up (postaction).
+
 1320.    668
+
 1321.    518        if (!state.mode_json) {
+
 1322.    518            jslint_phase4_walk(state);
+
 1323.    533        }
+
 1324.    533        jslint_assert(catch_stack.length === 1, `catch_stack.length === 1.`);
+
 1325.    533        jslint_assert(
+
 1326.    533            function_stack.length === 0,
+
 1327.    533            `function_stack.length === 0.`
+
 1328.    533        );
+
 1329.    533
+
 1330.    533// PHASE 5. Check whitespace between tokens in <token_list>.
+
 1331.    533
+
 1332.    533        if (!state.mode_json && warning_list.length === 0) {
 1333.    208            jslint_phase5_whitage(state);
-
 1334.    531        }
-
 1335.    531        jslint_assert(catch_stack.length === 1, `catch_stack.length === 1.`);
-
 1336.    531        jslint_assert(
-
 1337.    531            function_stack.length === 0,
-
 1338.    531            `function_stack.length === 0.`
-
 1339.    531        );
-
 1340.    531
-
 1341.    531// PR-347 - Disable warning "missing_browser".
-
 1342.    531//
-
 1343.    531//         if (!option_dict.browser) {
-
 1344.    531//             directive_list.forEach(function (comment) {
-
 1345.    531//                 if (comment.directive === "global") {
-
 1346.    531//
-
 1347.    531// // test_cause:
-
 1348.    531// // ["/*global aa*/", "jslint", "missing_browser", "(comment)", 1]
-
 1349.    531//
-
 1350.    531//                     warn("missing_browser", comment);
-
 1351.    531//                 }
-
 1352.    531//             });
-
 1353.    531//         }
-
 1354.    531
-
 1355.    531        if (option_dict.test_internal_error) {
+
 1334.    533        }
+
 1335.    533        jslint_assert(catch_stack.length === 1, `catch_stack.length === 1.`);
+
 1336.    533        jslint_assert(
+
 1337.    533            function_stack.length === 0,
+
 1338.    533            `function_stack.length === 0.`
+
 1339.    533        );
+
 1340.    533
+
 1341.    533// PR-347 - Disable warning "missing_browser".
+
 1342.    533//
+
 1343.    533//         if (!option_dict.browser) {
+
 1344.    533//             directive_list.forEach(function (comment) {
+
 1345.    533//                 if (comment.directive === "global") {
+
 1346.    533//
+
 1347.    533// // test_cause:
+
 1348.    533// // ["/*global aa*/", "jslint", "missing_browser", "(comment)", 1]
+
 1349.    533//
+
 1350.    533//                     warn("missing_browser", comment);
+
 1351.    533//                 }
+
 1352.    533//             });
+
 1353.    533//         }
+
 1354.    533
+
 1355.    533        if (option_dict.test_internal_error) {
 1356.      2            jslint_assert(undefined, "test_internal_error");
 1357.      2        }
 1358.    137    } catch (err) {
@@ -1529,61 +1529,61 @@
 1371.    137            warning_list.push(err);
 1372.    137        }
 1373.    137    }
-
 1374.    666
-
 1375.    666// Sort warning_list by mode_stop first, line, column respectively.
-
 1376.    666
-
 1377.    976    warning_list.sort(function (aa, bb) {
-
 1378.    976        return (
-
 1379.    976            Boolean(bb.mode_stop) - Boolean(aa.mode_stop)
-
 1380.    886            || aa.line - bb.line
-
 1381.    866            || aa.column - bb.column
-
 1382.    976        );
-
 1383.    976
-
 1384.    976// Update each warning with formatted_message ready-for-use by jslint_cli.
-
 1385.    976
-
 1386.   1157    }).map(function ({
-
 1387.   1157        column,
-
 1388.   1157        line,
-
 1389.   1157        line_source,
-
 1390.   1157        message,
-
 1391.   1157        stack_trace = ""
-
 1392.   1157    }, ii, list) {
-
 1393.   1157        list[ii].formatted_message = String(
-
 1394.   1157            String(ii + 1).padStart(2, " ")
-
 1395.   1157            + ". \u001b[31m" + message + "\u001b[39m"
-
 1396.   1157            + " \u001b[90m\/\/ line " + line + ", column " + column
-
 1397.   1157            + "\u001b[39m\n"
-
 1398.   1157            + ("    " + line_source.trim()).slice(0, 72) + "\n"
-
 1399.   1157            + stack_trace
-
 1400.   1157        ).trimRight();
-
 1401.   1157    });
-
 1402.    666
-
 1403.    666    return {
-
 1404.    666        causes: cause_dict,
-
 1405.    666        directives: directive_list,
-
 1406.    666        edition: jslint_edition,
-
 1407.    666        exports: export_dict,
-
 1408.    666        froms: import_list,
-
 1409.    666        functions: function_list,
-
 1410.    666        global: token_global,
-
 1411.    666        id: "(JSLint)",
-
 1412.    666        json: state.mode_json,
-
 1413.    666        lines: line_list,
-
 1414.    666        module: state.mode_module === true,
+
 1374.    668
+
 1375.    668// Sort warning_list by mode_stop first, line, column respectively.
+
 1376.    668
+
 1377.    986    warning_list.sort(function (aa, bb) {
+
 1378.    986        return (
+
 1379.    986            Boolean(bb.mode_stop) - Boolean(aa.mode_stop)
+
 1380.    896            || aa.line - bb.line
+
 1381.    876            || aa.column - bb.column
+
 1382.    986        );
+
 1383.    986
+
 1384.    986// Update each warning with formatted_message ready-for-use by jslint_cli.
+
 1385.    986
+
 1386.   1164    }).map(function ({
+
 1387.   1164        column,
+
 1388.   1164        line,
+
 1389.   1164        line_source,
+
 1390.   1164        message,
+
 1391.   1164        stack_trace = ""
+
 1392.   1164    }, ii, list) {
+
 1393.   1164        list[ii].formatted_message = String(
+
 1394.   1164            String(ii + 1).padStart(2, " ")
+
 1395.   1164            + ". \u001b[31m" + message + "\u001b[39m"
+
 1396.   1164            + " \u001b[90m\/\/ line " + line + ", column " + column
+
 1397.   1164            + "\u001b[39m\n"
+
 1398.   1164            + ("    " + line_source.trim()).slice(0, 72) + "\n"
+
 1399.   1164            + stack_trace
+
 1400.   1164        ).trimRight();
+
 1401.   1164    });
+
 1402.    668
+
 1403.    668    return {
+
 1404.    668        causes: cause_dict,
+
 1405.    668        directives: directive_list,
+
 1406.    668        edition: jslint_edition,
+
 1407.    668        exports: export_dict,
+
 1408.    668        froms: import_list,
+
 1409.    668        functions: function_list,
+
 1410.    668        global: token_global,
+
 1411.    668        id: "(JSLint)",
+
 1412.    668        json: state.mode_json,
+
 1413.    668        lines: line_list,
+
 1414.    668        module: state.mode_module === true,
 1415.    164        ok: warning_list.length === 0 && !mode_stop,
-
 1416.    666        option: option_dict,
-
 1417.    666        property: property_dict,
-
 1418.    666        shebang: (
-
 1419.    666            state.mode_shebang
+
 1416.    668        option: option_dict,
+
 1417.    668        property: property_dict,
+
 1418.    668        shebang: (
+
 1419.    668            state.mode_shebang
 1420.      1            ? line_list[jslint_fudge].line_source
-
 1421.    665            : undefined
-
 1422.    666        ),
-
 1423.    666        stop: mode_stop,
-
 1424.    666        tokens: token_list,
-
 1425.    666        tree: state.token_tree,
-
 1426.    666        warnings: warning_list
-
 1427.    666    };
-
 1428.    666}
+
 1421.    667            : undefined
+
 1422.    668        ),
+
 1423.    668        stop: mode_stop,
+
 1424.    668        tokens: token_list,
+
 1425.    668        tree: state.token_tree,
+
 1426.    668        warnings: warning_list
+
 1427.    668    };
+
 1428.    668}
 1429.      1
 1430.      1// PR-362 - Add API Doc.
 1431.      1
@@ -1705,12 +1705,12 @@
 1547.    149        let whitespace = "";
 1548.    149        str.trim().replace((
 1549.    149            /^ */gm
-
 1550.  13060        ), function (match0) {
-
 1551.   8409            if (whitespace === "" || match0.length < whitespace.length) {
-
 1552.   6599                whitespace = match0;
-
 1553.   6599            }
-
 1554.  13060            return "";
-
 1555.  13060        });
+
 1550.  13071        ), function (match0) {
+
 1551.   8412            if (whitespace === "" || match0.length < whitespace.length) {
+
 1552.   6610                whitespace = match0;
+
 1553.   6610            }
+
 1554.  13071            return "";
+
 1555.  13071        });
 1556.    149        str = str.replace(new RegExp("^" + whitespace, "gm"), "");
 1557.    149        return str;
 1558.    149    }
@@ -1914,13 +1914,13 @@
 1756.      1    await fsWriteFileWithParents(pathname, html);
 1757.      1}
 1758.      1
-
 1759. 102727function jslint_assert(condition, message) {
-
 1760. 102727
-
 1761. 102727// This function will throw <message> if <condition> is falsy.
-
 1762. 102727
-
 1763. 102725    if (condition) {
-
 1764. 102725        return condition;
-
 1765. 102725    }
+
 1759. 102849function jslint_assert(condition, message) {
+
 1760. 102849
+
 1761. 102849// This function will throw <message> if <condition> is falsy.
+
 1762. 102849
+
 1763. 102847    if (condition) {
+
 1764. 102847        return condition;
+
 1765. 102847    }
 1766.      2    throw new Error(
 1767.      2        `This was caused by a bug in JSLint.
 1768.      2Please open an issue with this stack-trace (and possible example-code) at
@@ -2298,72 +2298,72 @@
 2140.      9    return exit_code;
 2141.      9}
 2142.      1
-
 2143.    666function jslint_phase1_split() {
-
 2144.    666
-
 2145.    666// PHASE 1. Split <source> by newlines into <line_list>.
-
 2146.    666
-
 2147.    666    return;
-
 2148.    666}
+
 2143.    668function jslint_phase1_split() {
+
 2144.    668
+
 2145.    668// PHASE 1. Split <source> by newlines into <line_list>.
+
 2146.    668
+
 2147.    668    return;
+
 2148.    668}
 2149.      1
-
 2150.    666function jslint_phase2_lex(state) {
-
 2151.    666
-
 2152.    666// PHASE 2. Lex <line_list> into <token_list>.
-
 2153.    666
-
 2154.    666    let {
-
 2155.    666        artifact,
-
 2156.    666        directive_list,
-
 2157.    666        global_dict,
-
 2158.    666        global_list,
-
 2159.    666        line_list,
-
 2160.    666        option_dict,
-
 2161.    666        stop,
-
 2162.    666        stop_at,
-
 2163.    666        tenure,
-
 2164.    666        test_cause,
-
 2165.    666        token_global,
-
 2166.    666        token_list,
-
 2167.    666        warn,
-
 2168.    666        warn_at
-
 2169.    666    } = state;
-
 2170.    666    let char;                   // The current character being lexed.
-
 2171.    666    let column = 0;             // The column number of the next character.
-
 2172.    666    let from;                   // The starting column number of the token.
-
 2173.    666    let from_mega;              // The starting column of megastring.
-
 2174.    666    let line = 0;               // The line number of the next character.
-
 2175.    666    let line_disable;           // The starting line of "/*jslint-disable*/".
-
 2176.    666    let line_mega;              // The starting line of megastring.
-
 2177.    666    let line_source = "";       // The remaining line source string.
-
 2178.    666    let line_whole = "";        // The whole line source string.
-
 2179.    666    let mode_digits_empty_string = 1;
-
 2180.    666    let mode_digits_numeric_separator = 2;
-
 2181.    666    let mode_directive = true;  // true if directives are still allowed.
-
 2182.    666    let mode_mega = false;      // true if currently parsing a megastring
-
 2183.    666                                // ... literal.
-
 2184.    666    let mode_regexp;            // true if regular expression literal seen on
-
 2185.    666                                // ... this line.
-
 2186.    666    let paren_backtrack_list = [];      // List of most recent "(" tokens at any
-
 2187.    666                                        // ... paren-depth.
-
 2188.    666    let paren_depth = 0;        // Keeps track of current paren-depth.
-
 2189.    666    let snippet = "";           // A piece of string.
-
 2190.    666    let token_1;                // The first token.
-
 2191.    666    let token_prv = token_global;       // The previous token including
-
 2192.    666                                        // ... comments.
-
 2193.    666    let token_prv_expr = token_global;  // The previous token excluding
-
 2194.    666                                        // ... comments.
-
 2195.    666
-
 2196.    666// Most tokens, including the identifiers, operators, and punctuators, can be
-
 2197.    666// found with a regular expression. Regular expressions cannot correctly match
-
 2198.    666// regular expression literals, so we will match those the hard way. String
-
 2199.    666// literals and number literals can be matched by regular expressions, but they
-
 2200.    666// don't provide good warnings. The functions char_after, char_before,
-
 2201.    666// read_digits, and char_after_escape help in the parsing of literals.
-
 2202.    666
-
 2203. 238096    function char_after(match) {
-
 2204. 238096
-
 2205. 238096// Get the next character from the source line. Remove it from the line_source,
-
 2206. 238096// and append it to the snippet. Optionally check that the previous character
-
 2207. 238096// matched an expected value.
-
 2208. 238096
+
 2150.    668function jslint_phase2_lex(state) {
+
 2151.    668
+
 2152.    668// PHASE 2. Lex <line_list> into <token_list>.
+
 2153.    668
+
 2154.    668    let {
+
 2155.    668        artifact,
+
 2156.    668        directive_list,
+
 2157.    668        global_dict,
+
 2158.    668        global_list,
+
 2159.    668        line_list,
+
 2160.    668        option_dict,
+
 2161.    668        stop,
+
 2162.    668        stop_at,
+
 2163.    668        tenure,
+
 2164.    668        test_cause,
+
 2165.    668        token_global,
+
 2166.    668        token_list,
+
 2167.    668        warn,
+
 2168.    668        warn_at
+
 2169.    668    } = state;
+
 2170.    668    let char;                   // The current character being lexed.
+
 2171.    668    let column = 0;             // The column number of the next character.
+
 2172.    668    let from;                   // The starting column number of the token.
+
 2173.    668    let from_mega;              // The starting column of megastring.
+
 2174.    668    let line = 0;               // The line number of the next character.
+
 2175.    668    let line_disable;           // The starting line of "/*jslint-disable*/".
+
 2176.    668    let line_mega;              // The starting line of megastring.
+
 2177.    668    let line_source = "";       // The remaining line source string.
+
 2178.    668    let line_whole = "";        // The whole line source string.
+
 2179.    668    let mode_digits_empty_string = 1;
+
 2180.    668    let mode_digits_numeric_separator = 2;
+
 2181.    668    let mode_directive = true;  // true if directives are still allowed.
+
 2182.    668    let mode_mega = false;      // true if currently parsing a megastring
+
 2183.    668                                // ... literal.
+
 2184.    668    let mode_regexp;            // true if regular expression literal seen on
+
 2185.    668                                // ... this line.
+
 2186.    668    let paren_backtrack_list = [];      // List of most recent "(" tokens at any
+
 2187.    668                                        // ... paren-depth.
+
 2188.    668    let paren_depth = 0;        // Keeps track of current paren-depth.
+
 2189.    668    let snippet = "";           // A piece of string.
+
 2190.    668    let token_1;                // The first token.
+
 2191.    668    let token_prv = token_global;       // The previous token including
+
 2192.    668                                        // ... comments.
+
 2193.    668    let token_prv_expr = token_global;  // The previous token excluding
+
 2194.    668                                        // ... comments.
+
 2195.    668
+
 2196.    668// Most tokens, including the identifiers, operators, and punctuators, can be
+
 2197.    668// found with a regular expression. Regular expressions cannot correctly match
+
 2198.    668// regular expression literals, so we will match those the hard way. String
+
 2199.    668// literals and number literals can be matched by regular expressions, but they
+
 2200.    668// don't provide good warnings. The functions char_after, char_before,
+
 2201.    668// read_digits, and char_after_escape help in the parsing of literals.
+
 2202.    668
+
 2203. 238236    function char_after(match) {
+
 2204. 238236
+
 2205. 238236// Get the next character from the source line. Remove it from the line_source,
+
 2206. 238236// and append it to the snippet. Optionally check that the previous character
+
 2207. 238236// matched an expected value.
+
 2208. 238236
 2209.   5986        if (match !== undefined && char !== match) {
 2210.     10
 2211.     10// test_cause:
@@ -2375,14 +2375,14 @@
 2217.     10                ? stop_at("expected_a", line, column - 1, match)
 2218.     10                : stop_at("expected_a_b", line, column, match, char)
 2219.     10            );
-
 2220. 238086        }
-
 2221. 238086        char = line_source.slice(0, 1);
-
 2222. 238086        line_source = line_source.slice(1);
-
 2223. 238086        snippet += char || " ";
-
 2224. 238096        column += 1;
-
 2225. 238096        return char;
-
 2226. 238096    }
-
 2227.    666
+
 2220. 238226        }
+
 2221. 238226        char = line_source.slice(0, 1);
+
 2222. 238226        line_source = line_source.slice(1);
+
 2223. 238226        snippet += char || " ";
+
 2224. 238236        column += 1;
+
 2225. 238236        return char;
+
 2226. 238236    }
+
 2227.    668
 2228.   2953    function char_after_escape(extra) {
 2229.   2953
 2230.   2953// Validate char after escape "\\".
@@ -2461,7 +2461,7 @@
 2303.    862            warn_at("unexpected_a_before_b", line, column, "\\", char);
 2304.   2953        }
 2305.   2953    }
-
 2306.    666
+
 2306.    668
 2307.  10013    function char_before() {
 2308.  10013
 2309.  10013// Back up one character by moving a character from the end of the snippet to
@@ -2476,7 +2476,7 @@
 2318.  10013        snippet = snippet.slice(0, -1);
 2319.  10013        return char;
 2320.  10013    }
-
 2321.    666
+
 2321.    668
 2322.   8924    function check_numeric_separator(digits, column) {
 2323.   8924
 2324.   8924// This function will check for illegal numeric-separator in <digits>.
@@ -2496,33 +2496,33 @@
 2338.      6            return "";
 2339.      6        });
 2340.   8924    }
-
 2341.    666
-
 2342.  11201    function lex_comment() {
-
 2343.  11201        let body;
-
 2344.  11201        let ii = 0;
-
 2345.  11201        let jj = 0;
-
 2346.  11201        let the_comment;
-
 2347.  11201
-
 2348.  11201// Create a comment object. Comments are not allowed in JSON text. Comments can
-
 2349.  11201// include directives and notices of incompletion.
-
 2350.  11201
-
 2351.  11201// Create token from comment //....
-
 2352.  11201
-
 2353.  11087        if (snippet === "//") {
-
 2354.  11087            snippet = line_source;
-
 2355.  11087            line_source = "";
-
 2356.  11087            the_comment = token_create("(comment)", snippet);
-
 2357.  11087            if (mode_mega) {
-
 2358.  11087
-
 2359.  11087// test_cause:
-
 2360.  11087// ["`${//}`", "lex_comment", "unexpected_comment", "`", 4]
-
 2361.  11087
-
 2362.  11087                warn("unexpected_comment", the_comment, "`");
-
 2363.  11087            }
-
 2364.  11087
-
 2365.  11087// Create token from comment /*...*/.
-
 2366.  11087
-
 2367.  11087        } else {
+
 2341.    668
+
 2342.  11221    function lex_comment() {
+
 2343.  11221        let body;
+
 2344.  11221        let ii = 0;
+
 2345.  11221        let jj = 0;
+
 2346.  11221        let the_comment;
+
 2347.  11221
+
 2348.  11221// Create a comment object. Comments are not allowed in JSON text. Comments can
+
 2349.  11221// include directives and notices of incompletion.
+
 2350.  11221
+
 2351.  11221// Create token from comment //....
+
 2352.  11221
+
 2353.  11107        if (snippet === "//") {
+
 2354.  11107            snippet = line_source;
+
 2355.  11107            line_source = "";
+
 2356.  11107            the_comment = token_create("(comment)", snippet);
+
 2357.  11107            if (mode_mega) {
+
 2358.  11107
+
 2359.  11107// test_cause:
+
 2360.  11107// ["`${//}`", "lex_comment", "unexpected_comment", "`", 4]
+
 2361.  11107
+
 2362.  11107                warn("unexpected_comment", the_comment, "`");
+
 2363.  11107            }
+
 2364.  11107
+
 2365.  11107// Create token from comment /*...*/.
+
 2366.  11107
+
 2367.  11107        } else {
 2368.    114            snippet = [];
 2369.    114            if (line_source[0] === "/") {
 2370.    114
@@ -2574,26 +2574,26 @@
 2416.    114            column += ii + 2;
 2417.    114            line_source = line_source.slice(ii + 2);
 2418.    114            the_comment = token_create("(comment)", snippet);
-
 2419.  11198        }
-
 2420.  11198
-
 2421.  11198// Uncompleted work comment.
-
 2422.  11198
-
 2423.  11198        if (!option_dict.devel && jslint_rgx_todo.test(snippet)) {
+
 2419.  11218        }
+
 2420.  11218
+
 2421.  11218// Uncompleted work comment.
+
 2422.  11218
+
 2423.  11218        if (!option_dict.devel && jslint_rgx_todo.test(snippet)) {
 2424.     16
 2425.     16// test_cause:
 2426.     16// ["//todo", "lex_comment", "todo_comment", "(comment)", 1] //jslint-ignore-line
 2427.     16
 2428.     16            warn("todo_comment", the_comment);
-
 2429.  11198        }
-
 2430.  11198
-
 2431.  11198// Lex directives in comment.
-
 2432.  11198
-
 2433.  11198        [
-
 2434.  11198            the_comment.directive, body
-
 2435.  11198        ] = Array.from(snippet.match(jslint_rgx_directive) || []).slice(1);
-
 2436.  11121        if (the_comment.directive === undefined) {
-
 2437.  11121            return the_comment;
-
 2438.  11121        }
+
 2429.  11218        }
+
 2430.  11218
+
 2431.  11218// Lex directives in comment.
+
 2432.  11218
+
 2433.  11218        [
+
 2434.  11218            the_comment.directive, body
+
 2435.  11218        ] = Array.from(snippet.match(jslint_rgx_directive) || []).slice(1);
+
 2436.  11141        if (the_comment.directive === undefined) {
+
 2437.  11141            return the_comment;
+
 2438.  11141        }
 2439.     77        directive_list.push(the_comment);
 2440.     77        if (!mode_directive) {
 2441.      1
@@ -2663,7 +2663,7 @@
 2505.   1759        });
 2506.     76        return the_comment;
 2507.     76    }
-
 2508.    666
+
 2508.    668
 2509.    789    function lex_megastring() {
 2510.    789        let id;
 2511.    789        let match;
@@ -2766,7 +2766,7 @@
 2608.   5963            }
 2609.   5963        }
 2610.    789    }
-
 2611.    666
+
 2611.    668
 2612.   8851    function lex_number() {
 2613.   8851        let prefix = snippet;
 2614.   8851
@@ -2822,7 +2822,7 @@
 2664.   8850        char_before();
 2665.   8850        return token_create("(number)", snippet);
 2666.   8850    }
-
 2667.    666
+
 2667.    668
 2668.    583    function lex_regexp() {
 2669.    583
 2670.    583// Regexp
@@ -2940,172 +2940,172 @@
 2782.      1                warn_at("expected_regexp_factor_a", line, column, char);
 2783.      1                break;
 2784.    794            }
-
 2785.   5589            while (true) {
-
 2786.   5589                switch (char) {
-
 2787.   5589                case "":
-
 2788.   5589                case ")":
-
 2789.   5589                case "/":
-
 2790.   5589                case "]":
-
 2791.   5589                    return;
-
 2792.   5589
-
 2793.   5589// PR-362 - Relax regexp-warning against using <space>.
-
 2794.   5589//
-
 2795.   5589//                 case " ":
-
 2796.   5589//
-
 2797.   5589// // test_cause:
-
 2798.   5589// // ["aa=/ /", "lex_regexp_group", "expected_a_b", " ", 5]
-
 2799.   5589//
-
 2800.   5589//                     warn_at("expected_a_b", line, column, "\\s", " ");
-
 2801.   5589//                     char_after();
-
 2802.   5589//                     break;
-
 2803.   5589
-
 2804.   5589                case "$":
-
 2805.   5589                    if (line_source[0] !== "/") {
-
 2806.   5589                        mode_regexp_multiline = true;
-
 2807.   5589                    }
-
 2808.   5589                    char_after();
-
 2809.   5589                    break;
-
 2810.   5589                case "(":
-
 2811.   5589
-
 2812.   5589// RegExp
-
 2813.   5589// Match a group that starts with left paren.
-
 2814.   5589
-
 2815.   5589                    char_after("(");
-
 2816.   5589                    switch (char) {
-
 2817.   5589                    case ":":
-
 2818.   5589
-
 2819.   5589// test_cause:
-
 2820.   5589// ["aa=/(:)/", "lex_regexp_group", "expected_a_before_b", ":", 6]
-
 2821.   5589// ["aa=/?/", "lex_regexp_group", "expected_a_before_b", "?", 5]
-
 2822.   5589
-
 2823.   5589                        warn_at("expected_a_before_b", line, column, "?", ":");
-
 2824.   5589                        break;
-
 2825.   5589                    case "?":
-
 2826.   5589                        char_after("?");
-
 2827.   5589                        switch (char) {
-
 2828.   5589                        case "!":
-
 2829.   5589
-
 2830.   5589// PR-437 - Add grammar for regexp-named-capture-group.
-
 2831.   5589
-
 2832.   5589                        case "<":
-
 2833.   5589                        case "=":
-
 2834.   5589                            char_after();
-
 2835.   5589                            break;
-
 2836.   5589                        default:
-
 2837.   5589                            char_after(":");
-
 2838.   5589                        }
-
 2839.   5589                        break;
-
 2840.   5589                    }
-
 2841.   5589
-
 2842.   5589// RegExp
-
 2843.   5589// Recurse lex_regexp_group().
-
 2844.   5589
-
 2845.   5589                    lex_regexp_group();
-
 2846.   5589                    char_after(")");
-
 2847.   5589                    break;
-
 2848.   5589                case "*":
-
 2849.   5589                case "+":
-
 2850.   5589                case "?":
-
 2851.   5589                case "{":
-
 2852.   5589                case "}":
-
 2853.   5589
-
 2854.   5589// test_cause:
-
 2855.   5589// ["aa=/+/", "lex_regexp_group", "expected_a_before_b", "+", 5]
-
 2856.   5589// ["aa=/.**/", "lex_regexp_group", "expected_a_before_b", "*", 7]
-
 2857.   5589// ["aa=/?/", "lex_regexp_group", "expected_a_before_b", "?", 5]
-
 2858.   5589// ["aa=/{/", "lex_regexp_group", "expected_a_before_b", "{", 5]
-
 2859.   5589// ["aa=/}/", "lex_regexp_group", "expected_a_before_b", "}", 5]
-
 2860.   5589
-
 2861.   5589                    warn_at("expected_a_before_b", line, column, "\\", char);
-
 2862.   5589                    char_after();
-
 2863.   5589                    break;
-
 2864.   5589                case "[":
-
 2865.   5589                    lex_regexp_bracketed();
-
 2866.   5589                    break;
-
 2867.   5589                case "\\":
-
 2868.   5589
-
 2869.   5589// test_cause:
-
 2870.   5589// ["aa=/\\/", "lex_regexp_group", "escape", "", 0]
-
 2871.   5589
-
 2872.   5589                    test_cause("escape");
-
 2873.   5589
-
 2874.   5589// PR-437 - Add grammar for regexp-named-backreference.
-
 2875.   5589
-
 2876.   5589                    char_after_escape("BbDdSsWw^${}[]():=!.|*+?k");
-
 2877.   5589                    break;
-
 2878.   5589                case "^":
-
 2879.   5589                    if (snippet !== "^") {
-
 2880.   5589                        mode_regexp_multiline = true;
-
 2881.   5589                    }
-
 2882.   5589                    char_after();
-
 2883.   5589                    break;
-
 2884.   5589                case "`":
-
 2885.   5589                    if (mode_mega) {
-
 2886.   5589
-
 2887.   5589// test_cause:
-
 2888.   5589// ["`${/`/}`", "lex_regexp_group", "unexpected_a", "`", 5]
-
 2889.   5589
-
 2890.   5589                        warn_at("unexpected_a", line, column, "`");
-
 2891.   5589                    }
-
 2892.   5589                    char_after();
-
 2893.   5589                    break;
-
 2894.   5589                default:
-
 2895.   5589                    char_after();
-
 2896.   5589                }
-
 2897.   5589
-
 2898.   5589// RegExp
-
 2899.   5589// Match an optional quantifier.
-
 2900.   5589
-
 2901.   5589                switch (char) {
-
 2902.   5589                case "*":
-
 2903.   5589                case "+":
-
 2904.   5589                    if (char_after(char) === "?") {
-
 2905.   5589
-
 2906.   5589// test_cause:
-
 2907.   5589// ["aa=/.*?/", "lex_regexp_group", "?", "", 0]
-
 2908.   5589// ["aa=/.+?/", "lex_regexp_group", "?", "", 0]
-
 2909.   5589
-
 2910.   5589                        test_cause("?");
-
 2911.   5589                        char_after("?");
-
 2912.   5589                    }
-
 2913.   5589                    break;
-
 2914.   5589                case "?":
-
 2915.   5589                    if (char_after("?") === "?") {
-
 2916.   5589
-
 2917.   5589// test_cause:
-
 2918.   5589// ["aa=/.??/", "lex_regexp_group", "unexpected_a", "?", 7]
-
 2919.   5589
-
 2920.   5589                        warn_at("unexpected_a", line, column, char);
-
 2921.   5589                        char_after("?");
-
 2922.   5589                    }
-
 2923.   5589                    break;
-
 2924.   5589                case "{":
-
 2925.   5589                    if (read_digits("d", mode_digits_empty_string) === 0) {
-
 2926.   5589
-
 2927.   5589// test_cause:
-
 2928.   5589// ["aa=/aa{/", "lex_regexp_group", "expected_a_before_b", ",", 8]
-
 2929.   5589
-
 2930.   5589                        warn_at("expected_a_before_b", line, column, "0", ",");
-
 2931.   5589                    }
-
 2932.   5589                    if (char === ",") {
-
 2933.   5589
-
 2934.   5589// test_cause:
-
 2935.   5589// ["aa=/.{,/", "lex_regexp_group", "comma", "", 0]
-
 2936.   5589
-
 2937.   5589                        test_cause("comma");
-
 2938.   5589                        read_digits("d", mode_digits_empty_string);
-
 2939.   5589                    }
-
 2940.   5589                    if (char_after("}") === "?") {
-
 2941.   5589
-
 2942.   5589// test_cause:
-
 2943.   5589// ["aa=/.{0}?/", "lex_regexp_group", "unexpected_a", "?", 9]
-
 2944.   5589
-
 2945.   5589                        warn_at("unexpected_a", line, column, char);
-
 2946.   5589                        char_after("?");
-
 2947.   5589                    }
-
 2948.   5589                    break;
-
 2949.   5589                }
-
 2950.   5589            }
+
 2785.   5592            while (true) {
+
 2786.   5592                switch (char) {
+
 2787.   5592                case "":
+
 2788.   5592                case ")":
+
 2789.   5592                case "/":
+
 2790.   5592                case "]":
+
 2791.   5592                    return;
+
 2792.   5592
+
 2793.   5592// PR-362 - Relax regexp-warning against using <space>.
+
 2794.   5592//
+
 2795.   5592//                 case " ":
+
 2796.   5592//
+
 2797.   5592// // test_cause:
+
 2798.   5592// // ["aa=/ /", "lex_regexp_group", "expected_a_b", " ", 5]
+
 2799.   5592//
+
 2800.   5592//                     warn_at("expected_a_b", line, column, "\\s", " ");
+
 2801.   5592//                     char_after();
+
 2802.   5592//                     break;
+
 2803.   5592
+
 2804.   5592                case "$":
+
 2805.   5592                    if (line_source[0] !== "/") {
+
 2806.   5592                        mode_regexp_multiline = true;
+
 2807.   5592                    }
+
 2808.   5592                    char_after();
+
 2809.   5592                    break;
+
 2810.   5592                case "(":
+
 2811.   5592
+
 2812.   5592// RegExp
+
 2813.   5592// Match a group that starts with left paren.
+
 2814.   5592
+
 2815.   5592                    char_after("(");
+
 2816.   5592                    switch (char) {
+
 2817.   5592                    case ":":
+
 2818.   5592
+
 2819.   5592// test_cause:
+
 2820.   5592// ["aa=/(:)/", "lex_regexp_group", "expected_a_before_b", ":", 6]
+
 2821.   5592// ["aa=/?/", "lex_regexp_group", "expected_a_before_b", "?", 5]
+
 2822.   5592
+
 2823.   5592                        warn_at("expected_a_before_b", line, column, "?", ":");
+
 2824.   5592                        break;
+
 2825.   5592                    case "?":
+
 2826.   5592                        char_after("?");
+
 2827.   5592                        switch (char) {
+
 2828.   5592                        case "!":
+
 2829.   5592
+
 2830.   5592// PR-437 - Add grammar for regexp-named-capture-group.
+
 2831.   5592
+
 2832.   5592                        case "<":
+
 2833.   5592                        case "=":
+
 2834.   5592                            char_after();
+
 2835.   5592                            break;
+
 2836.   5592                        default:
+
 2837.   5592                            char_after(":");
+
 2838.   5592                        }
+
 2839.   5592                        break;
+
 2840.   5592                    }
+
 2841.   5592
+
 2842.   5592// RegExp
+
 2843.   5592// Recurse lex_regexp_group().
+
 2844.   5592
+
 2845.   5592                    lex_regexp_group();
+
 2846.   5592                    char_after(")");
+
 2847.   5592                    break;
+
 2848.   5592                case "*":
+
 2849.   5592                case "+":
+
 2850.   5592                case "?":
+
 2851.   5592                case "{":
+
 2852.   5592                case "}":
+
 2853.   5592
+
 2854.   5592// test_cause:
+
 2855.   5592// ["aa=/+/", "lex_regexp_group", "expected_a_before_b", "+", 5]
+
 2856.   5592// ["aa=/.**/", "lex_regexp_group", "expected_a_before_b", "*", 7]
+
 2857.   5592// ["aa=/?/", "lex_regexp_group", "expected_a_before_b", "?", 5]
+
 2858.   5592// ["aa=/{/", "lex_regexp_group", "expected_a_before_b", "{", 5]
+
 2859.   5592// ["aa=/}/", "lex_regexp_group", "expected_a_before_b", "}", 5]
+
 2860.   5592
+
 2861.   5592                    warn_at("expected_a_before_b", line, column, "\\", char);
+
 2862.   5592                    char_after();
+
 2863.   5592                    break;
+
 2864.   5592                case "[":
+
 2865.   5592                    lex_regexp_bracketed();
+
 2866.   5592                    break;
+
 2867.   5592                case "\\":
+
 2868.   5592
+
 2869.   5592// test_cause:
+
 2870.   5592// ["aa=/\\/", "lex_regexp_group", "escape", "", 0]
+
 2871.   5592
+
 2872.   5592                    test_cause("escape");
+
 2873.   5592
+
 2874.   5592// PR-437 - Add grammar for regexp-named-backreference.
+
 2875.   5592
+
 2876.   5592                    char_after_escape("BbDdSsWw^${}[]():=!.|*+?k");
+
 2877.   5592                    break;
+
 2878.   5592                case "^":
+
 2879.   5592                    if (snippet !== "^") {
+
 2880.   5592                        mode_regexp_multiline = true;
+
 2881.   5592                    }
+
 2882.   5592                    char_after();
+
 2883.   5592                    break;
+
 2884.   5592                case "`":
+
 2885.   5592                    if (mode_mega) {
+
 2886.   5592
+
 2887.   5592// test_cause:
+
 2888.   5592// ["`${/`/}`", "lex_regexp_group", "unexpected_a", "`", 5]
+
 2889.   5592
+
 2890.   5592                        warn_at("unexpected_a", line, column, "`");
+
 2891.   5592                    }
+
 2892.   5592                    char_after();
+
 2893.   5592                    break;
+
 2894.   5592                default:
+
 2895.   5592                    char_after();
+
 2896.   5592                }
+
 2897.   5592
+
 2898.   5592// RegExp
+
 2899.   5592// Match an optional quantifier.
+
 2900.   5592
+
 2901.   5592                switch (char) {
+
 2902.   5592                case "*":
+
 2903.   5592                case "+":
+
 2904.   5592                    if (char_after(char) === "?") {
+
 2905.   5592
+
 2906.   5592// test_cause:
+
 2907.   5592// ["aa=/.*?/", "lex_regexp_group", "?", "", 0]
+
 2908.   5592// ["aa=/.+?/", "lex_regexp_group", "?", "", 0]
+
 2909.   5592
+
 2910.   5592                        test_cause("?");
+
 2911.   5592                        char_after("?");
+
 2912.   5592                    }
+
 2913.   5592                    break;
+
 2914.   5592                case "?":
+
 2915.   5592                    if (char_after("?") === "?") {
+
 2916.   5592
+
 2917.   5592// test_cause:
+
 2918.   5592// ["aa=/.??/", "lex_regexp_group", "unexpected_a", "?", 7]
+
 2919.   5592
+
 2920.   5592                        warn_at("unexpected_a", line, column, char);
+
 2921.   5592                        char_after("?");
+
 2922.   5592                    }
+
 2923.   5592                    break;
+
 2924.   5592                case "{":
+
 2925.   5592                    if (read_digits("d", mode_digits_empty_string) === 0) {
+
 2926.   5592
+
 2927.   5592// test_cause:
+
 2928.   5592// ["aa=/aa{/", "lex_regexp_group", "expected_a_before_b", ",", 8]
+
 2929.   5592
+
 2930.   5592                        warn_at("expected_a_before_b", line, column, "0", ",");
+
 2931.   5592                    }
+
 2932.   5592                    if (char === ",") {
+
 2933.   5592
+
 2934.   5592// test_cause:
+
 2935.   5592// ["aa=/.{,/", "lex_regexp_group", "comma", "", 0]
+
 2936.   5592
+
 2937.   5592                        test_cause("comma");
+
 2938.   5592                        read_digits("d", mode_digits_empty_string);
+
 2939.   5592                    }
+
 2940.   5592                    if (char_after("}") === "?") {
+
 2941.   5592
+
 2942.   5592// test_cause:
+
 2943.   5592// ["aa=/.{0}?/", "lex_regexp_group", "unexpected_a", "?", 9]
+
 2944.   5592
+
 2945.   5592                        warn_at("unexpected_a", line, column, char);
+
 2946.   5592                        char_after("?");
+
 2947.   5592                    }
+
 2948.   5592                    break;
+
 2949.   5592                }
+
 2950.   5592            }
 2951.    794        }
 2952.    583
 2953.    583// RegExp
@@ -3143,39 +3143,39 @@
 2985.    583// Regexp
 2986.    583// char is a letter.
 2987.    583
-
 2988.    511            (char >= "a" && char <= "z\uffff")
+
 2988.    512            (char >= "a" && char <= "z\uffff")
 2989.    573            || (char >= "A" && char <= "Z\uffff")
-
 2990.    509        ) {
-
 2991.    509
-
 2992.    509// RegExp
-
 2993.    509// Process dangling flag letters.
-
 2994.    509
-
 2995.    509            switch (!flag[char] && char) {
-
 2996.    509            case "g":
-
 2997.    509                break;
-
 2998.    509            case "i":
-
 2999.    509                break;
-
 3000.    509            case "m":
-
 3001.    509                break;
-
 3002.    509            case "u":
-
 3003.    509                break;
-
 3004.    509            case "y":
-
 3005.    509
-
 3006.    509// test_cause:
-
 3007.    509// ["aa=/./gimuy", "lex_regexp", "flag", "", 0]
-
 3008.    509
-
 3009.    509                test_cause("flag");
-
 3010.    509                break;
-
 3011.    509            default:
-
 3012.    509
-
 3013.    509// test_cause:
-
 3014.    509// ["aa=/./gg", "lex_regexp", "unexpected_a", "g", 8]
-
 3015.    509// ["aa=/./z", "lex_regexp", "unexpected_a", "z", 7]
-
 3016.    509
-
 3017.    509                warn_at("unexpected_a", line, column, char);
-
 3018.    509            }
-
 3019.    509            flag[char] = true;
-
 3020.    509            char_after();
+
 2990.    510        ) {
+
 2991.    510
+
 2992.    510// RegExp
+
 2993.    510// Process dangling flag letters.
+
 2994.    510
+
 2995.    510            switch (!flag[char] && char) {
+
 2996.    510            case "g":
+
 2997.    510                break;
+
 2998.    510            case "i":
+
 2999.    510                break;
+
 3000.    510            case "m":
+
 3001.    510                break;
+
 3002.    510            case "u":
+
 3003.    510                break;
+
 3004.    510            case "y":
+
 3005.    510
+
 3006.    510// test_cause:
+
 3007.    510// ["aa=/./gimuy", "lex_regexp", "flag", "", 0]
+
 3008.    510
+
 3009.    510                test_cause("flag");
+
 3010.    510                break;
+
 3011.    510            default:
+
 3012.    510
+
 3013.    510// test_cause:
+
 3014.    510// ["aa=/./gg", "lex_regexp", "unexpected_a", "g", 8]
+
 3015.    510// ["aa=/./z", "lex_regexp", "unexpected_a", "z", 7]
+
 3016.    510
+
 3017.    510                warn_at("unexpected_a", line, column, char);
+
 3018.    510            }
+
 3019.    510            flag[char] = true;
+
 3020.    510            char_after();
 3021.    573        }
 3022.    573        char_before();
 3023.    573        if (char === "/" || char === "*") {
@@ -3197,7 +3197,7 @@
 3039.    572        }
 3040.    572        return result;
 3041.    572    }
-
 3042.    666
+
 3042.    668
 3043.    598    function lex_slash_or_regexp() {
 3044.    598
 3045.    598// The / can be a division operator or the beginning of a regular expression
@@ -3302,217 +3302,217 @@
 3144.     15        }
 3145.     15        return token_create(snippet);
 3146.     15    }
-
 3147.    666
-
 3148.  24320    function lex_string(quote) {
-
 3149.  24320
-
 3150.  24320// Create a string token.
-
 3151.  24320
-
 3152.  24320        let the_token;
-
 3153.  24318        if (!option_dict.single && quote === "'") {
+
 3147.    668
+
 3148.  24335    function lex_string(quote) {
+
 3149.  24335
+
 3150.  24335// Create a string token.
+
 3151.  24335
+
 3152.  24335        let the_token;
+
 3153.  24333        if (!option_dict.single && quote === "'") {
 3154.      2
 3155.      2// test_cause:
 3156.      2// ["''", "lex_string", "use_double", "", 1]
 3157.      2
 3158.      2            warn_at("use_double", line, column);
 3159.      2        }
-
 3160.  24320        snippet = "";
-
 3161.  24320        char_after();
-
 3162.  24320
-
 3163.  24320// Lex/loop through each character in "...".
-
 3164.  24320
-
 3165. 216942        while (true) {
-
 3166. 216942            switch (char) {
-
 3167. 216942            case "":
-
 3168. 216942
-
 3169. 216942// test_cause:
-
 3170. 216942// ["\"", "lex_string", "unclosed_string", "", 1]
-
 3171. 216942
-
 3172. 216942                return stop_at("unclosed_string", line, column);
-
 3173. 216942            case "\\":
-
 3174. 216942                char_after_escape(quote);
-
 3175. 216942                break;
-
 3176. 216942            case "`":
-
 3177. 216942                if (mode_mega) {
-
 3178. 216942
-
 3179. 216942// test_cause:
-
 3180. 216942// ["`${\"`\"}`", "lex_string", "unexpected_a", "`", 5]
-
 3181. 216942
-
 3182. 216942                    warn_at("unexpected_a", line, column, "`");
-
 3183. 216942                }
-
 3184. 216942                char_after("`");
-
 3185. 216942                break;
-
 3186. 216942            case quote:
-
 3187. 216942
-
 3188. 216942// Remove last character from snippet.
-
 3189. 216942
-
 3190. 216942                snippet = snippet.slice(0, -1);
-
 3191. 216942                the_token = token_create("(string)", snippet);
-
 3192. 216942                the_token.quote = quote;
-
 3193. 216942                return the_token;
-
 3194. 216942            default:
-
 3195. 216942                char_after();
-
 3196. 216942            }
-
 3197. 216942        }
-
 3198.  24320    }
-
 3199.    666
-
 3200. 252113    function lex_token() {
-
 3201. 252113        let match;
-
 3202. 252113
-
 3203. 252113// Lex/loop through each whitespace.
-
 3204. 252113
-
 3205. 375837        while (true) {
-
 3206. 375837
-
 3207. 375837// Lex/loop through each blank-line.
-
 3208. 375837
-
 3209. 375837            while (!line_source) {
-
 3210. 375837                line_source = read_line();
-
 3211. 375837                from = 0;
-
 3212. 375837                if (line_source === undefined) {
-
 3213. 375837                    return (
-
 3214. 375837                        mode_mega
-
 3215. 375837
-
 3216. 375837// test_cause:
-
 3217. 375837// ["`${//}`", "lex_token", "unclosed_mega", "", 1]
-
 3218. 375837
-
 3219. 375837                        ? stop_at("unclosed_mega", line_mega, from_mega)
-
 3220. 375837                        : line_disable !== undefined
-
 3221. 375837
-
 3222. 375837// test_cause:
-
 3223. 375837// ["/*jslint-disable*/", "lex_token", "unclosed_disable", "", 1]
-
 3224. 375837
-
 3225. 375837                        ? stop_at("unclosed_disable", line_disable)
-
 3226. 375837                        : token_create("(end)")
-
 3227. 375837                    );
-
 3228. 375837                }
-
 3229. 375837            }
-
 3230. 375837            from = column;
-
 3231. 375837            match = line_source.match(jslint_rgx_token);
-
 3232. 375837
-
 3233. 375837// match[1] token
-
 3234. 375837// match[2] whitespace
-
 3235. 375837// match[3] identifier
-
 3236. 375837// match[4] number
-
 3237. 375837// match[5] rest
-
 3238. 375837
-
 3239. 375837            if (!match) {
-
 3240. 375837
-
 3241. 375837// test_cause:
-
 3242. 375837// ["#", "lex_token", "unexpected_char_a", "#", 1]
-
 3243. 375837
-
 3244. 375837                return stop_at(
-
 3245. 375837                    "unexpected_char_a",
-
 3246. 375837                    line,
-
 3247. 375837                    column,
-
 3248. 375837                    line_source[0]
-
 3249. 375837                );
-
 3250. 375837            }
-
 3251. 375837            snippet = match[1];
-
 3252. 375837            column += snippet.length;
-
 3253. 375837            line_source = match[5];
-
 3254. 375837            if (!match[2]) {
-
 3255. 375837                break;
-
 3256. 375837            }
-
 3257. 375837        }
-
 3258. 251472
-
 3259. 251472// The token is an identifier.
-
 3260. 251472
-
 3261. 251472        if (match[3]) {
-
 3262.  67660            return token_create(snippet, undefined, true);
-
 3263. 183812        }
-
 3264. 183812
-
 3265. 183812// Create token from number.
-
 3266. 183812
-
 3267. 183812        if (match[4]) {
+
 3160.  24335        snippet = "";
+
 3161.  24335        char_after();
+
 3162.  24335
+
 3163.  24335// Lex/loop through each character in "...".
+
 3164.  24335
+
 3165. 217078        while (true) {
+
 3166. 217078            switch (char) {
+
 3167. 217078            case "":
+
 3168. 217078
+
 3169. 217078// test_cause:
+
 3170. 217078// ["\"", "lex_string", "unclosed_string", "", 1]
+
 3171. 217078
+
 3172. 217078                return stop_at("unclosed_string", line, column);
+
 3173. 217078            case "\\":
+
 3174. 217078                char_after_escape(quote);
+
 3175. 217078                break;
+
 3176. 217078            case "`":
+
 3177. 217078                if (mode_mega) {
+
 3178. 217078
+
 3179. 217078// test_cause:
+
 3180. 217078// ["`${\"`\"}`", "lex_string", "unexpected_a", "`", 5]
+
 3181. 217078
+
 3182. 217078                    warn_at("unexpected_a", line, column, "`");
+
 3183. 217078                }
+
 3184. 217078                char_after("`");
+
 3185. 217078                break;
+
 3186. 217078            case quote:
+
 3187. 217078
+
 3188. 217078// Remove last character from snippet.
+
 3189. 217078
+
 3190. 217078                snippet = snippet.slice(0, -1);
+
 3191. 217078                the_token = token_create("(string)", snippet);
+
 3192. 217078                the_token.quote = quote;
+
 3193. 217078                return the_token;
+
 3194. 217078            default:
+
 3195. 217078                char_after();
+
 3196. 217078            }
+
 3197. 217078        }
+
 3198.  24335    }
+
 3199.    668
+
 3200. 252255    function lex_token() {
+
 3201. 252255        let match;
+
 3202. 252255
+
 3203. 252255// Lex/loop through each whitespace.
+
 3204. 252255
+
 3205. 376039        while (true) {
+
 3206. 376039
+
 3207. 376039// Lex/loop through each blank-line.
+
 3208. 376039
+
 3209. 376039            while (!line_source) {
+
 3210. 376039                line_source = read_line();
+
 3211. 376039                from = 0;
+
 3212. 376039                if (line_source === undefined) {
+
 3213. 376039                    return (
+
 3214. 376039                        mode_mega
+
 3215. 376039
+
 3216. 376039// test_cause:
+
 3217. 376039// ["`${//}`", "lex_token", "unclosed_mega", "", 1]
+
 3218. 376039
+
 3219. 376039                        ? stop_at("unclosed_mega", line_mega, from_mega)
+
 3220. 376039                        : line_disable !== undefined
+
 3221. 376039
+
 3222. 376039// test_cause:
+
 3223. 376039// ["/*jslint-disable*/", "lex_token", "unclosed_disable", "", 1]
+
 3224. 376039
+
 3225. 376039                        ? stop_at("unclosed_disable", line_disable)
+
 3226. 376039                        : token_create("(end)")
+
 3227. 376039                    );
+
 3228. 376039                }
+
 3229. 376039            }
+
 3230. 376039            from = column;
+
 3231. 376039            match = line_source.match(jslint_rgx_token);
+
 3232. 376039
+
 3233. 376039// match[1] token
+
 3234. 376039// match[2] whitespace
+
 3235. 376039// match[3] identifier
+
 3236. 376039// match[4] number
+
 3237. 376039// match[5] rest
+
 3238. 376039
+
 3239. 376039            if (!match) {
+
 3240. 376039
+
 3241. 376039// test_cause:
+
 3242. 376039// ["#", "lex_token", "unexpected_char_a", "#", 1]
+
 3243. 376039
+
 3244. 376039                return stop_at(
+
 3245. 376039                    "unexpected_char_a",
+
 3246. 376039                    line,
+
 3247. 376039                    column,
+
 3248. 376039                    line_source[0]
+
 3249. 376039                );
+
 3250. 376039            }
+
 3251. 376039            snippet = match[1];
+
 3252. 376039            column += snippet.length;
+
 3253. 376039            line_source = match[5];
+
 3254. 376039            if (!match[2]) {
+
 3255. 376039                break;
+
 3256. 376039            }
+
 3257. 376039        }
+
 3258. 251612
+
 3259. 251612// The token is an identifier.
+
 3260. 251612
+
 3261. 251612        if (match[3]) {
+
 3262.  67699            return token_create(snippet, undefined, true);
+
 3263. 183913        }
+
 3264. 183913
+
 3265. 183913// Create token from number.
+
 3266. 183913
+
 3267. 183913        if (match[4]) {
 3268.   8851            return lex_number();
-
 3269. 174961        }
-
 3270. 174961
-
 3271. 174961// Create token from string "..." or '...'.
-
 3272. 174961
-
 3273. 174961        if (snippet === "\"" || snippet === "'") {
-
 3274.  24320            return lex_string(snippet);
-
 3275. 150641        }
-
 3276. 150641
-
 3277. 150641// Create token from megastring `...`.
-
 3278. 150641
-
 3279. 150641        if (snippet === "`") {
+
 3269. 175062        }
+
 3270. 175062
+
 3271. 175062// Create token from string "..." or '...'.
+
 3272. 175062
+
 3273. 175062        if (snippet === "\"" || snippet === "'") {
+
 3274.  24335            return lex_string(snippet);
+
 3275. 150727        }
+
 3276. 150727
+
 3277. 150727// Create token from megastring `...`.
+
 3278. 150727
+
 3279. 150727        if (snippet === "`") {
 3280.    789            return lex_megastring();
-
 3281. 149852        }
-
 3282. 149852
-
 3283. 149852// Create token from comment /*...*/ or //....
-
 3284. 149852
-
 3285. 149852        if (snippet === "/*" || snippet === "//") {
-
 3286.  11201            return lex_comment();
-
 3287. 138651        }
-
 3288. 138651
-
 3289. 138651// Create token from slash /.
-
 3290. 138651
-
 3291. 138651        if (snippet === "/") {
+
 3281. 149938        }
+
 3282. 149938
+
 3283. 149938// Create token from comment /*...*/ or //....
+
 3284. 149938
+
 3285. 149938        if (snippet === "/*" || snippet === "//") {
+
 3286.  11221            return lex_comment();
+
 3287. 138717        }
+
 3288. 138717
+
 3289. 138717// Create token from slash /.
+
 3290. 138717
+
 3291. 138717        if (snippet === "/") {
 3292.    598            return lex_slash_or_regexp();
-
 3293. 138053        }
-
 3294. 138053        return token_create(snippet);
-
 3295. 138053    }
-
 3296.    666
-
 3297.   2659    function option_set_item(key, val) {
-
 3298.   2659
-
 3299.   2659// These are the options that are recognized in the option object or that may
-
 3300.   2659// appear in a /*jslint*/ directive. Most options will have a boolean value,
-
 3301.   2659// usually true. Some options will also predefine some number of global
-
 3302.   2659// variables.
-
 3303.   2659
-
 3304.   2659        switch (key) {
-
 3305.    657        case "beta":            // Enable experimental warnings.
-
 3306.    659        case "bitwise":         // Allow bitwise operator.
-
 3307.    666        case "browser":         // Assume browser environment.
-
 3308.    668        case "convert":         // Allow conversion operator.
-
 3309.    670        case "couch":           // Assume CouchDb environment.
-
 3310.    676        case "devel":           // Allow console.log() and friends.
-
 3311.   2008        case "ecma":            // Assume ECMAScript environment.
-
 3312.   2014        case "eval":            // Allow eval().
-
 3313.   2018        case "fart":            // Allow complex fat-arrow.
-
 3314.   2023        case "for":             // Allow for-statement.
-
 3315.   2029        case "getset":          // Allow get() and set().
-
 3316.   2034        case "indent2":         // Use 2-space indent.
-
 3317.   2036        case "long":            // Allow long lines.
-
 3318.   2083        case "node":            // Assume Node.js environment.
-
 3319.   2087        case "nomen":           // Allow weird property name.
-
 3320.   2089        case "single":          // Allow single-quote strings.
-
 3321.   2091        case "subscript":       // Allow identifier in subscript-notation.
-
 3322.   2594        case "test_cause":      // Test jslint's causes.
-
 3323.   2596        case "test_internal_error":     // Test jslint's internal-error
-
 3324.   2659                                        // ... handling-ability.
-
 3325.   2598        case "this":            // Allow 'this'.
-
 3326.   2601        case "trace":           // Include jslint stack-trace in warnings.
-
 3327.   2605        case "unordered":       // Allow unordered cases, params, properties,
-
 3328.   2659                                // ... variables, and exports.
-
 3329.   2609        case "variable":        // Allow unordered const and let declarations
-
 3330.   2659                                // ... that are not at top of function-scope.
-
 3331.   2611        case "white":           // Allow messy whitespace.
-
 3332.   2611            option_dict[key] = val;
-
 3333.   2611            break;
-
 3334.   2659
-
 3335.   2659// PR-404 - Alias "evil" to jslint-directive "eval" for backwards-compat.
-
 3336.   2659
+
 3293. 138119        }
+
 3294. 138119        return token_create(snippet);
+
 3295. 138119    }
+
 3296.    668
+
 3297.   2667    function option_set_item(key, val) {
+
 3298.   2667
+
 3299.   2667// These are the options that are recognized in the option object or that may
+
 3300.   2667// appear in a /*jslint*/ directive. Most options will have a boolean value,
+
 3301.   2667// usually true. Some options will also predefine some number of global
+
 3302.   2667// variables.
+
 3303.   2667
+
 3304.   2667        switch (key) {
+
 3305.    659        case "beta":            // Enable experimental warnings.
+
 3306.    661        case "bitwise":         // Allow bitwise operator.
+
 3307.    668        case "browser":         // Assume browser environment.
+
 3308.    670        case "convert":         // Allow conversion operator.
+
 3309.    672        case "couch":           // Assume CouchDb environment.
+
 3310.    678        case "devel":           // Allow console.log() and friends.
+
 3311.   2014        case "ecma":            // Assume ECMAScript environment.
+
 3312.   2020        case "eval":            // Allow eval().
+
 3313.   2024        case "fart":            // Allow complex fat-arrow.
+
 3314.   2029        case "for":             // Allow for-statement.
+
 3315.   2035        case "getset":          // Allow get() and set().
+
 3316.   2040        case "indent2":         // Use 2-space indent.
+
 3317.   2042        case "long":            // Allow long lines.
+
 3318.   2089        case "node":            // Assume Node.js environment.
+
 3319.   2093        case "nomen":           // Allow weird property name.
+
 3320.   2095        case "single":          // Allow single-quote strings.
+
 3321.   2097        case "subscript":       // Allow identifier in subscript-notation.
+
 3322.   2602        case "test_cause":      // Test jslint's causes.
+
 3323.   2604        case "test_internal_error":     // Test jslint's internal-error
+
 3324.   2667                                        // ... handling-ability.
+
 3325.   2606        case "this":            // Allow 'this'.
+
 3326.   2609        case "trace":           // Include jslint stack-trace in warnings.
+
 3327.   2613        case "unordered":       // Allow unordered cases, params, properties,
+
 3328.   2667                                // ... variables, and exports.
+
 3329.   2617        case "variable":        // Allow unordered const and let declarations
+
 3330.   2667                                // ... that are not at top of function-scope.
+
 3331.   2619        case "white":           // Allow messy whitespace.
+
 3332.   2619            option_dict[key] = val;
+
 3333.   2619            break;
+
 3334.   2667
+
 3335.   2667// PR-404 - Alias "evil" to jslint-directive "eval" for backwards-compat.
+
 3336.   2667
 3337.      2        case "evil":
 3338.      2            return option_set_item("eval", val);
-
 3339.   2659
-
 3340.   2659// PR-404 - Alias "nomen" to jslint-directive "name" for backwards-compat.
-
 3341.   2659
+
 3339.   2667
+
 3340.   2667// PR-404 - Alias "nomen" to jslint-directive "name" for backwards-compat.
+
 3341.   2667
 3342.      2        case "name":
 3343.      2            return option_set_item("nomen", val);
 3344.     44        default:
 3345.     44            return false;
-
 3346.   2611        }
-
 3347.   2611
-
 3348.   2611// Initialize global-variables.
-
 3349.   2611
-
 3350.   2611        switch (val && key) {
-
 3351.   2659
-
 3352.   2659// Assign global browser variables to global_dict.
-
 3353.   2659/*
-
 3354.   2659// /\*jslint beta, browser, devel*\/
-
 3355.   2659console.log(JSON.stringify(Object.keys(window).sort(), undefined, 4));
-
 3356.   2659*/
-
 3357.   2659
+
 3346.   2619        }
+
 3347.   2619
+
 3348.   2619// Initialize global-variables.
+
 3349.   2619
+
 3350.   2619        switch (val && key) {
+
 3351.   2667
+
 3352.   2667// Assign global browser variables to global_dict.
+
 3353.   2667/*
+
 3354.   2667// /\*jslint beta, browser, devel*\/
+
 3355.   2667console.log(JSON.stringify(Object.keys(window).sort(), undefined, 4));
+
 3356.   2667*/
+
 3357.   2667
 3358.      6        case "browser":
 3359.      6            object_assign_from_list(global_dict, [
 3360.      6
@@ -3601,9 +3601,9 @@
 3443.      6                "window"
 3444.      6            ], "browser");
 3445.      6            break;
-
 3446.   2659
-
 3447.   2659// https://docs.couchdb.org/en/stable/query-server/javascript.html#javascript
-
 3448.   2659
+
 3446.   2667
+
 3447.   2667// https://docs.couchdb.org/en/stable/query-server/javascript.html#javascript
+
 3448.   2667
 3449.      2        case "couch":
 3450.      2            object_assign_from_list(global_dict, [
 3451.      2                "emit",
@@ -3624,131 +3624,131 @@
 3466.      6                "alert", "confirm", "console", "prompt"
 3467.      6            ], "development");
 3468.      6            break;
-
 3469.   2659
-
 3470.   2659// These are the globals that are provided by the language standard.
-
 3471.   2659// Assign global ECMAScript variables to global_dict.
-
 3472.   2659/*
-
 3473.   2659node --input-type=module --eval '
-
 3474.   2659// /\*jslint beta, node*\/
-
 3475.   2659import https from "https";
-
 3476.   2659(async function () {
-
 3477.   2659    let dict = {import: true};
-
 3478.   2659    let result = "";
-
 3479.   2659    await new Promise(function (resolve) {
-
 3480.   2659        https.get((
-
 3481.   2659            "https://raw.githubusercontent.com/mdn/content/main/files"
-
 3482.   2659            + "/en-us/web/javascript/reference/global_objects/index.md"
-
 3483.   2659        ), function (res) {
-
 3484.   2659            res.on("data", function (chunk) {
-
 3485.   2659                result += chunk;
-
 3486.   2659            }).on("end", resolve).setEncoding("utf8");
-
 3487.   2659        });
-
 3488.   2659    });
-
 3489.   2659    result.replace((
-
 3490.   2659        /\n- \{\{JSxRef\("(?:Global_Objects\/)?([^"\/]+?)"/g
-
 3491.   2659    ), function (ignore, key) {
-
 3492.   2659        if (globalThis.hasOwnProperty(key)) {
-
 3493.   2659            dict[key] = true;
-
 3494.   2659        }
-
 3495.   2659        return "";
-
 3496.   2659    });
-
 3497.   2659    console.log(JSON.stringify(Object.keys(dict).sort(), undefined, 4));
-
 3498.   2659}());
-
 3499.   2659'
-
 3500.   2659*/
-
 3501.   2659
-
 3502.   1332        case "ecma":
-
 3503.   1332            object_assign_from_list(global_dict, [
-
 3504.   1332                "AggregateError",
-
 3505.   1332                "Array",
-
 3506.   1332                "ArrayBuffer",
-
 3507.   1332                "Atomics",
-
 3508.   1332                "BigInt",
-
 3509.   1332                "BigInt64Array",
-
 3510.   1332                "BigUint64Array",
-
 3511.   1332                "Boolean",
-
 3512.   1332                "DataView",
-
 3513.   1332                "Date",
-
 3514.   1332                "Error",
-
 3515.   1332                "EvalError",
-
 3516.   1332                "Float32Array",
-
 3517.   1332                "Float64Array",
-
 3518.   1332                "Function",
-
 3519.   1332                "Infinity",
-
 3520.   1332                "Int16Array",
-
 3521.   1332                "Int32Array",
-
 3522.   1332                "Int8Array",
-
 3523.   1332                "Intl",
-
 3524.   1332                "JSON",
-
 3525.   1332                "Map",
-
 3526.   1332                "Math",
-
 3527.   1332                "NaN",
-
 3528.   1332                "Number",
-
 3529.   1332                "Object",
-
 3530.   1332                "Promise",
-
 3531.   1332                "Proxy",
-
 3532.   1332                "RangeError",
-
 3533.   1332                "ReferenceError",
-
 3534.   1332                "Reflect",
-
 3535.   1332                "RegExp",
-
 3536.   1332                "Set",
-
 3537.   1332                "SharedArrayBuffer",
-
 3538.   1332                "String",
-
 3539.   1332                "Symbol",
-
 3540.   1332                "SyntaxError",
-
 3541.   1332                "TypeError",
-
 3542.   1332                "URIError",
-
 3543.   1332                "Uint16Array",
-
 3544.   1332                "Uint32Array",
-
 3545.   1332                "Uint8Array",
-
 3546.   1332                "Uint8ClampedArray",
-
 3547.   1332                "WeakMap",
-
 3548.   1332                "WeakSet",
-
 3549.   1332                "WebAssembly",
-
 3550.   1332                "decodeURI",
-
 3551.   1332                "decodeURIComponent",
-
 3552.   1332                "encodeURI",
-
 3553.   1332                "encodeURIComponent",
-
 3554.   1332                "eval",
-
 3555.   1332                "globalThis",
-
 3556.   1332                "import",
-
 3557.   1332                "isFinite",
-
 3558.   1332                "isNaN",
-
 3559.   1332                "parseFloat",
-
 3560.   1332                "parseInt",
-
 3561.   1332                "undefined"
-
 3562.   1332            ], "ECMAScript");
-
 3563.   1332            break;
-
 3564.   2659
-
 3565.   2659// Assign global Node.js variables to global_dict.
-
 3566.   2659/*
-
 3567.   2659node --input-type=module --eval '
-
 3568.   2659// /\*jslint beta, node*\/
-
 3569.   2659import moduleHttps from "https";
-
 3570.   2659(async function () {
-
 3571.   2659    let dict = Object.create(null);
-
 3572.   2659    let result = "";
-
 3573.   2659    await new Promise(function (resolve) {
-
 3574.   2659        moduleHttps.get((
-
 3575.   2659            "https://raw.githubusercontent.com/nodejs/node/v16.x/doc/api"
-
 3576.   2659            + "/globals.md"
-
 3577.   2659        ), function (res) {
-
 3578.   2659            res.on("data", function (chunk) {
-
 3579.   2659                result += chunk;
-
 3580.   2659            }).on("end", resolve).setEncoding("utf8");
-
 3581.   2659        });
-
 3582.   2659    });
-
 3583.   2659    result.replace((
-
 3584.   2659        /\n(?:\* \[`|## |## Class: )`\w+/g
-
 3585.   2659    ), function (match0) {
-
 3586.   2659        dict[match0.split("`")[1]] = true;
-
 3587.   2659        return "";
-
 3588.   2659    });
-
 3589.   2659    console.log(JSON.stringify(Object.keys(dict).sort(), undefined, 4));
-
 3590.   2659}());
-
 3591.   2659'
-
 3592.   2659*/
-
 3593.   2659
+
 3469.   2667
+
 3470.   2667// These are the globals that are provided by the language standard.
+
 3471.   2667// Assign global ECMAScript variables to global_dict.
+
 3472.   2667/*
+
 3473.   2667node --input-type=module --eval '
+
 3474.   2667// /\*jslint beta, node*\/
+
 3475.   2667import https from "https";
+
 3476.   2667(async function () {
+
 3477.   2667    let dict = {import: true};
+
 3478.   2667    let result = "";
+
 3479.   2667    await new Promise(function (resolve) {
+
 3480.   2667        https.get((
+
 3481.   2667            "https://raw.githubusercontent.com/mdn/content/main/files"
+
 3482.   2667            + "/en-us/web/javascript/reference/global_objects/index.md"
+
 3483.   2667        ), function (res) {
+
 3484.   2667            res.on("data", function (chunk) {
+
 3485.   2667                result += chunk;
+
 3486.   2667            }).on("end", resolve).setEncoding("utf8");
+
 3487.   2667        });
+
 3488.   2667    });
+
 3489.   2667    result.replace((
+
 3490.   2667        /\n- \{\{JSxRef\("(?:Global_Objects\/)?([^"\/]+?)"/g
+
 3491.   2667    ), function (ignore, key) {
+
 3492.   2667        if (globalThis.hasOwnProperty(key)) {
+
 3493.   2667            dict[key] = true;
+
 3494.   2667        }
+
 3495.   2667        return "";
+
 3496.   2667    });
+
 3497.   2667    console.log(JSON.stringify(Object.keys(dict).sort(), undefined, 4));
+
 3498.   2667}());
+
 3499.   2667'
+
 3500.   2667*/
+
 3501.   2667
+
 3502.   1336        case "ecma":
+
 3503.   1336            object_assign_from_list(global_dict, [
+
 3504.   1336                "AggregateError",
+
 3505.   1336                "Array",
+
 3506.   1336                "ArrayBuffer",
+
 3507.   1336                "Atomics",
+
 3508.   1336                "BigInt",
+
 3509.   1336                "BigInt64Array",
+
 3510.   1336                "BigUint64Array",
+
 3511.   1336                "Boolean",
+
 3512.   1336                "DataView",
+
 3513.   1336                "Date",
+
 3514.   1336                "Error",
+
 3515.   1336                "EvalError",
+
 3516.   1336                "Float32Array",
+
 3517.   1336                "Float64Array",
+
 3518.   1336                "Function",
+
 3519.   1336                "Infinity",
+
 3520.   1336                "Int16Array",
+
 3521.   1336                "Int32Array",
+
 3522.   1336                "Int8Array",
+
 3523.   1336                "Intl",
+
 3524.   1336                "JSON",
+
 3525.   1336                "Map",
+
 3526.   1336                "Math",
+
 3527.   1336                "NaN",
+
 3528.   1336                "Number",
+
 3529.   1336                "Object",
+
 3530.   1336                "Promise",
+
 3531.   1336                "Proxy",
+
 3532.   1336                "RangeError",
+
 3533.   1336                "ReferenceError",
+
 3534.   1336                "Reflect",
+
 3535.   1336                "RegExp",
+
 3536.   1336                "Set",
+
 3537.   1336                "SharedArrayBuffer",
+
 3538.   1336                "String",
+
 3539.   1336                "Symbol",
+
 3540.   1336                "SyntaxError",
+
 3541.   1336                "TypeError",
+
 3542.   1336                "URIError",
+
 3543.   1336                "Uint16Array",
+
 3544.   1336                "Uint32Array",
+
 3545.   1336                "Uint8Array",
+
 3546.   1336                "Uint8ClampedArray",
+
 3547.   1336                "WeakMap",
+
 3548.   1336                "WeakSet",
+
 3549.   1336                "WebAssembly",
+
 3550.   1336                "decodeURI",
+
 3551.   1336                "decodeURIComponent",
+
 3552.   1336                "encodeURI",
+
 3553.   1336                "encodeURIComponent",
+
 3554.   1336                "eval",
+
 3555.   1336                "globalThis",
+
 3556.   1336                "import",
+
 3557.   1336                "isFinite",
+
 3558.   1336                "isNaN",
+
 3559.   1336                "parseFloat",
+
 3560.   1336                "parseInt",
+
 3561.   1336                "undefined"
+
 3562.   1336            ], "ECMAScript");
+
 3563.   1336            break;
+
 3564.   2667
+
 3565.   2667// Assign global Node.js variables to global_dict.
+
 3566.   2667/*
+
 3567.   2667node --input-type=module --eval '
+
 3568.   2667// /\*jslint beta, node*\/
+
 3569.   2667import moduleHttps from "https";
+
 3570.   2667(async function () {
+
 3571.   2667    let dict = Object.create(null);
+
 3572.   2667    let result = "";
+
 3573.   2667    await new Promise(function (resolve) {
+
 3574.   2667        moduleHttps.get((
+
 3575.   2667            "https://raw.githubusercontent.com/nodejs/node/v16.x/doc/api"
+
 3576.   2667            + "/globals.md"
+
 3577.   2667        ), function (res) {
+
 3578.   2667            res.on("data", function (chunk) {
+
 3579.   2667                result += chunk;
+
 3580.   2667            }).on("end", resolve).setEncoding("utf8");
+
 3581.   2667        });
+
 3582.   2667    });
+
 3583.   2667    result.replace((
+
 3584.   2667        /\n(?:\* \[`|## |## Class: )`\w+/g
+
 3585.   2667    ), function (match0) {
+
 3586.   2667        dict[match0.split("`")[1]] = true;
+
 3587.   2667        return "";
+
 3588.   2667    });
+
 3589.   2667    console.log(JSON.stringify(Object.keys(dict).sort(), undefined, 4));
+
 3590.   2667}());
+
 3591.   2667'
+
 3592.   2667*/
+
 3593.   2667
 3594.     47        case "node":
 3595.     47            object_assign_from_list(global_dict, [
 3596.     47                "AbortController",
@@ -3790,10 +3790,10 @@
 3632.     47                "setTimeout"
 3633.     47            ], "Node.js");
 3634.     47            break;
-
 3635.   2611        }
-
 3636.   2611        return true;
-
 3637.   2611    }
-
 3638.    666
+
 3635.   2619        }
+
 3636.   2619        return true;
+
 3637.   2619    }
+
 3638.    668
 3639.    469    function read_digits(base, mode) {
 3640.    469        let digits = line_source.match(
 3641.    469            base === "b"
@@ -3837,16 +3837,16 @@
 3679.    469        char_after();
 3680.    469        return digits.length;
 3681.    469    }
-
 3682.    666
-
 3683. 105134    function read_line() {
-
 3684. 105134
-
 3685. 105134// Put the next line of source in line_source. If the line contains tabs,
-
 3686. 105134// replace them with spaces and give a warning. Also warn if the line contains
-
 3687. 105134// unsafe characters or is too damn long.
-
 3688. 105134
-
 3689. 105134        if (
-
 3690. 105134            !option_dict.long
-
 3691. 105130            && line_whole.length > 80
+
 3682.    668
+
 3683. 105193    function read_line() {
+
 3684. 105193
+
 3685. 105193// Put the next line of source in line_source. If the line contains tabs,
+
 3686. 105193// replace them with spaces and give a warning. Also warn if the line contains
+
 3687. 105193// unsafe characters or is too damn long.
+
 3688. 105193
+
 3689. 105193        if (
+
 3690. 105193            !option_dict.long
+
 3691. 105189            && line_whole.length > 80
 3692.     56            && line_disable === undefined
 3693.     56            && !state.mode_json
 3694.     23            && token_1
@@ -3858,59 +3858,59 @@
 3700.     13
 3701.     13            warn_at("too_long", line);
 3702.     13        }
-
 3703. 105134        column = 0;
-
 3704. 105134        line += 1;
-
 3705. 105134        mode_regexp = false;
-
 3706. 105134        line_source = undefined;
-
 3707. 105134        line_whole = "";
-
 3708.    643        if (line_list[line] === undefined) {
-
 3709.    643            return line_source;
-
 3710. 104491        }
-
 3711. 104491        line_source = line_list[line].line_source;
-
 3712. 104491        line_whole = line_source;
-
 3713. 104491
-
 3714. 104491// Scan each line for following ignore-directives:
-
 3715. 104491// "/*jslint-disable*/"
-
 3716. 104491// "/*jslint-enable*/"
-
 3717. 104491// "//jslint-ignore-line"
-
 3718. 104491
-
 3719. 104491        if (line_source === "/*jslint-disable*/") {
+
 3703. 105193        column = 0;
+
 3704. 105193        line += 1;
+
 3705. 105193        mode_regexp = false;
+
 3706. 105193        line_source = undefined;
+
 3707. 105193        line_whole = "";
+
 3708.    645        if (line_list[line] === undefined) {
+
 3709.    645            return line_source;
+
 3710. 104548        }
+
 3711. 104548        line_source = line_list[line].line_source;
+
 3712. 104548        line_whole = line_source;
+
 3713. 104548
+
 3714. 104548// Scan each line for following ignore-directives:
+
 3715. 104548// "/*jslint-disable*/"
+
 3716. 104548// "/*jslint-enable*/"
+
 3717. 104548// "//jslint-ignore-line"
+
 3718. 104548
+
 3719. 104548        if (line_source === "/*jslint-disable*/") {
 3720.      5
 3721.      5// test_cause:
 3722.      5// ["/*jslint-disable*/", "read_line", "jslint_disable", "", 0]
 3723.      5
 3724.      5            test_cause("jslint_disable");
 3725.      5            line_disable = line;
-
 3726. 104486        } else if (line_source === "/*jslint-enable*/") {
-
 3727. 104486            if (line_disable === undefined) {
-
 3728. 104486
-
 3729. 104486// test_cause:
-
 3730. 104486// ["/*jslint-enable*/", "read_line", "unopened_enable", "", 1]
-
 3731. 104486
-
 3732. 104486                stop_at("unopened_enable", line);
-
 3733. 104486            }
-
 3734. 104486            line_disable = undefined;
-
 3735. 104486        } else if (
-
 3736. 104486            line_source.endsWith(" //jslint-ignore-line")
-
 3737. 104486            || line_source.endsWith(" //jslint-quiet")
-
 3738. 104486        ) {
-
 3739. 104486
-
 3740. 104486// test_cause:
-
 3741. 104486// ["0 //jslint-ignore-line", "read_line", "jslint_ignore_line", "", 0]
-
 3742. 104486
-
 3743. 104486            test_cause("jslint_ignore_line");
-
 3744. 104486            line_list[line].directive_ignore_line = true;
-
 3745. 104490        }
-
 3746. 104490        if (line_disable !== undefined) {
+
 3726. 104543        } else if (line_source === "/*jslint-enable*/") {
+
 3727. 104543            if (line_disable === undefined) {
+
 3728. 104543
+
 3729. 104543// test_cause:
+
 3730. 104543// ["/*jslint-enable*/", "read_line", "unopened_enable", "", 1]
+
 3731. 104543
+
 3732. 104543                stop_at("unopened_enable", line);
+
 3733. 104543            }
+
 3734. 104543            line_disable = undefined;
+
 3735. 104543        } else if (
+
 3736. 104543            line_source.endsWith(" //jslint-ignore-line")
+
 3737. 104543            || line_source.endsWith(" //jslint-quiet")
+
 3738. 104543        ) {
+
 3739. 104543
+
 3740. 104543// test_cause:
+
 3741. 104543// ["0 //jslint-ignore-line", "read_line", "jslint_ignore_line", "", 0]
+
 3742. 104543
+
 3743. 104543            test_cause("jslint_ignore_line");
+
 3744. 104543            line_list[line].directive_ignore_line = true;
+
 3745. 104547        }
+
 3746. 104547        if (line_disable !== undefined) {
 3747.      9
 3748.      9// test_cause:
 3749.      9// ["/*jslint-disable*/\n0", "read_line", "line_disable", "", 0]
 3750.      9
 3751.      9            test_cause("line_disable");
 3752.      9            line_source = "";
-
 3753. 104490        }
-
 3754. 104490        // jslint_rgx_tab
-
 3755. 104490        if (line_source.indexOf("\t") >= 0) {
+
 3753. 104547        }
+
 3754. 104547        // jslint_rgx_tab
+
 3755. 104547        if (line_source.indexOf("\t") >= 0) {
 3756.      3            if (!option_dict.white) {
 3757.      3
 3758.      3// test_cause:
@@ -3919,47 +3919,47 @@
 3761.      3                warn_at("use_spaces", line, line_source.indexOf("\t") + 1);
 3762.      3            }
 3763.      3            line_source = line_source.replace(jslint_rgx_tab, " ");
-
 3764. 104490        }
-
 3765. 104490        if (!option_dict.white && line_source.endsWith(" ")) {
+
 3764. 104547        }
+
 3765. 104547        if (!option_dict.white && line_source.endsWith(" ")) {
 3766.      2
 3767.      2// test_cause:
 3768.      2// [" ", "read_line", "unexpected_trailing_space", "", 1]
 3769.      2
 3770.      2            warn_at("unexpected_trailing_space", line, line_source.length - 1);
-
 3771. 104490        }
-
 3772. 104490        return line_source;
-
 3773. 104490    }
-
 3774.    666
-
 3775. 255099    function token_create(id, value, identifier) {
-
 3776. 255099
-
 3777. 255099// Create the token object and append it to token_list.
-
 3778. 255099
-
 3779. 255099        let the_token = {
-
 3780. 255099            from,
-
 3781. 255099            id,
-
 3782. 255099            identifier: Boolean(identifier),
-
 3783. 255099            line,
-
 3784. 255099            nr: token_list.length,
-
 3785. 255099            thru: column,
-
 3786. 255099            value
-
 3787. 255099        };
-
 3788. 255099        token_list.push(the_token);
-
 3789. 255099
-
 3790. 255099// Directives must appear before the first statement.
-
 3791. 255099
-
 3792. 243901        if (id !== "(comment)" && id !== ";") {
-
 3793. 227889            mode_directive = false;
-
 3794. 227889        }
-
 3795. 255099
-
 3796. 255099// If this token is an identifier that touches a preceding number, or
-
 3797. 255099// a "/", comment, or regular expression literal that touches a preceding
-
 3798. 255099// comment or regular expression literal, then give a missing space warning.
-
 3799. 255099// This warning is not suppressed by option_dict.white.
-
 3800. 255099
-
 3801. 255099        if (
-
 3802. 255099            token_prv.line === line
-
 3803. 185733            && token_prv.thru === from
-
 3804. 119850            && (id === "(comment)" || id === "(regexp)" || id === "/")
+
 3771. 104547        }
+
 3772. 104547        return line_source;
+
 3773. 104547    }
+
 3774.    668
+
 3775. 255241    function token_create(id, value, identifier) {
+
 3776. 255241
+
 3777. 255241// Create the token object and append it to token_list.
+
 3778. 255241
+
 3779. 255241        let the_token = {
+
 3780. 255241            from,
+
 3781. 255241            id,
+
 3782. 255241            identifier: Boolean(identifier),
+
 3783. 255241            line,
+
 3784. 255241            nr: token_list.length,
+
 3785. 255241            thru: column,
+
 3786. 255241            value
+
 3787. 255241        };
+
 3788. 255241        token_list.push(the_token);
+
 3789. 255241
+
 3790. 255241// Directives must appear before the first statement.
+
 3791. 255241
+
 3792. 244023        if (id !== "(comment)" && id !== ";") {
+
 3793. 228006            mode_directive = false;
+
 3794. 228006        }
+
 3795. 255241
+
 3796. 255241// If this token is an identifier that touches a preceding number, or
+
 3797. 255241// a "/", comment, or regular expression literal that touches a preceding
+
 3798. 255241// comment or regular expression literal, then give a missing space warning.
+
 3799. 255241// This warning is not suppressed by option_dict.white.
+
 3800. 255241
+
 3801. 255241        if (
+
 3802. 255241            token_prv.line === line
+
 3803. 185838            && token_prv.thru === from
+
 3804. 119910            && (id === "(comment)" || id === "(regexp)" || id === "/")
 3805.    125            && (token_prv.id === "(comment)" || token_prv.id === "(regexp)")
 3806.      1        ) {
 3807.      1
@@ -3973,30 +3973,30 @@
 3815.      1                artifact(the_token)
 3816.      1            );
 3817.      1        }
-
 3818.  11593        if (token_prv.id === "." && id === "(number)") {
+
 3818.  11603        if (token_prv.id === "." && id === "(number)") {
 3819.      4
 3820.      4// test_cause:
 3821.      4// [".0", "token_create", "expected_a_before_b", ".", 1]
 3822.      4
 3823.      4            warn("expected_a_before_b", token_prv, "0", ".");
 3824.      4        }
-
 3825.  11593        if (token_prv_expr.id === "." && the_token.identifier) {
-
 3826.  11588            the_token.dot = true;
-
 3827.  11588        }
-
 3828. 255099
-
 3829. 255099// PR-385 - Bugfix - Fixes issue #382 - failure to detect destructured fart.
-
 3830. 255099// Farts are now detected by keeping a list of most recent "(" tokens at any
-
 3831. 255099// given depth. When a "=>" token is encountered, the most recent "(" token at
-
 3832. 255099// current depth is marked as a fart.
-
 3833. 255099
-
 3834. 255099        switch (id) {
-
 3835.  17580        case "(":
-
 3836.  17580            paren_backtrack_list[paren_depth] = the_token;
-
 3837.  17580            paren_depth += 1;
-
 3838.  17580            break;
-
 3839.  17579        case ")":
-
 3840.  17579            paren_depth -= 1;
-
 3841.  17579            break;
+
 3825.  11603        if (token_prv_expr.id === "." && the_token.identifier) {
+
 3826.  11598            the_token.dot = true;
+
 3827.  11598        }
+
 3828. 255241
+
 3829. 255241// PR-385 - Bugfix - Fixes issue #382 - failure to detect destructured fart.
+
 3830. 255241// Farts are now detected by keeping a list of most recent "(" tokens at any
+
 3831. 255241// given depth. When a "=>" token is encountered, the most recent "(" token at
+
 3832. 255241// current depth is marked as a fart.
+
 3833. 255241
+
 3834. 255241        switch (id) {
+
 3835.  17591        case "(":
+
 3836.  17591            paren_backtrack_list[paren_depth] = the_token;
+
 3837.  17591            paren_depth += 1;
+
 3838.  17591            break;
+
 3839.  17590        case ")":
+
 3840.  17590            paren_depth -= 1;
+
 3841.  17590            break;
 3842.     16        case "=>":
 3843.     16            if (
 3844.     16                token_prv_expr.id === ")"
@@ -4005,120 +4005,120 @@
 3847.     16                paren_backtrack_list[paren_depth].fart = the_token;
 3848.     16            }
 3849.     16            break;
-
 3850. 255099        }
-
 3851. 255099
-
 3852. 255099// The previous token is used to detect adjacency problems.
-
 3853. 255099
-
 3854. 255099        token_prv = the_token;
-
 3855. 255099
-
 3856. 255099// The token_prv_expr token is a previous token that was not a comment.
-
 3857. 255099// The token_prv_expr token
-
 3858. 255099// is used to disambiguate "/", which can mean division or regular expression
-
 3859. 255099// literal.
-
 3860. 255099
-
 3861. 243901        if (token_prv.id !== "(comment)") {
-
 3862. 243901            token_prv_expr = token_prv;
-
 3863. 243901        }
-
 3864. 255099        return the_token;
-
 3865. 255099    }
-
 3866.    666
-
 3867.    666// Init global_dict and option_dict.
-
 3868.    666
-
 3869.    666    option_set_item("ecma", true);
-
 3870.   1890    Object.keys(option_dict).sort().forEach(function (key) {
-
 3871.   1890        option_set_item(key, option_dict[key] === true);
-
 3872.   1890    });
-
 3873.    666    object_assign_from_list(global_dict, global_list, "user-defined");
-
 3874.    666
-
 3875.    666// Scan first line for "#!" and ignore it.
-
 3876.    666
+
 3850. 255241        }
+
 3851. 255241
+
 3852. 255241// The previous token is used to detect adjacency problems.
+
 3853. 255241
+
 3854. 255241        token_prv = the_token;
+
 3855. 255241
+
 3856. 255241// The token_prv_expr token is a previous token that was not a comment.
+
 3857. 255241// The token_prv_expr token
+
 3858. 255241// is used to disambiguate "/", which can mean division or regular expression
+
 3859. 255241// literal.
+
 3860. 255241
+
 3861. 244023        if (token_prv.id !== "(comment)") {
+
 3862. 244023            token_prv_expr = token_prv;
+
 3863. 244023        }
+
 3864. 255241        return the_token;
+
 3865. 255241    }
+
 3866.    668
+
 3867.    668// Init global_dict and option_dict.
+
 3868.    668
+
 3869.    668    option_set_item("ecma", true);
+
 3870.   1896    Object.keys(option_dict).sort().forEach(function (key) {
+
 3871.   1896        option_set_item(key, option_dict[key] === true);
+
 3872.   1896    });
+
 3873.    668    object_assign_from_list(global_dict, global_list, "user-defined");
+
 3874.    668
+
 3875.    668// Scan first line for "#!" and ignore it.
+
 3876.    668
 3877.      1    if (line_list[jslint_fudge].line_source.startsWith("#!")) {
 3878.      1        line += 1;
 3879.      1        state.mode_shebang = true;
 3880.      1    }
-
 3881.    666    token_1 = lex_token();
-
 3882.    638    state.mode_json = token_1.id === "{" || token_1.id === "[";
-
 3883.    666
-
 3884.    666// Lex/loop through each token until (end).
-
 3885.    666
-
 3886. 249334    while (true) {
-
 3887. 249334        if (lex_token().id === "(end)") {
-
 3888. 249334            break;
-
 3889. 249334        }
-
 3890. 249334    }
-
 3891.    666}
+
 3881.    668    token_1 = lex_token();
+
 3882.    640    state.mode_json = token_1.id === "{" || token_1.id === "[";
+
 3883.    668
+
 3884.    668// Lex/loop through each token until (end).
+
 3885.    668
+
 3886. 249474    while (true) {
+
 3887. 249474        if (lex_token().id === "(end)") {
+
 3888. 249474            break;
+
 3889. 249474        }
+
 3890. 249474    }
+
 3891.    668}
 3892.      1
-
 3893.    629function jslint_phase3_parse(state) {
-
 3894.    629
-
 3895.    629// PHASE 3. Parse <token_list> into <token_tree> using the Pratt-parser.
-
 3896.    629
-
 3897.    629// Parsing:
-
 3898.    629
-
 3899.    629// Parsing weaves the tokens into an abstract syntax tree. During that process,
-
 3900.    629// a token may be given any of these properties:
-
 3901.    629
-
 3902.    629//      arity       string
-
 3903.    629//      label       identifier
-
 3904.    629//      name        identifier
-
 3905.    629//      expression  expressions
-
 3906.    629//      block       statements
-
 3907.    629//      else        statements (else, default, catch)
-
 3908.    629
-
 3909.    629// Specialized tokens may have additional properties.
-
 3910.    629
-
 3911.    629    let anon = "anonymous";     // The guessed name for anonymous functions.
-
 3912.    629    let {
-
 3913.    629        artifact,
-
 3914.    629        catch_list,
-
 3915.    629        catch_stack,
-
 3916.    629        export_dict,
-
 3917.    629        function_list,
-
 3918.    629        function_stack,
-
 3919.    629        global_dict,
-
 3920.    629        import_list,
-
 3921.    629        is_equal,
-
 3922.    629        option_dict,
-
 3923.    629        property_dict,
-
 3924.    629        stop,
-
 3925.    629        syntax_dict,
-
 3926.    629        tenure,
-
 3927.    629        test_cause,
-
 3928.    629        token_global,
-
 3929.    629        token_list,
-
 3930.    629        warn,
-
 3931.    629        warn_at
-
 3932.    629    } = state;
-
 3933.    629    let catchage = catch_stack[0];      // The current catch-block.
-
 3934.    629    let functionage = token_global;     // The current function.
-
 3935.    629    let mode_var;               // "var" if using var; "let" if using let.
-
 3936.    629    let token_ii = 0;           // The number of the next token.
-
 3937.    629    let token_now = token_global;       // The current token being examined in
-
 3938.    629                                        // ... the parse.
-
 3939.    629    let token_nxt = token_global;       // The next token to be examined in
-
 3940.    629                                        // ... <token_list>.
-
 3941.    629
-
 3942. 244237    function advance(id, match) {
-
 3943. 244237
-
 3944. 244237// Produce the next token.
-
 3945. 244237
-
 3946. 244237// Attempt to give helpful names to anonymous functions.
-
 3947. 244237
-
 3948. 244237        if (
-
 3949. 244237            token_now.identifier
-
 3950.  67617            && token_now.id !== "function"
-
 3951.  65625            && token_now.id !== "async"
-
 3952.  65444        ) {
-
 3953.  65444            anon = token_now.id;
-
 3954. 178793        } else if (
-
 3955. 178793            token_now.id === "(string)"
-
 3956. 178793            && jslint_rgx_identifier.test(token_now.value)
-
 3957. 178793        ) {
-
 3958. 178793            anon = token_now.value;
-
 3959. 178793        }
-
 3960. 244237
-
 3961. 244237// Attempt to match token_nxt with an expected id.
-
 3962. 244237
-
 3963. 120026        if (id !== undefined && token_nxt.id !== id) {
+
 3893.    631function jslint_phase3_parse(state) {
+
 3894.    631
+
 3895.    631// PHASE 3. Parse <token_list> into <token_tree> using the Pratt-parser.
+
 3896.    631
+
 3897.    631// Parsing:
+
 3898.    631
+
 3899.    631// Parsing weaves the tokens into an abstract syntax tree. During that process,
+
 3900.    631// a token may be given any of these properties:
+
 3901.    631
+
 3902.    631//      arity       string
+
 3903.    631//      label       identifier
+
 3904.    631//      name        identifier
+
 3905.    631//      expression  expressions
+
 3906.    631//      block       statements
+
 3907.    631//      else        statements (else, default, catch)
+
 3908.    631
+
 3909.    631// Specialized tokens may have additional properties.
+
 3910.    631
+
 3911.    631    let anon = "anonymous";     // The guessed name for anonymous functions.
+
 3912.    631    let {
+
 3913.    631        artifact,
+
 3914.    631        catch_list,
+
 3915.    631        catch_stack,
+
 3916.    631        export_dict,
+
 3917.    631        function_list,
+
 3918.    631        function_stack,
+
 3919.    631        global_dict,
+
 3920.    631        import_list,
+
 3921.    631        is_equal,
+
 3922.    631        option_dict,
+
 3923.    631        property_dict,
+
 3924.    631        stop,
+
 3925.    631        syntax_dict,
+
 3926.    631        tenure,
+
 3927.    631        test_cause,
+
 3928.    631        token_global,
+
 3929.    631        token_list,
+
 3930.    631        warn,
+
 3931.    631        warn_at
+
 3932.    631    } = state;
+
 3933.    631    let catchage = catch_stack[0];      // The current catch-block.
+
 3934.    631    let functionage = token_global;     // The current function.
+
 3935.    631    let mode_var;               // "var" if using var; "let" if using let.
+
 3936.    631    let token_ii = 0;           // The number of the next token.
+
 3937.    631    let token_now = token_global;       // The current token being examined in
+
 3938.    631                                        // ... the parse.
+
 3939.    631    let token_nxt = token_global;       // The next token to be examined in
+
 3940.    631                                        // ... <token_list>.
+
 3941.    631
+
 3942. 244361    function advance(id, match) {
+
 3943. 244361
+
 3944. 244361// Produce the next token.
+
 3945. 244361
+
 3946. 244361// Attempt to give helpful names to anonymous functions.
+
 3947. 244361
+
 3948. 244361        if (
+
 3949. 244361            token_now.identifier
+
 3950.  67656            && token_now.id !== "function"
+
 3951.  65664            && token_now.id !== "async"
+
 3952.  65483        ) {
+
 3953.  65483            anon = token_now.id;
+
 3954. 178878        } else if (
+
 3955. 178878            token_now.id === "(string)"
+
 3956. 178878            && jslint_rgx_identifier.test(token_now.value)
+
 3957. 178878        ) {
+
 3958. 178878            anon = token_now.value;
+
 3959. 178878        }
+
 3960. 244361
+
 3961. 244361// Attempt to match token_nxt with an expected id.
+
 3962. 244361
+
 3963. 120065        if (id !== undefined && token_nxt.id !== id) {
 3964.     26            return (
 3965.     26                match === undefined
 3966.     26
@@ -4139,97 +4139,97 @@
 3981.     26                    artifact()
 3982.     26                )
 3983.     26            );
-
 3984. 244211        }
-
 3985. 244211
-
 3986. 244211// Promote the tokens, skipping comments.
-
 3987. 244211
-
 3988. 244211        token_now = token_nxt;
-
 3989. 255406        while (true) {
-
 3990. 255406            token_nxt = token_list[token_ii];
-
 3991. 255406            state.token_nxt = token_nxt;
-
 3992. 255406            token_ii += 1;
-
 3993. 255406            if (token_nxt.id !== "(comment)") {
-
 3994. 255406                if (token_nxt.id === "(end)") {
-
 3995. 255406                    token_ii -= 1;
-
 3996. 255406                }
-
 3997. 255406                break;
-
 3998. 255406            }
-
 3999. 255406            if (state.mode_json) {
-
 4000. 255406
-
 4001. 255406// test_cause:
-
 4002. 255406// ["[//]", "advance", "unexpected_a", "(comment)", 2]
-
 4003. 255406
-
 4004. 255406                warn("unexpected_a");
-
 4005. 255406            }
-
 4006. 255406        }
-
 4007. 244237    }
-
 4008.    629
-
 4009.   7548    function assignment(id) {
-
 4010.   7548
-
 4011.   7548// Create an assignment operator. The one true assignment is different because
-
 4012.   7548// its left side, when it is a variable, is not treated as an expression.
-
 4013.   7548// That case is special because that is when a variable gets initialized. The
-
 4014.   7548// other assignment operators can modify, but they cannot initialize.
-
 4015.   7548
-
 4016.   7548        const the_symbol = symbol(id, 20);
-
 4017.   5018        the_symbol.led_infix = function (left) {
-
 4018.   5018            const the_token = token_now;
-
 4019.   5018            let right;
-
 4020.   5018            the_token.arity = "assignment";
-
 4021.   5018            right = parse_expression(20 - 1);
-
 4022.   4239            if (id === "=" && left.arity === "variable") {
-
 4023.   2823                the_token.names = left;
-
 4024.   2823                the_token.expression = right;
-
 4025.   2823            } else {
+
 3984. 244335        }
+
 3985. 244335
+
 3986. 244335// Promote the tokens, skipping comments.
+
 3987. 244335
+
 3988. 244335        token_now = token_nxt;
+
 3989. 255550        while (true) {
+
 3990. 255550            token_nxt = token_list[token_ii];
+
 3991. 255550            state.token_nxt = token_nxt;
+
 3992. 255550            token_ii += 1;
+
 3993. 255550            if (token_nxt.id !== "(comment)") {
+
 3994. 255550                if (token_nxt.id === "(end)") {
+
 3995. 255550                    token_ii -= 1;
+
 3996. 255550                }
+
 3997. 255550                break;
+
 3998. 255550            }
+
 3999. 255550            if (state.mode_json) {
+
 4000. 255550
+
 4001. 255550// test_cause:
+
 4002. 255550// ["[//]", "advance", "unexpected_a", "(comment)", 2]
+
 4003. 255550
+
 4004. 255550                warn("unexpected_a");
+
 4005. 255550            }
+
 4006. 255550        }
+
 4007. 244361    }
+
 4008.    631
+
 4009.   7572    function assignment(id) {
+
 4010.   7572
+
 4011.   7572// Create an assignment operator. The one true assignment is different because
+
 4012.   7572// its left side, when it is a variable, is not treated as an expression.
+
 4013.   7572// That case is special because that is when a variable gets initialized. The
+
 4014.   7572// other assignment operators can modify, but they cannot initialize.
+
 4015.   7572
+
 4016.   7572        const the_symbol = symbol(id, 20);
+
 4017.   5013        the_symbol.led_infix = function (left) {
+
 4018.   5013            const the_token = token_now;
+
 4019.   5013            let right;
+
 4020.   5013            the_token.arity = "assignment";
+
 4021.   5013            right = parse_expression(20 - 1);
+
 4022.   4234            if (id === "=" && left.arity === "variable") {
+
 4023.   2818                the_token.names = left;
+
 4024.   2818                the_token.expression = right;
+
 4025.   2818            } else {
 4026.   2191                the_token.expression = [left, right];
-
 4027.   5014            }
-
 4028.   5014            if (
-
 4029.   5014                right.arity === "assignment"
-
 4030.   5014                || right.arity === "preassign"
-
 4031.   5012                || right.arity === "postassign"
+
 4027.   5009            }
+
 4028.   5009            if (
+
 4029.   5009                right.arity === "assignment"
+
 4030.   5009                || right.arity === "preassign"
+
 4031.   5007                || right.arity === "postassign"
 4032.      2            ) {
 4033.      2                warn("unexpected_a", right);
-
 4034.   5014            }
-
 4035.   5014            check_mutation(left);
-
 4036.   5014            return the_token;
-
 4037.   5014        };
-
 4038.   7548        return the_symbol;
-
 4039.   7548    }
-
 4040.    629
-
 4041.   5708    function block(special) {
-
 4042.   5708
-
 4043.   5708// Parse a block, a sequence of statements wrapped in braces.
-
 4044.   5708//  special "body"      The block is a function body.
-
 4045.   5708//          "ignore"    No warning on an empty block.
-
 4046.   5708//          "naked"     No advance.
-
 4047.   5708//          undefined   An ordinary block.
-
 4048.   5708
-
 4049.   5708        let stmts;
-
 4050.   5708        let the_block;
-
 4051.   5703        if (special !== "naked") {
-
 4052.   5703            advance("{");
-
 4053.   5707        }
-
 4054.   5707        the_block = token_now;
-
 4055.   5707        if (special !== "body") {
-
 4056.   3710            functionage.statement_prv = the_block;
-
 4057.   5707        }
-
 4058.   5707        the_block.arity = "statement";
-
 4059.   5707        the_block.body = special === "body";
-
 4060.   5707
-
 4061.   5707// Top level function bodies may include the "use strict" pragma.
-
 4062.   5707
-
 4063.   5707        if (
-
 4064.   5707            special === "body"
-
 4065.   5707            && function_stack.length === 1
+
 4034.   5009            }
+
 4035.   5009            check_mutation(left);
+
 4036.   5009            return the_token;
+
 4037.   5009        };
+
 4038.   7572        return the_symbol;
+
 4039.   7572    }
+
 4040.    631
+
 4041.   5713    function block(special) {
+
 4042.   5713
+
 4043.   5713// Parse a block, a sequence of statements wrapped in braces.
+
 4044.   5713//  special "body"      The block is a function body.
+
 4045.   5713//          "ignore"    No warning on an empty block.
+
 4046.   5713//          "naked"     No advance.
+
 4047.   5713//          undefined   An ordinary block.
+
 4048.   5713
+
 4049.   5713        let stmts;
+
 4050.   5713        let the_block;
+
 4051.   5708        if (special !== "naked") {
+
 4052.   5708            advance("{");
+
 4053.   5712        }
+
 4054.   5712        the_block = token_now;
+
 4055.   5712        if (special !== "body") {
+
 4056.   3715            functionage.statement_prv = the_block;
+
 4057.   5712        }
+
 4058.   5712        the_block.arity = "statement";
+
 4059.   5712        the_block.body = special === "body";
+
 4060.   5712
+
 4061.   5712// Top level function bodies may include the "use strict" pragma.
+
 4062.   5712
+
 4063.   5712        if (
+
 4064.   5712            special === "body"
+
 4065.   5712            && function_stack.length === 1
 4066.    281            && token_nxt.value === "use strict"
 4067.      4        ) {
 4068.      4            token_nxt.statement = true;
 4069.      4            advance("(string)");
 4070.      4            advance(";");
-
 4071.   5707        }
-
 4072.   5707        stmts = parse_statements();
-
 4073.   5707        the_block.block = stmts;
-
 4074.   5707        if (stmts.length === 0) {
+
 4071.   5712        }
+
 4072.   5712        stmts = parse_statements();
+
 4073.   5712        the_block.block = stmts;
+
 4074.   5712        if (stmts.length === 0) {
 4075.     72            if (!option_dict.devel && special !== "ignore") {
 4076.     72
 4077.     72// test_cause:
@@ -4238,26 +4238,26 @@
 4080.     72                warn("empty_block", the_block);
 4081.     72            }
 4082.     72            the_block.disrupt = false;
-
 4083.   5628        } else {
-
 4084.   5628            the_block.disrupt = stmts[stmts.length - 1].disrupt;
-
 4085.   5700        }
-
 4086.   5700        advance("}");
-
 4087.   5700        return the_block;
-
 4088.   5700    }
-
 4089.    629
-
 4090.  23278    function check_left(left, right) {
-
 4091.  23278
-
 4092.  23278// Warn if the left is not one of these:
-
 4093.  23278//      ?.
-
 4094.  23278//      ?:
-
 4095.  23278//      e()
-
 4096.  23278//      e.b
-
 4097.  23278//      e[b]
-
 4098.  23278//      identifier
-
 4099.  23278
-
 4100.  23278        const id = left.id;
-
 4101.  23278        if (
-
 4102.  23278            !left.identifier
+
 4083.   5633        } else {
+
 4084.   5633            the_block.disrupt = stmts[stmts.length - 1].disrupt;
+
 4085.   5705        }
+
 4086.   5705        advance("}");
+
 4087.   5705        return the_block;
+
 4088.   5705    }
+
 4089.    631
+
 4090.  23297    function check_left(left, right) {
+
 4091.  23297
+
 4092.  23297// Warn if the left is not one of these:
+
 4093.  23297//      ?.
+
 4094.  23297//      ?:
+
 4095.  23297//      e()
+
 4096.  23297//      e.b
+
 4097.  23297//      e[b]
+
 4098.  23297//      identifier
+
 4099.  23297
+
 4100.  23297        const id = left.id;
+
 4101.  23297        if (
+
 4102.  23297            !left.identifier
 4103.   6298            && (
 4104.   6298                left.arity !== "ternary"
 4105.   6298                || (
@@ -4272,21 +4272,21 @@
 4114.     11        ) {
 4115.     11            warn("unexpected_a", right || token_nxt);
 4116.     11            return false;
-
 4117.  23267        }
-
 4118.  23267        return true;
-
 4119.  23267    }
-
 4120.    629
-
 4121.   5017    function check_mutation(the_thing) {
-
 4122.   5017
-
 4123.   5017// The only expressions that may be assigned to are
-
 4124.   5017//      e.b
-
 4125.   5017//      e[b]
-
 4126.   5017//      v
-
 4127.   5017//      [destructure]
-
 4128.   5017//      {destructure}
-
 4129.   5017
-
 4130.   5017        if (
-
 4131.   5017            the_thing.arity !== "variable"
+
 4117.  23286        }
+
 4118.  23286        return true;
+
 4119.  23286    }
+
 4120.    631
+
 4121.   5012    function check_mutation(the_thing) {
+
 4122.   5012
+
 4123.   5012// The only expressions that may be assigned to are
+
 4124.   5012//      e.b
+
 4125.   5012//      e[b]
+
 4126.   5012//      v
+
 4127.   5012//      [destructure]
+
 4128.   5012//      {destructure}
+
 4129.   5012
+
 4130.   5012        if (
+
 4131.   5012            the_thing.arity !== "variable"
 4132.   1543            && the_thing.id !== "."
 4133.    192            && the_thing.id !== "["
 4134.      7            && the_thing.id !== "{"
@@ -4297,14 +4297,14 @@
 4139.      7
 4140.      7            warn("bad_assignment_a", the_thing);
 4141.      7            return false;
-
 4142.   5010        }
-
 4143.   5010        return true;
-
 4144.   5010    }
-
 4145.    629
-
 4146.   2203    function check_not_top_level(thing) {
-
 4147.   2203
-
 4148.   2203// Some features should not be at the outermost level.
-
 4149.   2203
+
 4142.   5005        }
+
 4143.   5005        return true;
+
 4144.   5005    }
+
 4145.    631
+
 4146.   2208    function check_not_top_level(thing) {
+
 4147.   2208
+
 4148.   2208// Some features should not be at the outermost level.
+
 4149.   2208
 4150.     34        if (functionage === token_global) {
 4151.     34
 4152.     34// test_cause:
@@ -4314,12 +4314,12 @@
 4156.     34
 4157.     34            warn("unexpected_at_top_level_a", thing);
 4158.     34        }
-
 4159.   2203    }
-
 4160.    629
-
 4161.   3358    function check_ordered(type, token_list) {
-
 4162.   3358
-
 4163.   3358// This function will warn if <token_list> is unordered.
-
 4164.   3358
+
 4159.   2208    }
+
 4160.    631
+
 4161.   3360    function check_ordered(type, token_list) {
+
 4162.   3360
+
 4163.   3360// This function will warn if <token_list> is unordered.
+
 4164.   3360
 4165.   4062        token_list.reduce(function (aa, token) {
 4166.   4062            const bb = artifact(token);
 4167.   4048            if (!option_dict.unordered && aa > bb) {
@@ -4327,8 +4327,8 @@
 4169.      4            }
 4170.   4062            return bb;
 4171.   4062        }, "");
-
 4172.   3358    }
-
 4173.    629
+
 4172.   3360    }
+
 4173.    631
 4174.   1301    function check_ordered_case(case_list) {
 4175.   1301
 4176.   1301// This function will warn if <case_list> is unordered.
@@ -4382,36 +4382,36 @@
 4224.   2691            return bb;
 4225.   2691        }, undefined);
 4226.   1301    }
-
 4227.    629
-
 4228.   3258    function condition() {
-
 4229.   3258
-
 4230.   3258// Parse the condition part of a do, if, while.
-
 4231.   3258
-
 4232.   3258        const the_paren = token_nxt;
-
 4233.   3258        let the_value;
-
 4234.   3258
-
 4235.   3258// test_cause:
-
 4236.   3258// ["do{}while()", "condition", "", "", 0]
-
 4237.   3258// ["if(){}", "condition", "", "", 0]
-
 4238.   3258// ["while(){}", "condition", "", "", 0]
-
 4239.   3258
-
 4240.   3258        test_cause("");
-
 4241.   3258        the_paren.free = true;
-
 4242.   3258        advance("(");
-
 4243.   3258        the_value = parse_expression(0);
-
 4244.   3258        advance(")");
+
 4227.    631
+
 4228.   3263    function condition() {
+
 4229.   3263
+
 4230.   3263// Parse the condition part of a do, if, while.
+
 4231.   3263
+
 4232.   3263        const the_paren = token_nxt;
+
 4233.   3263        let the_value;
+
 4234.   3263
+
 4235.   3263// test_cause:
+
 4236.   3263// ["do{}while()", "condition", "", "", 0]
+
 4237.   3263// ["if(){}", "condition", "", "", 0]
+
 4238.   3263// ["while(){}", "condition", "", "", 0]
+
 4239.   3263
+
 4240.   3263        test_cause("");
+
 4241.   3263        the_paren.free = true;
+
 4242.   3263        advance("(");
+
 4243.   3263        the_value = parse_expression(0);
+
 4244.   3263        advance(")");
 4245.      1        if (the_value.wrapped === true) {
 4246.      1
 4247.      1// test_cause:
 4248.      1// ["while((0)){}", "condition", "unexpected_a", "(", 6]
 4249.      1
 4250.      1            warn("unexpected_a", the_paren);
-
 4251.   3254        }
-
 4252.   3254
-
 4253.   3254// Check for anticondition.
-
 4254.   3254
-
 4255.   3254        switch (the_value.id) {
-
 4256.   3254        case "%":
+
 4251.   3259        }
+
 4252.   3259
+
 4253.   3259// Check for anticondition.
+
 4254.   3259
+
 4255.   3259        switch (the_value.id) {
+
 4256.   3259        case "%":
 4257.      1            warn("unexpected_a", the_value);
 4258.      1            break;
 4259.      1        case "&":
@@ -4478,32 +4478,32 @@
 4320.      1
 4321.      1            warn("unexpected_a", the_value);
 4322.      1            break;
-
 4323.   3254        }
-
 4324.   3254        return the_value;
-
 4325.   3254    }
-
 4326.    629
-
 4327.  10064    function constant(id, type, value) {
-
 4328.  10064
-
 4329.  10064// Create a constant symbol.
-
 4330.  10064
-
 4331.  10064        const the_symbol = symbol(id);
-
 4332.  10064        the_symbol.constant = true;
-
 4333.  10064        the_symbol.nud_prefix = (
-
 4334.  10064            typeof value === "function"
-
 4335.   4403            ? value
-
 4336.  18674            : function () {
-
 4337.  18674                token_now.constant = true;
-
 4338.   5661                if (value !== undefined) {
-
 4339.   5661                    token_now.value = value;
-
 4340.   5661                }
-
 4341.  18674                return token_now;
-
 4342.  18674            }
-
 4343.  10064        );
-
 4344.  10064        the_symbol.type = type;
-
 4345.  10064        the_symbol.value = value;
-
 4346.  10064        return the_symbol;
-
 4347.  10064    }
-
 4348.    629
+
 4323.   3259        }
+
 4324.   3259        return the_value;
+
 4325.   3259    }
+
 4326.    631
+
 4327.  10096    function constant(id, type, value) {
+
 4328.  10096
+
 4329.  10096// Create a constant symbol.
+
 4330.  10096
+
 4331.  10096        const the_symbol = symbol(id);
+
 4332.  10096        the_symbol.constant = true;
+
 4333.  10096        the_symbol.nud_prefix = (
+
 4334.  10096            typeof value === "function"
+
 4335.   4417            ? value
+
 4336.  18689            : function () {
+
 4337.  18689                token_now.constant = true;
+
 4338.   5679                if (value !== undefined) {
+
 4339.   5679                    token_now.value = value;
+
 4340.   5679                }
+
 4341.  18689                return token_now;
+
 4342.  18689            }
+
 4343.  10096        );
+
 4344.  10096        the_symbol.type = type;
+
 4345.  10096        the_symbol.value = value;
+
 4346.  10096        return the_symbol;
+
 4347.  10096    }
+
 4348.    631
 4349.      5    function constant_Function() {
 4350.      2        if (!option_dict.eval) {
 4351.      2
@@ -4523,7 +4523,7 @@
 4365.      3        }
 4366.      5        return token_now;
 4367.      5    }
-
 4368.    629
+
 4368.    631
 4369.      1    function constant_arguments() {
 4370.      1
 4371.      1// test_cause:
@@ -4532,7 +4532,7 @@
 4374.      1        warn("unexpected_a", token_now);
 4375.      1        return token_now;
 4376.      1    }
-
 4377.    629
+
 4377.    631
 4378.      4    function constant_eval() {
 4379.      1        if (!option_dict.eval) {
 4380.      1
@@ -4549,7 +4549,7 @@
 4391.      3        }
 4392.      4        return token_now;
 4393.      4    }
-
 4394.    629
+
 4394.    631
 4395.      1    function constant_ignore() {
 4396.      1
 4397.      1// test_cause:
@@ -4558,7 +4558,7 @@
 4400.      1        warn("unexpected_a", token_now);
 4401.      1        return token_now;
 4402.      1    }
-
 4403.    629
+
 4403.    631
 4404.      1    function constant_isInfinite() {
 4405.      1
 4406.      1// test_cause:
@@ -4567,7 +4567,7 @@
 4409.      1        warn("expected_a_b", token_now, "Number.isFinite", "isFinite");
 4410.      1        return token_now;
 4411.      1    }
-
 4412.    629
+
 4412.    631
 4413.      1    function constant_isNaN() {
 4414.      1
 4415.      1// test_cause:
@@ -4576,7 +4576,7 @@
 4418.      1        warn("number_isNaN", token_now);
 4419.      1        return token_now;
 4420.      1    }
-
 4421.    629
+
 4421.    631
 4422.      3    function constant_this() {
 4423.      1        if (!option_dict.this) {
 4424.      1
@@ -4587,7 +4587,7 @@
 4429.      1        }
 4430.      3        return token_now;
 4431.      3    }
-
 4432.    629
+
 4432.    631
 4433.   6366    function enroll(name, role, readonly) {
 4434.   6366
 4435.   6366// Enroll a name into the current function context. The role can be exception,
@@ -4676,72 +4676,72 @@
 4518.   6366        });
 4519.   6366        name.parent.context[id] = name;
 4520.   6366    }
-
 4521.    629
-
 4522.  18870    function infix(bp, id, f) {
-
 4523.  18870
-
 4524.  18870// Create an infix operator.
-
 4525.  18870
-
 4526.  18870        const the_symbol = symbol(id, bp);
-
 4527.  31907        the_symbol.led_infix = function (left) {
-
 4528.  31907            const the_token = token_now;
-
 4529.  31907            the_token.arity = "binary";
-
 4530.  23474            if (f !== undefined) {
-
 4531.  23474                return f(left);
-
 4532.  23474            }
-
 4533.   8433            the_token.expression = [left, parse_expression(bp)];
-
 4534.   8433            return the_token;
-
 4535.   8433        };
-
 4536.  18870        return the_symbol;
-
 4537.  18870    }
-
 4538.    629
-
 4539.  11587    function infix_dot(left) {
-
 4540.  11587        const the_token = token_now;
-
 4541.  11587        let name = token_nxt;
-
 4542.  11587        if (
-
 4543.  11587            (
-
 4544.  11587                left.id !== "(string)"
+
 4521.    631
+
 4522.  18930    function infix(bp, id, f) {
+
 4523.  18930
+
 4524.  18930// Create an infix operator.
+
 4525.  18930
+
 4526.  18930        const the_symbol = symbol(id, bp);
+
 4527.  31941        the_symbol.led_infix = function (left) {
+
 4528.  31941            const the_token = token_now;
+
 4529.  31941            the_token.arity = "binary";
+
 4530.  23493            if (f !== undefined) {
+
 4531.  23493                return f(left);
+
 4532.  23493            }
+
 4533.   8448            the_token.expression = [left, parse_expression(bp)];
+
 4534.   8448            return the_token;
+
 4535.   8448        };
+
 4536.  18930        return the_symbol;
+
 4537.  18930    }
+
 4538.    631
+
 4539.  11597    function infix_dot(left) {
+
 4540.  11597        const the_token = token_now;
+
 4541.  11597        let name = token_nxt;
+
 4542.  11597        if (
+
 4543.  11597            (
+
 4544.  11597                left.id !== "(string)"
 4545.     44                || (name.id !== "indexOf" && name.id !== "repeat")
-
 4546.  11587            )
-
 4547.  11544            && (
-
 4548.  11544                left.id !== "["
-
 4549.  11544                || (
-
 4550.  11544                    name.id !== "concat"
-
 4551.  11544                    && name.id !== "flat"
-
 4552.  11544                    && name.id !== "flatMap"
-
 4553.  11544                    && name.id !== "forEach"
-
 4554.  11544                    && name.id !== "join"
-
 4555.  11544                    && name.id !== "map"
-
 4556.  11544                )
-
 4557.  11544            )
-
 4558.  11499            && (left.id !== "+" || name.id !== "slice")
-
 4559.  11494            && (
-
 4560.  11494                left.id !== "(regexp)"
-
 4561.  11494                || (name.id !== "exec" && name.id !== "test")
-
 4562.  11494            )
-
 4563.  11427        ) {
-
 4564.  11427
-
 4565.  11427// test_cause:
-
 4566.  11427// ["\"\".aa", "check_left", "unexpected_a", ".", 3]
-
 4567.  11427
-
 4568.  11427            check_left(left, the_token);
-
 4569.  11427        }
+
 4546.  11597            )
+
 4547.  11554            && (
+
 4548.  11554                left.id !== "["
+
 4549.  11554                || (
+
 4550.  11554                    name.id !== "concat"
+
 4551.  11554                    && name.id !== "flat"
+
 4552.  11554                    && name.id !== "flatMap"
+
 4553.  11554                    && name.id !== "forEach"
+
 4554.  11554                    && name.id !== "join"
+
 4555.  11554                    && name.id !== "map"
+
 4556.  11554                )
+
 4557.  11554            )
+
 4558.  11509            && (left.id !== "+" || name.id !== "slice")
+
 4559.  11504            && (
+
 4560.  11504                left.id !== "(regexp)"
+
 4561.  11504                || (name.id !== "exec" && name.id !== "test")
+
 4562.  11504            )
+
 4563.  11437        ) {
+
 4564.  11437
+
 4565.  11437// test_cause:
+
 4566.  11437// ["\"\".aa", "check_left", "unexpected_a", ".", 3]
+
 4567.  11437
+
 4568.  11437            check_left(left, the_token);
+
 4569.  11437        }
 4570.      1        if (!name.identifier) {
 4571.      1
 4572.      1// test_cause:
 4573.      1// ["aa.0", "infix_dot", "expected_identifier_a", "0", 4]
 4574.      1
 4575.      1            stop("expected_identifier_a");
-
 4576.  11586        }
-
 4577.  11586        advance();
-
 4578.  11586        survey(name);
-
 4579.  11586
-
 4580.  11586// The property name is not an expression.
-
 4581.  11586
-
 4582.  11586        the_token.name = name;
-
 4583.  11586        the_token.expression = left;
-
 4584.  11586        return the_token;
-
 4585.  11586    }
-
 4586.    629
+
 4576.  11596        }
+
 4577.  11596        advance();
+
 4578.  11596        survey(name);
+
 4579.  11596
+
 4580.  11596// The property name is not an expression.
+
 4581.  11596
+
 4582.  11596        the_token.name = name;
+
 4583.  11596        the_token.expression = left;
+
 4584.  11596        return the_token;
+
 4585.  11596    }
+
 4586.    631
 4587.      1    function infix_fart_unwrapped() {
 4588.      1
 4589.      1// test_cause:
@@ -4749,7 +4749,7 @@
 4591.      1
 4592.      1        return stop("wrap_fart_parameter", token_now);
 4593.      1    }
-
 4594.    629
+
 4594.    631
 4595.      1    function infix_grave(left) {
 4596.      1        const the_tick = prefix_tick();
 4597.      1
@@ -4760,12 +4760,12 @@
 4602.      1        the_tick.expression = [left].concat(the_tick.expression);
 4603.      1        return the_tick;
 4604.      1    }
-
 4605.    629
-
 4606.   1460    function infix_lbracket(left) {
-
 4607.   1460        const the_token = token_now;
-
 4608.   1460        let name;
-
 4609.   1460        let the_subscript = parse_expression(0);
-
 4610.   1437        if (the_subscript.id === "(string)" || the_subscript.id === "`") {
+
 4605.    631
+
 4606.   1461    function infix_lbracket(left) {
+
 4607.   1461        const the_token = token_now;
+
 4608.   1461        let name;
+
 4609.   1461        let the_subscript = parse_expression(0);
+
 4610.   1438        if (the_subscript.id === "(string)" || the_subscript.id === "`") {
 4611.     25            name = survey(the_subscript);
 4612.     25
 4613.     25// PR-404 - Add new directive "subscript" to play nice with Google Closure.
@@ -4778,71 +4778,71 @@
 4620.     25                warn("subscript_a", the_subscript, name);
 4621.     25            }
 4622.     25        }
-
 4623.   1460
-
 4624.   1460// test_cause:
-
 4625.   1460// ["0[0]", "check_left", "unexpected_a", "[", 2]
-
 4626.   1460
-
 4627.   1460        check_left(left, the_token);
-
 4628.   1460        the_token.expression = [left, the_subscript];
-
 4629.   1460        advance("]");
-
 4630.   1460        return the_token;
-
 4631.   1460    }
-
 4632.    629
-
 4633.  10415    function infix_lparen(left) {
-
 4634.  10415        const the_paren = token_now;
-
 4635.  10415        let ellipsis;
-
 4636.  10415        let the_argument;
-
 4637.  10378        if (left.id !== "function") {
-
 4638.  10378
-
 4639.  10378// test_cause:
-
 4640.  10378// ["(0?0:0)()", "check_left", "unexpected_a", "(", 8]
-
 4641.  10378// ["0()", "check_left", "unexpected_a", "(", 2]
-
 4642.  10378
-
 4643.  10378            check_left(left, the_paren);
-
 4644.  10378        }
-
 4645.   7694        if (functionage.arity === "statement" && left.identifier) {
-
 4646.   5498            functionage.name.calls[left.id] = left;
-
 4647.   5498        }
-
 4648.  10415        the_paren.expression = [left];
-
 4649.   8956        if (token_nxt.id !== ")") {
-
 4650.   8956
-
 4651.   8956// Parse/loop through each token in expression (...).
-
 4652.   8956
-
 4653.  14280            while (true) {
-
 4654.  14280                if (token_nxt.id === "...") {
-
 4655.  14280                    ellipsis = true;
-
 4656.  14280                    advance("...");
-
 4657.  14280                }
-
 4658.  14280                the_argument = parse_expression(10);
-
 4659.  14280                if (ellipsis) {
-
 4660.  14280                    the_argument.ellipsis = true;
-
 4661.  14280                }
-
 4662.  14280                the_paren.expression.push(the_argument);
-
 4663.  14280                if (token_nxt.id !== ",") {
-
 4664.  14280                    break;
-
 4665.  14280                }
-
 4666.  14280                advance(",");
-
 4667.  14280            }
-
 4668.   8956        }
-
 4669.  10415        advance(")", the_paren);
-
 4670.   5254        if (the_paren.expression.length === 2) {
-
 4671.   5254
-
 4672.   5254// test_cause:
-
 4673.   5254// ["aa(0)", "infix_lparen", "free", "", 0]
-
 4674.   5254
-
 4675.   5254            test_cause("free");
-
 4676.   5254            the_paren.free = true;
-
 4677.   5254            if (the_argument.wrapped === true) {
-
 4678.   5254
-
 4679.   5254// test_cause:
-
 4680.   5254// ["aa((0))", "infix_lparen", "unexpected_a", "(", 3]
-
 4681.   5254
-
 4682.   5254                warn("unexpected_a", the_paren);
-
 4683.   5254            }
-
 4684.   5254            if (the_argument.id === "(") {
-
 4685.   5254                the_argument.wrapped = true;
-
 4686.   5254            }
-
 4687.   5254        } else {
+
 4623.   1461
+
 4624.   1461// test_cause:
+
 4625.   1461// ["0[0]", "check_left", "unexpected_a", "[", 2]
+
 4626.   1461
+
 4627.   1461        check_left(left, the_token);
+
 4628.   1461        the_token.expression = [left, the_subscript];
+
 4629.   1461        advance("]");
+
 4630.   1461        return the_token;
+
 4631.   1461    }
+
 4632.    631
+
 4633.  10421    function infix_lparen(left) {
+
 4634.  10421        const the_paren = token_now;
+
 4635.  10421        let ellipsis;
+
 4636.  10421        let the_argument;
+
 4637.  10384        if (left.id !== "function") {
+
 4638.  10384
+
 4639.  10384// test_cause:
+
 4640.  10384// ["(0?0:0)()", "check_left", "unexpected_a", "(", 8]
+
 4641.  10384// ["0()", "check_left", "unexpected_a", "(", 2]
+
 4642.  10384
+
 4643.  10384            check_left(left, the_paren);
+
 4644.  10384        }
+
 4645.   7699        if (functionage.arity === "statement" && left.identifier) {
+
 4646.   5503            functionage.name.calls[left.id] = left;
+
 4647.   5503        }
+
 4648.  10421        the_paren.expression = [left];
+
 4649.   8962        if (token_nxt.id !== ")") {
+
 4650.   8962
+
 4651.   8962// Parse/loop through each token in expression (...).
+
 4652.   8962
+
 4653.  14286            while (true) {
+
 4654.  14286                if (token_nxt.id === "...") {
+
 4655.  14286                    ellipsis = true;
+
 4656.  14286                    advance("...");
+
 4657.  14286                }
+
 4658.  14286                the_argument = parse_expression(10);
+
 4659.  14286                if (ellipsis) {
+
 4660.  14286                    the_argument.ellipsis = true;
+
 4661.  14286                }
+
 4662.  14286                the_paren.expression.push(the_argument);
+
 4663.  14286                if (token_nxt.id !== ",") {
+
 4664.  14286                    break;
+
 4665.  14286                }
+
 4666.  14286                advance(",");
+
 4667.  14286            }
+
 4668.   8962        }
+
 4669.  10421        advance(")", the_paren);
+
 4670.   5260        if (the_paren.expression.length === 2) {
+
 4671.   5260
+
 4672.   5260// test_cause:
+
 4673.   5260// ["aa(0)", "infix_lparen", "free", "", 0]
+
 4674.   5260
+
 4675.   5260            test_cause("free");
+
 4676.   5260            the_paren.free = true;
+
 4677.   5260            if (the_argument.wrapped === true) {
+
 4678.   5260
+
 4679.   5260// test_cause:
+
 4680.   5260// ["aa((0))", "infix_lparen", "unexpected_a", "(", 3]
+
 4681.   5260
+
 4682.   5260                warn("unexpected_a", the_paren);
+
 4683.   5260            }
+
 4684.   5260            if (the_argument.id === "(") {
+
 4685.   5260                the_argument.wrapped = true;
+
 4686.   5260            }
+
 4687.   5260        } else {
 4688.   5161
 4689.   5161// test_cause:
 4690.   5161// ["aa()", "infix_lparen", "not_free", "", 0]
@@ -4851,6874 +4851,6885 @@
 4693.   5161            test_cause("not_free");
 4694.   5161            the_paren.free = false;
 4695.   5161        }
-
 4696.  10415        return the_paren;
-
 4697.  10415    }
-
 4698.    629
-
 4699.     10    function infix_option_chain(left) {
-
 4700.     10        const the_token = token_now;
-
 4701.     10        let name;
-
 4702.     10        name = token_nxt;
-
 4703.     10        if (
-
 4704.     10            (
-
 4705.     10                left.id !== "(string)"
-
 4706.      1                || (name.id !== "indexOf" && name.id !== "repeat")
-
 4707.     10            )
-
 4708.     10            && (
-
 4709.     10                left.id !== "["
-
 4710.      1                || (
-
 4711.      1                    name.id !== "concat"
-
 4712.      1                    && name.id !== "forEach"
-
 4713.      1                    && name.id !== "join"
-
 4714.      1                    && name.id !== "map"
-
 4715.      1                )
-
 4716.     10            )
-
 4717.     10
-
 4718.     10// test_cause:
-
 4719.     10// ["(0+0)?.0", "infix_option_chain", "check_left", "", 0]
-
 4720.     10
-
 4721.      1            && (left.id !== "+" || name.id !== "slice")
-
 4722.     10            && (
-
 4723.     10                left.id !== "(regexp)"
-
 4724.      1                || (name.id !== "exec" && name.id !== "test")
-
 4725.     10            )
-
 4726.     10        ) {
-
 4727.     10            test_cause("check_left");
-
 4728.     10
-
 4729.     10// test_cause:
-
 4730.     10// ["(/./)?.0", "check_left", "unexpected_a", "?.", 6]
-
 4731.     10// ["\"aa\"?.0", "check_left", "unexpected_a", "?.", 5]
-
 4732.     10// ["aa=[]?.aa", "check_left", "unexpected_a", "?.", 6]
-
 4733.     10
-
 4734.     10            check_left(left, the_token);
-
 4735.     10        }
-
 4736.      4        if (!name.identifier) {
-
 4737.      4
-
 4738.      4// test_cause:
-
 4739.      4// ["aa?.0", "infix_option_chain", "expected_identifier_a", "0", 5]
-
 4740.      4
-
 4741.      4            stop("expected_identifier_a");
-
 4742.      6        }
-
 4743.      6        advance();
-
 4744.      6        survey(name);
-
 4745.      6
-
 4746.      6// The property name is not an expression.
-
 4747.      6
-
 4748.      6        the_token.name = name;
-
 4749.      6        the_token.expression = left;
-
 4750.      6        return the_token;
-
 4751.      6    }
-
 4752.    629
-
 4753.    629    function infixr(bp, id) {
-
 4754.    629
-
 4755.    629// Create a right associative infix operator.
-
 4756.    629
-
 4757.    629        const the_symbol = symbol(id, bp);
-
 4758.      1        the_symbol.led_infix = function parse_infixr_led(left) {
-
 4759.      1            const the_token = token_now;
-
 4760.      1
-
 4761.      1// test_cause:
-
 4762.      1// ["0**0", "parse_infixr_led", "led_infix", "", 0]
-
 4763.      1
-
 4764.      1            test_cause("led_infix");
-
 4765.      1            the_token.arity = "binary";
-
 4766.      1            the_token.expression = [left, parse_expression(bp - 1)];
-
 4767.      1            return the_token;
-
 4768.      1        };
-
 4769.    629        return the_symbol;
-
 4770.    629    }
-
 4771.    629
-
 4772.  55968    function parse_expression(rbp, initial) {
-
 4773.  55968
-
 4774.  55968// This is the heart of JSLINT, the Pratt parser. In addition to parsing, it
-
 4775.  55968// is looking for ad hoc lint patterns. We add .fud_stmt to Pratt's model, which
-
 4776.  55968// is like .nud_prefix except that it is only used on the first token of a
-
 4777.  55968// statement. Having .fud_stmt makes it much easier to define statement-oriented
-
 4778.  55968// languages like JavaScript. I retained Pratt's nomenclature.
-
 4779.  55968// They are elements of the parsing method called Top Down Operator Precedence.
-
 4780.  55968
-
 4781.  55968// .nud_prefix  Null denotation. The prefix handler.
-
 4782.  55968// .fud_stmt    First null denotation. The statement handler.
-
 4783.  55968// .led_infix   Left denotation. The infix/postfix handler.
-
 4784.  55968//  lbp         Left binding power of infix operator. It tells us how strongly
-
 4785.  55968//              the operator binds to the argument at its left.
-
 4786.  55968//  rbp         Right binding power.
-
 4787.  55968
-
 4788.  55968// It processes a nud_prefix (variable, constant, prefix operator). It will then
-
 4789.  55968// process leds (infix operators) until the bind powers cause it to stop (it
-
 4790.  55968// consumes tokens until it meets a token whose lbp <= rbp). Specifically, it
-
 4791.  55968// means that it collects all tokens that bind together before returning to the
-
 4792.  55968// operator that called it. It returns the expression's parse tree.
-
 4793.  55968
-
 4794.  55968// For example, "3 + 1 * 2 * 4 + 5"
-
 4795.  55968// parses into
-
 4796.  55968// {
-
 4797.  55968//     "id": "+",
-
 4798.  55968//     "expression": [
-
 4799.  55968//         {
-
 4800.  55968//             "id": "+",
-
 4801.  55968//             "expression": [
-
 4802.  55968//                 {
-
 4803.  55968//                     "id": "(number)",
-
 4804.  55968//                     "value": "3"
-
 4805.  55968//                 },
-
 4806.  55968//                 {
-
 4807.  55968//                     "id": "*",
-
 4808.  55968//                     "expression": [
-
 4809.  55968//                         {
-
 4810.  55968//                             "id": "*",
-
 4811.  55968//                             "expression": [
-
 4812.  55968//                                 {
-
 4813.  55968//                                     "id": "(number)",
-
 4814.  55968//                                     "value": "1"
-
 4815.  55968//                                 },
-
 4816.  55968//                                 {
-
 4817.  55968//                                     "id": "(number)",
-
 4818.  55968//                                     "value": "2"
-
 4819.  55968//                                 }
-
 4820.  55968//                             ]
-
 4821.  55968//                         },
-
 4822.  55968//                         {
-
 4823.  55968//                             "id": "(number)",
-
 4824.  55968//                             "value": "4"
-
 4825.  55968//                         }
-
 4826.  55968//                     ]
-
 4827.  55968//                 }
-
 4828.  55968//             ]
-
 4829.  55968//         },
-
 4830.  55968//         {
-
 4831.  55968//             "id": "(number)",
-
 4832.  55968//             "value": "5"
-
 4833.  55968//         }
-
 4834.  55968//     ]
-
 4835.  55968// }
-
 4836.  55968
-
 4837.  55968        let left;
-
 4838.  55968        let the_symbol;
-
 4839.  55968
-
 4840.  55968// Statements will have already advanced, so advance now only if the token is
-
 4841.  55968// not the first of a statement.
-
 4842.  55968
-
 4843.  44610        if (!initial) {
-
 4844.  44610            advance();
-
 4845.  44610        }
-
 4846.  55968        the_symbol = syntax_dict[token_now.id];
-
 4847.  24495        if (the_symbol !== undefined && the_symbol.nud_prefix !== undefined) {
-
 4848.  24436
-
 4849.  24436// test_cause:
-
 4850.  24436// ["0", "parse_expression", "symbol", "", 0]
-
 4851.  24436
-
 4852.  24436            test_cause("symbol");
-
 4853.  24436            left = the_symbol.nud_prefix();
-
 4854.  31532        } else if (token_now.identifier) {
-
 4855.  31532
-
 4856.  31532// test_cause:
-
 4857.  31532// ["aa", "parse_expression", "identifier", "", 0]
-
 4858.  31532
-
 4859.  31532            test_cause("identifier");
-
 4860.  31532            left = token_now;
-
 4861.  31532            left.arity = "variable";
-
 4862.  31532        } else {
-
 4863.  31532
-
 4864.  31532// test_cause:
-
 4865.  31532// ["!", "parse_expression", "unexpected_a", "(end)", 1]
-
 4866.  31532// ["/./", "parse_expression", "unexpected_a", "/", 1]
-
 4867.  31532// ["let aa=`${}`;", "parse_expression", "unexpected_a", "}", 11]
-
 4868.  31532
-
 4869.  31532            return stop("unexpected_a", token_now);
-
 4870.  55932        }
-
 4871.  55932
-
 4872.  55932// Parse/loop through each symbol in expression.
-
 4873.  55932
-
 4874.  93061        while (true) {
-
 4875.  93061            the_symbol = syntax_dict[token_nxt.id];
-
 4876.  93061            if (
-
 4877.  93061                the_symbol === undefined
-
 4878.  93061                || the_symbol.led_infix === undefined
-
 4879.  93061                || the_symbol.lbp <= rbp
-
 4880.  93061            ) {
-
 4881.  93061                break;
-
 4882.  93061            }
-
 4883.  93061            advance();
-
 4884.  93061            left = the_symbol.led_infix(left);
-
 4885.  93061        }
-
 4886.  55921        return left;
-
 4887.  55921    }
-
 4888.    629
-
 4889.     14    function parse_fart(the_fart) {
-
 4890.     14
-
 4891.     14// Give the function properties storing its names and for observing the depth
-
 4892.     14// of loops and switches.
-
 4893.     14
-
 4894.     14        Object.assign(the_fart, {
-
 4895.     14            arity: "binary",
-
 4896.     14            context: empty(),
-
 4897.     14            finally: 0,
-
 4898.     14            level: functionage.level + 1,
-
 4899.     14            loop: 0,
-
 4900.     14            name: anon,
-
 4901.     14            switch: 0,
-
 4902.     14            try: 0
-
 4903.     14        });
+
 4696.  10421        return the_paren;
+
 4697.  10421    }
+
 4698.    631
+
 4699.     12    function infix_option_chain(left) {
+
 4700.     12        const the_token = token_now;
+
 4701.     12        let name = token_nxt;
+
 4702.     12        if (
+
 4703.     12            (
+
 4704.     12                left.id !== "(string)"
+
 4705.      1                || (name.id !== "indexOf" && name.id !== "repeat")
+
 4706.     12            )
+
 4707.     12            && (
+
 4708.     12                left.id !== "["
+
 4709.      1                || (
+
 4710.      1                    name.id !== "concat"
+
 4711.      1                    && name.id !== "forEach"
+
 4712.      1                    && name.id !== "join"
+
 4713.      1                    && name.id !== "map"
+
 4714.      1                )
+
 4715.     12            )
+
 4716.     12
+
 4717.     12// test_cause:
+
 4718.     12// ["(0+0)?.0", "infix_option_chain", "check_left", "", 0]
+
 4719.     12
+
 4720.      1            && (left.id !== "+" || name.id !== "slice")
+
 4721.     12            && (
+
 4722.     12                left.id !== "(regexp)"
+
 4723.      1                || (name.id !== "exec" && name.id !== "test")
+
 4724.     12            )
+
 4725.     12        ) {
+
 4726.     12            test_cause("check_left");
+
 4727.     12
+
 4728.     12// test_cause:
+
 4729.     12// ["(/./)?.0", "check_left", "unexpected_a", "?.", 6]
+
 4730.     12// ["\"aa\"?.0", "check_left", "unexpected_a", "?.", 5]
+
 4731.     12// ["aa=[]?.aa", "check_left", "unexpected_a", "?.", 6]
+
 4732.     12
+
 4733.     12            check_left(left, the_token);
+
 4734.     12        }
+
 4735.     12
+
 4736.     12// Issue #468 - Fix optional dynamic-property/function-call not recognized.
+
 4737.     12
+
 4738.     11        if (name.id === "[" || name.id === "(") {
+
 4739.      2            test_cause("dyn_prop_or_call");
+
 4740.      2
+
 4741.      2// test_cause:
+
 4742.      2// ["aa?.(bb)", "infix_option_chain", "dyn_prop_or_call", "", 0]
+
 4743.      2// ["aa?.[bb]", "infix_option_chain", "dyn_prop_or_call", "", 0]
+
 4744.      2
+
 4745.      2            return left;
+
 4746.     10        }
+
 4747.     10        if (!name.identifier) {
+
 4748.      4
+
 4749.      4// test_cause:
+
 4750.      4// ["aa?.0", "infix_option_chain", "expected_identifier_a", "0", 5]
+
 4751.      4
+
 4752.      4            stop("expected_identifier_a");
+
 4753.      6        }
+
 4754.      6        advance();
+
 4755.      6        survey(name);
+
 4756.      6
+
 4757.      6// The property name is not an expression.
+
 4758.      6
+
 4759.      6        the_token.name = name;
+
 4760.      6        the_token.expression = left;
+
 4761.      6        return the_token;
+
 4762.      6    }
+
 4763.    631
+
 4764.    631    function infixr(bp, id) {
+
 4765.    631
+
 4766.    631// Create a right associative infix operator.
+
 4767.    631
+
 4768.    631        const the_symbol = symbol(id, bp);
+
 4769.      1        the_symbol.led_infix = function parse_infixr_led(left) {
+
 4770.      1            const the_token = token_now;
+
 4771.      1
+
 4772.      1// test_cause:
+
 4773.      1// ["0**0", "parse_infixr_led", "led_infix", "", 0]
+
 4774.      1
+
 4775.      1            test_cause("led_infix");
+
 4776.      1            the_token.arity = "binary";
+
 4777.      1            the_token.expression = [left, parse_expression(bp - 1)];
+
 4778.      1            return the_token;
+
 4779.      1        };
+
 4780.    631        return the_symbol;
+
 4781.    631    }
+
 4782.    631
+
 4783.  56002    function parse_expression(rbp, initial) {
+
 4784.  56002
+
 4785.  56002// This is the heart of JSLINT, the Pratt parser. In addition to parsing, it
+
 4786.  56002// is looking for ad hoc lint patterns. We add .fud_stmt to Pratt's model, which
+
 4787.  56002// is like .nud_prefix except that it is only used on the first token of a
+
 4788.  56002// statement. Having .fud_stmt makes it much easier to define statement-oriented
+
 4789.  56002// languages like JavaScript. I retained Pratt's nomenclature.
+
 4790.  56002// They are elements of the parsing method called Top Down Operator Precedence.
+
 4791.  56002
+
 4792.  56002// .nud_prefix  Null denotation. The prefix handler.
+
 4793.  56002// .fud_stmt    First null denotation. The statement handler.
+
 4794.  56002// .led_infix   Left denotation. The infix/postfix handler.
+
 4795.  56002//  lbp         Left binding power of infix operator. It tells us how strongly
+
 4796.  56002//              the operator binds to the argument at its left.
+
 4797.  56002//  rbp         Right binding power.
+
 4798.  56002
+
 4799.  56002// It processes a nud_prefix (variable, constant, prefix operator). It will then
+
 4800.  56002// process leds (infix operators) until the bind powers cause it to stop (it
+
 4801.  56002// consumes tokens until it meets a token whose lbp <= rbp). Specifically, it
+
 4802.  56002// means that it collects all tokens that bind together before returning to the
+
 4803.  56002// operator that called it. It returns the expression's parse tree.
+
 4804.  56002
+
 4805.  56002// For example, "3 + 1 * 2 * 4 + 5"
+
 4806.  56002// parses into
+
 4807.  56002// {
+
 4808.  56002//     "id": "+",
+
 4809.  56002//     "expression": [
+
 4810.  56002//         {
+
 4811.  56002//             "id": "+",
+
 4812.  56002//             "expression": [
+
 4813.  56002//                 {
+
 4814.  56002//                     "id": "(number)",
+
 4815.  56002//                     "value": "3"
+
 4816.  56002//                 },
+
 4817.  56002//                 {
+
 4818.  56002//                     "id": "*",
+
 4819.  56002//                     "expression": [
+
 4820.  56002//                         {
+
 4821.  56002//                             "id": "*",
+
 4822.  56002//                             "expression": [
+
 4823.  56002//                                 {
+
 4824.  56002//                                     "id": "(number)",
+
 4825.  56002//                                     "value": "1"
+
 4826.  56002//                                 },
+
 4827.  56002//                                 {
+
 4828.  56002//                                     "id": "(number)",
+
 4829.  56002//                                     "value": "2"
+
 4830.  56002//                                 }
+
 4831.  56002//                             ]
+
 4832.  56002//                         },
+
 4833.  56002//                         {
+
 4834.  56002//                             "id": "(number)",
+
 4835.  56002//                             "value": "4"
+
 4836.  56002//                         }
+
 4837.  56002//                     ]
+
 4838.  56002//                 }
+
 4839.  56002//             ]
+
 4840.  56002//         },
+
 4841.  56002//         {
+
 4842.  56002//             "id": "(number)",
+
 4843.  56002//             "value": "5"
+
 4844.  56002//         }
+
 4845.  56002//     ]
+
 4846.  56002// }
+
 4847.  56002
+
 4848.  56002        let left;
+
 4849.  56002        let the_symbol;
+
 4850.  56002
+
 4851.  56002// Statements will have already advanced, so advance now only if the token is
+
 4852.  56002// not the first of a statement.
+
 4853.  56002
+
 4854.  44642        if (!initial) {
+
 4855.  44642            advance();
+
 4856.  44642        }
+
 4857.  56002        the_symbol = syntax_dict[token_now.id];
+
 4858.  24510        if (the_symbol !== undefined && the_symbol.nud_prefix !== undefined) {
+
 4859.  24451
+
 4860.  24451// test_cause:
+
 4861.  24451// ["0", "parse_expression", "symbol", "", 0]
+
 4862.  24451
+
 4863.  24451            test_cause("symbol");
+
 4864.  24451            left = the_symbol.nud_prefix();
+
 4865.  31551        } else if (token_now.identifier) {
+
 4866.  31551
+
 4867.  31551// test_cause:
+
 4868.  31551// ["aa", "parse_expression", "identifier", "", 0]
+
 4869.  31551
+
 4870.  31551            test_cause("identifier");
+
 4871.  31551            left = token_now;
+
 4872.  31551            left.arity = "variable";
+
 4873.  31551        } else {
+
 4874.  31551
+
 4875.  31551// test_cause:
+
 4876.  31551// ["!", "parse_expression", "unexpected_a", "(end)", 1]
+
 4877.  31551// ["/./", "parse_expression", "unexpected_a", "/", 1]
+
 4878.  31551// ["let aa=`${}`;", "parse_expression", "unexpected_a", "}", 11]
+
 4879.  31551
+
 4880.  31551            return stop("unexpected_a", token_now);
+
 4881.  55966        }
+
 4882.  55966
+
 4883.  55966// Parse/loop through each symbol in expression.
+
 4884.  55966
+
 4885.  93124        while (true) {
+
 4886.  93124            the_symbol = syntax_dict[token_nxt.id];
+
 4887.  93124            if (
+
 4888.  93124                the_symbol === undefined
+
 4889.  93124                || the_symbol.led_infix === undefined
+
 4890.  93124                || the_symbol.lbp <= rbp
+
 4891.  93124            ) {
+
 4892.  93124                break;
+
 4893.  93124            }
+
 4894.  93124            advance();
+
 4895.  93124            left = the_symbol.led_infix(left);
+
 4896.  93124        }
+
 4897.  55955        return left;
+
 4898.  55955    }
+
 4899.    631
+
 4900.     14    function parse_fart(the_fart) {
+
 4901.     14
+
 4902.     14// Give the function properties storing its names and for observing the depth
+
 4903.     14// of loops and switches.
 4904.     14
-
 4905.     14// PR-384 - Relax warning "function_in_loop".
-
 4906.     14//
-
 4907.     14//         if (functionage.loop > 0) {
-
 4908.     14
-
 4909.     14// // test_cause:
-
 4910.     14// // ["while(0){aa.map(()=>0);}", "parse_fart", "function_in_loop", "=>", 19]
-
 4911.     14//
-
 4912.     14//             warn("function_in_loop", the_fart);
-
 4913.     14//         }
-
 4914.     14
-
 4915.     14// Push the current function context and establish a new one.
-
 4916.     14
-
 4917.     14        function_list.push(the_fart);
-
 4918.     14        function_stack.push(functionage);
-
 4919.     14        functionage = the_fart;
-
 4920.     14
-
 4921.     14// Parse the parameter list.
-
 4922.     14
-
 4923.     14        prefix_function_parameter(the_fart);
-
 4924.     14        advance("=>");
+
 4905.     14        Object.assign(the_fart, {
+
 4906.     14            arity: "binary",
+
 4907.     14            context: empty(),
+
 4908.     14            finally: 0,
+
 4909.     14            level: functionage.level + 1,
+
 4910.     14            loop: 0,
+
 4911.     14            name: anon,
+
 4912.     14            switch: 0,
+
 4913.     14            try: 0
+
 4914.     14        });
+
 4915.     14
+
 4916.     14// PR-384 - Relax warning "function_in_loop".
+
 4917.     14//
+
 4918.     14//         if (functionage.loop > 0) {
+
 4919.     14
+
 4920.     14// // test_cause:
+
 4921.     14// // ["while(0){aa.map(()=>0);}", "parse_fart", "function_in_loop", "=>", 19]
+
 4922.     14//
+
 4923.     14//             warn("function_in_loop", the_fart);
+
 4924.     14//         }
 4925.     14
-
 4926.     14// The function's body is a block.
+
 4926.     14// Push the current function context and establish a new one.
 4927.     14
-
 4928.      3        if (token_nxt.id === "{") {
-
 4929.      3            if (!option_dict.fart) {
-
 4930.      3
-
 4931.      3// test_cause:
-
 4932.      3// ["()=>{}", "parse_fart", "use_function_not_fart", "=>", 3]
-
 4933.      3
-
 4934.      3                warn("use_function_not_fart", the_fart);
-
 4935.      3            }
-
 4936.      3            the_fart.block = block("body");
-
 4937.     11        } else if (
-
 4938.     11            syntax_dict[token_nxt.id] !== undefined
-
 4939.     11            && syntax_dict[token_nxt.id].fud_stmt !== undefined
-
 4940.     11        ) {
-
 4941.     11
-
 4942.     11// PR-384 - Bugfix - Fixes issue #379 - warn against naked-statement in fart.
-
 4943.     11
-
 4944.     11// test_cause:
-
 4945.     11// ["()=>delete aa", "parse_fart", "unexpected_a_after_b", "=>", 5]
-
 4946.     11
-
 4947.     11            stop("unexpected_a_after_b", token_nxt, token_nxt.id, "=>");
-
 4948.     11
-
 4949.     11// The function's body is an expression.
-
 4950.     11
-
 4951.     11        } else {
-
 4952.     11            the_fart.expression = parse_expression(0);
-
 4953.     13        }
-
 4954.     13
-
 4955.     13// Restore the previous context.
-
 4956.     13
-
 4957.     13        functionage = function_stack.pop();
-
 4958.     13        return the_fart;
-
 4959.     13    }
-
 4960.    629
-
 4961.  12961    function parse_json() {
-
 4962.  12961        let container;
-
 4963.  12961        let is_dup;
-
 4964.  12961        let name;
-
 4965.  12961        let negative;
-
 4966.  12961        switch (token_nxt.id) {
-
 4967.   5262        case "(number)":
-
 4968.   5262            if (!jslint_rgx_json_number.test(token_nxt.value)) {
-
 4969.   5262
-
 4970.   5262// test_cause:
-
 4971.   5262// ["[-.0]", "parse_json", "unexpected_a", ".", 3]
-
 4972.   5262// ["[-0x0]", "parse_json", "unexpected_a", "0x0", 3]
-
 4973.   5262// ["[.0]", "parse_json", "unexpected_a", ".", 2]
-
 4974.   5262// ["[0x0]", "parse_json", "unexpected_a", "0x0", 2]
-
 4975.   5262
-
 4976.   5262                warn("unexpected_a");
-
 4977.   5262            }
-
 4978.   5262            advance("(number)");
-
 4979.   5262            return token_now;
-
 4980.   1767        case "(string)":
-
 4981.   1767            if (token_nxt.quote !== "\"") {
-
 4982.   1767
-
 4983.   1767// test_cause:
-
 4984.   1767// ["['']", "parse_json", "unexpected_a", "'", 2]
-
 4985.   1767
-
 4986.   1767                warn("unexpected_a", token_nxt, token_nxt.quote);
-
 4987.   1767            }
-
 4988.   1767            advance("(string)");
-
 4989.   1767            return token_now;
-
 4990.      3        case "-":
-
 4991.      3            negative = token_nxt;
-
 4992.      3            negative.arity = "unary";
-
 4993.      3            advance("-");
-
 4994.      3
-
 4995.      3// Recurse parse_json().
-
 4996.      3
-
 4997.      3            negative.expression = parse_json();
-
 4998.      3            return negative;
-
 4999.   1649        case "[":
-
 5000.   1649
-
 5001.   1649// test_cause:
-
 5002.   1649// ["[]", "parse_json", "bracket", "", 0]
-
 5003.   1649
-
 5004.   1649            test_cause("bracket");
-
 5005.   1649            container = token_nxt;
-
 5006.   1649            container.expression = [];
-
 5007.   1649            advance("[");
-
 5008.   1649            if (token_nxt.id !== "]") {
-
 5009.   3300                while (true) {
-
 5010.   3300
-
 5011.   3300// Recurse parse_json().
-
 5012.   3300
-
 5013.   3300                    container.expression.push(parse_json());
-
 5014.   3300                    if (token_nxt.id !== ",") {
-
 5015.   3300
-
 5016.   3300// test_cause:
-
 5017.   3300// ["[0,0]", "parse_json", "comma", "", 0]
-
 5018.   3300
-
 5019.   3300                        test_cause("comma");
-
 5020.   3300                        break;
-
 5021.   3300                    }
-
 5022.   3300                    advance(",");
-
 5023.   3300                }
-
 5024.   1649            }
-
 5025.   1649            advance("]", container);
-
 5026.   1649            return container;
-
 5027.    509        case "false":
-
 5028.    511        case "null":
-
 5029.    896        case "true":
-
 5030.    896
-
 5031.    896// test_cause:
-
 5032.    896// ["[false]", "parse_json", "constant", "", 0]
-
 5033.    896// ["[null]", "parse_json", "constant", "", 0]
-
 5034.    896// ["[true]", "parse_json", "constant", "", 0]
-
 5035.    896
-
 5036.    896            test_cause("constant");
-
 5037.    896            advance();
-
 5038.    896            return token_now;
-
 5039.   3379        case "{":
-
 5040.   3379
-
 5041.   3379// test_cause:
-
 5042.   3379// ["{}", "parse_json", "brace", "", 0]
-
 5043.   3379
-
 5044.   3379            test_cause("brace");
-
 5045.   3379            container = token_nxt;
-
 5046.   3379
-
 5047.   3379// Explicit empty-object required to detect "__proto__".
-
 5048.   3379
-
 5049.   3379            is_dup = empty();
-
 5050.   3379            container.expression = [];
-
 5051.   3379            advance("{");
-
 5052.   3379            if (token_nxt.id !== "}") {
-
 5053.   3379
-
 5054.   3379// JSON
-
 5055.   3379// Parse/loop through each property in {...}.
-
 5056.   3379
-
 5057.   9636                while (true) {
-
 5058.   9636                    if (token_nxt.quote !== "\"") {
-
 5059.   9636
-
 5060.   9636// test_cause:
-
 5061.   9636// ["{0:0}", "parse_json", "unexpected_a", "0", 2]
-
 5062.   9636
-
 5063.   9636                        warn(
-
 5064.   9636                            "unexpected_a",
-
 5065.   9636                            token_nxt,
-
 5066.   9636                            token_nxt.quote
-
 5067.   9636                        );
-
 5068.   9636                    }
-
 5069.   9636                    name = token_nxt;
-
 5070.   9636                    advance("(string)");
-
 5071.   9636                    if (is_dup[token_now.value] !== undefined) {
-
 5072.   9636
-
 5073.   9636// test_cause:
-
 5074.   9636// ["{\"aa\":0,\"aa\":0}", "parse_json", "duplicate_a", "aa", 9]
-
 5075.   9636
-
 5076.   9636                        warn("duplicate_a", token_now);
-
 5077.   9636                    } else if (token_now.value === "__proto__") {
-
 5078.   9636
-
 5079.   9636// test_cause:
-
 5080.   9636// ["{\"__proto__\":0}", "parse_json", "weird_property_a", "__proto__", 2]
-
 5081.   9636
-
 5082.   9636                        warn("weird_property_a", token_now);
-
 5083.   9636                    } else {
-
 5084.   9636                        is_dup[token_now.value] = token_now;
-
 5085.   9636                    }
-
 5086.   9636                    advance(":");
-
 5087.   9636                    container.expression.push(
-
 5088.   9636
-
 5089.   9636// Recurse parse_json().
-
 5090.   9636
-
 5091.   9636                        Object.assign(parse_json(), {
-
 5092.   9636                            label: name
-
 5093.   9636                        })
-
 5094.   9636                    );
-
 5095.   9636                    if (token_nxt.id !== ",") {
-
 5096.   9636                        break;
-
 5097.   9636                    }
-
 5098.   9636                    advance(",");
-
 5099.   9636                }
-
 5100.   3379            }
-
 5101.   3379            advance("}", container);
-
 5102.   3379            return container;
-
 5103.      5        default:
-
 5104.      5
-
 5105.      5// test_cause:
-
 5106.      5// ["[undefined]", "parse_json", "unexpected_a", "undefined", 2]
-
 5107.      5
-
 5108.      5            stop("unexpected_a");
-
 5109.  12961        }
-
 5110.  12961    }
-
 5111.    629
-
 5112.  20917    function parse_statement() {
-
 5113.  20917
-
 5114.  20917// Parse a statement. Any statement may have a label, but only four statements
-
 5115.  20917// have use for one. A statement can be one of the standard statements, or
-
 5116.  20917// an assignment expression, or an invocation expression.
-
 5117.  20917
-
 5118.  20917        let first;
-
 5119.  20917        let the_label;
-
 5120.  20917        let the_statement;
-
 5121.  20917        let the_symbol;
-
 5122.  20917        advance();
-
 5123.  20730        if (token_now.identifier && token_nxt.id === ":") {
-
 5124.     13            the_label = token_now;
-
 5125.     13            if (the_label.id === "ignore") {
-
 5126.     13
-
 5127.     13// test_cause:
-
 5128.     13// ["ignore:", "parse_statement", "unexpected_a", "ignore", 1]
-
 5129.     13
-
 5130.     13                warn("unexpected_a", the_label);
-
 5131.     13            }
-
 5132.     13            advance(":");
-
 5133.     13            switch (token_nxt.id) {
-
 5134.     13            case "do":
-
 5135.     13            case "for":
-
 5136.     13            case "switch":
-
 5137.     13            case "while":
-
 5138.     13
-
 5139.     13// test_cause:
-
 5140.     13// ["aa:do{}", "parse_statement", "the_statement_label", "do", 0]
-
 5141.     13// ["aa:for{}", "parse_statement", "the_statement_label", "for", 0]
-
 5142.     13// ["aa:switch{}", "parse_statement", "the_statement_label", "switch", 0]
-
 5143.     13// ["aa:while{}", "parse_statement", "the_statement_label", "while", 0]
-
 5144.     13
-
 5145.     13                test_cause("the_statement_label", token_nxt.id);
-
 5146.     13                enroll(the_label, "label", true);
-
 5147.     13                the_label.dead = false;
-
 5148.     13                the_label.init = true;
-
 5149.     13                the_statement = parse_statement();
-
 5150.     13                functionage.statement_prv = the_statement;
-
 5151.     13                the_statement.label = the_label;
-
 5152.     13                the_statement.statement = true;
-
 5153.     13                return the_statement;
-
 5154.     13            }
-
 5155.     13            advance();
-
 5156.     13
-
 5157.     13// test_cause:
-
 5158.     13// ["aa:", "parse_statement", "unexpected_label_a", "aa", 1]
-
 5159.     13
-
 5160.     13            warn("unexpected_label_a", the_label);
-
 5161.  20908        }
-
 5162.  20908
-
 5163.  20908// Parse the statement.
-
 5164.  20908
-
 5165.  20908        first = token_now;
-
 5166.  20908        first.statement = true;
-
 5167.  20908        the_symbol = syntax_dict[first.id];
-
 5168.  20908        if (
-
 5169.  20908            the_symbol !== undefined
-
 5170.  20908            && the_symbol.fud_stmt !== undefined
-
 5171.  20917
-
 5172.  20917// PR-318 - Bugfix - Fixes issues #316, #317 - dynamic-import().
-
 5173.  20917
-
 5174.  10144            && !(the_symbol.id === "import" && token_nxt.id === "(")
-
 5175.  10142        ) {
-
 5176.  10142            the_symbol.disrupt = false;
-
 5177.  10142            the_symbol.statement = true;
-
 5178.  10142            token_now.arity = "statement";
-
 5179.  10142            the_statement = the_symbol.fud_stmt();
-
 5180.  10142            functionage.statement_prv = the_statement;
-
 5181.  10766        } else {
-
 5182.  10766
-
 5183.  10766// It is an expression statement.
-
 5184.  10766
-
 5185.  10766            the_statement = parse_expression(0, true);
-
 5186.  10766            functionage.statement_prv = the_statement;
-
 5187.  10766            if (the_statement.wrapped && the_statement.id !== "(") {
-
 5188.  10766
-
 5189.  10766// test_cause:
-
 5190.  10766// ["(0)", "parse_statement", "unexpected_a", "(", 1]
-
 5191.  10766
-
 5192.  10766                warn("unexpected_a", first);
-
 5193.  10766            }
-
 5194.  10766            semicolon();
-
 5195.  20814        }
-
 5196.  20814        if (the_label !== undefined) {
-
 5197.      1            the_label.dead = true;
-
 5198.  20814        }
-
 5199.  20814        return the_statement;
-
 5200.  20814    }
-
 5201.    629
-
 5202.   7494    function parse_statements() {
-
 5203.   7494
-
 5204.   7494// Parse a list of statements. Give a warning if an unreachable statement
-
 5205.   7494// follows a disruptive statement.
-
 5206.   7494
-
 5207.   7494        const statement_list = [];
-
 5208.   7494        let a_statement;
-
 5209.   7494        let disrupt = false;
-
 5210.   7494
-
 5211.   7494// Parse/loop each statement until a statement-terminator is reached.
-
 5212.   7494
-
 5213.  27984        while (true) {
-
 5214.  27984            switch (token_nxt.id) {
-
 5215.  27984            case "(end)":
-
 5216.  27984            case "case":
-
 5217.  27984            case "default":
-
 5218.  27984            case "else":
-
 5219.  27984            case "}":
-
 5220.  27984
-
 5221.  27984// test_cause:
-
 5222.  27984// [";", "parse_statements", "closer", "", 0]
-
 5223.  27984// ["case", "parse_statements", "closer", "", 0]
-
 5224.  27984// ["default", "parse_statements", "closer", "", 0]
-
 5225.  27984// ["else", "parse_statements", "closer", "", 0]
-
 5226.  27984// ["}", "parse_statements", "closer", "", 0]
-
 5227.  27984
-
 5228.  27984                test_cause("closer");
-
 5229.  27984                return statement_list;
-
 5230.  27984            }
-
 5231.  27984            a_statement = parse_statement();
-
 5232.  27984            statement_list.push(a_statement);
-
 5233.  27984            if (disrupt) {
-
 5234.  27984
-
 5235.  27984// test_cause:
-
 5236.  27984// ["while(0){break;0;}", "parse_statements", "unreachable_a", "0", 16]
-
 5237.  27984
-
 5238.  27984                warn("unreachable_a", a_statement);
-
 5239.  27984            }
-
 5240.  27984            disrupt = a_statement.disrupt;
-
 5241.  27984        }
-
 5242.   7494    }
-
 5243.    629
-
 5244.   1258    function postassign(id) {
-
 5245.   1258
-
 5246.   1258// Create one of the postassign operators.
-
 5247.   1258
-
 5248.   1258        const the_symbol = symbol(id, 150);
-
 5249.      1        the_symbol.led_infix = function (left) {
-
 5250.      1            token_now.expression = left;
-
 5251.      1            token_now.arity = "postassign";
-
 5252.      1            check_mutation(token_now.expression);
-
 5253.      1            return token_now;
-
 5254.      1        };
-
 5255.   1258        return the_symbol;
-
 5256.   1258    }
-
 5257.    629
-
 5258.   1258    function preassign(id) {
-
 5259.   1258
-
 5260.   1258// Create one of the preassign operators.
-
 5261.   1258
-
 5262.   1258        const the_symbol = symbol(id);
-
 5263.      2        the_symbol.nud_prefix = function () {
-
 5264.      2            const the_token = token_now;
-
 5265.      2            the_token.arity = "preassign";
-
 5266.      2            the_token.expression = parse_expression(150);
-
 5267.      2            check_mutation(the_token.expression);
-
 5268.      2            return the_token;
-
 5269.      2        };
-
 5270.   1258        return the_symbol;
-
 5271.   1258    }
-
 5272.    629
-
 5273.  10693    function prefix(id, f) {
-
 5274.  10693
-
 5275.  10693// Create a prefix operator.
-
 5276.  10693
-
 5277.  10693        const the_symbol = symbol(id);
-
 5278.   5744        the_symbol.nud_prefix = function () {
-
 5279.   5744            const the_token = token_now;
-
 5280.   5744            the_token.arity = "unary";
-
 5281.   4932            if (typeof f === "function") {
-
 5282.   4932                return f();
-
 5283.   4932            }
-
 5284.    812            the_token.expression = parse_expression(150);
-
 5285.    812            return the_token;
-
 5286.    812        };
-
 5287.  10693        return the_symbol;
-
 5288.  10693    }
-
 5289.    629
-
 5290.      1    function prefix_assign_divide() {
-
 5291.      1
-
 5292.      1// test_cause:
-
 5293.      1// ["/=", "prefix_assign_divide", "expected_a_b", "/=", 1]
-
 5294.      1
-
 5295.      1        stop("expected_a_b", token_now, "/\\=", "/=");
-
 5296.      1    }
-
 5297.    629
-
 5298.    136    function prefix_async() {
-
 5299.    136        let the_async = token_now;
-
 5300.    136        let the_function;
-
 5301.    136        token_nxt.arity = the_async.arity;
-
 5302.    136
-
 5303.    136// PR-414 - Parse async fart.
-
 5304.    136
-
 5305.      3        if (token_nxt.fart) {
-
 5306.      3            advance("(");
-
 5307.      3            the_function = Object.assign(token_now.fart, {
-
 5308.      3                async: 1
-
 5309.      3            });
-
 5310.      3            if (!option_dict.fart) {
-
 5311.      3
-
 5312.      3// test_cause:
-
 5313.      3// ["async()=>0", "prefix_async", "use_function_not_fart", "=>", 8]
-
 5314.      3
-
 5315.      3                warn("use_function_not_fart", the_function);
-
 5316.      3            }
-
 5317.      3            prefix_lparen();
-
 5318.      3
-
 5319.      3// Parse async function.
-
 5320.      3
-
 5321.    133        } else {
-
 5322.    133            advance("function");
-
 5323.    133            the_function = Object.assign(token_now, {
-
 5324.    133                async: 1
-
 5325.    133            });
-
 5326.    133            prefix_function();
-
 5327.    133        }
-
 5328.      3        if (the_function.async === 1) {
+
 4928.     14        function_list.push(the_fart);
+
 4929.     14        function_stack.push(functionage);
+
 4930.     14        functionage = the_fart;
+
 4931.     14
+
 4932.     14// Parse the parameter list.
+
 4933.     14
+
 4934.     14        prefix_function_parameter(the_fart);
+
 4935.     14        advance("=>");
+
 4936.     14
+
 4937.     14// The function's body is a block.
+
 4938.     14
+
 4939.      3        if (token_nxt.id === "{") {
+
 4940.      3            if (!option_dict.fart) {
+
 4941.      3
+
 4942.      3// test_cause:
+
 4943.      3// ["()=>{}", "parse_fart", "use_function_not_fart", "=>", 3]
+
 4944.      3
+
 4945.      3                warn("use_function_not_fart", the_fart);
+
 4946.      3            }
+
 4947.      3            the_fart.block = block("body");
+
 4948.     11        } else if (
+
 4949.     11            syntax_dict[token_nxt.id] !== undefined
+
 4950.     11            && syntax_dict[token_nxt.id].fud_stmt !== undefined
+
 4951.     11        ) {
+
 4952.     11
+
 4953.     11// PR-384 - Bugfix - Fixes issue #379 - warn against naked-statement in fart.
+
 4954.     11
+
 4955.     11// test_cause:
+
 4956.     11// ["()=>delete aa", "parse_fart", "unexpected_a_after_b", "=>", 5]
+
 4957.     11
+
 4958.     11            stop("unexpected_a_after_b", token_nxt, token_nxt.id, "=>");
+
 4959.     11
+
 4960.     11// The function's body is an expression.
+
 4961.     11
+
 4962.     11        } else {
+
 4963.     11            the_fart.expression = parse_expression(0);
+
 4964.     13        }
+
 4965.     13
+
 4966.     13// Restore the previous context.
+
 4967.     13
+
 4968.     13        functionage = function_stack.pop();
+
 4969.     13        return the_fart;
+
 4970.     13    }
+
 4971.    631
+
 4972.  12961    function parse_json() {
+
 4973.  12961        let container;
+
 4974.  12961        let is_dup;
+
 4975.  12961        let name;
+
 4976.  12961        let negative;
+
 4977.  12961        switch (token_nxt.id) {
+
 4978.   5262        case "(number)":
+
 4979.   5262            if (!jslint_rgx_json_number.test(token_nxt.value)) {
+
 4980.   5262
+
 4981.   5262// test_cause:
+
 4982.   5262// ["[-.0]", "parse_json", "unexpected_a", ".", 3]
+
 4983.   5262// ["[-0x0]", "parse_json", "unexpected_a", "0x0", 3]
+
 4984.   5262// ["[.0]", "parse_json", "unexpected_a", ".", 2]
+
 4985.   5262// ["[0x0]", "parse_json", "unexpected_a", "0x0", 2]
+
 4986.   5262
+
 4987.   5262                warn("unexpected_a");
+
 4988.   5262            }
+
 4989.   5262            advance("(number)");
+
 4990.   5262            return token_now;
+
 4991.   1767        case "(string)":
+
 4992.   1767            if (token_nxt.quote !== "\"") {
+
 4993.   1767
+
 4994.   1767// test_cause:
+
 4995.   1767// ["['']", "parse_json", "unexpected_a", "'", 2]
+
 4996.   1767
+
 4997.   1767                warn("unexpected_a", token_nxt, token_nxt.quote);
+
 4998.   1767            }
+
 4999.   1767            advance("(string)");
+
 5000.   1767            return token_now;
+
 5001.      3        case "-":
+
 5002.      3            negative = token_nxt;
+
 5003.      3            negative.arity = "unary";
+
 5004.      3            advance("-");
+
 5005.      3
+
 5006.      3// Recurse parse_json().
+
 5007.      3
+
 5008.      3            negative.expression = parse_json();
+
 5009.      3            return negative;
+
 5010.   1649        case "[":
+
 5011.   1649
+
 5012.   1649// test_cause:
+
 5013.   1649// ["[]", "parse_json", "bracket", "", 0]
+
 5014.   1649
+
 5015.   1649            test_cause("bracket");
+
 5016.   1649            container = token_nxt;
+
 5017.   1649            container.expression = [];
+
 5018.   1649            advance("[");
+
 5019.   1649            if (token_nxt.id !== "]") {
+
 5020.   3300                while (true) {
+
 5021.   3300
+
 5022.   3300// Recurse parse_json().
+
 5023.   3300
+
 5024.   3300                    container.expression.push(parse_json());
+
 5025.   3300                    if (token_nxt.id !== ",") {
+
 5026.   3300
+
 5027.   3300// test_cause:
+
 5028.   3300// ["[0,0]", "parse_json", "comma", "", 0]
+
 5029.   3300
+
 5030.   3300                        test_cause("comma");
+
 5031.   3300                        break;
+
 5032.   3300                    }
+
 5033.   3300                    advance(",");
+
 5034.   3300                }
+
 5035.   1649            }
+
 5036.   1649            advance("]", container);
+
 5037.   1649            return container;
+
 5038.    509        case "false":
+
 5039.    511        case "null":
+
 5040.    896        case "true":
+
 5041.    896
+
 5042.    896// test_cause:
+
 5043.    896// ["[false]", "parse_json", "constant", "", 0]
+
 5044.    896// ["[null]", "parse_json", "constant", "", 0]
+
 5045.    896// ["[true]", "parse_json", "constant", "", 0]
+
 5046.    896
+
 5047.    896            test_cause("constant");
+
 5048.    896            advance();
+
 5049.    896            return token_now;
+
 5050.   3379        case "{":
+
 5051.   3379
+
 5052.   3379// test_cause:
+
 5053.   3379// ["{}", "parse_json", "brace", "", 0]
+
 5054.   3379
+
 5055.   3379            test_cause("brace");
+
 5056.   3379            container = token_nxt;
+
 5057.   3379
+
 5058.   3379// Explicit empty-object required to detect "__proto__".
+
 5059.   3379
+
 5060.   3379            is_dup = empty();
+
 5061.   3379            container.expression = [];
+
 5062.   3379            advance("{");
+
 5063.   3379            if (token_nxt.id !== "}") {
+
 5064.   3379
+
 5065.   3379// JSON
+
 5066.   3379// Parse/loop through each property in {...}.
+
 5067.   3379
+
 5068.   9636                while (true) {
+
 5069.   9636                    if (token_nxt.quote !== "\"") {
+
 5070.   9636
+
 5071.   9636// test_cause:
+
 5072.   9636// ["{0:0}", "parse_json", "unexpected_a", "0", 2]
+
 5073.   9636
+
 5074.   9636                        warn(
+
 5075.   9636                            "unexpected_a",
+
 5076.   9636                            token_nxt,
+
 5077.   9636                            token_nxt.quote
+
 5078.   9636                        );
+
 5079.   9636                    }
+
 5080.   9636                    name = token_nxt;
+
 5081.   9636                    advance("(string)");
+
 5082.   9636                    if (is_dup[token_now.value] !== undefined) {
+
 5083.   9636
+
 5084.   9636// test_cause:
+
 5085.   9636// ["{\"aa\":0,\"aa\":0}", "parse_json", "duplicate_a", "aa", 9]
+
 5086.   9636
+
 5087.   9636                        warn("duplicate_a", token_now);
+
 5088.   9636                    } else if (token_now.value === "__proto__") {
+
 5089.   9636
+
 5090.   9636// test_cause:
+
 5091.   9636// ["{\"__proto__\":0}", "parse_json", "weird_property_a", "__proto__", 2]
+
 5092.   9636
+
 5093.   9636                        warn("weird_property_a", token_now);
+
 5094.   9636                    } else {
+
 5095.   9636                        is_dup[token_now.value] = token_now;
+
 5096.   9636                    }
+
 5097.   9636                    advance(":");
+
 5098.   9636                    container.expression.push(
+
 5099.   9636
+
 5100.   9636// Recurse parse_json().
+
 5101.   9636
+
 5102.   9636                        Object.assign(parse_json(), {
+
 5103.   9636                            label: name
+
 5104.   9636                        })
+
 5105.   9636                    );
+
 5106.   9636                    if (token_nxt.id !== ",") {
+
 5107.   9636                        break;
+
 5108.   9636                    }
+
 5109.   9636                    advance(",");
+
 5110.   9636                }
+
 5111.   3379            }
+
 5112.   3379            advance("}", container);
+
 5113.   3379            return container;
+
 5114.      5        default:
+
 5115.      5
+
 5116.      5// test_cause:
+
 5117.      5// ["[undefined]", "parse_json", "unexpected_a", "undefined", 2]
+
 5118.      5
+
 5119.      5            stop("unexpected_a");
+
 5120.  12961        }
+
 5121.  12961    }
+
 5122.    631
+
 5123.  20929    function parse_statement() {
+
 5124.  20929
+
 5125.  20929// Parse a statement. Any statement may have a label, but only four statements
+
 5126.  20929// have use for one. A statement can be one of the standard statements, or
+
 5127.  20929// an assignment expression, or an invocation expression.
+
 5128.  20929
+
 5129.  20929        let first;
+
 5130.  20929        let the_label;
+
 5131.  20929        let the_statement;
+
 5132.  20929        let the_symbol;
+
 5133.  20929        advance();
+
 5134.  20742        if (token_now.identifier && token_nxt.id === ":") {
+
 5135.     13            the_label = token_now;
+
 5136.     13            if (the_label.id === "ignore") {
+
 5137.     13
+
 5138.     13// test_cause:
+
 5139.     13// ["ignore:", "parse_statement", "unexpected_a", "ignore", 1]
+
 5140.     13
+
 5141.     13                warn("unexpected_a", the_label);
+
 5142.     13            }
+
 5143.     13            advance(":");
+
 5144.     13            switch (token_nxt.id) {
+
 5145.     13            case "do":
+
 5146.     13            case "for":
+
 5147.     13            case "switch":
+
 5148.     13            case "while":
+
 5149.     13
+
 5150.     13// test_cause:
+
 5151.     13// ["aa:do{}", "parse_statement", "the_statement_label", "do", 0]
+
 5152.     13// ["aa:for{}", "parse_statement", "the_statement_label", "for", 0]
+
 5153.     13// ["aa:switch{}", "parse_statement", "the_statement_label", "switch", 0]
+
 5154.     13// ["aa:while{}", "parse_statement", "the_statement_label", "while", 0]
+
 5155.     13
+
 5156.     13                test_cause("the_statement_label", token_nxt.id);
+
 5157.     13                enroll(the_label, "label", true);
+
 5158.     13                the_label.dead = false;
+
 5159.     13                the_label.init = true;
+
 5160.     13                the_statement = parse_statement();
+
 5161.     13                functionage.statement_prv = the_statement;
+
 5162.     13                the_statement.label = the_label;
+
 5163.     13                the_statement.statement = true;
+
 5164.     13                return the_statement;
+
 5165.     13            }
+
 5166.     13            advance();
+
 5167.     13
+
 5168.     13// test_cause:
+
 5169.     13// ["aa:", "parse_statement", "unexpected_label_a", "aa", 1]
+
 5170.     13
+
 5171.     13            warn("unexpected_label_a", the_label);
+
 5172.  20920        }
+
 5173.  20920
+
 5174.  20920// Parse the statement.
+
 5175.  20920
+
 5176.  20920        first = token_now;
+
 5177.  20920        first.statement = true;
+
 5178.  20920        the_symbol = syntax_dict[first.id];
+
 5179.  20920        if (
+
 5180.  20920            the_symbol !== undefined
+
 5181.  20920            && the_symbol.fud_stmt !== undefined
+
 5182.  20929
+
 5183.  20929// PR-318 - Bugfix - Fixes issues #316, #317 - dynamic-import().
+
 5184.  20929
+
 5185.  10154            && !(the_symbol.id === "import" && token_nxt.id === "(")
+
 5186.  10152        ) {
+
 5187.  10152            the_symbol.disrupt = false;
+
 5188.  10152            the_symbol.statement = true;
+
 5189.  10152            token_now.arity = "statement";
+
 5190.  10152            the_statement = the_symbol.fud_stmt();
+
 5191.  10152            functionage.statement_prv = the_statement;
+
 5192.  10768        } else {
+
 5193.  10768
+
 5194.  10768// It is an expression statement.
+
 5195.  10768
+
 5196.  10768            the_statement = parse_expression(0, true);
+
 5197.  10768            functionage.statement_prv = the_statement;
+
 5198.  10768            if (the_statement.wrapped && the_statement.id !== "(") {
+
 5199.  10768
+
 5200.  10768// test_cause:
+
 5201.  10768// ["(0)", "parse_statement", "unexpected_a", "(", 1]
+
 5202.  10768
+
 5203.  10768                warn("unexpected_a", first);
+
 5204.  10768            }
+
 5205.  10768            semicolon();
+
 5206.  20826        }
+
 5207.  20826        if (the_label !== undefined) {
+
 5208.      1            the_label.dead = true;
+
 5209.  20826        }
+
 5210.  20826        return the_statement;
+
 5211.  20826    }
+
 5212.    631
+
 5213.   7501    function parse_statements() {
+
 5214.   7501
+
 5215.   7501// Parse a list of statements. Give a warning if an unreachable statement
+
 5216.   7501// follows a disruptive statement.
+
 5217.   7501
+
 5218.   7501        const statement_list = [];
+
 5219.   7501        let a_statement;
+
 5220.   7501        let disrupt = false;
+
 5221.   7501
+
 5222.   7501// Parse/loop each statement until a statement-terminator is reached.
+
 5223.   7501
+
 5224.  28003        while (true) {
+
 5225.  28003            switch (token_nxt.id) {
+
 5226.  28003            case "(end)":
+
 5227.  28003            case "case":
+
 5228.  28003            case "default":
+
 5229.  28003            case "else":
+
 5230.  28003            case "}":
+
 5231.  28003
+
 5232.  28003// test_cause:
+
 5233.  28003// [";", "parse_statements", "closer", "", 0]
+
 5234.  28003// ["case", "parse_statements", "closer", "", 0]
+
 5235.  28003// ["default", "parse_statements", "closer", "", 0]
+
 5236.  28003// ["else", "parse_statements", "closer", "", 0]
+
 5237.  28003// ["}", "parse_statements", "closer", "", 0]
+
 5238.  28003
+
 5239.  28003                test_cause("closer");
+
 5240.  28003                return statement_list;
+
 5241.  28003            }
+
 5242.  28003            a_statement = parse_statement();
+
 5243.  28003            statement_list.push(a_statement);
+
 5244.  28003            if (disrupt) {
+
 5245.  28003
+
 5246.  28003// test_cause:
+
 5247.  28003// ["while(0){break;0;}", "parse_statements", "unreachable_a", "0", 16]
+
 5248.  28003
+
 5249.  28003                warn("unreachable_a", a_statement);
+
 5250.  28003            }
+
 5251.  28003            disrupt = a_statement.disrupt;
+
 5252.  28003        }
+
 5253.   7501    }
+
 5254.    631
+
 5255.   1262    function postassign(id) {
+
 5256.   1262
+
 5257.   1262// Create one of the postassign operators.
+
 5258.   1262
+
 5259.   1262        const the_symbol = symbol(id, 150);
+
 5260.      1        the_symbol.led_infix = function (left) {
+
 5261.      1            token_now.expression = left;
+
 5262.      1            token_now.arity = "postassign";
+
 5263.      1            check_mutation(token_now.expression);
+
 5264.      1            return token_now;
+
 5265.      1        };
+
 5266.   1262        return the_symbol;
+
 5267.   1262    }
+
 5268.    631
+
 5269.   1262    function preassign(id) {
+
 5270.   1262
+
 5271.   1262// Create one of the preassign operators.
+
 5272.   1262
+
 5273.   1262        const the_symbol = symbol(id);
+
 5274.      2        the_symbol.nud_prefix = function () {
+
 5275.      2            const the_token = token_now;
+
 5276.      2            the_token.arity = "preassign";
+
 5277.      2            the_token.expression = parse_expression(150);
+
 5278.      2            check_mutation(the_token.expression);
+
 5279.      2            return the_token;
+
 5280.      2        };
+
 5281.   1262        return the_symbol;
+
 5282.   1262    }
+
 5283.    631
+
 5284.  10727    function prefix(id, f) {
+
 5285.  10727
+
 5286.  10727// Create a prefix operator.
+
 5287.  10727
+
 5288.  10727        const the_symbol = symbol(id);
+
 5289.   5744        the_symbol.nud_prefix = function () {
+
 5290.   5744            const the_token = token_now;
+
 5291.   5744            the_token.arity = "unary";
+
 5292.   4932            if (typeof f === "function") {
+
 5293.   4932                return f();
+
 5294.   4932            }
+
 5295.    812            the_token.expression = parse_expression(150);
+
 5296.    812            return the_token;
+
 5297.    812        };
+
 5298.  10727        return the_symbol;
+
 5299.  10727    }
+
 5300.    631
+
 5301.      1    function prefix_assign_divide() {
+
 5302.      1
+
 5303.      1// test_cause:
+
 5304.      1// ["/=", "prefix_assign_divide", "expected_a_b", "/=", 1]
+
 5305.      1
+
 5306.      1        stop("expected_a_b", token_now, "/\\=", "/=");
+
 5307.      1    }
+
 5308.    631
+
 5309.    136    function prefix_async() {
+
 5310.    136        let the_async = token_now;
+
 5311.    136        let the_function;
+
 5312.    136        token_nxt.arity = the_async.arity;
+
 5313.    136
+
 5314.    136// PR-414 - Parse async fart.
+
 5315.    136
+
 5316.      3        if (token_nxt.fart) {
+
 5317.      3            advance("(");
+
 5318.      3            the_function = Object.assign(token_now.fart, {
+
 5319.      3                async: 1
+
 5320.      3            });
+
 5321.      3            if (!option_dict.fart) {
+
 5322.      3
+
 5323.      3// test_cause:
+
 5324.      3// ["async()=>0", "prefix_async", "use_function_not_fart", "=>", 8]
+
 5325.      3
+
 5326.      3                warn("use_function_not_fart", the_function);
+
 5327.      3            }
+
 5328.      3            prefix_lparen();
 5329.      3
-
 5330.      3// test_cause:
-
 5331.      3// ["
-
 5332.      3// async function aa(){}
-
 5333.      3// ", "prefix_async", "missing_await_statement", "function", 7]
-
 5334.      3
-
 5335.      3            warn("missing_await_statement", the_function);
-
 5336.      3        }
-
 5337.    136        return the_function;
-
 5338.    136    }
-
 5339.    629
-
 5340.    297    function prefix_await() {
-
 5341.    297        const the_await = token_now;
-
 5342.    297
-
 5343.    297// PR-370 - Add top-level-await support.
-
 5344.    297
-
 5345.      4        if (functionage.async === 0 && functionage !== token_global) {
-
 5346.      2
-
 5347.      2// test_cause:
-
 5348.      2// ["function aa(){aa=await 0;}", "prefix_await", "unexpected_a", "await", 18]
-
 5349.      2// ["function aa(){await 0;}", "prefix_await", "unexpected_a", "await", 15]
-
 5350.      2
-
 5351.      2            warn("unexpected_a", the_await);
-
 5352.    295        } else {
-
 5353.    295            functionage.async += 1;
-
 5354.    295        }
-
 5355.    185        if (the_await.arity === "statement") {
-
 5356.    185
-
 5357.    185// PR-405 - Bugfix - fix expression after "await" mis-identified as statement.
-
 5358.    185
-
 5359.    185            the_await.expression = parse_expression(150);
-
 5360.    185            semicolon();
-
 5361.    185        } else {
-
 5362.    112            the_await.expression = parse_expression(150);
-
 5363.    112        }
-
 5364.    297        return the_await;
-
 5365.    297    }
-
 5366.    629
-
 5367.      1    function prefix_fart() {
-
 5368.      1
-
 5369.      1// test_cause:
-
 5370.      1// ["=>0", "prefix_fart", "expected_a_before_b", "=>", 1]
-
 5371.      1
-
 5372.      1        return stop("expected_a_before_b", token_now, "()", "=>");
-
 5373.      1    }
-
 5374.    629
-
 5375.   2005    function prefix_function(the_function) {
-
 5376.     11        let name = the_function && the_function.name;
-
 5377.   1994        if (the_function === undefined) {
-
 5378.   1994            the_function = token_now;
-
 5379.   1994
-
 5380.   1994// A function statement must have a name that will be in the parent's scope.
-
 5381.   1994
-
 5382.   1994            if (the_function.arity === "statement") {
-
 5383.   1994                if (!token_nxt.identifier) {
-
 5384.   1994
-
 5385.   1994// test_cause:
-
 5386.   1994// ["function(){}", "prefix_function", "expected_identifier_a", "(", 9]
-
 5387.   1994// ["function*aa(){}", "prefix_function", "expected_identifier_a", "*", 9]
-
 5388.   1994
-
 5389.   1994                    return stop("expected_identifier_a");
-
 5390.   1994                }
-
 5391.   1994                name = token_nxt;
-
 5392.   1994                enroll(name, "variable", true);
-
 5393.   1994                the_function.name = Object.assign(name, {
-
 5394.   1994                    calls: empty(),
+
 5330.      3// Parse async function.
+
 5331.      3
+
 5332.    133        } else {
+
 5333.    133            advance("function");
+
 5334.    133            the_function = Object.assign(token_now, {
+
 5335.    133                async: 1
+
 5336.    133            });
+
 5337.    133            prefix_function();
+
 5338.    133        }
+
 5339.      3        if (the_function.async === 1) {
+
 5340.      3
+
 5341.      3// test_cause:
+
 5342.      3// ["
+
 5343.      3// async function aa(){}
+
 5344.      3// ", "prefix_async", "missing_await_statement", "function", 7]
+
 5345.      3
+
 5346.      3            warn("missing_await_statement", the_function);
+
 5347.      3        }
+
 5348.    136        return the_function;
+
 5349.    136    }
+
 5350.    631
+
 5351.    297    function prefix_await() {
+
 5352.    297        const the_await = token_now;
+
 5353.    297
+
 5354.    297// PR-370 - Add top-level-await support.
+
 5355.    297
+
 5356.      4        if (functionage.async === 0 && functionage !== token_global) {
+
 5357.      2
+
 5358.      2// test_cause:
+
 5359.      2// ["function aa(){aa=await 0;}", "prefix_await", "unexpected_a", "await", 18]
+
 5360.      2// ["function aa(){await 0;}", "prefix_await", "unexpected_a", "await", 15]
+
 5361.      2
+
 5362.      2            warn("unexpected_a", the_await);
+
 5363.    295        } else {
+
 5364.    295            functionage.async += 1;
+
 5365.    295        }
+
 5366.    185        if (the_await.arity === "statement") {
+
 5367.    185
+
 5368.    185// PR-405 - Bugfix - fix expression after "await" mis-identified as statement.
+
 5369.    185
+
 5370.    185            the_await.expression = parse_expression(150);
+
 5371.    185            semicolon();
+
 5372.    185        } else {
+
 5373.    112            the_await.expression = parse_expression(150);
+
 5374.    112        }
+
 5375.    297        return the_await;
+
 5376.    297    }
+
 5377.    631
+
 5378.      1    function prefix_fart() {
+
 5379.      1
+
 5380.      1// test_cause:
+
 5381.      1// ["=>0", "prefix_fart", "expected_a_before_b", "=>", 1]
+
 5382.      1
+
 5383.      1        return stop("expected_a_before_b", token_now, "()", "=>");
+
 5384.      1    }
+
 5385.    631
+
 5386.   2005    function prefix_function(the_function) {
+
 5387.     11        let name = the_function && the_function.name;
+
 5388.   1994        if (the_function === undefined) {
+
 5389.   1994            the_function = token_now;
+
 5390.   1994
+
 5391.   1994// A function statement must have a name that will be in the parent's scope.
+
 5392.   1994
+
 5393.   1994            if (the_function.arity === "statement") {
+
 5394.   1994                if (!token_nxt.identifier) {
 5395.   1994
-
 5396.   1994// PR-331 - Bugfix - Fixes issue #272 - function hoisting not allowed.
-
 5397.   1994
-
 5398.   1994                    dead: false,
-
 5399.   1994                    init: true
-
 5400.   1994                });
-
 5401.   1994                advance();
-
 5402.   1994            } else if (name === undefined) {
-
 5403.   1994
-
 5404.   1994// A function expression may have an optional name.
-
 5405.   1994
-
 5406.   1994                the_function.name = anon;
-
 5407.   1994                if (token_nxt.identifier) {
-
 5408.   1994                    name = token_nxt;
-
 5409.   1994                    the_function.name = name;
-
 5410.   1994                    advance();
-
 5411.   1994                }
-
 5412.   1994            }
-
 5413.   2003        }
-
 5414.   2003
-
 5415.   2003//  Probably deadcode.
-
 5416.   2003//  if (mode_mega) {
-
 5417.   2003//      warn("unexpected_a", the_function);
-
 5418.   2003//  }
-
 5419.   2003//  jslint_assert(!mode_mega, `Expected !mode_mega.`);
-
 5420.   2003
-
 5421.   2003// PR-378 - Relax warning "function_in_loop".
-
 5422.   2003//
-
 5423.   2003// // Don't create functions in loops. It is inefficient, and it can lead to
-
 5424.   2003// // scoping errors.
-
 5425.   2003//
-
 5426.   2003//         if (functionage.loop > 0) {
-
 5427.   2003//
-
 5428.   2003// // test_cause:
-
 5429.   2003// // ["
-
 5430.   2003// // while(0){aa.map(function(){});}
-
 5431.   2003// // ", "prefix_function", "function_in_loop", "function", 17]
-
 5432.   2003//
-
 5433.   2003//             warn("function_in_loop", the_function);
-
 5434.   2003//         }
-
 5435.   2003
-
 5436.   2003// Give the function properties for storing its names and for observing the
-
 5437.   2003// depth of loops and switches.
-
 5438.   2003
-
 5439.   2003        Object.assign(the_function, {
-
 5440.   2003            async: the_function.async || 0,
-
 5441.   2005            context: empty(),
-
 5442.   2005            finally: 0,
-
 5443.   2005            level: functionage.level + 1,
-
 5444.   2005            loop: 0,
-
 5445.   2005            statement_prv: undefined,
-
 5446.   2005            switch: 0,
-
 5447.   2005            try: 0
-
 5448.   2005        });
-
 5449.    929        if (the_function.arity !== "statement" && typeof name === "object") {
-
 5450.     38
-
 5451.     38// test_cause:
-
 5452.     38// ["let aa=function bb(){return;};", "prefix_function", "expression", "bb", 0]
-
 5453.     38
-
 5454.     38            test_cause("expression", name.id);
-
 5455.     38            enroll(name, "function", true);
-
 5456.     38            name.dead = false;
-
 5457.     38            name.init = true;
-
 5458.     38            name.used = 1;
-
 5459.   2003        }
-
 5460.   2003
-
 5461.   2003// PR-334 - Bugfix - fix function-redefinition not warned inside function-call.
-
 5462.   2003// Push the current function context and establish a new one.
-
 5463.   2003
-
 5464.   2003        function_list.push(the_function);
-
 5465.   2003        function_stack.push(functionage);
-
 5466.   2003        functionage = the_function;
-
 5467.   2003
-
 5468.   2003// Parse the parameter list.
-
 5469.   2003
-
 5470.   2003        advance("(");
-
 5471.   2003        token_now.arity = "function";
-
 5472.   2003        prefix_function_parameter(the_function);
-
 5473.   2003
-
 5474.   2003// The function's body is a block.
-
 5475.   2003
-
 5476.   2003        the_function.block = block("body");
-
 5477.   2003        if (
-
 5478.   2003            the_function.arity === "statement"
-
 5479.   2003            && token_nxt.line === token_now.line
-
 5480.      2        ) {
-
 5481.      2
-
 5482.      2// test_cause:
-
 5483.      2// ["function aa(){}0", "prefix_function", "unexpected_a", "0", 16]
-
 5484.      2
-
 5485.      2            return stop("unexpected_a");
-
 5486.   1990        }
-
 5487.   1990        if (
-
 5488.   1990            token_nxt.id === "."
-
 5489.   1990            || token_nxt.id === "?."
-
 5490.   2005
-
 5491.   2005// PR-459 - Allow destructuring-assignment after function-definition.
-
 5492.   2005
-
 5493.   2005            // || token_nxt.id === "["
-
 5494.      2        ) {
+
 5396.   1994// test_cause:
+
 5397.   1994// ["function(){}", "prefix_function", "expected_identifier_a", "(", 9]
+
 5398.   1994// ["function*aa(){}", "prefix_function", "expected_identifier_a", "*", 9]
+
 5399.   1994
+
 5400.   1994                    return stop("expected_identifier_a");
+
 5401.   1994                }
+
 5402.   1994                name = token_nxt;
+
 5403.   1994                enroll(name, "variable", true);
+
 5404.   1994                the_function.name = Object.assign(name, {
+
 5405.   1994                    calls: empty(),
+
 5406.   1994
+
 5407.   1994// PR-331 - Bugfix - Fixes issue #272 - function hoisting not allowed.
+
 5408.   1994
+
 5409.   1994                    dead: false,
+
 5410.   1994                    init: true
+
 5411.   1994                });
+
 5412.   1994                advance();
+
 5413.   1994            } else if (name === undefined) {
+
 5414.   1994
+
 5415.   1994// A function expression may have an optional name.
+
 5416.   1994
+
 5417.   1994                the_function.name = anon;
+
 5418.   1994                if (token_nxt.identifier) {
+
 5419.   1994                    name = token_nxt;
+
 5420.   1994                    the_function.name = name;
+
 5421.   1994                    advance();
+
 5422.   1994                }
+
 5423.   1994            }
+
 5424.   2003        }
+
 5425.   2003
+
 5426.   2003//  Probably deadcode.
+
 5427.   2003//  if (mode_mega) {
+
 5428.   2003//      warn("unexpected_a", the_function);
+
 5429.   2003//  }
+
 5430.   2003//  jslint_assert(!mode_mega, `Expected !mode_mega.`);
+
 5431.   2003
+
 5432.   2003// PR-378 - Relax warning "function_in_loop".
+
 5433.   2003//
+
 5434.   2003// // Don't create functions in loops. It is inefficient, and it can lead to
+
 5435.   2003// // scoping errors.
+
 5436.   2003//
+
 5437.   2003//         if (functionage.loop > 0) {
+
 5438.   2003//
+
 5439.   2003// // test_cause:
+
 5440.   2003// // ["
+
 5441.   2003// // while(0){aa.map(function(){});}
+
 5442.   2003// // ", "prefix_function", "function_in_loop", "function", 17]
+
 5443.   2003//
+
 5444.   2003//             warn("function_in_loop", the_function);
+
 5445.   2003//         }
+
 5446.   2003
+
 5447.   2003// Give the function properties for storing its names and for observing the
+
 5448.   2003// depth of loops and switches.
+
 5449.   2003
+
 5450.   2003        Object.assign(the_function, {
+
 5451.   2003            async: the_function.async || 0,
+
 5452.   2005            context: empty(),
+
 5453.   2005            finally: 0,
+
 5454.   2005            level: functionage.level + 1,
+
 5455.   2005            loop: 0,
+
 5456.   2005            statement_prv: undefined,
+
 5457.   2005            switch: 0,
+
 5458.   2005            try: 0
+
 5459.   2005        });
+
 5460.    929        if (the_function.arity !== "statement" && typeof name === "object") {
+
 5461.     38
+
 5462.     38// test_cause:
+
 5463.     38// ["let aa=function bb(){return;};", "prefix_function", "expression", "bb", 0]
+
 5464.     38
+
 5465.     38            test_cause("expression", name.id);
+
 5466.     38            enroll(name, "function", true);
+
 5467.     38            name.dead = false;
+
 5468.     38            name.init = true;
+
 5469.     38            name.used = 1;
+
 5470.   2003        }
+
 5471.   2003
+
 5472.   2003// PR-334 - Bugfix - fix function-redefinition not warned inside function-call.
+
 5473.   2003// Push the current function context and establish a new one.
+
 5474.   2003
+
 5475.   2003        function_list.push(the_function);
+
 5476.   2003        function_stack.push(functionage);
+
 5477.   2003        functionage = the_function;
+
 5478.   2003
+
 5479.   2003// Parse the parameter list.
+
 5480.   2003
+
 5481.   2003        advance("(");
+
 5482.   2003        token_now.arity = "function";
+
 5483.   2003        prefix_function_parameter(the_function);
+
 5484.   2003
+
 5485.   2003// The function's body is a block.
+
 5486.   2003
+
 5487.   2003        the_function.block = block("body");
+
 5488.   2003        if (
+
 5489.   2003            the_function.arity === "statement"
+
 5490.   2003            && token_nxt.line === token_now.line
+
 5491.      2        ) {
+
 5492.      2
+
 5493.      2// test_cause:
+
 5494.      2// ["function aa(){}0", "prefix_function", "unexpected_a", "0", 16]
 5495.      2
-
 5496.      2// test_cause:
-
 5497.      2// ["function aa(){}\n.aa", "prefix_function", "unexpected_a", ".", 1]
-
 5498.      2// ["function aa(){}\n?.aa", "prefix_function", "unexpected_a", "?.", 1]
-
 5499.      2
-
 5500.      2            warn("unexpected_a");
-
 5501.   1990        }
-
 5502.   1990
-
 5503.   1990// Check functions are ordered.
-
 5504.   1990
-
 5505.   1990        check_ordered(
-
 5506.   1990            "function",
-
 5507.   1990            function_list.slice(
-
 5508.   1990                function_list.indexOf(the_function) + 1
-
 5509.   2515            ).map(function ({
-
 5510.   2515                level,
-
 5511.   2515                name
-
 5512.   2515            }) {
-
 5513.   1990                return (level === the_function.level + 1) && name;
-
 5514.   2515            }).filter(function (name) {
-
 5515.   2510                return option_dict.beta && name && name.id;
-
 5516.   2515            })
-
 5517.   1990        );
-
 5518.   1990
-
 5519.   1990// Restore the previous context.
-
 5520.   1990
-
 5521.   1990        functionage = function_stack.pop();
-
 5522.   1990        return the_function;
-
 5523.   1990    }
-
 5524.    629
-
 5525.   2017    function prefix_function_parameter(the_function) {
-
 5526.   2017
-
 5527.   2017// This function will parse input <parameters> at beginning of <the_function>
-
 5528.   2017
-
 5529.   2017        let optional;
-
 5530.   2017        let parameters = [];
-
 5531.   2017        let signature = ["("];
-
 5532.   2017        let subparam;
-
 5533.   2781        function param_enroll(name) {
-
 5534.   2514            if (name.identifier) {
-
 5535.   2514                enroll(name, "parameter", false);
-
 5536.   2514            } else {
-
 5537.    267
-
 5538.    267// test_cause:
-
 5539.    267// ["([aa])=>0", "param_enroll", "use_function_not_fart", "=>", 7]
-
 5540.    267// ["({aa})=>0", "param_enroll", "use_function_not_fart", "=>", 7]
-
 5541.    267
-
 5542.    267                if (the_function.id === "=>" && !option_dict.fart) {
-
 5543.    267                    warn("use_function_not_fart", the_function);
-
 5544.    267                }
-
 5545.    267
-
 5546.    267// Recurse param_enroll().
-
 5547.    267
-
 5548.    267                name.names.forEach(param_enroll);
-
 5549.    267            }
-
 5550.   2781        }
-
 5551.   2077        function param_parse() {
-
 5552.   2077            let ellipsis = false;
-
 5553.   2077            let param;
-
 5554.    227            if (token_nxt.id === "{") {
-
 5555.    227                if (optional !== undefined) {
-
 5556.    227
-
 5557.    227// test_cause:
-
 5558.    227// ["function aa(aa=0,{}){}", "param_parse", "required_a_optional_b", "aa", 18]
-
 5559.    227
-
 5560.    227                    warn(
-
 5561.    227                        "required_a_optional_b",
-
 5562.    227                        token_nxt,
-
 5563.    227                        token_nxt.id,
-
 5564.    227                        optional.id
-
 5565.    227                    );
-
 5566.    227                }
-
 5567.    227                param = token_nxt;
-
 5568.    227                param.names = [];
-
 5569.    227                advance("{");
-
 5570.    227                signature.push("{");
-
 5571.    625                while (true) {
-
 5572.    625                    subparam = token_nxt;
-
 5573.    625                    if (!subparam.identifier) {
-
 5574.    625
-
 5575.    625// test_cause:
-
 5576.    625// ["function aa(aa=0,{}){}", "param_parse", "expected_identifier_a", "}", 19]
-
 5577.    625// ["function aa({0}){}", "param_parse", "expected_identifier_a", "0", 14]
-
 5578.    625
-
 5579.    625                        return stop("expected_identifier_a");
-
 5580.    625                    }
-
 5581.    625                    survey(subparam);
-
 5582.    625                    advance();
-
 5583.    625                    signature.push(subparam.id);
-
 5584.    625                    if (token_nxt.id === ":") {
-
 5585.    625                        advance(":");
-
 5586.    625                        advance();
-
 5587.    625                        token_now.label = subparam;
-
 5588.    625                        subparam = token_now;
-
 5589.    625                        if (!subparam.identifier) {
-
 5590.    625
-
 5591.    625// test_cause:
-
 5592.    625// ["function aa({aa:0}){}", "param_parse", "expected_identifier_a", "}", 18]
-
 5593.    625
-
 5594.    625                            return stop(
-
 5595.    625                                "expected_identifier_a",
-
 5596.    625                                token_nxt
-
 5597.    625                            );
-
 5598.    625                        }
-
 5599.    625                    }
-
 5600.    625
-
 5601.    625// test_cause:
-
 5602.    625// ["function aa({aa=aa},aa){}", "param_parse", "equal", "", 0]
-
 5603.    625
-
 5604.    625                    test_cause("equal");
-
 5605.    625                    if (token_nxt.id === "=") {
-
 5606.    625                        advance("=");
-
 5607.    625                        subparam.expression = parse_expression();
-
 5608.    625                        param.open = true;
-
 5609.    625                    }
-
 5610.    625                    param.names.push(subparam);
-
 5611.    625                    if (token_nxt.id === ",") {
-
 5612.    625                        advance(",");
-
 5613.    625                        signature.push(", ");
-
 5614.    625                    } else {
-
 5615.    625                        break;
-
 5616.    625                    }
-
 5617.    625                }
-
 5618.    227                parameters.push(param);
-
 5619.    227
-
 5620.    227// test_cause:
-
 5621.    227// ["
-
 5622.    227// function aa({bb,aa}){}
-
 5623.    227// ", "check_ordered", "expected_a_b_before_c_d", "aa", 17]
-
 5624.    227
-
 5625.    227                check_ordered("parameter", param.names);
-
 5626.    227                advance("}");
-
 5627.    227                signature.push("}");
-
 5628.    227                if (token_nxt.id === ",") {
-
 5629.    227                    advance(",");
-
 5630.    227                    signature.push(", ");
-
 5631.    227                    param_parse();
-
 5632.    227                    return;
-
 5633.    227                }
-
 5634.   1850            } else if (token_nxt.id === "[") {
-
 5635.   1850                if (optional !== undefined) {
-
 5636.   1850
-
 5637.   1850// test_cause:
-
 5638.   1850// ["function aa(aa=0,[]){}", "param_parse", "required_a_optional_b", "aa", 18]
-
 5639.   1850
-
 5640.   1850                    warn(
-
 5641.   1850                        "required_a_optional_b",
-
 5642.   1850                        token_nxt,
-
 5643.   1850                        token_nxt.id,
-
 5644.   1850                        optional.id
-
 5645.   1850                    );
-
 5646.   1850                }
-
 5647.   1850                param = token_nxt;
-
 5648.   1850                param.names = [];
-
 5649.   1850                advance("[");
-
 5650.   1850                signature.push("[]");
-
 5651.   1850                while (true) {
-
 5652.   1850                    subparam = token_nxt;
-
 5653.   1850                    if (!subparam.identifier) {
-
 5654.   1850
-
 5655.   1850// test_cause:
-
 5656.   1850// ["function aa(aa=0,[]){}", "param_parse", "expected_identifier_a", "]", 19]
-
 5657.   1850
-
 5658.   1850                        return stop("expected_identifier_a");
-
 5659.   1850                    }
-
 5660.   1850                    advance();
-
 5661.   1850                    param.names.push(subparam);
-
 5662.   1850
-
 5663.   1850// test_cause:
-
 5664.   1850// ["function aa([aa=aa],aa){}", "param_parse", "id", "", 0]
+
 5496.      2            return stop("unexpected_a");
+
 5497.   1990        }
+
 5498.   1990        if (
+
 5499.   1990            token_nxt.id === "."
+
 5500.   1990            || token_nxt.id === "?."
+
 5501.   2005
+
 5502.   2005// PR-459 - Allow destructuring-assignment after function-definition.
+
 5503.   2005
+
 5504.   2005            // || token_nxt.id === "["
+
 5505.      2        ) {
+
 5506.      2
+
 5507.      2// test_cause:
+
 5508.      2// ["function aa(){}\n.aa", "prefix_function", "unexpected_a", ".", 1]
+
 5509.      2// ["function aa(){}\n?.aa", "prefix_function", "unexpected_a", "?.", 1]
+
 5510.      2
+
 5511.      2            warn("unexpected_a");
+
 5512.   1990        }
+
 5513.   1990
+
 5514.   1990// Check functions are ordered.
+
 5515.   1990
+
 5516.   1990        check_ordered(
+
 5517.   1990            "function",
+
 5518.   1990            function_list.slice(
+
 5519.   1990                function_list.indexOf(the_function) + 1
+
 5520.   2515            ).map(function ({
+
 5521.   2515                level,
+
 5522.   2515                name
+
 5523.   2515            }) {
+
 5524.   1990                return (level === the_function.level + 1) && name;
+
 5525.   2515            }).filter(function (name) {
+
 5526.   2510                return option_dict.beta && name && name.id;
+
 5527.   2515            })
+
 5528.   1990        );
+
 5529.   1990
+
 5530.   1990// Restore the previous context.
+
 5531.   1990
+
 5532.   1990        functionage = function_stack.pop();
+
 5533.   1990        return the_function;
+
 5534.   1990    }
+
 5535.    631
+
 5536.   2017    function prefix_function_parameter(the_function) {
+
 5537.   2017
+
 5538.   2017// This function will parse input <parameters> at beginning of <the_function>
+
 5539.   2017
+
 5540.   2017        let optional;
+
 5541.   2017        let parameters = [];
+
 5542.   2017        let signature = ["("];
+
 5543.   2017        let subparam;
+
 5544.   2781        function param_enroll(name) {
+
 5545.   2514            if (name.identifier) {
+
 5546.   2514                enroll(name, "parameter", false);
+
 5547.   2514            } else {
+
 5548.    267
+
 5549.    267// test_cause:
+
 5550.    267// ["([aa])=>0", "param_enroll", "use_function_not_fart", "=>", 7]
+
 5551.    267// ["({aa})=>0", "param_enroll", "use_function_not_fart", "=>", 7]
+
 5552.    267
+
 5553.    267                if (the_function.id === "=>" && !option_dict.fart) {
+
 5554.    267                    warn("use_function_not_fart", the_function);
+
 5555.    267                }
+
 5556.    267
+
 5557.    267// Recurse param_enroll().
+
 5558.    267
+
 5559.    267                name.names.forEach(param_enroll);
+
 5560.    267            }
+
 5561.   2781        }
+
 5562.   2077        function param_parse() {
+
 5563.   2077            let ellipsis = false;
+
 5564.   2077            let param;
+
 5565.    227            if (token_nxt.id === "{") {
+
 5566.    227                if (optional !== undefined) {
+
 5567.    227
+
 5568.    227// test_cause:
+
 5569.    227// ["function aa(aa=0,{}){}", "param_parse", "required_a_optional_b", "aa", 18]
+
 5570.    227
+
 5571.    227                    warn(
+
 5572.    227                        "required_a_optional_b",
+
 5573.    227                        token_nxt,
+
 5574.    227                        token_nxt.id,
+
 5575.    227                        optional.id
+
 5576.    227                    );
+
 5577.    227                }
+
 5578.    227                param = token_nxt;
+
 5579.    227                param.names = [];
+
 5580.    227                advance("{");
+
 5581.    227                signature.push("{");
+
 5582.    625                while (true) {
+
 5583.    625                    subparam = token_nxt;
+
 5584.    625                    if (!subparam.identifier) {
+
 5585.    625
+
 5586.    625// test_cause:
+
 5587.    625// ["function aa(aa=0,{}){}", "param_parse", "expected_identifier_a", "}", 19]
+
 5588.    625// ["function aa({0}){}", "param_parse", "expected_identifier_a", "0", 14]
+
 5589.    625
+
 5590.    625                        return stop("expected_identifier_a");
+
 5591.    625                    }
+
 5592.    625                    survey(subparam);
+
 5593.    625                    advance();
+
 5594.    625                    signature.push(subparam.id);
+
 5595.    625                    if (token_nxt.id === ":") {
+
 5596.    625                        advance(":");
+
 5597.    625                        advance();
+
 5598.    625                        token_now.label = subparam;
+
 5599.    625                        subparam = token_now;
+
 5600.    625                        if (!subparam.identifier) {
+
 5601.    625
+
 5602.    625// test_cause:
+
 5603.    625// ["function aa({aa:0}){}", "param_parse", "expected_identifier_a", "}", 18]
+
 5604.    625
+
 5605.    625                            return stop(
+
 5606.    625                                "expected_identifier_a",
+
 5607.    625                                token_nxt
+
 5608.    625                            );
+
 5609.    625                        }
+
 5610.    625                    }
+
 5611.    625
+
 5612.    625// test_cause:
+
 5613.    625// ["function aa({aa=aa},aa){}", "param_parse", "equal", "", 0]
+
 5614.    625
+
 5615.    625                    test_cause("equal");
+
 5616.    625                    if (token_nxt.id === "=") {
+
 5617.    625                        advance("=");
+
 5618.    625                        subparam.expression = parse_expression();
+
 5619.    625                        param.open = true;
+
 5620.    625                    }
+
 5621.    625                    param.names.push(subparam);
+
 5622.    625                    if (token_nxt.id === ",") {
+
 5623.    625                        advance(",");
+
 5624.    625                        signature.push(", ");
+
 5625.    625                    } else {
+
 5626.    625                        break;
+
 5627.    625                    }
+
 5628.    625                }
+
 5629.    227                parameters.push(param);
+
 5630.    227
+
 5631.    227// test_cause:
+
 5632.    227// ["
+
 5633.    227// function aa({bb,aa}){}
+
 5634.    227// ", "check_ordered", "expected_a_b_before_c_d", "aa", 17]
+
 5635.    227
+
 5636.    227                check_ordered("parameter", param.names);
+
 5637.    227                advance("}");
+
 5638.    227                signature.push("}");
+
 5639.    227                if (token_nxt.id === ",") {
+
 5640.    227                    advance(",");
+
 5641.    227                    signature.push(", ");
+
 5642.    227                    param_parse();
+
 5643.    227                    return;
+
 5644.    227                }
+
 5645.   1850            } else if (token_nxt.id === "[") {
+
 5646.   1850                if (optional !== undefined) {
+
 5647.   1850
+
 5648.   1850// test_cause:
+
 5649.   1850// ["function aa(aa=0,[]){}", "param_parse", "required_a_optional_b", "aa", 18]
+
 5650.   1850
+
 5651.   1850                    warn(
+
 5652.   1850                        "required_a_optional_b",
+
 5653.   1850                        token_nxt,
+
 5654.   1850                        token_nxt.id,
+
 5655.   1850                        optional.id
+
 5656.   1850                    );
+
 5657.   1850                }
+
 5658.   1850                param = token_nxt;
+
 5659.   1850                param.names = [];
+
 5660.   1850                advance("[");
+
 5661.   1850                signature.push("[]");
+
 5662.   1850                while (true) {
+
 5663.   1850                    subparam = token_nxt;
+
 5664.   1850                    if (!subparam.identifier) {
 5665.   1850
-
 5666.   1850                    test_cause("id");
-
 5667.   1850                    if (token_nxt.id === "=") {
-
 5668.   1850                        advance("=");
-
 5669.   1850                        subparam.expression = parse_expression();
-
 5670.   1850                        param.open = true;
-
 5671.   1850                    }
-
 5672.   1850                    if (token_nxt.id === ",") {
-
 5673.   1850                        advance(",");
-
 5674.   1850                    } else {
-
 5675.   1850                        break;
-
 5676.   1850                    }
-
 5677.   1850                }
-
 5678.   1850                parameters.push(param);
-
 5679.   1850                advance("]");
-
 5680.   1850                if (token_nxt.id === ",") {
-
 5681.   1850                    advance(",");
-
 5682.   1850                    signature.push(", ");
-
 5683.   1850                    param_parse();
-
 5684.   1850                    return;
-
 5685.   1850                }
-
 5686.   1850            } else {
-
 5687.   1850                if (token_nxt.id === "...") {
-
 5688.   1850                    ellipsis = true;
-
 5689.   1850                    signature.push("...");
-
 5690.   1850                    advance("...");
-
 5691.   1850                    if (optional !== undefined) {
-
 5692.   1850
-
 5693.   1850// test_cause:
-
 5694.   1850// ["function aa(aa=0,...){}", "param_parse", "required_a_optional_b", "aa", 21]
-
 5695.   1850
-
 5696.   1850                        warn(
-
 5697.   1850                            "required_a_optional_b",
-
 5698.   1850                            token_nxt,
-
 5699.   1850                            token_nxt.id,
-
 5700.   1850                            optional.id
-
 5701.   1850                        );
-
 5702.   1850                    }
-
 5703.   1850                }
-
 5704.   1850                if (!token_nxt.identifier) {
-
 5705.   1850
-
 5706.   1850// test_cause:
-
 5707.   1850// ["function aa(0){}", "param_parse", "expected_identifier_a", "0", 13]
-
 5708.   1850
-
 5709.   1850                    return stop("expected_identifier_a");
-
 5710.   1850                }
-
 5711.   1850                param = token_nxt;
-
 5712.   1850                parameters.push(param);
-
 5713.   1850                advance();
-
 5714.   1850                signature.push(param.id);
-
 5715.   1850                if (ellipsis) {
-
 5716.   1850                    param.ellipsis = true;
-
 5717.   1850                } else {
-
 5718.   1850                    if (token_nxt.id === "=") {
-
 5719.   1850                        optional = param;
-
 5720.   1850                        advance("=");
-
 5721.   1850                        param.expression = parse_expression(0);
-
 5722.   1850                    } else {
-
 5723.   1850                        if (optional !== undefined) {
-
 5724.   1850
-
 5725.   1850// test_cause:
-
 5726.   1850// ["function aa(aa=0,bb){}", "param_parse", "required_a_optional_b", "aa", 18]
-
 5727.   1850
-
 5728.   1850                            warn(
-
 5729.   1850                                "required_a_optional_b",
-
 5730.   1850                                param,
-
 5731.   1850                                param.id,
-
 5732.   1850                                optional.id
-
 5733.   1850                            );
-
 5734.   1850                        }
-
 5735.   1850                    }
-
 5736.   1850                    if (token_nxt.id === ",") {
-
 5737.   1850                        advance(",");
-
 5738.   1850                        signature.push(", ");
-
 5739.   1850                        param_parse();
-
 5740.   1850                        return;
-
 5741.   1850                    }
-
 5742.   1850                }
-
 5743.   1850            }
-
 5744.   2077        }
-
 5745.   2017
-
 5746.   2017// test_cause:
-
 5747.   2017// ["function aa(){}", "prefix_function_parameter", "opener", "(", 0]
-
 5748.   2017
-
 5749.   2017        test_cause("opener", token_now.id);
-
 5750.   2017        token_now.free = false;
-
 5751.   1485        if (token_nxt.id !== ")" && token_nxt.id !== "(end)") {
-
 5752.   1485            param_parse();
-
 5753.   2009        }
-
 5754.   2009        advance(")");
-
 5755.   2009        signature.push(")");
-
 5756.   2009        parameters.forEach(param_enroll);
-
 5757.   2009        the_function.parameters = parameters;
-
 5758.   2009        the_function.signature = signature.join("");
-
 5759.   2009    }
-
 5760.    629
-
 5761.    588    function prefix_lbrace() {
-
 5762.    588        const seen = empty();
-
 5763.    588        const the_brace = token_now;
-
 5764.    588        let extra;
-
 5765.    588        let full;
-
 5766.    588        let id;
-
 5767.    588        let name;
-
 5768.    588        let the_colon;
-
 5769.    588        let value;
-
 5770.    588        the_brace.expression = [];
-
 5771.    548        if (token_nxt.id !== "}") {
-
 5772.    548
-
 5773.    548// Parse/loop through each property in {...}.
-
 5774.    548
-
 5775.   1996            while (true) {
-
 5776.   1996                name = token_nxt;
-
 5777.   1996                advance();
-
 5778.   1996                if (
-
 5779.   1996                    (name.id === "get" || name.id === "set")
-
 5780.   1996                    && token_nxt.identifier
-
 5781.   1996                ) {
-
 5782.   1996                    if (!option_dict.getset) {
-
 5783.   1996
-
 5784.   1996// test_cause:
-
 5785.   1996// ["aa={get aa(){}}", "prefix_lbrace", "unexpected_a", "get", 5]
-
 5786.   1996
-
 5787.   1996                        warn("unexpected_a", name);
-
 5788.   1996                    }
-
 5789.   1996                    extra = name.id;
-
 5790.   1996                    full = extra + " " + token_nxt.id;
-
 5791.   1996                    name = token_nxt;
-
 5792.   1996                    advance();
-
 5793.   1996                    id = survey(name);
-
 5794.   1996                    if (seen[full] === true || seen[id] === true) {
-
 5795.   1996
-
 5796.   1996// test_cause:
-
 5797.   1996// ["aa={get aa(){},get aa(){}}", "prefix_lbrace", "duplicate_a", "aa", 20]
-
 5798.   1996
-
 5799.   1996                        warn("duplicate_a", name);
-
 5800.   1996                    }
-
 5801.   1996                    seen[id] = false;
-
 5802.   1996                    seen[full] = true;
-
 5803.   1996                } else if (name.id === "`") {
-
 5804.   1996
-
 5805.   1996// test_cause:
-
 5806.   1996// ["aa={`aa`:0}", "prefix_lbrace", "unexpected_a", "`", 5]
-
 5807.   1996
-
 5808.   1996                    stop("unexpected_a", name);
+
 5666.   1850// test_cause:
+
 5667.   1850// ["function aa(aa=0,[]){}", "param_parse", "expected_identifier_a", "]", 19]
+
 5668.   1850
+
 5669.   1850                        return stop("expected_identifier_a");
+
 5670.   1850                    }
+
 5671.   1850                    advance();
+
 5672.   1850                    param.names.push(subparam);
+
 5673.   1850
+
 5674.   1850// test_cause:
+
 5675.   1850// ["function aa([aa=aa],aa){}", "param_parse", "id", "", 0]
+
 5676.   1850
+
 5677.   1850                    test_cause("id");
+
 5678.   1850                    if (token_nxt.id === "=") {
+
 5679.   1850                        advance("=");
+
 5680.   1850                        subparam.expression = parse_expression();
+
 5681.   1850                        param.open = true;
+
 5682.   1850                    }
+
 5683.   1850                    if (token_nxt.id === ",") {
+
 5684.   1850                        advance(",");
+
 5685.   1850                    } else {
+
 5686.   1850                        break;
+
 5687.   1850                    }
+
 5688.   1850                }
+
 5689.   1850                parameters.push(param);
+
 5690.   1850                advance("]");
+
 5691.   1850                if (token_nxt.id === ",") {
+
 5692.   1850                    advance(",");
+
 5693.   1850                    signature.push(", ");
+
 5694.   1850                    param_parse();
+
 5695.   1850                    return;
+
 5696.   1850                }
+
 5697.   1850            } else {
+
 5698.   1850                if (token_nxt.id === "...") {
+
 5699.   1850                    ellipsis = true;
+
 5700.   1850                    signature.push("...");
+
 5701.   1850                    advance("...");
+
 5702.   1850                    if (optional !== undefined) {
+
 5703.   1850
+
 5704.   1850// test_cause:
+
 5705.   1850// ["function aa(aa=0,...){}", "param_parse", "required_a_optional_b", "aa", 21]
+
 5706.   1850
+
 5707.   1850                        warn(
+
 5708.   1850                            "required_a_optional_b",
+
 5709.   1850                            token_nxt,
+
 5710.   1850                            token_nxt.id,
+
 5711.   1850                            optional.id
+
 5712.   1850                        );
+
 5713.   1850                    }
+
 5714.   1850                }
+
 5715.   1850                if (!token_nxt.identifier) {
+
 5716.   1850
+
 5717.   1850// test_cause:
+
 5718.   1850// ["function aa(0){}", "param_parse", "expected_identifier_a", "0", 13]
+
 5719.   1850
+
 5720.   1850                    return stop("expected_identifier_a");
+
 5721.   1850                }
+
 5722.   1850                param = token_nxt;
+
 5723.   1850                parameters.push(param);
+
 5724.   1850                advance();
+
 5725.   1850                signature.push(param.id);
+
 5726.   1850                if (ellipsis) {
+
 5727.   1850                    param.ellipsis = true;
+
 5728.   1850                } else {
+
 5729.   1850                    if (token_nxt.id === "=") {
+
 5730.   1850                        optional = param;
+
 5731.   1850                        advance("=");
+
 5732.   1850                        param.expression = parse_expression(0);
+
 5733.   1850                    } else {
+
 5734.   1850                        if (optional !== undefined) {
+
 5735.   1850
+
 5736.   1850// test_cause:
+
 5737.   1850// ["function aa(aa=0,bb){}", "param_parse", "required_a_optional_b", "aa", 18]
+
 5738.   1850
+
 5739.   1850                            warn(
+
 5740.   1850                                "required_a_optional_b",
+
 5741.   1850                                param,
+
 5742.   1850                                param.id,
+
 5743.   1850                                optional.id
+
 5744.   1850                            );
+
 5745.   1850                        }
+
 5746.   1850                    }
+
 5747.   1850                    if (token_nxt.id === ",") {
+
 5748.   1850                        advance(",");
+
 5749.   1850                        signature.push(", ");
+
 5750.   1850                        param_parse();
+
 5751.   1850                        return;
+
 5752.   1850                    }
+
 5753.   1850                }
+
 5754.   1850            }
+
 5755.   2077        }
+
 5756.   2017
+
 5757.   2017// test_cause:
+
 5758.   2017// ["function aa(){}", "prefix_function_parameter", "opener", "(", 0]
+
 5759.   2017
+
 5760.   2017        test_cause("opener", token_now.id);
+
 5761.   2017        token_now.free = false;
+
 5762.   1485        if (token_nxt.id !== ")" && token_nxt.id !== "(end)") {
+
 5763.   1485            param_parse();
+
 5764.   2009        }
+
 5765.   2009        advance(")");
+
 5766.   2009        signature.push(")");
+
 5767.   2009        parameters.forEach(param_enroll);
+
 5768.   2009        the_function.parameters = parameters;
+
 5769.   2009        the_function.signature = signature.join("");
+
 5770.   2009    }
+
 5771.    631
+
 5772.    588    function prefix_lbrace() {
+
 5773.    588        const seen = empty();
+
 5774.    588        const the_brace = token_now;
+
 5775.    588        let extra;
+
 5776.    588        let full;
+
 5777.    588        let id;
+
 5778.    588        let name;
+
 5779.    588        let the_colon;
+
 5780.    588        let value;
+
 5781.    588        the_brace.expression = [];
+
 5782.    548        if (token_nxt.id !== "}") {
+
 5783.    548
+
 5784.    548// Parse/loop through each property in {...}.
+
 5785.    548
+
 5786.   1996            while (true) {
+
 5787.   1996                name = token_nxt;
+
 5788.   1996                advance();
+
 5789.   1996                if (
+
 5790.   1996                    (name.id === "get" || name.id === "set")
+
 5791.   1996                    && token_nxt.identifier
+
 5792.   1996                ) {
+
 5793.   1996                    if (!option_dict.getset) {
+
 5794.   1996
+
 5795.   1996// test_cause:
+
 5796.   1996// ["aa={get aa(){}}", "prefix_lbrace", "unexpected_a", "get", 5]
+
 5797.   1996
+
 5798.   1996                        warn("unexpected_a", name);
+
 5799.   1996                    }
+
 5800.   1996                    extra = name.id;
+
 5801.   1996                    full = extra + " " + token_nxt.id;
+
 5802.   1996                    name = token_nxt;
+
 5803.   1996                    advance();
+
 5804.   1996                    id = survey(name);
+
 5805.   1996                    if (seen[full] === true || seen[id] === true) {
+
 5806.   1996
+
 5807.   1996// test_cause:
+
 5808.   1996// ["aa={get aa(){},get aa(){}}", "prefix_lbrace", "duplicate_a", "aa", 20]
 5809.   1996
-
 5810.   1996                } else {
-
 5811.   1996                    id = survey(name);
-
 5812.   1996                    if (typeof seen[id] === "boolean") {
-
 5813.   1996
-
 5814.   1996// test_cause:
-
 5815.   1996// ["aa={aa,aa}", "prefix_lbrace", "duplicate_a", "aa", 8]
-
 5816.   1996
-
 5817.   1996                        warn("duplicate_a", name);
-
 5818.   1996                    }
-
 5819.   1996                    seen[id] = true;
-
 5820.   1996                }
-
 5821.   1996                if (name.identifier) {
-
 5822.   1996                    if (token_nxt.id === "}" || token_nxt.id === ",") {
-
 5823.   1996                        if (typeof extra === "string") {
+
 5810.   1996                        warn("duplicate_a", name);
+
 5811.   1996                    }
+
 5812.   1996                    seen[id] = false;
+
 5813.   1996                    seen[full] = true;
+
 5814.   1996                } else if (name.id === "`") {
+
 5815.   1996
+
 5816.   1996// test_cause:
+
 5817.   1996// ["aa={`aa`:0}", "prefix_lbrace", "unexpected_a", "`", 5]
+
 5818.   1996
+
 5819.   1996                    stop("unexpected_a", name);
+
 5820.   1996
+
 5821.   1996                } else {
+
 5822.   1996                    id = survey(name);
+
 5823.   1996                    if (typeof seen[id] === "boolean") {
 5824.   1996
 5825.   1996// test_cause:
-
 5826.   1996// ["aa={get aa}", "prefix_lbrace", "closer", "", 0]
+
 5826.   1996// ["aa={aa,aa}", "prefix_lbrace", "duplicate_a", "aa", 8]
 5827.   1996
-
 5828.   1996                            test_cause("closer");
-
 5829.   1996                            advance("(");
-
 5830.   1996                        }
-
 5831.   1996                        value = parse_expression(Infinity, true);
-
 5832.   1996                    } else if (token_nxt.id === "(") {
-
 5833.   1996
-
 5834.   1996// test_cause:
-
 5835.   1996// ["aa={aa()}", "prefix_lbrace", "paren", "", 0]
-
 5836.   1996// ["aa={get aa(){}}", "prefix_lbrace", "paren", "", 0]
-
 5837.   1996
-
 5838.   1996                        test_cause("paren");
-
 5839.   1996                        value = prefix_function({
-
 5840.   1996                            arity: "unary",
-
 5841.   1996                            from: name.from,
-
 5842.   1996                            id: "function",
-
 5843.   1996                            line: name.line,
-
 5844.   1996                            name: (
-
 5845.   1996                                typeof extra === "string"
-
 5846.   1996                                ? extra
-
 5847.   1996                                : id
-
 5848.   1996                            ),
-
 5849.   1996                            thru: name.from
-
 5850.   1996                        });
-
 5851.   1996                    } else {
-
 5852.   1996                        if (typeof extra === "string") {
-
 5853.   1996
-
 5854.   1996// test_cause:
-
 5855.   1996// ["aa={get aa.aa}", "prefix_lbrace", "paren", "", 0]
-
 5856.   1996
-
 5857.   1996                            test_cause("paren");
-
 5858.   1996                            advance("(");
-
 5859.   1996                        }
-
 5860.   1996                        the_colon = token_nxt;
-
 5861.   1996                        advance(":");
-
 5862.   1996                        value = parse_expression(0);
-
 5863.   1996                        if (
-
 5864.   1996                            value.id === name.id
-
 5865.   1996                            && value.id !== "function"
-
 5866.   1996                        ) {
+
 5828.   1996                        warn("duplicate_a", name);
+
 5829.   1996                    }
+
 5830.   1996                    seen[id] = true;
+
 5831.   1996                }
+
 5832.   1996                if (name.identifier) {
+
 5833.   1996                    if (token_nxt.id === "}" || token_nxt.id === ",") {
+
 5834.   1996                        if (typeof extra === "string") {
+
 5835.   1996
+
 5836.   1996// test_cause:
+
 5837.   1996// ["aa={get aa}", "prefix_lbrace", "closer", "", 0]
+
 5838.   1996
+
 5839.   1996                            test_cause("closer");
+
 5840.   1996                            advance("(");
+
 5841.   1996                        }
+
 5842.   1996                        value = parse_expression(Infinity, true);
+
 5843.   1996                    } else if (token_nxt.id === "(") {
+
 5844.   1996
+
 5845.   1996// test_cause:
+
 5846.   1996// ["aa={aa()}", "prefix_lbrace", "paren", "", 0]
+
 5847.   1996// ["aa={get aa(){}}", "prefix_lbrace", "paren", "", 0]
+
 5848.   1996
+
 5849.   1996                        test_cause("paren");
+
 5850.   1996                        value = prefix_function({
+
 5851.   1996                            arity: "unary",
+
 5852.   1996                            from: name.from,
+
 5853.   1996                            id: "function",
+
 5854.   1996                            line: name.line,
+
 5855.   1996                            name: (
+
 5856.   1996                                typeof extra === "string"
+
 5857.   1996                                ? extra
+
 5858.   1996                                : id
+
 5859.   1996                            ),
+
 5860.   1996                            thru: name.from
+
 5861.   1996                        });
+
 5862.   1996                    } else {
+
 5863.   1996                        if (typeof extra === "string") {
+
 5864.   1996
+
 5865.   1996// test_cause:
+
 5866.   1996// ["aa={get aa.aa}", "prefix_lbrace", "paren", "", 0]
 5867.   1996
-
 5868.   1996// test_cause:
-
 5869.   1996// ["aa={aa:aa}", "prefix_lbrace", "unexpected_a", ": aa", 7]
-
 5870.   1996
-
 5871.   1996                            warn("unexpected_a", the_colon, ": " + name.id);
-
 5872.   1996                        }
-
 5873.   1996                    }
-
 5874.   1996                    value.label = name;
-
 5875.   1996                    if (typeof extra === "string") {
-
 5876.   1996                        value.extra = extra;
-
 5877.   1996                    }
-
 5878.   1996                    the_brace.expression.push(value);
-
 5879.   1996                } else {
-
 5880.   1996
-
 5881.   1996// test_cause:
-
 5882.   1996// ["aa={\"aa\":0}", "prefix_lbrace", "colon", "", 0]
-
 5883.   1996
-
 5884.   1996                    test_cause("colon");
-
 5885.   1996                    advance(":");
-
 5886.   1996                    value = parse_expression(0);
-
 5887.   1996                    value.label = name;
-
 5888.   1996                    the_brace.expression.push(value);
-
 5889.   1996                }
-
 5890.   1996                if (token_nxt.id !== ",") {
-
 5891.   1996                    break;
-
 5892.   1996                }
-
 5893.   1996
-
 5894.   1996// test_cause:
-
 5895.   1996// ["aa={\"aa\":0,\"bb\":0}", "prefix_lbrace", "comma", "", 0]
-
 5896.   1996
-
 5897.   1996                test_cause("comma");
-
 5898.   1996                advance(",");
-
 5899.   1996                if (token_nxt.id === "}") {
-
 5900.   1996
-
 5901.   1996// test_cause:
-
 5902.   1996// ["let aa={aa:0,}", "prefix_lbrace", "unexpected_a", ",", 13]
-
 5903.   1996
-
 5904.   1996                    warn("unexpected_a", token_now);
-
 5905.   1996                    break;
-
 5906.   1996                }
-
 5907.   1996            }
-
 5908.    583        }
-
 5909.    583
-
 5910.    583// test_cause:
-
 5911.    583// ["aa={bb,aa}", "check_ordered", "expected_a_b_before_c_d", "aa", 8]
-
 5912.    583
-
 5913.    583        check_ordered(
-
 5914.    583            "property",
-
 5915.   1991            the_brace.expression.map(function ({
-
 5916.   1991                label
-
 5917.   1991            }) {
-
 5918.   1991                return label;
-
 5919.   1991            })
-
 5920.    583        );
-
 5921.    583        advance("}");
-
 5922.    583        return the_brace;
-
 5923.    583    }
-
 5924.    629
-
 5925.    759    function prefix_lbracket() {
-
 5926.    759        const the_token = token_now;
-
 5927.    759        let element;
-
 5928.    759        let ellipsis;
-
 5929.    759        the_token.expression = [];
-
 5930.    392        if (token_nxt.id !== "]") {
-
 5931.    392
-
 5932.    392// Parse/loop through each element in [...].
-
 5933.    392
-
 5934.   1884            while (true) {
-
 5935.   1884                ellipsis = false;
-
 5936.   1884                if (token_nxt.id === "...") {
-
 5937.   1884                    ellipsis = true;
-
 5938.   1884                    advance("...");
-
 5939.   1884                }
-
 5940.   1884                element = parse_expression(10);
-
 5941.   1884                if (ellipsis) {
-
 5942.   1884                    element.ellipsis = true;
-
 5943.   1884                }
-
 5944.   1884                the_token.expression.push(element);
-
 5945.   1884                if (token_nxt.id !== ",") {
-
 5946.   1884                    break;
-
 5947.   1884                }
-
 5948.   1884                advance(",");
-
 5949.   1884                if (token_nxt.id === "]") {
-
 5950.   1884
-
 5951.   1884// test_cause:
-
 5952.   1884// ["let aa=[0,]", "prefix_lbracket", "unexpected_a", ",", 10]
-
 5953.   1884
-
 5954.   1884                    warn("unexpected_a", token_now);
-
 5955.   1884                    break;
-
 5956.   1884                }
-
 5957.   1884            }
-
 5958.    392        }
-
 5959.    759        advance("]");
-
 5960.    759        return the_token;
-
 5961.    759    }
-
 5962.    629
-
 5963.   1616    function prefix_lparen() {
-
 5964.   1616        let the_paren = token_now;
-
 5965.   1616        let the_value;
-
 5966.   1616
-
 5967.   1616// PR-385 - Bugfix - Fixes issue #382 - failure to detect destructured fart.
-
 5968.   1616
-
 5969.     14        if (token_now.fart) {
-
 5970.     14            return parse_fart(token_now.fart);
-
 5971.   1602        }
-
 5972.   1602
-
 5973.   1602// test_cause:
-
 5974.   1602// ["(0)", "prefix_lparen", "expr", "", 0]
-
 5975.   1602
-
 5976.   1602        test_cause("expr");
-
 5977.   1602        the_paren.free = true;
-
 5978.   1602        the_value = parse_expression(0);
-
 5979.   1602        if (the_value.wrapped === true) {
-
 5980.      1
-
 5981.      1// test_cause:
-
 5982.      1// ["((0))", "prefix_lparen", "unexpected_a", "(", 1]
-
 5983.      1
-
 5984.      1            warn("unexpected_a", the_paren);
-
 5985.   1602        }
-
 5986.   1602        the_value.wrapped = true;
-
 5987.   1602        advance(")", the_paren);
-
 5988.   1602        return the_value;
-
 5989.   1602    }
-
 5990.    629
-
 5991.    155    function prefix_new() {
-
 5992.    155        const the_new = token_now;
-
 5993.    155        let right;
-
 5994.    155        right = parse_expression(160);
-
 5995.      1        if (token_nxt.id !== "(") {
-
 5996.      1
-
 5997.      1// test_cause:
-
 5998.      1// ["new aa", "prefix_new", "expected_a_before_b", "(end)", 1]
-
 5999.      1
-
 6000.      1            warn("expected_a_before_b", token_nxt, "()", artifact());
-
 6001.      1        }
-
 6002.    155        the_new.expression = right;
-
 6003.    155        return the_new;
-
 6004.    155    }
-
 6005.    629
-
 6006.    782    function prefix_tick() {
-
 6007.    782        const the_tick = token_now;
-
 6008.    782        the_tick.value = [];
-
 6009.    782        the_tick.expression = [];
-
 6010.    782        if (token_nxt.id !== "`") {
-
 6011.    782
-
 6012.    782// Parse/loop through each token in `${...}`.
-
 6013.    782
-
 6014.   1499            while (true) {
-
 6015.   1499                advance("(string)");
-
 6016.   1499                the_tick.value.push(token_now);
-
 6017.   1499                if (token_nxt.id !== "${") {
-
 6018.   1499                    break;
-
 6019.   1499                }
-
 6020.   1499                advance("${");
-
 6021.   1499
-
 6022.   1499// test_cause:
-
 6023.   1499// ["let aa=`${}`;", "prefix_tick", "${", "", 0]
-
 6024.   1499
-
 6025.   1499                test_cause("${");
-
 6026.   1499                the_tick.expression.push(parse_expression(0));
-
 6027.   1499                advance("}");
-
 6028.   1499            }
-
 6029.    780        }
-
 6030.    780        advance("`");
-
 6031.    780        return the_tick;
-
 6032.    780    }
-
 6033.    629
-
 6034.      2    function prefix_void() {
-
 6035.      2        const the_void = token_now;
-
 6036.      2
-
 6037.      2// test_cause:
-
 6038.      2// ["void 0", "prefix_void", "unexpected_a", "void", 1]
-
 6039.      2// ["void", "prefix_void", "unexpected_a", "void", 1]
-
 6040.      2
-
 6041.      2        warn("unexpected_a", the_void);
-
 6042.      2        the_void.expression = parse_expression(0);
-
 6043.      2        return the_void;
-
 6044.      2    }
-
 6045.    629
-
 6046.  13428    function semicolon() {
-
 6047.  13428
-
 6048.  13428// Try to match a semicolon.
-
 6049.  13428
-
 6050.  13205        if (token_nxt.id === ";") {
-
 6051.  13205            advance(";");
-
 6052.  13205        } else {
-
 6053.    223
-
 6054.    223// test_cause:
-
 6055.    223// ["0", "semicolon", "expected_a_b", "(end)", 1]
-
 6056.    223
-
 6057.    223            warn_at(
-
 6058.    223                "expected_a_b",
-
 6059.    223                token_now.line,
-
 6060.    223                token_now.thru + 1,
-
 6061.    223                ";",
-
 6062.    223                artifact()
-
 6063.    223            );
-
 6064.    223        }
-
 6065.  13428        anon = "anonymous";
-
 6066.  13428    }
-
 6067.    629
-
 6068.  14467    function stmt(id, fud_stmt) {
-
 6069.  14467
-
 6070.  14467// Create a statement.
-
 6071.  14467
-
 6072.  14467        const the_symbol = symbol(id);
-
 6073.  14467        the_symbol.fud_stmt = fud_stmt;
-
 6074.  14467        return the_symbol;
-
 6075.  14467    }
-
 6076.    629
-
 6077.   1023    function stmt_break() {
-
 6078.   1023        const the_break = token_now;
-
 6079.   1023        let the_label;
-
 6080.   1023        if (
-
 6081.    719            (functionage.loop < 1 && functionage.switch < 1)
-
 6082.   1017            || functionage.finally > 0
-
 6083.      6        ) {
-
 6084.      6
-
 6085.      6// test_cause:
-
 6086.      6// ["break", "stmt_break", "unexpected_a", "break", 1]
-
 6087.      6
-
 6088.      6            warn("unexpected_a", the_break);
-
 6089.      6        }
-
 6090.   1023        the_break.disrupt = true;
-
 6091.      5        if (token_nxt.identifier && token_now.line === token_nxt.line) {
-
 6092.      5            the_label = functionage.context[token_nxt.id];
-
 6093.      5            if (
-
 6094.      5                the_label === undefined
-
 6095.      5                || the_label.role !== "label"
-
 6096.      5                || the_label.dead
-
 6097.      5            ) {
-
 6098.      5                if (the_label !== undefined && the_label.dead) {
-
 6099.      5
-
 6100.      5// test_cause:
-
 6101.      5// ["aa:{function aa(aa){break aa;}}", "stmt_break", "out_of_scope_a", "aa", 27]
-
 6102.      5
-
 6103.      5                    warn("out_of_scope_a");
-
 6104.      5                } else {
-
 6105.      5
-
 6106.      5// test_cause:
-
 6107.      5// ["aa:{break aa;}", "stmt_break", "not_label_a", "aa", 11]
-
 6108.      5
-
 6109.      5                    warn("not_label_a");
-
 6110.      5                }
-
 6111.      5            } else {
-
 6112.      5                the_label.used += 1;
-
 6113.      5            }
-
 6114.      5            the_break.label = token_nxt;
-
 6115.      5            advance();
-
 6116.      5        }
-
 6117.   1023        advance(";");
-
 6118.   1023        return the_break;
-
 6119.   1023    }
-
 6120.    629
-
 6121.      2    function stmt_continue() {
-
 6122.      2        const the_continue = token_now;
-
 6123.      1        if (functionage.loop < 1 || functionage.finally > 0) {
-
 6124.      2
-
 6125.      2// test_cause:
-
 6126.      2// ["continue", "stmt_continue", "unexpected_a", "continue", 1]
-
 6127.      2// ["
-
 6128.      2// function aa(){while(0){try{}finally{continue}}}
-
 6129.      2// ", "stmt_continue", "unexpected_a", "continue", 37]
-
 6130.      2
-
 6131.      2            warn("unexpected_a", the_continue);
-
 6132.      2        }
-
 6133.      2        check_not_top_level(the_continue);
-
 6134.      2        the_continue.disrupt = true;
-
 6135.      2        warn("unexpected_a", the_continue);
-
 6136.      2        advance(";");
-
 6137.      2        return the_continue;
-
 6138.      2    }
-
 6139.    629
-
 6140.      3    function stmt_debugger() {
-
 6141.      3        const the_debug = token_now;
-
 6142.      1        if (!option_dict.devel) {
-
 6143.      1
-
 6144.      1// test_cause:
-
 6145.      1// ["debugger", "stmt_debugger", "unexpected_a", "debugger", 1]
-
 6146.      1
-
 6147.      1            warn("unexpected_a", the_debug);
-
 6148.      1        }
-
 6149.      3        semicolon();
-
 6150.      3        return the_debug;
-
 6151.      3    }
-
 6152.    629
-
 6153.     72    function stmt_delete() {
-
 6154.     72        const the_token = token_now;
-
 6155.     72        const the_value = parse_expression(0);
-
 6156.     72        if (
-
 6157.      1            (the_value.id !== "." && the_value.id !== "[")
-
 6158.     71            || the_value.arity !== "binary"
-
 6159.      1        ) {
-
 6160.      1
-
 6161.      1// test_cause:
-
 6162.      1// ["delete 0", "stmt_delete", "expected_a_b", "0", 8]
-
 6163.      1
-
 6164.      1            stop("expected_a_b", the_value, ".", artifact(the_value));
-
 6165.     71        }
-
 6166.     71        the_token.expression = the_value;
-
 6167.     71        semicolon();
-
 6168.     71        return the_token;
-
 6169.     71    }
-
 6170.    629
-
 6171.      5    function stmt_do() {
-
 6172.      5        const the_do = token_now;
-
 6173.      5        check_not_top_level(the_do);
-
 6174.      5        functionage.loop += 1;
-
 6175.      5        the_do.block = block();
-
 6176.      5        advance("while");
-
 6177.      5        the_do.expression = condition();
-
 6178.      5        semicolon();
-
 6179.      1        if (the_do.block.disrupt === true) {
-
 6180.      1
-
 6181.      1// test_cause:
-
 6182.      1// ["function aa(){do{break;}while(0)}", "stmt_do", "weird_loop", "do", 15]
-
 6183.      1
-
 6184.      1            warn("weird_loop", the_do);
-
 6185.      3        }
-
 6186.      3        functionage.loop -= 1;
-
 6187.      3        return the_do;
-
 6188.      3    }
-
 6189.    629
-
 6190.     24    function stmt_export() {
-
 6191.     24        let export_list = [];
-
 6192.     24        let the_export = token_now;
-
 6193.     24        let the_id;
-
 6194.     24        let the_name;
-
 6195.     24        let the_thing;
-
 6196.     24
-
 6197.     24        the_export.expression = [];
-
 6198.     11        if (token_nxt.id === "default") {
-
 6199.     11            if (export_dict.default !== undefined) {
-
 6200.     11
-
 6201.     11// test_cause:
-
 6202.     11// ["
-
 6203.     11// export default 0;export default 0
-
 6204.     11// ", "stmt_export", "duplicate_a", "default", 25]
-
 6205.     11
-
 6206.     11                warn("duplicate_a");
-
 6207.     11            }
-
 6208.     11            advance("default");
-
 6209.     11            the_thing = parse_expression(0);
-
 6210.     11            if (
-
 6211.     11                the_thing.id !== "("
-
 6212.     11                || the_thing.expression[0].id !== "."
-
 6213.     11                || the_thing.expression[0].expression.id !== "Object"
-
 6214.     11                || the_thing.expression[0].name.id !== "freeze"
-
 6215.     11            ) {
+
 5868.   1996                            test_cause("paren");
+
 5869.   1996                            advance("(");
+
 5870.   1996                        }
+
 5871.   1996                        the_colon = token_nxt;
+
 5872.   1996                        advance(":");
+
 5873.   1996                        value = parse_expression(0);
+
 5874.   1996                        if (
+
 5875.   1996                            value.id === name.id
+
 5876.   1996                            && value.id !== "function"
+
 5877.   1996                        ) {
+
 5878.   1996
+
 5879.   1996// test_cause:
+
 5880.   1996// ["aa={aa:aa}", "prefix_lbrace", "unexpected_a", ": aa", 7]
+
 5881.   1996
+
 5882.   1996                            warn("unexpected_a", the_colon, ": " + name.id);
+
 5883.   1996                        }
+
 5884.   1996                    }
+
 5885.   1996                    value.label = name;
+
 5886.   1996                    if (typeof extra === "string") {
+
 5887.   1996                        value.extra = extra;
+
 5888.   1996                    }
+
 5889.   1996                    the_brace.expression.push(value);
+
 5890.   1996                } else {
+
 5891.   1996
+
 5892.   1996// test_cause:
+
 5893.   1996// ["aa={\"aa\":0}", "prefix_lbrace", "colon", "", 0]
+
 5894.   1996
+
 5895.   1996                    test_cause("colon");
+
 5896.   1996                    advance(":");
+
 5897.   1996                    value = parse_expression(0);
+
 5898.   1996                    value.label = name;
+
 5899.   1996                    the_brace.expression.push(value);
+
 5900.   1996                }
+
 5901.   1996                if (token_nxt.id !== ",") {
+
 5902.   1996                    break;
+
 5903.   1996                }
+
 5904.   1996
+
 5905.   1996// test_cause:
+
 5906.   1996// ["aa={\"aa\":0,\"bb\":0}", "prefix_lbrace", "comma", "", 0]
+
 5907.   1996
+
 5908.   1996                test_cause("comma");
+
 5909.   1996                advance(",");
+
 5910.   1996                if (token_nxt.id === "}") {
+
 5911.   1996
+
 5912.   1996// test_cause:
+
 5913.   1996// ["let aa={aa:0,}", "prefix_lbrace", "unexpected_a", ",", 13]
+
 5914.   1996
+
 5915.   1996                    warn("unexpected_a", token_now);
+
 5916.   1996                    break;
+
 5917.   1996                }
+
 5918.   1996            }
+
 5919.    583        }
+
 5920.    583
+
 5921.    583// test_cause:
+
 5922.    583// ["aa={bb,aa}", "check_ordered", "expected_a_b_before_c_d", "aa", 8]
+
 5923.    583
+
 5924.    583        check_ordered(
+
 5925.    583            "property",
+
 5926.   1991            the_brace.expression.map(function ({
+
 5927.   1991                label
+
 5928.   1991            }) {
+
 5929.   1991                return label;
+
 5930.   1991            })
+
 5931.    583        );
+
 5932.    583        advance("}");
+
 5933.    583        return the_brace;
+
 5934.    583    }
+
 5935.    631
+
 5936.    759    function prefix_lbracket() {
+
 5937.    759        const the_token = token_now;
+
 5938.    759        let element;
+
 5939.    759        let ellipsis;
+
 5940.    759        the_token.expression = [];
+
 5941.    392        if (token_nxt.id !== "]") {
+
 5942.    392
+
 5943.    392// Parse/loop through each element in [...].
+
 5944.    392
+
 5945.   1884            while (true) {
+
 5946.   1884                ellipsis = false;
+
 5947.   1884                if (token_nxt.id === "...") {
+
 5948.   1884                    ellipsis = true;
+
 5949.   1884                    advance("...");
+
 5950.   1884                }
+
 5951.   1884                element = parse_expression(10);
+
 5952.   1884                if (ellipsis) {
+
 5953.   1884                    element.ellipsis = true;
+
 5954.   1884                }
+
 5955.   1884                the_token.expression.push(element);
+
 5956.   1884                if (token_nxt.id !== ",") {
+
 5957.   1884                    break;
+
 5958.   1884                }
+
 5959.   1884                advance(",");
+
 5960.   1884                if (token_nxt.id === "]") {
+
 5961.   1884
+
 5962.   1884// test_cause:
+
 5963.   1884// ["let aa=[0,]", "prefix_lbracket", "unexpected_a", ",", 10]
+
 5964.   1884
+
 5965.   1884                    warn("unexpected_a", token_now);
+
 5966.   1884                    break;
+
 5967.   1884                }
+
 5968.   1884            }
+
 5969.    392        }
+
 5970.    759        advance("]");
+
 5971.    759        return the_token;
+
 5972.    759    }
+
 5973.    631
+
 5974.   1616    function prefix_lparen() {
+
 5975.   1616        let the_paren = token_now;
+
 5976.   1616        let the_value;
+
 5977.   1616
+
 5978.   1616// PR-385 - Bugfix - Fixes issue #382 - failure to detect destructured fart.
+
 5979.   1616
+
 5980.     14        if (token_now.fart) {
+
 5981.     14            return parse_fart(token_now.fart);
+
 5982.   1602        }
+
 5983.   1602
+
 5984.   1602// test_cause:
+
 5985.   1602// ["(0)", "prefix_lparen", "expr", "", 0]
+
 5986.   1602
+
 5987.   1602        test_cause("expr");
+
 5988.   1602        the_paren.free = true;
+
 5989.   1602        the_value = parse_expression(0);
+
 5990.   1602        if (the_value.wrapped === true) {
+
 5991.      1
+
 5992.      1// test_cause:
+
 5993.      1// ["((0))", "prefix_lparen", "unexpected_a", "(", 1]
+
 5994.      1
+
 5995.      1            warn("unexpected_a", the_paren);
+
 5996.   1602        }
+
 5997.   1602        the_value.wrapped = true;
+
 5998.   1602        advance(")", the_paren);
+
 5999.   1602        return the_value;
+
 6000.   1602    }
+
 6001.    631
+
 6002.    155    function prefix_new() {
+
 6003.    155        const the_new = token_now;
+
 6004.    155        let right;
+
 6005.    155        right = parse_expression(160);
+
 6006.      1        if (token_nxt.id !== "(") {
+
 6007.      1
+
 6008.      1// test_cause:
+
 6009.      1// ["new aa", "prefix_new", "expected_a_before_b", "(end)", 1]
+
 6010.      1
+
 6011.      1            warn("expected_a_before_b", token_nxt, "()", artifact());
+
 6012.      1        }
+
 6013.    155        the_new.expression = right;
+
 6014.    155        return the_new;
+
 6015.    155    }
+
 6016.    631
+
 6017.    782    function prefix_tick() {
+
 6018.    782        const the_tick = token_now;
+
 6019.    782        the_tick.value = [];
+
 6020.    782        the_tick.expression = [];
+
 6021.    782        if (token_nxt.id !== "`") {
+
 6022.    782
+
 6023.    782// Parse/loop through each token in `${...}`.
+
 6024.    782
+
 6025.   1499            while (true) {
+
 6026.   1499                advance("(string)");
+
 6027.   1499                the_tick.value.push(token_now);
+
 6028.   1499                if (token_nxt.id !== "${") {
+
 6029.   1499                    break;
+
 6030.   1499                }
+
 6031.   1499                advance("${");
+
 6032.   1499
+
 6033.   1499// test_cause:
+
 6034.   1499// ["let aa=`${}`;", "prefix_tick", "${", "", 0]
+
 6035.   1499
+
 6036.   1499                test_cause("${");
+
 6037.   1499                the_tick.expression.push(parse_expression(0));
+
 6038.   1499                advance("}");
+
 6039.   1499            }
+
 6040.    780        }
+
 6041.    780        advance("`");
+
 6042.    780        return the_tick;
+
 6043.    780    }
+
 6044.    631
+
 6045.      2    function prefix_void() {
+
 6046.      2        const the_void = token_now;
+
 6047.      2
+
 6048.      2// test_cause:
+
 6049.      2// ["void 0", "prefix_void", "unexpected_a", "void", 1]
+
 6050.      2// ["void", "prefix_void", "unexpected_a", "void", 1]
+
 6051.      2
+
 6052.      2        warn("unexpected_a", the_void);
+
 6053.      2        the_void.expression = parse_expression(0);
+
 6054.      2        return the_void;
+
 6055.      2    }
+
 6056.    631
+
 6057.  13430    function semicolon() {
+
 6058.  13430
+
 6059.  13430// Try to match a semicolon.
+
 6060.  13430
+
 6061.  13205        if (token_nxt.id === ";") {
+
 6062.  13205            advance(";");
+
 6063.  13205        } else {
+
 6064.    225
+
 6065.    225// test_cause:
+
 6066.    225// ["0", "semicolon", "expected_a_b", "(end)", 1]
+
 6067.    225
+
 6068.    225            warn_at(
+
 6069.    225                "expected_a_b",
+
 6070.    225                token_now.line,
+
 6071.    225                token_now.thru + 1,
+
 6072.    225                ";",
+
 6073.    225                artifact()
+
 6074.    225            );
+
 6075.    225        }
+
 6076.  13430        anon = "anonymous";
+
 6077.  13430    }
+
 6078.    631
+
 6079.  14513    function stmt(id, fud_stmt) {
+
 6080.  14513
+
 6081.  14513// Create a statement.
+
 6082.  14513
+
 6083.  14513        const the_symbol = symbol(id);
+
 6084.  14513        the_symbol.fud_stmt = fud_stmt;
+
 6085.  14513        return the_symbol;
+
 6086.  14513    }
+
 6087.    631
+
 6088.   1023    function stmt_break() {
+
 6089.   1023        const the_break = token_now;
+
 6090.   1023        let the_label;
+
 6091.   1023        if (
+
 6092.    719            (functionage.loop < 1 && functionage.switch < 1)
+
 6093.   1017            || functionage.finally > 0
+
 6094.      6        ) {
+
 6095.      6
+
 6096.      6// test_cause:
+
 6097.      6// ["break", "stmt_break", "unexpected_a", "break", 1]
+
 6098.      6
+
 6099.      6            warn("unexpected_a", the_break);
+
 6100.      6        }
+
 6101.   1023        the_break.disrupt = true;
+
 6102.      5        if (token_nxt.identifier && token_now.line === token_nxt.line) {
+
 6103.      5            the_label = functionage.context[token_nxt.id];
+
 6104.      5            if (
+
 6105.      5                the_label === undefined
+
 6106.      5                || the_label.role !== "label"
+
 6107.      5                || the_label.dead
+
 6108.      5            ) {
+
 6109.      5                if (the_label !== undefined && the_label.dead) {
+
 6110.      5
+
 6111.      5// test_cause:
+
 6112.      5// ["aa:{function aa(aa){break aa;}}", "stmt_break", "out_of_scope_a", "aa", 27]
+
 6113.      5
+
 6114.      5                    warn("out_of_scope_a");
+
 6115.      5                } else {
+
 6116.      5
+
 6117.      5// test_cause:
+
 6118.      5// ["aa:{break aa;}", "stmt_break", "not_label_a", "aa", 11]
+
 6119.      5
+
 6120.      5                    warn("not_label_a");
+
 6121.      5                }
+
 6122.      5            } else {
+
 6123.      5                the_label.used += 1;
+
 6124.      5            }
+
 6125.      5            the_break.label = token_nxt;
+
 6126.      5            advance();
+
 6127.      5        }
+
 6128.   1023        advance(";");
+
 6129.   1023        return the_break;
+
 6130.   1023    }
+
 6131.    631
+
 6132.      2    function stmt_continue() {
+
 6133.      2        const the_continue = token_now;
+
 6134.      1        if (functionage.loop < 1 || functionage.finally > 0) {
+
 6135.      2
+
 6136.      2// test_cause:
+
 6137.      2// ["continue", "stmt_continue", "unexpected_a", "continue", 1]
+
 6138.      2// ["
+
 6139.      2// function aa(){while(0){try{}finally{continue}}}
+
 6140.      2// ", "stmt_continue", "unexpected_a", "continue", 37]
+
 6141.      2
+
 6142.      2            warn("unexpected_a", the_continue);
+
 6143.      2        }
+
 6144.      2        check_not_top_level(the_continue);
+
 6145.      2        the_continue.disrupt = true;
+
 6146.      2        warn("unexpected_a", the_continue);
+
 6147.      2        advance(";");
+
 6148.      2        return the_continue;
+
 6149.      2    }
+
 6150.    631
+
 6151.      3    function stmt_debugger() {
+
 6152.      3        const the_debug = token_now;
+
 6153.      1        if (!option_dict.devel) {
+
 6154.      1
+
 6155.      1// test_cause:
+
 6156.      1// ["debugger", "stmt_debugger", "unexpected_a", "debugger", 1]
+
 6157.      1
+
 6158.      1            warn("unexpected_a", the_debug);
+
 6159.      1        }
+
 6160.      3        semicolon();
+
 6161.      3        return the_debug;
+
 6162.      3    }
+
 6163.    631
+
 6164.     72    function stmt_delete() {
+
 6165.     72        const the_token = token_now;
+
 6166.     72        const the_value = parse_expression(0);
+
 6167.     72        if (
+
 6168.      1            (the_value.id !== "." && the_value.id !== "[")
+
 6169.     71            || the_value.arity !== "binary"
+
 6170.      1        ) {
+
 6171.      1
+
 6172.      1// test_cause:
+
 6173.      1// ["delete 0", "stmt_delete", "expected_a_b", "0", 8]
+
 6174.      1
+
 6175.      1            stop("expected_a_b", the_value, ".", artifact(the_value));
+
 6176.     71        }
+
 6177.     71        the_token.expression = the_value;
+
 6178.     71        semicolon();
+
 6179.     71        return the_token;
+
 6180.     71    }
+
 6181.    631
+
 6182.      5    function stmt_do() {
+
 6183.      5        const the_do = token_now;
+
 6184.      5        check_not_top_level(the_do);
+
 6185.      5        functionage.loop += 1;
+
 6186.      5        the_do.block = block();
+
 6187.      5        advance("while");
+
 6188.      5        the_do.expression = condition();
+
 6189.      5        semicolon();
+
 6190.      1        if (the_do.block.disrupt === true) {
+
 6191.      1
+
 6192.      1// test_cause:
+
 6193.      1// ["function aa(){do{break;}while(0)}", "stmt_do", "weird_loop", "do", 15]
+
 6194.      1
+
 6195.      1            warn("weird_loop", the_do);
+
 6196.      3        }
+
 6197.      3        functionage.loop -= 1;
+
 6198.      3        return the_do;
+
 6199.      3    }
+
 6200.    631
+
 6201.     24    function stmt_export() {
+
 6202.     24        let export_list = [];
+
 6203.     24        let the_export = token_now;
+
 6204.     24        let the_id;
+
 6205.     24        let the_name;
+
 6206.     24        let the_thing;
+
 6207.     24
+
 6208.     24        the_export.expression = [];
+
 6209.     11        if (token_nxt.id === "default") {
+
 6210.     11            if (export_dict.default !== undefined) {
+
 6211.     11
+
 6212.     11// test_cause:
+
 6213.     11// ["
+
 6214.     11// export default 0;export default 0
+
 6215.     11// ", "stmt_export", "duplicate_a", "default", 25]
 6216.     11
-
 6217.     11// test_cause:
-
 6218.     11// ["export default {}", "stmt_export", "freeze_exports", "{", 16]
-
 6219.     11
-
 6220.     11                warn("freeze_exports", the_thing);
-
 6221.     11
-
 6222.     11// PR-301 - Bugfix - Fixes issues #282 - optional-semicolon.
-
 6223.     11
-
 6224.     11            } else {
-
 6225.     11
-
 6226.     11// test_cause:
-
 6227.     11// ["
-
 6228.     11// export default Object.freeze({})
-
 6229.     11// ", "semicolon", "expected_a_b", "(end)", 32]
+
 6217.     11                warn("duplicate_a");
+
 6218.     11            }
+
 6219.     11            advance("default");
+
 6220.     11            the_thing = parse_expression(0);
+
 6221.     11            if (
+
 6222.     11                the_thing.id !== "("
+
 6223.     11                || the_thing.expression[0].id !== "."
+
 6224.     11                || the_thing.expression[0].expression.id !== "Object"
+
 6225.     11                || the_thing.expression[0].name.id !== "freeze"
+
 6226.     11            ) {
+
 6227.     11
+
 6228.     11// test_cause:
+
 6229.     11// ["export default {}", "stmt_export", "freeze_exports", "{", 16]
 6230.     11
-
 6231.     11                semicolon();
-
 6232.     11            }
-
 6233.     11            export_dict.default = the_thing;
-
 6234.     11            the_export.expression.push(the_thing);
-
 6235.     13        } else {
-
 6236.     13
-
 6237.     13// PR-439 - Add grammar for "export async function ...".
-
 6238.     13
-
 6239.     13            if (token_nxt.id === "function" || token_nxt.id === "async") {
-
 6240.     13
-
 6241.     13// test_cause:
-
 6242.     13// ["export async function aa(){}", "stmt_export", "freeze_exports", "async", 8]
-
 6243.     13// ["export function aa(){}", "stmt_export", "freeze_exports", "function", 8]
-
 6244.     13
-
 6245.     13                warn("freeze_exports");
-
 6246.     13                the_thing = parse_statement();
-
 6247.     13                the_name = the_thing.name;
-
 6248.     13                the_id = the_name.id;
-
 6249.     13                the_name.used += 1;
-
 6250.     13                if (export_dict[the_id] !== undefined) {
+
 6231.     11                warn("freeze_exports", the_thing);
+
 6232.     11
+
 6233.     11// PR-301 - Bugfix - Fixes issues #282 - optional-semicolon.
+
 6234.     11
+
 6235.     11            } else {
+
 6236.     11
+
 6237.     11// test_cause:
+
 6238.     11// ["
+
 6239.     11// export default Object.freeze({})
+
 6240.     11// ", "semicolon", "expected_a_b", "(end)", 32]
+
 6241.     11
+
 6242.     11                semicolon();
+
 6243.     11            }
+
 6244.     11            export_dict.default = the_thing;
+
 6245.     11            the_export.expression.push(the_thing);
+
 6246.     13        } else {
+
 6247.     13
+
 6248.     13// PR-439 - Add grammar for "export async function ...".
+
 6249.     13
+
 6250.     13            if (token_nxt.id === "function" || token_nxt.id === "async") {
 6251.     13
 6252.     13// test_cause:
-
 6253.     13// ["
-
 6254.     13// let aa;export{aa};export function aa(){}
-
 6255.     13// ", "stmt_export", "duplicate_a", "aa", 35]
-
 6256.     13
-
 6257.     13                    warn("duplicate_a", the_name);
-
 6258.     13                }
-
 6259.     13                export_dict[the_id] = the_thing;
-
 6260.     13                the_export.expression.push(the_thing);
-
 6261.     13                the_thing.statement = false;
-
 6262.     13                the_thing.arity = "unary";
-
 6263.     13            } else if (
-
 6264.     13                token_nxt.id === "var"
-
 6265.     13                || token_nxt.id === "let"
-
 6266.     13                || token_nxt.id === "const"
-
 6267.     13            ) {
-
 6268.     13
-
 6269.     13// test_cause:
-
 6270.     13// ["export const", "stmt_export", "unexpected_a", "const", 8]
-
 6271.     13// ["export let", "stmt_export", "unexpected_a", "let", 8]
-
 6272.     13// ["export var", "stmt_export", "unexpected_a", "var", 8]
-
 6273.     13
-
 6274.     13                warn("unexpected_a");
-
 6275.     13                parse_statement();
-
 6276.     13            } else if (token_nxt.id === "{") {
-
 6277.     13
-
 6278.     13// test_cause:
-
 6279.     13// ["export {}", "stmt_export", "advance{", "", 0]
-
 6280.     13
-
 6281.     13                test_cause("advance{");
-
 6282.     13                advance("{");
-
 6283.     13                while (true) {
-
 6284.     13                    if (!token_nxt.identifier) {
-
 6285.     13
-
 6286.     13// test_cause:
-
 6287.     13// ["export {}", "stmt_export", "expected_identifier_a", "}", 9]
+
 6253.     13// ["export async function aa(){}", "stmt_export", "freeze_exports", "async", 8]
+
 6254.     13// ["export function aa(){}", "stmt_export", "freeze_exports", "function", 8]
+
 6255.     13
+
 6256.     13                warn("freeze_exports");
+
 6257.     13                the_thing = parse_statement();
+
 6258.     13                the_name = the_thing.name;
+
 6259.     13                the_id = the_name.id;
+
 6260.     13                the_name.used += 1;
+
 6261.     13                if (export_dict[the_id] !== undefined) {
+
 6262.     13
+
 6263.     13// test_cause:
+
 6264.     13// ["
+
 6265.     13// let aa;export{aa};export function aa(){}
+
 6266.     13// ", "stmt_export", "duplicate_a", "aa", 35]
+
 6267.     13
+
 6268.     13                    warn("duplicate_a", the_name);
+
 6269.     13                }
+
 6270.     13                export_dict[the_id] = the_thing;
+
 6271.     13                the_export.expression.push(the_thing);
+
 6272.     13                the_thing.statement = false;
+
 6273.     13                the_thing.arity = "unary";
+
 6274.     13            } else if (
+
 6275.     13                token_nxt.id === "var"
+
 6276.     13                || token_nxt.id === "let"
+
 6277.     13                || token_nxt.id === "const"
+
 6278.     13            ) {
+
 6279.     13
+
 6280.     13// test_cause:
+
 6281.     13// ["export const", "stmt_export", "unexpected_a", "const", 8]
+
 6282.     13// ["export let", "stmt_export", "unexpected_a", "let", 8]
+
 6283.     13// ["export var", "stmt_export", "unexpected_a", "var", 8]
+
 6284.     13
+
 6285.     13                warn("unexpected_a");
+
 6286.     13                parse_statement();
+
 6287.     13            } else if (token_nxt.id === "{") {
 6288.     13
-
 6289.     13                        stop("expected_identifier_a");
-
 6290.     13                    }
-
 6291.     13                    the_id = token_nxt.id;
-
 6292.     13                    export_list.push(token_nxt);
-
 6293.     13                    the_name = token_global.context[the_id];
-
 6294.     13                    if (the_name === undefined) {
-
 6295.     13
-
 6296.     13// test_cause:
-
 6297.     13// ["export {aa}", "stmt_export", "unexpected_a", "aa", 9]
-
 6298.     13
-
 6299.     13                        warn("unexpected_a");
-
 6300.     13                    } else {
-
 6301.     13                        the_name.used += 1;
-
 6302.     13                        if (export_dict[the_id] !== undefined) {
-
 6303.     13
-
 6304.     13// test_cause:
-
 6305.     13// ["let aa;export{aa,aa}", "stmt_export", "duplicate_a", "aa", 18]
+
 6289.     13// test_cause:
+
 6290.     13// ["export {}", "stmt_export", "advance{", "", 0]
+
 6291.     13
+
 6292.     13                test_cause("advance{");
+
 6293.     13                advance("{");
+
 6294.     13                while (true) {
+
 6295.     13                    if (!token_nxt.identifier) {
+
 6296.     13
+
 6297.     13// test_cause:
+
 6298.     13// ["export {}", "stmt_export", "expected_identifier_a", "}", 9]
+
 6299.     13
+
 6300.     13                        stop("expected_identifier_a");
+
 6301.     13                    }
+
 6302.     13                    the_id = token_nxt.id;
+
 6303.     13                    export_list.push(token_nxt);
+
 6304.     13                    the_name = token_global.context[the_id];
+
 6305.     13                    if (the_name === undefined) {
 6306.     13
-
 6307.     13                            warn("duplicate_a");
-
 6308.     13                        }
-
 6309.     13                        export_dict[the_id] = the_name;
-
 6310.     13                    }
-
 6311.     13                    advance();
-
 6312.     13                    the_export.expression.push(the_thing);
-
 6313.     13                    if (token_nxt.id === ",") {
-
 6314.     13                        advance(",");
-
 6315.     13                    } else {
-
 6316.     13                        break;
-
 6317.     13                    }
-
 6318.     13                }
-
 6319.     13
-
 6320.     13// PR-439 - Check exported properties are ordered.
-
 6321.     13
-
 6322.     13// test_cause:
-
 6323.     13// ["export {bb, aa}", "check_ordered", "expected_a_b_before_c_d", "aa", 13]
-
 6324.     13
-
 6325.     13                check_ordered("export", export_list);
-
 6326.     13                advance("}");
-
 6327.     13                semicolon();
-
 6328.     13            } else {
-
 6329.     13
-
 6330.     13// test_cause:
-
 6331.     13// ["export", "stmt_export", "unexpected_a", "(end)", 1]
+
 6307.     13// test_cause:
+
 6308.     13// ["export {aa}", "stmt_export", "unexpected_a", "aa", 9]
+
 6309.     13
+
 6310.     13                        warn("unexpected_a");
+
 6311.     13                    } else {
+
 6312.     13                        the_name.used += 1;
+
 6313.     13                        if (export_dict[the_id] !== undefined) {
+
 6314.     13
+
 6315.     13// test_cause:
+
 6316.     13// ["let aa;export{aa,aa}", "stmt_export", "duplicate_a", "aa", 18]
+
 6317.     13
+
 6318.     13                            warn("duplicate_a");
+
 6319.     13                        }
+
 6320.     13                        export_dict[the_id] = the_name;
+
 6321.     13                    }
+
 6322.     13                    advance();
+
 6323.     13                    the_export.expression.push(the_thing);
+
 6324.     13                    if (token_nxt.id === ",") {
+
 6325.     13                        advance(",");
+
 6326.     13                    } else {
+
 6327.     13                        break;
+
 6328.     13                    }
+
 6329.     13                }
+
 6330.     13
+
 6331.     13// PR-439 - Check exported properties are ordered.
 6332.     13
-
 6333.     13                stop("unexpected_a");
-
 6334.     13            }
-
 6335.     18        }
-
 6336.     18        state.mode_module = true;
-
 6337.     18        return the_export;
-
 6338.     18    }
-
 6339.    629
-
 6340.     12    function stmt_for() {
-
 6341.     12        let first;
-
 6342.     12        let the_for = token_now;
-
 6343.      7        if (!option_dict.for) {
-
 6344.      7
-
 6345.      7// test_cause:
-
 6346.      7// ["for", "stmt_for", "unexpected_a", "for", 1]
-
 6347.      7
-
 6348.      7            warn("unexpected_a", the_for);
-
 6349.      7        }
-
 6350.     12        check_not_top_level(the_for);
-
 6351.     12        functionage.loop += 1;
-
 6352.     12        advance("(");
-
 6353.     12        token_now.free = true;
-
 6354.      1        if (token_nxt.id === ";") {
-
 6355.      1
-
 6356.      1// test_cause:
-
 6357.      1// ["for(;;){}", "stmt_for", "expected_a_b", "for (;", 1]
-
 6358.      1
-
 6359.      1            return stop("expected_a_b", the_for, "while (", "for (;");
-
 6360.      9        }
-
 6361.      9        switch (token_nxt.id) {
-
 6362.      9        case "const":
-
 6363.      1        case "let":
-
 6364.      1        case "var":
-
 6365.      1
-
 6366.      1// test_cause:
-
 6367.      1// ["for(const aa in aa){}", "stmt_for", "unexpected_a", "const", 5]
-
 6368.      1
-
 6369.      1            return stop("unexpected_a");
-
 6370.      8        }
-
 6371.      8        first = parse_expression(0);
-
 6372.      8        if (first.id === "in") {
-
 6373.      2            if (first.expression[0].arity !== "variable") {
-
 6374.      2
-
 6375.      2// test_cause:
-
 6376.      2// ["for(0 in aa){}", "stmt_for", "bad_assignment_a", "0", 5]
-
 6377.      2
-
 6378.      2                warn("bad_assignment_a", first.expression[0]);
-
 6379.      2            }
-
 6380.      2            the_for.name = first.expression[0];
-
 6381.      2            the_for.expression = first.expression[1];
-
 6382.      2            warn("expected_a_b", the_for, "Object.keys", "for in");
-
 6383.      6        } else {
-
 6384.      6            the_for.initial = first;
-
 6385.      6            advance(";");
-
 6386.      6            the_for.expression = parse_expression(0);
-
 6387.      6            advance(";");
-
 6388.      6            the_for.inc = parse_expression(0);
-
 6389.      6            if (the_for.inc.id === "++") {
-
 6390.      6
-
 6391.      6// test_cause:
-
 6392.      6// ["for(aa;aa;aa++){}", "stmt_for", "expected_a_b", "++", 13]
-
 6393.      6
-
 6394.      6                warn("expected_a_b", the_for.inc, "+= 1", "++");
-
 6395.      6            }
-
 6396.      8        }
-
 6397.      8        advance(")");
-
 6398.      8        the_for.block = block();
-
 6399.      8        if (the_for.block.disrupt === true) {
-
 6400.      1
-
 6401.      1// test_cause:
-
 6402.      1// ["
-
 6403.      1// /*jslint for*/
-
 6404.      1// function aa(bb,cc){for(0;0;0){break;}}
-
 6405.      1// ", "stmt_for", "weird_loop", "for", 20]
-
 6406.      1
-
 6407.      1            warn("weird_loop", the_for);
-
 6408.      8        }
-
 6409.      8        functionage.loop -= 1;
-
 6410.      8        return the_for;
-
 6411.      8    }
-
 6412.    629
-
 6413.   3046    function stmt_if() {
-
 6414.   3046        const the_if = token_now;
-
 6415.   3046        let the_else;
-
 6416.   3046        the_if.expression = condition();
-
 6417.   3046        the_if.block = block();
-
 6418.    642        if (token_nxt.id === "else") {
-
 6419.    642            advance("else");
-
 6420.    642            the_else = token_now;
-
 6421.    642            the_if.else = (
-
 6422.    642                token_nxt.id === "if"
-
 6423.    642                ? parse_statement()
-
 6424.    642                : block()
-
 6425.    642            );
-
 6426.    642
-
 6427.    642// test_cause:
-
 6428.    642// ["if(0){0}else if(0){0}", "stmt_if", "else", "", 0]
-
 6429.    642// ["if(0){0}else{0}", "stmt_if", "else", "", 0]
-
 6430.    642
-
 6431.    642            test_cause("else");
-
 6432.    642            if (the_if.block.disrupt === true) {
-
 6433.    642                if (the_if.else.disrupt === true) {
-
 6434.    642
-
 6435.    642// test_cause:
-
 6436.    642// ["if(0){break;}else{break;}", "stmt_if", "disrupt", "", 0]
+
 6333.     13// test_cause:
+
 6334.     13// ["export {bb, aa}", "check_ordered", "expected_a_b_before_c_d", "aa", 13]
+
 6335.     13
+
 6336.     13                check_ordered("export", export_list);
+
 6337.     13                advance("}");
+
 6338.     13                semicolon();
+
 6339.     13            } else {
+
 6340.     13
+
 6341.     13// test_cause:
+
 6342.     13// ["export", "stmt_export", "unexpected_a", "(end)", 1]
+
 6343.     13
+
 6344.     13                stop("unexpected_a");
+
 6345.     13            }
+
 6346.     18        }
+
 6347.     18        state.mode_module = true;
+
 6348.     18        return the_export;
+
 6349.     18    }
+
 6350.    631
+
 6351.     12    function stmt_for() {
+
 6352.     12        let first;
+
 6353.     12        let the_for = token_now;
+
 6354.      7        if (!option_dict.for) {
+
 6355.      7
+
 6356.      7// test_cause:
+
 6357.      7// ["for", "stmt_for", "unexpected_a", "for", 1]
+
 6358.      7
+
 6359.      7            warn("unexpected_a", the_for);
+
 6360.      7        }
+
 6361.     12        check_not_top_level(the_for);
+
 6362.     12        functionage.loop += 1;
+
 6363.     12        advance("(");
+
 6364.     12        token_now.free = true;
+
 6365.      1        if (token_nxt.id === ";") {
+
 6366.      1
+
 6367.      1// test_cause:
+
 6368.      1// ["for(;;){}", "stmt_for", "expected_a_b", "for (;", 1]
+
 6369.      1
+
 6370.      1            return stop("expected_a_b", the_for, "while (", "for (;");
+
 6371.      9        }
+
 6372.      9        switch (token_nxt.id) {
+
 6373.      9        case "const":
+
 6374.      1        case "let":
+
 6375.      1        case "var":
+
 6376.      1
+
 6377.      1// test_cause:
+
 6378.      1// ["for(const aa in aa){}", "stmt_for", "unexpected_a", "const", 5]
+
 6379.      1
+
 6380.      1            return stop("unexpected_a");
+
 6381.      8        }
+
 6382.      8        first = parse_expression(0);
+
 6383.      8        if (first.id === "in") {
+
 6384.      2            if (first.expression[0].arity !== "variable") {
+
 6385.      2
+
 6386.      2// test_cause:
+
 6387.      2// ["for(0 in aa){}", "stmt_for", "bad_assignment_a", "0", 5]
+
 6388.      2
+
 6389.      2                warn("bad_assignment_a", first.expression[0]);
+
 6390.      2            }
+
 6391.      2            the_for.name = first.expression[0];
+
 6392.      2            the_for.expression = first.expression[1];
+
 6393.      2            warn("expected_a_b", the_for, "Object.keys", "for in");
+
 6394.      6        } else {
+
 6395.      6            the_for.initial = first;
+
 6396.      6            advance(";");
+
 6397.      6            the_for.expression = parse_expression(0);
+
 6398.      6            advance(";");
+
 6399.      6            the_for.inc = parse_expression(0);
+
 6400.      6            if (the_for.inc.id === "++") {
+
 6401.      6
+
 6402.      6// test_cause:
+
 6403.      6// ["for(aa;aa;aa++){}", "stmt_for", "expected_a_b", "++", 13]
+
 6404.      6
+
 6405.      6                warn("expected_a_b", the_for.inc, "+= 1", "++");
+
 6406.      6            }
+
 6407.      8        }
+
 6408.      8        advance(")");
+
 6409.      8        the_for.block = block();
+
 6410.      8        if (the_for.block.disrupt === true) {
+
 6411.      1
+
 6412.      1// test_cause:
+
 6413.      1// ["
+
 6414.      1// /*jslint for*/
+
 6415.      1// function aa(bb,cc){for(0;0;0){break;}}
+
 6416.      1// ", "stmt_for", "weird_loop", "for", 20]
+
 6417.      1
+
 6418.      1            warn("weird_loop", the_for);
+
 6419.      8        }
+
 6420.      8        functionage.loop -= 1;
+
 6421.      8        return the_for;
+
 6422.      8    }
+
 6423.    631
+
 6424.   3051    function stmt_if() {
+
 6425.   3051        const the_if = token_now;
+
 6426.   3051        let the_else;
+
 6427.   3051        the_if.expression = condition();
+
 6428.   3051        the_if.block = block();
+
 6429.    642        if (token_nxt.id === "else") {
+
 6430.    642            advance("else");
+
 6431.    642            the_else = token_now;
+
 6432.    642            the_if.else = (
+
 6433.    642                token_nxt.id === "if"
+
 6434.    642                ? parse_statement()
+
 6435.    642                : block()
+
 6436.    642            );
 6437.    642
-
 6438.    642                    test_cause("disrupt");
-
 6439.    642                    the_if.disrupt = true;
-
 6440.    642                } else {
+
 6438.    642// test_cause:
+
 6439.    642// ["if(0){0}else if(0){0}", "stmt_if", "else", "", 0]
+
 6440.    642// ["if(0){0}else{0}", "stmt_if", "else", "", 0]
 6441.    642
-
 6442.    642// test_cause:
-
 6443.    642// ["if(0){break;}else{}", "stmt_if", "unexpected_a", "else", 14]
-
 6444.    642
-
 6445.    642                    warn("unexpected_a", the_else);
-
 6446.    642                }
-
 6447.    642            }
-
 6448.   3045        }
-
 6449.   3045        return the_if;
-
 6450.   3045    }
-
 6451.    629
-
 6452.     62    function stmt_import() {
-
 6453.     62        const the_import = token_now;
-
 6454.     62        let name;
-
 6455.     62        let names;
-
 6456.     62
-
 6457.     62// PR-347 - Disable warning "unexpected_directive_a".
-
 6458.     62//
-
 6459.     62//         if (typeof state.mode_module === "object") {
-
 6460.     62//
-
 6461.     62// // test_cause:
-
 6462.     62// // ["
-
 6463.     62// // /*global aa*/
-
 6464.     62// // import aa from "aa"
-
 6465.     62// // ", "stmt_import", "unexpected_directive_a", "global", 1]
-
 6466.     62//
-
 6467.     62//             warn(
-
 6468.     62//                 "unexpected_directive_a",
-
 6469.     62//                 state.mode_module,
-
 6470.     62//                 state.mode_module.directive
-
 6471.     62//             );
-
 6472.     62//         }
-
 6473.     62
-
 6474.     62        state.mode_module = true;
-
 6475.     62
-
 6476.     62// PR-436 - Add grammar for side-effect import-statement.
-
 6477.     62
-
 6478.      1        if (token_nxt.id === "(string)") {
-
 6479.      1
-
 6480.      1// test_cause:
-
 6481.      1// ["import \"./aa.mjs\";", "stmt_import", "import_side_effect", "", 0]
-
 6482.      1
-
 6483.      1            test_cause("import_side_effect");
-
 6484.      1            warn("expected_a_b", token_nxt, "{", artifact());
-
 6485.      1            advance();
-
 6486.      1            semicolon();
-
 6487.      1            return the_import;
-
 6488.     61        }
-
 6489.     61        if (token_nxt.identifier) {
-
 6490.     57            name = token_nxt;
-
 6491.     57            advance();
-
 6492.     57            if (name.id === "ignore") {
-
 6493.     57
-
 6494.     57// test_cause:
-
 6495.     57// ["import ignore from \"aa\"", "stmt_import", "unexpected_a", "ignore", 8]
-
 6496.     57
-
 6497.     57                warn("unexpected_a", name);
-
 6498.     57            }
-
 6499.     57            enroll(name, "variable", true);
-
 6500.     57            the_import.name = name;
-
 6501.     57        } else {
-
 6502.      4            names = [];
-
 6503.      4            advance("{");
-
 6504.      4            if (token_nxt.id !== "}") {
-
 6505.      4                while (true) {
-
 6506.      4                    if (!token_nxt.identifier) {
-
 6507.      4
-
 6508.      4// test_cause:
-
 6509.      4// ["import {", "stmt_import", "expected_identifier_a", "(end)", 1]
-
 6510.      4
-
 6511.      4                        stop("expected_identifier_a");
-
 6512.      4                    }
-
 6513.      4                    name = token_nxt;
-
 6514.      4                    advance();
-
 6515.      4                    if (name.id === "ignore") {
-
 6516.      4
-
 6517.      4// test_cause:
-
 6518.      4// ["import {ignore} from \"aa\"", "stmt_import", "unexpected_a", "ignore", 9]
-
 6519.      4
-
 6520.      4                        warn("unexpected_a", name);
-
 6521.      4                    }
-
 6522.      4                    enroll(name, "variable", true);
-
 6523.      4                    names.push(name);
-
 6524.      4                    if (token_nxt.id !== ",") {
-
 6525.      4                        break;
-
 6526.      4                    }
-
 6527.      4                    advance(",");
-
 6528.      4                }
-
 6529.      4            }
-
 6530.      4            advance("}");
-
 6531.      4            the_import.name = names;
-
 6532.     60        }
-
 6533.     60        advance("from");
-
 6534.     60        advance("(string)");
-
 6535.     60        the_import.import = token_now;
-
 6536.     60        if (!jslint_rgx_module.test(token_now.value)) {
-
 6537.      1
-
 6538.      1// test_cause:
-
 6539.      1// ["import aa from \"!aa\"", "stmt_import", "bad_module_name_a", "!aa", 16]
-
 6540.      1
-
 6541.      1            warn("bad_module_name_a", token_now);
-
 6542.     60        }
-
 6543.     60        import_list.push(token_now.value);
-
 6544.     60        semicolon();
-
 6545.     60        return the_import;
-
 6546.     60    }
-
 6547.    629
-
 6548.      5    function stmt_lbrace() {
-
 6549.      5
-
 6550.      5// test_cause:
-
 6551.      5// [";{}", "stmt_lbrace", "naked_block", "{", 2]
-
 6552.      5// ["class aa{}", "stmt_lbrace", "naked_block", "{", 9]
-
 6553.      5
-
 6554.      5        warn("naked_block", token_now);
-
 6555.      5        return block("naked");
-
 6556.      5    }
-
 6557.    629
-
 6558.   1756    function stmt_return() {
-
 6559.   1756        const the_return = token_now;
-
 6560.   1756        check_not_top_level(the_return);
-
 6561.      1        if (functionage.finally > 0) {
-
 6562.      1
-
 6563.      1// test_cause:
-
 6564.      1// ["
-
 6565.      1// function aa(){try{}finally{return;}}
-
 6566.      1// ", "stmt_return", "unexpected_a", "return", 28]
-
 6567.      1
-
 6568.      1            warn("unexpected_a", the_return);
-
 6569.      1        }
-
 6570.   1756        the_return.disrupt = true;
-
 6571.   1504        if (token_nxt.id !== ";" && the_return.line === token_nxt.line) {
-
 6572.   1504            the_return.expression = parse_expression(10);
-
 6573.   1504        }
-
 6574.   1756        advance(";");
-
 6575.   1756        return the_return;
-
 6576.   1756    }
-
 6577.    629
-
 6578.      5    function stmt_semicolon() {
-
 6579.      5
-
 6580.      5// test_cause:
-
 6581.      5// [";", "stmt_semicolon", "unexpected_a", ";", 1]
-
 6582.      5
-
 6583.      5        warn("unexpected_a", token_now);
-
 6584.      5        return token_now;
-
 6585.      5    }
-
 6586.    629
-
 6587.    220    function stmt_switch() {
-
 6588.    220        const the_cases = [];
-
 6589.    220        const the_switch = token_now;
-
 6590.    220        let dups = [];
-
 6591.    220        let exp;
-
 6592.    220        let last;
-
 6593.    220        let stmts;
-
 6594.    220        let the_case;
-
 6595.    220        let the_default;
-
 6596.    220        let the_disrupt = true;
-
 6597.    220        let the_last;
-
 6598.  23088        function is_dup(thing) {
-
 6599.  23088            return is_equal(thing, exp);
-
 6600.  23088        }
-
 6601.    220        check_not_top_level(the_switch);
-
 6602.      1        if (functionage.finally > 0) {
-
 6603.      1
-
 6604.      1// test_cause:
-
 6605.      1// ["
-
 6606.      1// function aa(){try{}finally{switch(0){}}}
-
 6607.      1// ", "stmt_switch", "unexpected_a", "switch", 28]
-
 6608.      1
-
 6609.      1            warn("unexpected_a", the_switch);
-
 6610.      1        }
-
 6611.    220        functionage.switch += 1;
-
 6612.    220        advance("(");
-
 6613.    220        token_now.free = true;
-
 6614.    220        the_switch.expression = parse_expression(0);
-
 6615.    220        the_switch.block = the_cases;
-
 6616.    220        advance(")");
-
 6617.    220        advance("{");
-
 6618.   1085        while (true) {
-
 6619.   1085
-
 6620.   1085// Loop through cases with breaks.
-
 6621.   1085
-
 6622.   1085            the_case = token_nxt;
-
 6623.   1085            the_case.arity = "statement";
-
 6624.   1085            the_case.expression = [];
-
 6625.   1612            while (true) {
-
 6626.   1612
-
 6627.   1612// Loop through fallthrough cases.
-
 6628.   1612
-
 6629.   1612                advance("case");
-
 6630.   1612                token_now.switch = true;
-
 6631.   1612                exp = parse_expression(0);
-
 6632.   1612                if (dups.some(is_dup)) {
-
 6633.   1612
-
 6634.   1612// test_cause:
-
 6635.   1612// ["
-
 6636.   1612// switch(0){case 0:break;case 0:break}
-
 6637.   1612// ", "stmt_switch", "unexpected_a", "0", 29]
-
 6638.   1612
-
 6639.   1612                    warn("unexpected_a", exp);
-
 6640.   1612                }
-
 6641.   1612                dups.push(exp);
-
 6642.   1612                the_case.expression.push(exp);
-
 6643.   1612                advance(":");
-
 6644.   1612                if (token_nxt.id !== "case") {
-
 6645.   1612                    break;
-
 6646.   1612                }
-
 6647.   1612            }
-
 6648.   1085
-
 6649.   1085// test_cause:
-
 6650.   1085// ["
-
 6651.   1085// switch(0){case 1:case 0:break;}
-
 6652.   1085// ", "check_ordered_case", "expected_a_b_before_c_d", "case-number", 23]
-
 6653.   1085// ["
-
 6654.   1085// switch(0){case "aa":case 0:break;}
-
 6655.   1085// ", "check_ordered_case", "expected_a_b_before_c_d", "case-number", 26]
-
 6656.   1085// ["
-
 6657.   1085// switch(0){case "bb":case "aa":break;}
-
 6658.   1085// ", "check_ordered_case", "expected_a_b_before_c_d", "aa", 26]
-
 6659.   1085// ["
-
 6660.   1085// switch(0){case aa:case "aa":break;}
-
 6661.   1085// ", "check_ordered_case", "expected_a_b_before_c_d", "aa", 24]
-
 6662.   1085// ["
-
 6663.   1085// switch(0){case bb:case aa:break;}
-
 6664.   1085// ", "check_ordered_case", "expected_a_b_before_c_d", "aa", 24]
-
 6665.   1085
-
 6666.   1085            check_ordered_case(the_case.expression);
-
 6667.   1085            stmts = parse_statements();
-
 6668.   1085            if (stmts.length < 1) {
-
 6669.   1085
-
 6670.   1085// test_cause:
-
 6671.   1085// ["
-
 6672.   1085// switch(0){case 0:default:}
-
 6673.   1085// ", "stmt_switch", "expected_statements_a", "default", 18]
-
 6674.   1085// ["switch(0){case 0:}", "stmt_switch", "expected_statements_a", "}", 18]
-
 6675.   1085
-
 6676.   1085                warn("expected_statements_a");
-
 6677.   1085
-
 6678.   1085// PR-359 - Bugfix - Fixes issue #358 - switch-statement crashes jslint.
-
 6679.   1085
-
 6680.   1085                break;
-
 6681.   1085            }
-
 6682.   1085            the_case.block = stmts;
-
 6683.   1085            the_cases.push(the_case);
-
 6684.   1085            last = stmts[stmts.length - 1];
-
 6685.   1085            if (last.disrupt) {
-
 6686.   1085                if (last.id === "break" && last.label === undefined) {
-
 6687.   1085                    the_disrupt = false;
-
 6688.   1085                }
-
 6689.   1085            } else {
-
 6690.   1085                warn("expected_a_before_b", token_nxt, "break;", artifact());
-
 6691.   1085            }
-
 6692.   1085            if (token_nxt.id !== "case") {
-
 6693.   1085                break;
-
 6694.   1085            }
-
 6695.   1085        }
-
 6696.    217
-
 6697.    217// test_cause:
-
 6698.    217// ["
-
 6699.    217// switch(0){case 1:break;case 0:break;}
-
 6700.    217// ", "check_ordered_case", "expected_a_b_before_c_d", "case-number", 29]
-
 6701.    217// ["
-
 6702.    217// switch(0){case "aa":break;case 0:break;}
-
 6703.    217// ", "check_ordered_case", "expected_a_b_before_c_d", "case-number", 32]
-
 6704.    217// ["
-
 6705.    217// switch(0){case "bb":break;case "aa":break;}
-
 6706.    217// ", "check_ordered_case", "expected_a_b_before_c_d", "aa", 32]
-
 6707.    217// ["
-
 6708.    217// switch(0){case aa:break;case "aa":break;}
-
 6709.    217// ", "check_ordered_case", "expected_a_b_before_c_d", "aa", 30]
-
 6710.    217// ["
-
 6711.    217// switch(0){case bb:break;case aa:break;}
-
 6712.    217// ", "check_ordered_case", "expected_a_b_before_c_d", "aa", 30]
-
 6713.    217
-
 6714.   1080        check_ordered_case(the_cases.map(function ({
-
 6715.   1080            expression
-
 6716.   1080        }) {
-
 6717.   1080            return expression[0];
-
 6718.   1080        }));
-
 6719.    217        dups = undefined;
-
 6720.    217        if (token_nxt.id === "default") {
-
 6721.     99            the_default = token_nxt;
-
 6722.     99            advance("default");
-
 6723.     99            token_now.switch = true;
-
 6724.     99            advance(":");
-
 6725.     99            the_switch.else = parse_statements();
-
 6726.     99            if (the_switch.else.length < 1) {
-
 6727.     99
-
 6728.     99// test_cause:
-
 6729.     99// ["
-
 6730.     99// switch(0){case 0:break;default:}
-
 6731.     99// ", "stmt_switch", "unexpected_a", "default", 24]
-
 6732.     99
-
 6733.     99                warn("unexpected_a", the_default);
-
 6734.     99                the_disrupt = false;
-
 6735.     99            } else {
-
 6736.     99                the_last = the_switch.else[
-
 6737.     99                    the_switch.else.length - 1
-
 6738.     99                ];
-
 6739.     99                if (
-
 6740.     99                    the_last.id === "break"
-
 6741.     99                    && the_last.label === undefined
-
 6742.     99                ) {
+
 6442.    642            test_cause("else");
+
 6443.    642            if (the_if.block.disrupt === true) {
+
 6444.    642                if (the_if.else.disrupt === true) {
+
 6445.    642
+
 6446.    642// test_cause:
+
 6447.    642// ["if(0){break;}else{break;}", "stmt_if", "disrupt", "", 0]
+
 6448.    642
+
 6449.    642                    test_cause("disrupt");
+
 6450.    642                    the_if.disrupt = true;
+
 6451.    642                } else {
+
 6452.    642
+
 6453.    642// test_cause:
+
 6454.    642// ["if(0){break;}else{}", "stmt_if", "unexpected_a", "else", 14]
+
 6455.    642
+
 6456.    642                    warn("unexpected_a", the_else);
+
 6457.    642                }
+
 6458.    642            }
+
 6459.   3050        }
+
 6460.   3050        return the_if;
+
 6461.   3050    }
+
 6462.    631
+
 6463.     62    function stmt_import() {
+
 6464.     62        const the_import = token_now;
+
 6465.     62        let name;
+
 6466.     62        let names;
+
 6467.     62
+
 6468.     62// PR-347 - Disable warning "unexpected_directive_a".
+
 6469.     62//
+
 6470.     62//         if (typeof state.mode_module === "object") {
+
 6471.     62//
+
 6472.     62// // test_cause:
+
 6473.     62// // ["
+
 6474.     62// // /*global aa*/
+
 6475.     62// // import aa from "aa"
+
 6476.     62// // ", "stmt_import", "unexpected_directive_a", "global", 1]
+
 6477.     62//
+
 6478.     62//             warn(
+
 6479.     62//                 "unexpected_directive_a",
+
 6480.     62//                 state.mode_module,
+
 6481.     62//                 state.mode_module.directive
+
 6482.     62//             );
+
 6483.     62//         }
+
 6484.     62
+
 6485.     62        state.mode_module = true;
+
 6486.     62
+
 6487.     62// PR-436 - Add grammar for side-effect import-statement.
+
 6488.     62
+
 6489.      1        if (token_nxt.id === "(string)") {
+
 6490.      1
+
 6491.      1// test_cause:
+
 6492.      1// ["import \"./aa.mjs\";", "stmt_import", "import_side_effect", "", 0]
+
 6493.      1
+
 6494.      1            test_cause("import_side_effect");
+
 6495.      1            warn("expected_a_b", token_nxt, "{", artifact());
+
 6496.      1            advance();
+
 6497.      1            semicolon();
+
 6498.      1            return the_import;
+
 6499.     61        }
+
 6500.     61        if (token_nxt.identifier) {
+
 6501.     57            name = token_nxt;
+
 6502.     57            advance();
+
 6503.     57            if (name.id === "ignore") {
+
 6504.     57
+
 6505.     57// test_cause:
+
 6506.     57// ["import ignore from \"aa\"", "stmt_import", "unexpected_a", "ignore", 8]
+
 6507.     57
+
 6508.     57                warn("unexpected_a", name);
+
 6509.     57            }
+
 6510.     57            enroll(name, "variable", true);
+
 6511.     57            the_import.name = name;
+
 6512.     57        } else {
+
 6513.      4            names = [];
+
 6514.      4            advance("{");
+
 6515.      4            if (token_nxt.id !== "}") {
+
 6516.      4                while (true) {
+
 6517.      4                    if (!token_nxt.identifier) {
+
 6518.      4
+
 6519.      4// test_cause:
+
 6520.      4// ["import {", "stmt_import", "expected_identifier_a", "(end)", 1]
+
 6521.      4
+
 6522.      4                        stop("expected_identifier_a");
+
 6523.      4                    }
+
 6524.      4                    name = token_nxt;
+
 6525.      4                    advance();
+
 6526.      4                    if (name.id === "ignore") {
+
 6527.      4
+
 6528.      4// test_cause:
+
 6529.      4// ["import {ignore} from \"aa\"", "stmt_import", "unexpected_a", "ignore", 9]
+
 6530.      4
+
 6531.      4                        warn("unexpected_a", name);
+
 6532.      4                    }
+
 6533.      4                    enroll(name, "variable", true);
+
 6534.      4                    names.push(name);
+
 6535.      4                    if (token_nxt.id !== ",") {
+
 6536.      4                        break;
+
 6537.      4                    }
+
 6538.      4                    advance(",");
+
 6539.      4                }
+
 6540.      4            }
+
 6541.      4            advance("}");
+
 6542.      4            the_import.name = names;
+
 6543.     60        }
+
 6544.     60        advance("from");
+
 6545.     60        advance("(string)");
+
 6546.     60        the_import.import = token_now;
+
 6547.     60        if (!jslint_rgx_module.test(token_now.value)) {
+
 6548.      1
+
 6549.      1// test_cause:
+
 6550.      1// ["import aa from \"!aa\"", "stmt_import", "bad_module_name_a", "!aa", 16]
+
 6551.      1
+
 6552.      1            warn("bad_module_name_a", token_now);
+
 6553.     60        }
+
 6554.     60        import_list.push(token_now.value);
+
 6555.     60        semicolon();
+
 6556.     60        return the_import;
+
 6557.     60    }
+
 6558.    631
+
 6559.      5    function stmt_lbrace() {
+
 6560.      5
+
 6561.      5// test_cause:
+
 6562.      5// [";{}", "stmt_lbrace", "naked_block", "{", 2]
+
 6563.      5// ["class aa{}", "stmt_lbrace", "naked_block", "{", 9]
+
 6564.      5
+
 6565.      5        warn("naked_block", token_now);
+
 6566.      5        return block("naked");
+
 6567.      5    }
+
 6568.    631
+
 6569.   1761    function stmt_return() {
+
 6570.   1761        const the_return = token_now;
+
 6571.   1761        check_not_top_level(the_return);
+
 6572.      1        if (functionage.finally > 0) {
+
 6573.      1
+
 6574.      1// test_cause:
+
 6575.      1// ["
+
 6576.      1// function aa(){try{}finally{return;}}
+
 6577.      1// ", "stmt_return", "unexpected_a", "return", 28]
+
 6578.      1
+
 6579.      1            warn("unexpected_a", the_return);
+
 6580.      1        }
+
 6581.   1761        the_return.disrupt = true;
+
 6582.   1509        if (token_nxt.id !== ";" && the_return.line === token_nxt.line) {
+
 6583.   1509            the_return.expression = parse_expression(10);
+
 6584.   1509        }
+
 6585.   1761        advance(";");
+
 6586.   1761        return the_return;
+
 6587.   1761    }
+
 6588.    631
+
 6589.      5    function stmt_semicolon() {
+
 6590.      5
+
 6591.      5// test_cause:
+
 6592.      5// [";", "stmt_semicolon", "unexpected_a", ";", 1]
+
 6593.      5
+
 6594.      5        warn("unexpected_a", token_now);
+
 6595.      5        return token_now;
+
 6596.      5    }
+
 6597.    631
+
 6598.    220    function stmt_switch() {
+
 6599.    220        const the_cases = [];
+
 6600.    220        const the_switch = token_now;
+
 6601.    220        let dups = [];
+
 6602.    220        let exp;
+
 6603.    220        let last;
+
 6604.    220        let stmts;
+
 6605.    220        let the_case;
+
 6606.    220        let the_default;
+
 6607.    220        let the_disrupt = true;
+
 6608.    220        let the_last;
+
 6609.  23088        function is_dup(thing) {
+
 6610.  23088            return is_equal(thing, exp);
+
 6611.  23088        }
+
 6612.    220        check_not_top_level(the_switch);
+
 6613.      1        if (functionage.finally > 0) {
+
 6614.      1
+
 6615.      1// test_cause:
+
 6616.      1// ["
+
 6617.      1// function aa(){try{}finally{switch(0){}}}
+
 6618.      1// ", "stmt_switch", "unexpected_a", "switch", 28]
+
 6619.      1
+
 6620.      1            warn("unexpected_a", the_switch);
+
 6621.      1        }
+
 6622.    220        functionage.switch += 1;
+
 6623.    220        advance("(");
+
 6624.    220        token_now.free = true;
+
 6625.    220        the_switch.expression = parse_expression(0);
+
 6626.    220        the_switch.block = the_cases;
+
 6627.    220        advance(")");
+
 6628.    220        advance("{");
+
 6629.   1085        while (true) {
+
 6630.   1085
+
 6631.   1085// Loop through cases with breaks.
+
 6632.   1085
+
 6633.   1085            the_case = token_nxt;
+
 6634.   1085            the_case.arity = "statement";
+
 6635.   1085            the_case.expression = [];
+
 6636.   1612            while (true) {
+
 6637.   1612
+
 6638.   1612// Loop through fallthrough cases.
+
 6639.   1612
+
 6640.   1612                advance("case");
+
 6641.   1612                token_now.switch = true;
+
 6642.   1612                exp = parse_expression(0);
+
 6643.   1612                if (dups.some(is_dup)) {
+
 6644.   1612
+
 6645.   1612// test_cause:
+
 6646.   1612// ["
+
 6647.   1612// switch(0){case 0:break;case 0:break}
+
 6648.   1612// ", "stmt_switch", "unexpected_a", "0", 29]
+
 6649.   1612
+
 6650.   1612                    warn("unexpected_a", exp);
+
 6651.   1612                }
+
 6652.   1612                dups.push(exp);
+
 6653.   1612                the_case.expression.push(exp);
+
 6654.   1612                advance(":");
+
 6655.   1612                if (token_nxt.id !== "case") {
+
 6656.   1612                    break;
+
 6657.   1612                }
+
 6658.   1612            }
+
 6659.   1085
+
 6660.   1085// test_cause:
+
 6661.   1085// ["
+
 6662.   1085// switch(0){case 1:case 0:break;}
+
 6663.   1085// ", "check_ordered_case", "expected_a_b_before_c_d", "case-number", 23]
+
 6664.   1085// ["
+
 6665.   1085// switch(0){case "aa":case 0:break;}
+
 6666.   1085// ", "check_ordered_case", "expected_a_b_before_c_d", "case-number", 26]
+
 6667.   1085// ["
+
 6668.   1085// switch(0){case "bb":case "aa":break;}
+
 6669.   1085// ", "check_ordered_case", "expected_a_b_before_c_d", "aa", 26]
+
 6670.   1085// ["
+
 6671.   1085// switch(0){case aa:case "aa":break;}
+
 6672.   1085// ", "check_ordered_case", "expected_a_b_before_c_d", "aa", 24]
+
 6673.   1085// ["
+
 6674.   1085// switch(0){case bb:case aa:break;}
+
 6675.   1085// ", "check_ordered_case", "expected_a_b_before_c_d", "aa", 24]
+
 6676.   1085
+
 6677.   1085            check_ordered_case(the_case.expression);
+
 6678.   1085            stmts = parse_statements();
+
 6679.   1085            if (stmts.length < 1) {
+
 6680.   1085
+
 6681.   1085// test_cause:
+
 6682.   1085// ["
+
 6683.   1085// switch(0){case 0:default:}
+
 6684.   1085// ", "stmt_switch", "expected_statements_a", "default", 18]
+
 6685.   1085// ["switch(0){case 0:}", "stmt_switch", "expected_statements_a", "}", 18]
+
 6686.   1085
+
 6687.   1085                warn("expected_statements_a");
+
 6688.   1085
+
 6689.   1085// PR-359 - Bugfix - Fixes issue #358 - switch-statement crashes jslint.
+
 6690.   1085
+
 6691.   1085                break;
+
 6692.   1085            }
+
 6693.   1085            the_case.block = stmts;
+
 6694.   1085            the_cases.push(the_case);
+
 6695.   1085            last = stmts[stmts.length - 1];
+
 6696.   1085            if (last.disrupt) {
+
 6697.   1085                if (last.id === "break" && last.label === undefined) {
+
 6698.   1085                    the_disrupt = false;
+
 6699.   1085                }
+
 6700.   1085            } else {
+
 6701.   1085                warn("expected_a_before_b", token_nxt, "break;", artifact());
+
 6702.   1085            }
+
 6703.   1085            if (token_nxt.id !== "case") {
+
 6704.   1085                break;
+
 6705.   1085            }
+
 6706.   1085        }
+
 6707.    217
+
 6708.    217// test_cause:
+
 6709.    217// ["
+
 6710.    217// switch(0){case 1:break;case 0:break;}
+
 6711.    217// ", "check_ordered_case", "expected_a_b_before_c_d", "case-number", 29]
+
 6712.    217// ["
+
 6713.    217// switch(0){case "aa":break;case 0:break;}
+
 6714.    217// ", "check_ordered_case", "expected_a_b_before_c_d", "case-number", 32]
+
 6715.    217// ["
+
 6716.    217// switch(0){case "bb":break;case "aa":break;}
+
 6717.    217// ", "check_ordered_case", "expected_a_b_before_c_d", "aa", 32]
+
 6718.    217// ["
+
 6719.    217// switch(0){case aa:break;case "aa":break;}
+
 6720.    217// ", "check_ordered_case", "expected_a_b_before_c_d", "aa", 30]
+
 6721.    217// ["
+
 6722.    217// switch(0){case bb:break;case aa:break;}
+
 6723.    217// ", "check_ordered_case", "expected_a_b_before_c_d", "aa", 30]
+
 6724.    217
+
 6725.   1080        check_ordered_case(the_cases.map(function ({
+
 6726.   1080            expression
+
 6727.   1080        }) {
+
 6728.   1080            return expression[0];
+
 6729.   1080        }));
+
 6730.    217        dups = undefined;
+
 6731.    217        if (token_nxt.id === "default") {
+
 6732.     99            the_default = token_nxt;
+
 6733.     99            advance("default");
+
 6734.     99            token_now.switch = true;
+
 6735.     99            advance(":");
+
 6736.     99            the_switch.else = parse_statements();
+
 6737.     99            if (the_switch.else.length < 1) {
+
 6738.     99
+
 6739.     99// test_cause:
+
 6740.     99// ["
+
 6741.     99// switch(0){case 0:break;default:}
+
 6742.     99// ", "stmt_switch", "unexpected_a", "default", 24]
 6743.     99
-
 6744.     99// test_cause:
-
 6745.     99// ["
-
 6746.     99// switch(0){case 0:break;default:break;}
-
 6747.     99// ", "stmt_switch", "unexpected_a", "break", 32]
-
 6748.     99
-
 6749.     99                    warn("unexpected_a", the_last);
-
 6750.     99                    the_last.disrupt = false;
-
 6751.     99                }
-
 6752.     99                the_disrupt = the_disrupt && the_last.disrupt;
-
 6753.     99            }
-
 6754.    118        } else {
-
 6755.    118            the_disrupt = false;
-
 6756.    217        }
-
 6757.    217        advance("}", the_switch);
-
 6758.    217        functionage.switch -= 1;
-
 6759.    217        the_switch.disrupt = the_disrupt;
-
 6760.    217        return the_switch;
-
 6761.    217    }
-
 6762.    629
-
 6763.     40    function stmt_throw() {
-
 6764.     40        const the_throw = token_now;
-
 6765.     40        the_throw.disrupt = true;
-
 6766.     40        the_throw.expression = parse_expression(10);
-
 6767.     40        semicolon();
-
 6768.      1        if (functionage.try > 0) {
-
 6769.      1
-
 6770.      1// test_cause:
-
 6771.      1// ["try{throw 0}catch(){}", "stmt_throw", "unexpected_a", "throw", 5]
-
 6772.      1
-
 6773.      1            warn("unexpected_a", the_throw);
-
 6774.      1        }
-
 6775.     40        return the_throw;
-
 6776.     40    }
-
 6777.    629
-
 6778.     62    function stmt_try() {
-
 6779.     62        const the_try = token_now;
-
 6780.     62        let ignored;
-
 6781.     62        let the_catch;
-
 6782.     62        let the_disrupt;
-
 6783.      1        if (functionage.try > 0) {
-
 6784.      1
-
 6785.      1// test_cause:
-
 6786.      1// ["try{try{}catch(){}}catch(){}", "stmt_try", "unexpected_a", "try", 5]
-
 6787.      1
-
 6788.      1            warn("unexpected_a", the_try);
-
 6789.      1        }
-
 6790.     62        functionage.try += 1;
-
 6791.     62        the_try.block = block();
-
 6792.     62        the_disrupt = the_try.block.disrupt;
-
 6793.     57        if (token_nxt.id === "catch") {
-
 6794.     57            ignored = "ignore";
-
 6795.     57            the_catch = token_nxt;
-
 6796.     57            the_try.catch = the_catch;
-
 6797.     57            advance("catch");
-
 6798.     57
-
 6799.     57// Create new catch-scope for catch-parameter.
-
 6800.     57
-
 6801.     57            catch_stack.push(catchage);
-
 6802.     57            catchage = the_catch;
-
 6803.     57            catch_list.push(catchage);
-
 6804.     57            the_catch.context = empty();
-
 6805.     57            if (token_nxt.id === "(") {
-
 6806.     57                advance("(");
-
 6807.     57                if (!token_nxt.identifier) {
-
 6808.     57
-
 6809.     57// test_cause:
-
 6810.     57// ["try{}catch(){}", "stmt_try", "expected_identifier_a", ")", 12]
+
 6744.     99                warn("unexpected_a", the_default);
+
 6745.     99                the_disrupt = false;
+
 6746.     99            } else {
+
 6747.     99                the_last = the_switch.else[
+
 6748.     99                    the_switch.else.length - 1
+
 6749.     99                ];
+
 6750.     99                if (
+
 6751.     99                    the_last.id === "break"
+
 6752.     99                    && the_last.label === undefined
+
 6753.     99                ) {
+
 6754.     99
+
 6755.     99// test_cause:
+
 6756.     99// ["
+
 6757.     99// switch(0){case 0:break;default:break;}
+
 6758.     99// ", "stmt_switch", "unexpected_a", "break", 32]
+
 6759.     99
+
 6760.     99                    warn("unexpected_a", the_last);
+
 6761.     99                    the_last.disrupt = false;
+
 6762.     99                }
+
 6763.     99                the_disrupt = the_disrupt && the_last.disrupt;
+
 6764.     99            }
+
 6765.    118        } else {
+
 6766.    118            the_disrupt = false;
+
 6767.    217        }
+
 6768.    217        advance("}", the_switch);
+
 6769.    217        functionage.switch -= 1;
+
 6770.    217        the_switch.disrupt = the_disrupt;
+
 6771.    217        return the_switch;
+
 6772.    217    }
+
 6773.    631
+
 6774.     40    function stmt_throw() {
+
 6775.     40        const the_throw = token_now;
+
 6776.     40        the_throw.disrupt = true;
+
 6777.     40        the_throw.expression = parse_expression(10);
+
 6778.     40        semicolon();
+
 6779.      1        if (functionage.try > 0) {
+
 6780.      1
+
 6781.      1// test_cause:
+
 6782.      1// ["try{throw 0}catch(){}", "stmt_throw", "unexpected_a", "throw", 5]
+
 6783.      1
+
 6784.      1            warn("unexpected_a", the_throw);
+
 6785.      1        }
+
 6786.     40        return the_throw;
+
 6787.     40    }
+
 6788.    631
+
 6789.     62    function stmt_try() {
+
 6790.     62        const the_try = token_now;
+
 6791.     62        let ignored;
+
 6792.     62        let the_catch;
+
 6793.     62        let the_disrupt;
+
 6794.      1        if (functionage.try > 0) {
+
 6795.      1
+
 6796.      1// test_cause:
+
 6797.      1// ["try{try{}catch(){}}catch(){}", "stmt_try", "unexpected_a", "try", 5]
+
 6798.      1
+
 6799.      1            warn("unexpected_a", the_try);
+
 6800.      1        }
+
 6801.     62        functionage.try += 1;
+
 6802.     62        the_try.block = block();
+
 6803.     62        the_disrupt = the_try.block.disrupt;
+
 6804.     57        if (token_nxt.id === "catch") {
+
 6805.     57            ignored = "ignore";
+
 6806.     57            the_catch = token_nxt;
+
 6807.     57            the_try.catch = the_catch;
+
 6808.     57            advance("catch");
+
 6809.     57
+
 6810.     57// Create new catch-scope for catch-parameter.
 6811.     57
-
 6812.     57                    return stop("expected_identifier_a");
-
 6813.     57                }
-
 6814.     57                if (token_nxt.id !== "ignore") {
-
 6815.     57                    ignored = undefined;
-
 6816.     57                    the_catch.name = token_nxt;
-
 6817.     57                    enroll(token_nxt, "exception", true);
-
 6818.     57                }
-
 6819.     57                advance();
-
 6820.     57                advance(")");
-
 6821.     57            }
-
 6822.     57            the_catch.block = block(ignored);
-
 6823.     57            if (the_catch.block.disrupt !== true) {
-
 6824.     57                the_disrupt = false;
-
 6825.     57            }
-
 6826.     57
-
 6827.     57// Restore previous catch-scope after catch-block.
-
 6828.     57
-
 6829.     57            catchage = catch_stack.pop();
-
 6830.     57
-
 6831.     57// PR-404 - Relax warning about missing `catch` in `try...finally` statement.
-
 6832.     57//
-
 6833.     57//         } else {
-
 6834.     57//
-
 6835.     57// // test_cause:
-
 6836.     57// // ["try{}finally{break;}", "stmt_try", "expected_a_before_b", "finally", 6]
-
 6837.     57//
-
 6838.     57//             warn("expected_a_before_b", token_nxt, "catch", artifact());
+
 6812.     57            catch_stack.push(catchage);
+
 6813.     57            catchage = the_catch;
+
 6814.     57            catch_list.push(catchage);
+
 6815.     57            the_catch.context = empty();
+
 6816.     57            if (token_nxt.id === "(") {
+
 6817.     57                advance("(");
+
 6818.     57                if (!token_nxt.identifier) {
+
 6819.     57
+
 6820.     57// test_cause:
+
 6821.     57// ["try{}catch(){}", "stmt_try", "expected_identifier_a", ")", 12]
+
 6822.     57
+
 6823.     57                    return stop("expected_identifier_a");
+
 6824.     57                }
+
 6825.     57                if (token_nxt.id !== "ignore") {
+
 6826.     57                    ignored = undefined;
+
 6827.     57                    the_catch.name = token_nxt;
+
 6828.     57                    enroll(token_nxt, "exception", true);
+
 6829.     57                }
+
 6830.     57                advance();
+
 6831.     57                advance(")");
+
 6832.     57            }
+
 6833.     57            the_catch.block = block(ignored);
+
 6834.     57            if (the_catch.block.disrupt !== true) {
+
 6835.     57                the_disrupt = false;
+
 6836.     57            }
+
 6837.     57
+
 6838.     57// Restore previous catch-scope after catch-block.
 6839.     57
-
 6840.     58        }
-
 6841.     58        if (token_nxt.id === "finally") {
-
 6842.      4            functionage.finally += 1;
-
 6843.      4            advance("finally");
-
 6844.      4            the_try.else = block();
-
 6845.      4            the_disrupt = the_try.else.disrupt;
-
 6846.      4            functionage.finally -= 1;
-
 6847.     56        }
-
 6848.     56        the_try.disrupt = the_disrupt;
-
 6849.     56        functionage.try -= 1;
-
 6850.     56        return the_try;
-
 6851.     56    }
-
 6852.    629
-
 6853.   2334    function stmt_var() {
-
 6854.   2334        let ellipsis;
-
 6855.   2334        let mode_const;
-
 6856.   2334        let name;
-
 6857.   2334        let the_brace;
-
 6858.   2334        let the_bracket;
-
 6859.   2334        let the_variable = token_now;
-
 6860.   2334        let variable_prv;
-
 6861.   2334        mode_const = the_variable.id === "const";
-
 6862.   2334        the_variable.names = [];
-
 6863.   2334
-
 6864.   2334// A program may use var or let, but not both.
-
 6865.   2334
-
 6866.   2058        if (!mode_const) {
-
 6867.   2058            if (mode_var === undefined) {
-
 6868.   2058                mode_var = the_variable.id;
-
 6869.   2058            } else if (the_variable.id !== mode_var) {
-
 6870.   2058
-
 6871.   2058// test_cause:
-
 6872.   2058// ["let aa;var aa", "stmt_var", "expected_a_b", "var", 8]
-
 6873.   2058
-
 6874.   2058                warn("expected_a_b", the_variable, mode_var, the_variable.id);
-
 6875.   2058            }
-
 6876.   2058        }
-
 6877.   2334
-
 6878.   2334// We don't expect to see variables created in switch statements.
-
 6879.   2334
-
 6880.      1        if (functionage.switch > 0) {
-
 6881.      1
-
 6882.      1// test_cause:
-
 6883.      1// ["switch(0){case 0:var aa}", "stmt_var", "var_switch", "var", 18]
-
 6884.      1
-
 6885.      1            warn("var_switch", the_variable);
-
 6886.      1        }
-
 6887.   2334        switch (
-
 6888.   2334            Boolean(functionage.statement_prv)
-
 6889.   1449            && functionage.statement_prv.id
-
 6890.   2334        ) {
-
 6891.    107        case "const":
-
 6892.   1437        case "let":
-
 6893.   1439        case "var":
-
 6894.   1439
-
 6895.   1439// test_cause:
-
 6896.   1439// ["const aa=0;const bb=0;", "stmt_var", "var_prv", "const", 0]
-
 6897.   1439// ["let aa=0;let bb=0;", "stmt_var", "var_prv", "let", 0]
-
 6898.   1439// ["var aa=0;var bb=0;", "stmt_var", "var_prv", "var", 0]
-
 6899.   1439
-
 6900.   1439            test_cause("var_prv", functionage.statement_prv.id);
-
 6901.   1439            variable_prv = functionage.statement_prv;
-
 6902.   1439            break;
-
 6903.      3        case "import":
-
 6904.      3
-
 6905.      3// test_cause:
-
 6906.      3// ["import aa from \"aa\";\nlet bb=0;", "stmt_var", "import_prv", "", 0]
-
 6907.      3
-
 6908.      3            test_cause("import_prv");
-
 6909.      3            break;
-
 6910.    885        case false:
-
 6911.    885            break;
-
 6912.      7        default:
-
 6913.      7            if (
-
 6914.      7                (option_dict.beta && !option_dict.variable)
-
 6915.      7                || the_variable.id === "var"
-
 6916.      7            ) {
-
 6917.      7
-
 6918.      7// test_cause:
-
 6919.      7// ["console.log();let aa=0;", "stmt_var", "var_on_top", "let", 15]
-
 6920.      7// ["console.log();var aa=0;", "stmt_var", "var_on_top", "var", 15]
-
 6921.      7// ["try{aa();}catch(aa){var aa=0;}", "stmt_var", "var_on_top", "var", 21]
-
 6922.      7// ["while(0){var aa;}", "stmt_var", "var_on_top", "var", 10]
-
 6923.      7
-
 6924.      7                warn("var_on_top", token_now);
-
 6925.      7            }
-
 6926.   2334        }
-
 6927.   2335        while (true) {
-
 6928.   2335            if (token_nxt.id === "{") {
-
 6929.   2335                if (the_variable.id === "var") {
-
 6930.   2335
-
 6931.   2335// test_cause:
-
 6932.   2335// ["var{aa}=0", "stmt_var", "unexpected_a", "var", 1]
-
 6933.   2335
-
 6934.   2335                    warn("unexpected_a", the_variable);
-
 6935.   2335                }
-
 6936.   2335                the_brace = token_nxt;
-
 6937.   2335                advance("{");
-
 6938.   2335                while (true) {
-
 6939.   2335                    name = token_nxt;
-
 6940.   2335                    if (!name.identifier) {
+
 6840.     57            catchage = catch_stack.pop();
+
 6841.     57
+
 6842.     57// PR-404 - Relax warning about missing `catch` in `try...finally` statement.
+
 6843.     57//
+
 6844.     57//         } else {
+
 6845.     57//
+
 6846.     57// // test_cause:
+
 6847.     57// // ["try{}finally{break;}", "stmt_try", "expected_a_before_b", "finally", 6]
+
 6848.     57//
+
 6849.     57//             warn("expected_a_before_b", token_nxt, "catch", artifact());
+
 6850.     57
+
 6851.     58        }
+
 6852.     58        if (token_nxt.id === "finally") {
+
 6853.      4            functionage.finally += 1;
+
 6854.      4            advance("finally");
+
 6855.      4            the_try.else = block();
+
 6856.      4            the_disrupt = the_try.else.disrupt;
+
 6857.      4            functionage.finally -= 1;
+
 6858.     56        }
+
 6859.     56        the_try.disrupt = the_disrupt;
+
 6860.     56        functionage.try -= 1;
+
 6861.     56        return the_try;
+
 6862.     56    }
+
 6863.    631
+
 6864.   2334    function stmt_var() {
+
 6865.   2334        let ellipsis;
+
 6866.   2334        let mode_const;
+
 6867.   2334        let name;
+
 6868.   2334        let the_brace;
+
 6869.   2334        let the_bracket;
+
 6870.   2334        let the_variable = token_now;
+
 6871.   2334        let variable_prv;
+
 6872.   2334        mode_const = the_variable.id === "const";
+
 6873.   2334        the_variable.names = [];
+
 6874.   2334
+
 6875.   2334// A program may use var or let, but not both.
+
 6876.   2334
+
 6877.   2058        if (!mode_const) {
+
 6878.   2058            if (mode_var === undefined) {
+
 6879.   2058                mode_var = the_variable.id;
+
 6880.   2058            } else if (the_variable.id !== mode_var) {
+
 6881.   2058
+
 6882.   2058// test_cause:
+
 6883.   2058// ["let aa;var aa", "stmt_var", "expected_a_b", "var", 8]
+
 6884.   2058
+
 6885.   2058                warn("expected_a_b", the_variable, mode_var, the_variable.id);
+
 6886.   2058            }
+
 6887.   2058        }
+
 6888.   2334
+
 6889.   2334// We don't expect to see variables created in switch statements.
+
 6890.   2334
+
 6891.      1        if (functionage.switch > 0) {
+
 6892.      1
+
 6893.      1// test_cause:
+
 6894.      1// ["switch(0){case 0:var aa}", "stmt_var", "var_switch", "var", 18]
+
 6895.      1
+
 6896.      1            warn("var_switch", the_variable);
+
 6897.      1        }
+
 6898.   2334        switch (
+
 6899.   2334            Boolean(functionage.statement_prv)
+
 6900.   1449            && functionage.statement_prv.id
+
 6901.   2334        ) {
+
 6902.    107        case "const":
+
 6903.   1437        case "let":
+
 6904.   1439        case "var":
+
 6905.   1439
+
 6906.   1439// test_cause:
+
 6907.   1439// ["const aa=0;const bb=0;", "stmt_var", "var_prv", "const", 0]
+
 6908.   1439// ["let aa=0;let bb=0;", "stmt_var", "var_prv", "let", 0]
+
 6909.   1439// ["var aa=0;var bb=0;", "stmt_var", "var_prv", "var", 0]
+
 6910.   1439
+
 6911.   1439            test_cause("var_prv", functionage.statement_prv.id);
+
 6912.   1439            variable_prv = functionage.statement_prv;
+
 6913.   1439            break;
+
 6914.      3        case "import":
+
 6915.      3
+
 6916.      3// test_cause:
+
 6917.      3// ["import aa from \"aa\";\nlet bb=0;", "stmt_var", "import_prv", "", 0]
+
 6918.      3
+
 6919.      3            test_cause("import_prv");
+
 6920.      3            break;
+
 6921.    885        case false:
+
 6922.    885            break;
+
 6923.      7        default:
+
 6924.      7            if (
+
 6925.      7                (option_dict.beta && !option_dict.variable)
+
 6926.      7                || the_variable.id === "var"
+
 6927.      7            ) {
+
 6928.      7
+
 6929.      7// test_cause:
+
 6930.      7// ["console.log();let aa=0;", "stmt_var", "var_on_top", "let", 15]
+
 6931.      7// ["console.log();var aa=0;", "stmt_var", "var_on_top", "var", 15]
+
 6932.      7// ["try{aa();}catch(aa){var aa=0;}", "stmt_var", "var_on_top", "var", 21]
+
 6933.      7// ["while(0){var aa;}", "stmt_var", "var_on_top", "var", 10]
+
 6934.      7
+
 6935.      7                warn("var_on_top", token_now);
+
 6936.      7            }
+
 6937.   2334        }
+
 6938.   2335        while (true) {
+
 6939.   2335            if (token_nxt.id === "{") {
+
 6940.   2335                if (the_variable.id === "var") {
 6941.   2335
 6942.   2335// test_cause:
-
 6943.   2335// ["let {0}", "stmt_var", "expected_identifier_a", "0", 6]
+
 6943.   2335// ["var{aa}=0", "stmt_var", "unexpected_a", "var", 1]
 6944.   2335
-
 6945.   2335                        return stop("expected_identifier_a");
-
 6946.   2335                    }
-
 6947.   2335                    survey(name);
-
 6948.   2335                    advance();
-
 6949.   2335                    if (token_nxt.id === ":") {
-
 6950.   2335                        advance(":");
-
 6951.   2335                        if (!token_nxt.identifier) {
+
 6945.   2335                    warn("unexpected_a", the_variable);
+
 6946.   2335                }
+
 6947.   2335                the_brace = token_nxt;
+
 6948.   2335                advance("{");
+
 6949.   2335                while (true) {
+
 6950.   2335                    name = token_nxt;
+
 6951.   2335                    if (!name.identifier) {
 6952.   2335
 6953.   2335// test_cause:
-
 6954.   2335// ["let {aa:0}", "stmt_var", "expected_identifier_a", "0", 9]
-
 6955.   2335// ["let {aa:{aa}}", "stmt_var", "expected_identifier_a", "{", 9]
-
 6956.   2335
-
 6957.   2335                            return stop("expected_identifier_a");
-
 6958.   2335                        }
-
 6959.   2335
-
 6960.   2335// PR-363 - Bugfix
-
 6961.   2335// Add test against false-warning <uninitialized 'bb'> in code
-
 6962.   2335// '/*jslint node*/\nlet {aa:bb} = {}; bb();'.
-
 6963.   2335//
-
 6964.   2335//                         token_nxt.label = name;
-
 6965.   2335//                         the_variable.names.push(token_nxt);
-
 6966.   2335//                         enroll(token_nxt, "variable", mode_const);
+
 6954.   2335// ["let {0}", "stmt_var", "expected_identifier_a", "0", 6]
+
 6955.   2335
+
 6956.   2335                        return stop("expected_identifier_a");
+
 6957.   2335                    }
+
 6958.   2335                    survey(name);
+
 6959.   2335                    advance();
+
 6960.   2335                    if (token_nxt.id === ":") {
+
 6961.   2335                        advance(":");
+
 6962.   2335                        if (!token_nxt.identifier) {
+
 6963.   2335
+
 6964.   2335// test_cause:
+
 6965.   2335// ["let {aa:0}", "stmt_var", "expected_identifier_a", "0", 9]
+
 6966.   2335// ["let {aa:{aa}}", "stmt_var", "expected_identifier_a", "{", 9]
 6967.   2335
-
 6968.   2335                        name = token_nxt;
-
 6969.   2335                        the_variable.names.push(name);
-
 6970.   2335                        survey(name);
-
 6971.   2335                        enroll(name, "variable", mode_const);
-
 6972.   2335
-
 6973.   2335                        advance();
-
 6974.   2335                        the_brace.open = true;
-
 6975.   2335                    } else {
-
 6976.   2335                        the_variable.names.push(name);
-
 6977.   2335                        enroll(name, "variable", mode_const);
-
 6978.   2335                    }
-
 6979.   2335                    name.dead = false;
-
 6980.   2335                    name.init = true;
-
 6981.   2335                    if (token_nxt.id === "=") {
-
 6982.   2335
-
 6983.   2335// test_cause:
-
 6984.   2335// ["let {aa=0}", "stmt_var", "assign", "", 0]
-
 6985.   2335
-
 6986.   2335                        test_cause("assign");
-
 6987.   2335                        advance("=");
-
 6988.   2335                        name.expression = parse_expression();
-
 6989.   2335                        the_brace.open = true;
-
 6990.   2335                    }
-
 6991.   2335                    if (token_nxt.id !== ",") {
-
 6992.   2335                        break;
-
 6993.   2335                    }
-
 6994.   2335                    advance(",");
-
 6995.   2335                }
+
 6968.   2335                            return stop("expected_identifier_a");
+
 6969.   2335                        }
+
 6970.   2335
+
 6971.   2335// PR-363 - Bugfix
+
 6972.   2335// Add test against false-warning <uninitialized 'bb'> in code
+
 6973.   2335// '/*jslint node*/\nlet {aa:bb} = {}; bb();'.
+
 6974.   2335//
+
 6975.   2335//                         token_nxt.label = name;
+
 6976.   2335//                         the_variable.names.push(token_nxt);
+
 6977.   2335//                         enroll(token_nxt, "variable", mode_const);
+
 6978.   2335
+
 6979.   2335                        name = token_nxt;
+
 6980.   2335                        the_variable.names.push(name);
+
 6981.   2335                        survey(name);
+
 6982.   2335                        enroll(name, "variable", mode_const);
+
 6983.   2335
+
 6984.   2335                        advance();
+
 6985.   2335                        the_brace.open = true;
+
 6986.   2335                    } else {
+
 6987.   2335                        the_variable.names.push(name);
+
 6988.   2335                        enroll(name, "variable", mode_const);
+
 6989.   2335                    }
+
 6990.   2335                    name.dead = false;
+
 6991.   2335                    name.init = true;
+
 6992.   2335                    if (token_nxt.id === "=") {
+
 6993.   2335
+
 6994.   2335// test_cause:
+
 6995.   2335// ["let {aa=0}", "stmt_var", "assign", "", 0]
 6996.   2335
-
 6997.   2335// test_cause:
-
 6998.   2335// ["let{bb,aa}", "check_ordered", "expected_a_b_before_c_d", "aa", 8]
-
 6999.   2335
-
 7000.   2335                check_ordered(the_variable.id, the_variable.names);
-
 7001.   2335                advance("}");
-
 7002.   2335                advance("=");
-
 7003.   2335                the_variable.expression = parse_expression(0);
-
 7004.   2335            } else if (token_nxt.id === "[") {
-
 7005.   2335                if (the_variable.id === "var") {
-
 7006.   2335
-
 7007.   2335// test_cause:
-
 7008.   2335// ["var[aa]=0", "stmt_var", "unexpected_a", "var", 1]
-
 7009.   2335
-
 7010.   2335                    warn("unexpected_a", the_variable);
-
 7011.   2335                }
-
 7012.   2335                the_bracket = token_nxt;
-
 7013.   2335                advance("[");
-
 7014.   2335                while (true) {
-
 7015.   2335                    ellipsis = false;
-
 7016.   2335                    if (token_nxt.id === "...") {
-
 7017.   2335                        ellipsis = true;
-
 7018.   2335                        advance("...");
-
 7019.   2335                    }
-
 7020.   2335                    if (!token_nxt.identifier) {
-
 7021.   2335
-
 7022.   2335// test_cause:
-
 7023.   2335// ["let[]", "stmt_var", "expected_identifier_a", "]", 5]
-
 7024.   2335
-
 7025.   2335                        return stop("expected_identifier_a");
-
 7026.   2335                    }
-
 7027.   2335                    name = token_nxt;
-
 7028.   2335                    advance();
-
 7029.   2335                    the_variable.names.push(name);
-
 7030.   2335                    enroll(name, "variable", mode_const);
-
 7031.   2335                    name.dead = false;
-
 7032.   2335                    name.init = true;
-
 7033.   2335                    if (ellipsis) {
-
 7034.   2335                        name.ellipsis = true;
-
 7035.   2335                        break;
-
 7036.   2335                    }
-
 7037.   2335                    if (token_nxt.id === "=") {
-
 7038.   2335                        advance("=");
-
 7039.   2335                        name.expression = parse_expression();
-
 7040.   2335                        the_bracket.open = true;
-
 7041.   2335                    }
-
 7042.   2335                    if (token_nxt.id !== ",") {
-
 7043.   2335                        break;
-
 7044.   2335                    }
-
 7045.   2335                    advance(",");
-
 7046.   2335                }
-
 7047.   2335                advance("]");
-
 7048.   2335                advance("=");
-
 7049.   2335                the_variable.expression = parse_expression(0);
-
 7050.   2335            } else if (token_nxt.identifier) {
-
 7051.   2335                name = token_nxt;
-
 7052.   2335                advance();
-
 7053.   2335                if (name.id === "ignore") {
-
 7054.   2335
-
 7055.   2335// test_cause:
-
 7056.   2335// ["
-
 7057.   2335// let ignore;function aa(ignore) {}
-
 7058.   2335// ", "stmt_var", "unexpected_a", "ignore", 5]
-
 7059.   2335
-
 7060.   2335                    warn("unexpected_a", name);
-
 7061.   2335                }
-
 7062.   2335                enroll(name, "variable", mode_const);
-
 7063.   2335                if (token_nxt.id === "=" || mode_const) {
-
 7064.   2335                    advance("=");
-
 7065.   2335                    name.dead = false;
-
 7066.   2335                    name.init = true;
-
 7067.   2335                    name.expression = parse_expression(0);
-
 7068.   2335                }
-
 7069.   2335                the_variable.names.push(name);
-
 7070.   2335            } else {
-
 7071.   2335
-
 7072.   2335// test_cause:
-
 7073.   2335// ["let 0", "stmt_var", "expected_identifier_a", "0", 5]
-
 7074.   2335// ["var{aa:{aa}}", "stmt_var", "expected_identifier_a", "{", 8]
-
 7075.   2335
-
 7076.   2335                return stop("expected_identifier_a");
-
 7077.   2335            }
-
 7078.   2335            if (token_nxt.id !== ",") {
-
 7079.   2335                break;
-
 7080.   2335            }
-
 7081.   2335
-
 7082.   2335// test_cause:
-
 7083.   2335// ["let aa,bb;", "stmt_var", "expected_a_b", ",", 7]
-
 7084.   2335
-
 7085.   2335            warn("expected_a_b", token_nxt, ";", ",");
-
 7086.   2335            advance(",");
-
 7087.   2335        }
-
 7088.   2320
-
 7089.   2320// Warn if variable declarations are unordered.
-
 7090.   2320
-
 7091.   2320        if (
-
 7092.   2320            option_dict.beta
-
 7093.   2320            && !option_dict.unordered
-
 7094.   2315            && !option_dict.variable
-
 7095.   2309            && variable_prv
-
 7096.   1437            && (
-
 7097.   1437                variable_prv.id + " " + variable_prv.names[0].id
-
 7098.   1437                > the_variable.id + " " + the_variable.names[0].id
-
 7099.   1437            )
-
 7100.      3        ) {
-
 7101.      3
-
 7102.      3// test_cause:
-
 7103.      3// ["const bb=0;const aa=0;", "stmt_var", "expected_a_b_before_c_d", "aa", 12]
-
 7104.      3// ["let bb;let aa;", "stmt_var", "expected_a_b_before_c_d", "aa", 8]
-
 7105.      3// ["var bb;var aa;", "stmt_var", "expected_a_b_before_c_d", "aa", 8]
-
 7106.      3
-
 7107.      3            warn(
-
 7108.      3                "expected_a_b_before_c_d",
-
 7109.      3                the_variable,
-
 7110.      3                the_variable.id,
-
 7111.      3                the_variable.names[0].id,
-
 7112.      3                variable_prv.id,
-
 7113.      3                variable_prv.names[0].id
-
 7114.      3            );
-
 7115.   2320        }
-
 7116.   2320        semicolon();
-
 7117.   2320        return the_variable;
-
 7118.   2320    }
-
 7119.    629
-
 7120.    208    function stmt_while() {
-
 7121.    208        const the_while = token_now;
-
 7122.    208        check_not_top_level(the_while);
-
 7123.    208        functionage.loop += 1;
-
 7124.    208        the_while.expression = condition();
-
 7125.    208        the_while.block = block();
-
 7126.      1        if (the_while.block.disrupt === true) {
-
 7127.      1
-
 7128.      1// test_cause:
-
 7129.      1// ["function aa(){while(0){break;}}", "stmt_while", "weird_loop", "while", 15]
-
 7130.      1
-
 7131.      1            warn("weird_loop", the_while);
-
 7132.    205        }
-
 7133.    205        functionage.loop -= 1;
-
 7134.    205        return the_while;
-
 7135.    205    }
-
 7136.    629
-
 7137.      1    function stmt_with() {
+
 6997.   2335                        test_cause("assign");
+
 6998.   2335                        advance("=");
+
 6999.   2335                        name.expression = parse_expression();
+
 7000.   2335                        the_brace.open = true;
+
 7001.   2335                    }
+
 7002.   2335                    if (token_nxt.id !== ",") {
+
 7003.   2335                        break;
+
 7004.   2335                    }
+
 7005.   2335                    advance(",");
+
 7006.   2335                }
+
 7007.   2335
+
 7008.   2335// test_cause:
+
 7009.   2335// ["let{bb,aa}", "check_ordered", "expected_a_b_before_c_d", "aa", 8]
+
 7010.   2335
+
 7011.   2335                check_ordered(the_variable.id, the_variable.names);
+
 7012.   2335                advance("}");
+
 7013.   2335                advance("=");
+
 7014.   2335                the_variable.expression = parse_expression(0);
+
 7015.   2335            } else if (token_nxt.id === "[") {
+
 7016.   2335                if (the_variable.id === "var") {
+
 7017.   2335
+
 7018.   2335// test_cause:
+
 7019.   2335// ["var[aa]=0", "stmt_var", "unexpected_a", "var", 1]
+
 7020.   2335
+
 7021.   2335                    warn("unexpected_a", the_variable);
+
 7022.   2335                }
+
 7023.   2335                the_bracket = token_nxt;
+
 7024.   2335                advance("[");
+
 7025.   2335                while (true) {
+
 7026.   2335                    ellipsis = false;
+
 7027.   2335                    if (token_nxt.id === "...") {
+
 7028.   2335                        ellipsis = true;
+
 7029.   2335                        advance("...");
+
 7030.   2335                    }
+
 7031.   2335                    if (!token_nxt.identifier) {
+
 7032.   2335
+
 7033.   2335// test_cause:
+
 7034.   2335// ["let[]", "stmt_var", "expected_identifier_a", "]", 5]
+
 7035.   2335
+
 7036.   2335                        return stop("expected_identifier_a");
+
 7037.   2335                    }
+
 7038.   2335                    name = token_nxt;
+
 7039.   2335                    advance();
+
 7040.   2335                    the_variable.names.push(name);
+
 7041.   2335                    enroll(name, "variable", mode_const);
+
 7042.   2335                    name.dead = false;
+
 7043.   2335                    name.init = true;
+
 7044.   2335                    if (ellipsis) {
+
 7045.   2335                        name.ellipsis = true;
+
 7046.   2335                        break;
+
 7047.   2335                    }
+
 7048.   2335                    if (token_nxt.id === "=") {
+
 7049.   2335                        advance("=");
+
 7050.   2335                        name.expression = parse_expression();
+
 7051.   2335                        the_bracket.open = true;
+
 7052.   2335                    }
+
 7053.   2335                    if (token_nxt.id !== ",") {
+
 7054.   2335                        break;
+
 7055.   2335                    }
+
 7056.   2335                    advance(",");
+
 7057.   2335                }
+
 7058.   2335                advance("]");
+
 7059.   2335                advance("=");
+
 7060.   2335                the_variable.expression = parse_expression(0);
+
 7061.   2335            } else if (token_nxt.identifier) {
+
 7062.   2335                name = token_nxt;
+
 7063.   2335                advance();
+
 7064.   2335                if (name.id === "ignore") {
+
 7065.   2335
+
 7066.   2335// test_cause:
+
 7067.   2335// ["
+
 7068.   2335// let ignore;function aa(ignore) {}
+
 7069.   2335// ", "stmt_var", "unexpected_a", "ignore", 5]
+
 7070.   2335
+
 7071.   2335                    warn("unexpected_a", name);
+
 7072.   2335                }
+
 7073.   2335                enroll(name, "variable", mode_const);
+
 7074.   2335                if (token_nxt.id === "=" || mode_const) {
+
 7075.   2335                    advance("=");
+
 7076.   2335                    name.dead = false;
+
 7077.   2335                    name.init = true;
+
 7078.   2335                    name.expression = parse_expression(0);
+
 7079.   2335                }
+
 7080.   2335                the_variable.names.push(name);
+
 7081.   2335            } else {
+
 7082.   2335
+
 7083.   2335// test_cause:
+
 7084.   2335// ["let 0", "stmt_var", "expected_identifier_a", "0", 5]
+
 7085.   2335// ["var{aa:{aa}}", "stmt_var", "expected_identifier_a", "{", 8]
+
 7086.   2335
+
 7087.   2335                return stop("expected_identifier_a");
+
 7088.   2335            }
+
 7089.   2335            if (token_nxt.id !== ",") {
+
 7090.   2335                break;
+
 7091.   2335            }
+
 7092.   2335
+
 7093.   2335// test_cause:
+
 7094.   2335// ["let aa,bb;", "stmt_var", "expected_a_b", ",", 7]
+
 7095.   2335
+
 7096.   2335            warn("expected_a_b", token_nxt, ";", ",");
+
 7097.   2335            advance(",");
+
 7098.   2335        }
+
 7099.   2320
+
 7100.   2320// Warn if variable declarations are unordered.
+
 7101.   2320
+
 7102.   2320        if (
+
 7103.   2320            option_dict.beta
+
 7104.   2320            && !option_dict.unordered
+
 7105.   2315            && !option_dict.variable
+
 7106.   2309            && variable_prv
+
 7107.   1437            && (
+
 7108.   1437                variable_prv.id + " " + variable_prv.names[0].id
+
 7109.   1437                > the_variable.id + " " + the_variable.names[0].id
+
 7110.   1437            )
+
 7111.      3        ) {
+
 7112.      3
+
 7113.      3// test_cause:
+
 7114.      3// ["const bb=0;const aa=0;", "stmt_var", "expected_a_b_before_c_d", "aa", 12]
+
 7115.      3// ["let bb;let aa;", "stmt_var", "expected_a_b_before_c_d", "aa", 8]
+
 7116.      3// ["var bb;var aa;", "stmt_var", "expected_a_b_before_c_d", "aa", 8]
+
 7117.      3
+
 7118.      3            warn(
+
 7119.      3                "expected_a_b_before_c_d",
+
 7120.      3                the_variable,
+
 7121.      3                the_variable.id,
+
 7122.      3                the_variable.names[0].id,
+
 7123.      3                variable_prv.id,
+
 7124.      3                variable_prv.names[0].id
+
 7125.      3            );
+
 7126.   2320        }
+
 7127.   2320        semicolon();
+
 7128.   2320        return the_variable;
+
 7129.   2320    }
+
 7130.    631
+
 7131.    208    function stmt_while() {
+
 7132.    208        const the_while = token_now;
+
 7133.    208        check_not_top_level(the_while);
+
 7134.    208        functionage.loop += 1;
+
 7135.    208        the_while.expression = condition();
+
 7136.    208        the_while.block = block();
+
 7137.      1        if (the_while.block.disrupt === true) {
 7138.      1
 7139.      1// test_cause:
-
 7140.      1// ["with", "stmt_with", "unexpected_a", "with", 1]
+
 7140.      1// ["function aa(){while(0){break;}}", "stmt_while", "weird_loop", "while", 15]
 7141.      1
-
 7142.      1        stop("unexpected_a", token_now);
-
 7143.      1    }
-
 7144.    629
-
 7145.  14590    function survey(name) {
-
 7146.  14590        let id = name.id;
-
 7147.  14590
-
 7148.  14590// Tally the property name. If it is a string, only tally strings that conform
-
 7149.  14590// to the identifier rules.
-
 7150.  14590
-
 7151.    183        if (id === "(string)") {
-
 7152.    183            id = name.value;
-
 7153.    183            if (!jslint_rgx_identifier.test(id)) {
-
 7154.    183                return id;
-
 7155.    183            }
-
 7156.  14407        } else if (id === "`") {
-
 7157.  14407            if (name.value.length === 1) {
-
 7158.  14407                id = name.value[0].value;
-
 7159.  14407                if (!jslint_rgx_identifier.test(id)) {
-
 7160.  14407                    return id;
-
 7161.  14407                }
-
 7162.  14407            }
-
 7163.  14407        } else if (!name.identifier) {
-
 7164.  14407
-
 7165.  14407// test_cause:
-
 7166.  14407// ["let aa={0:0}", "survey", "expected_identifier_a", "0", 9]
-
 7167.  14407
-
 7168.  14407            return stop("expected_identifier_a", name);
-
 7169.  14503        }
-
 7170.  14503
-
 7171.  14503// If we have seen this name before, increment its count.
-
 7172.  14503
-
 7173.  14503        if (typeof property_dict[id] === "number") {
-
 7174.  12076            property_dict[id] += 1;
-
 7175.  12076
-
 7176.  12076// If this is the first time seeing this property name, and if there is a
-
 7177.  12076// tenure list, then it must be on the list. Otherwise, it must conform to
-
 7178.  12076// the rules for good property names.
-
 7179.  12076
-
 7180.  12076        } else {
-
 7181.   2427            if (state.mode_property) {
-
 7182.   2427                if (tenure[id] !== true) {
-
 7183.   2427
-
 7184.   2427// test_cause:
-
 7185.   2427// ["/*property aa*/\naa.bb", "survey", "unregistered_property_a", "bb", 4]
-
 7186.   2427
-
 7187.   2427                    warn("unregistered_property_a", name);
-
 7188.   2427                }
-
 7189.   2427            } else if (
-
 7190.   2427                !option_dict.nomen
-
 7191.   2427                && name.identifier
-
 7192.   2427                && jslint_rgx_weird_property.test(id)
-
 7193.   2427            ) {
+
 7142.      1            warn("weird_loop", the_while);
+
 7143.    205        }
+
 7144.    205        functionage.loop -= 1;
+
 7145.    205        return the_while;
+
 7146.    205    }
+
 7147.    631
+
 7148.      1    function stmt_with() {
+
 7149.      1
+
 7150.      1// test_cause:
+
 7151.      1// ["with", "stmt_with", "unexpected_a", "with", 1]
+
 7152.      1
+
 7153.      1        stop("unexpected_a", token_now);
+
 7154.      1    }
+
 7155.    631
+
 7156.  14600    function survey(name) {
+
 7157.  14600        let id = name.id;
+
 7158.  14600
+
 7159.  14600// Tally the property name. If it is a string, only tally strings that conform
+
 7160.  14600// to the identifier rules.
+
 7161.  14600
+
 7162.    183        if (id === "(string)") {
+
 7163.    183            id = name.value;
+
 7164.    183            if (!jslint_rgx_identifier.test(id)) {
+
 7165.    183                return id;
+
 7166.    183            }
+
 7167.  14417        } else if (id === "`") {
+
 7168.  14417            if (name.value.length === 1) {
+
 7169.  14417                id = name.value[0].value;
+
 7170.  14417                if (!jslint_rgx_identifier.test(id)) {
+
 7171.  14417                    return id;
+
 7172.  14417                }
+
 7173.  14417            }
+
 7174.  14417        } else if (!name.identifier) {
+
 7175.  14417
+
 7176.  14417// test_cause:
+
 7177.  14417// ["let aa={0:0}", "survey", "expected_identifier_a", "0", 9]
+
 7178.  14417
+
 7179.  14417            return stop("expected_identifier_a", name);
+
 7180.  14513        }
+
 7181.  14513
+
 7182.  14513// If we have seen this name before, increment its count.
+
 7183.  14513
+
 7184.  14513        if (typeof property_dict[id] === "number") {
+
 7185.  12086            property_dict[id] += 1;
+
 7186.  12086
+
 7187.  12086// If this is the first time seeing this property name, and if there is a
+
 7188.  12086// tenure list, then it must be on the list. Otherwise, it must conform to
+
 7189.  12086// the rules for good property names.
+
 7190.  12086
+
 7191.  12086        } else {
+
 7192.   2427            if (state.mode_property) {
+
 7193.   2427                if (tenure[id] !== true) {
 7194.   2427
 7195.   2427// test_cause:
-
 7196.   2427// ["aa.$", "survey", "weird_property_a", "$", 4]
-
 7197.   2427// ["aa._", "survey", "weird_property_a", "_", 4]
-
 7198.   2427// ["aa._aa", "survey", "weird_property_a", "_aa", 4]
-
 7199.   2427// ["aa.aaSync", "survey", "weird_property_a", "aaSync", 4]
-
 7200.   2427// ["aa.aa_", "survey", "weird_property_a", "aa_", 4]
-
 7201.   2427
-
 7202.   2427                warn("weird_property_a", name);
-
 7203.   2427            }
-
 7204.   2427            property_dict[id] = 1;
-
 7205.  14503        }
-
 7206.  14503        return id;
-
 7207.  14503    }
-
 7208.    629
-
 7209.    629// These functions are used to specify the grammar of our language:
-
 7210.    629
-
 7211.  81770    function symbol(id, bp) {
-
 7212.  81770
-
 7213.  81770// Create a symbol if it does not already exist in the language's syntax.
-
 7214.  81770
-
 7215.  81770        let the_symbol = syntax_dict[id];
-
 7216.  71077        if (the_symbol === undefined) {
-
 7217.  71077            the_symbol = empty();
-
 7218.  71077            the_symbol.id = id;
-
 7219.  71077            the_symbol.lbp = bp || 0;
-
 7220.  71077            syntax_dict[id] = the_symbol;
-
 7221.  71077        }
-
 7222.  81770        return the_symbol;
-
 7223.  81770    }
-
 7224.    629
-
 7225.    629    function ternary(id1, id2) {
-
 7226.    629
-
 7227.    629// Create a ternary operator.
-
 7228.    629
-
 7229.    629        const the_symbol = symbol(id1, 30);
-
 7230.    213        the_symbol.led_infix = function parse_ternary_led(left) {
-
 7231.    213            const the_token = token_now;
-
 7232.    213            let second;
-
 7233.    213            second = parse_expression(20);
-
 7234.    213            advance(id2);
-
 7235.    213            token_now.arity = "ternary";
-
 7236.    213            the_token.arity = "ternary";
-
 7237.    213            the_token.expression = [left, second, parse_expression(10)];
-
 7238.      5            if (token_nxt.id !== ")") {
-
 7239.      5
-
 7240.      5// test_cause:
-
 7241.      5// ["0?0:0", "parse_ternary_led", "use_open", "?", 2]
-
 7242.      5
-
 7243.      5                warn("use_open", the_token);
-
 7244.      5            }
-
 7245.    213            return the_token;
-
 7246.    213        };
-
 7247.    629        return the_symbol;
-
 7248.    629    }
-
 7249.    629
-
 7250.    629// Now we parse JavaScript.
-
 7251.    629// Begin defining the language.
-
 7252.    629
-
 7253.    629    assignment("%=");
-
 7254.    629    assignment("&=");
-
 7255.    629    assignment("*=");
-
 7256.    629    assignment("+=");
-
 7257.    629    assignment("-=");
-
 7258.    629    assignment("/=");
-
 7259.    629    assignment("<<=");
-
 7260.    629    assignment("=");
-
 7261.    629    assignment(">>=");
-
 7262.    629    assignment(">>>=");
-
 7263.    629    assignment("^=");
-
 7264.    629    assignment("|=");
-
 7265.    629    constant("(number)", "number");
-
 7266.    629    constant("(regexp)", "regexp");
-
 7267.    629    constant("(string)", "string");
-
 7268.    629    constant("Function", "function", constant_Function);
-
 7269.    629    constant("Infinity", "number", Infinity);
-
 7270.    629    constant("NaN", "number", NaN);
-
 7271.    629    constant("arguments", "object", constant_arguments);
-
 7272.    629    constant("eval", "function", constant_eval);
-
 7273.    629    constant("false", "boolean", false);
-
 7274.    629    constant("ignore", "undefined", constant_ignore);
-
 7275.    629    constant("isFinite", "function", constant_isInfinite);
-
 7276.    629    constant("isNaN", "function", constant_isNaN);
-
 7277.    629    constant("null", "null", null);
-
 7278.    629    constant("this", "object", constant_this);
-
 7279.    629    constant("true", "boolean", true);
-
 7280.    629    constant("undefined", "undefined");
-
 7281.    629    infix(100, "!=");
-
 7282.    629    infix(100, "!==");
-
 7283.    629    infix(100, "==");
-
 7284.    629    infix(100, "===");
-
 7285.    629    infix(110, "<");
-
 7286.    629    infix(110, "<=");
-
 7287.    629    infix(110, ">");
-
 7288.    629    infix(110, ">=");
-
 7289.    629    infix(110, "in");
-
 7290.    629    infix(110, "instanceof");
-
 7291.    629    infix(120, "<<");
-
 7292.    629    infix(120, ">>");
-
 7293.    629    infix(120, ">>>");
-
 7294.    629    infix(130, "+");
-
 7295.    629    infix(130, "-");
-
 7296.    629    infix(140, "%");
-
 7297.    629    infix(140, "*");
-
 7298.    629    infix(140, "/");
-
 7299.    629    infix(160, "(", infix_lparen);
-
 7300.    629    infix(160, "`", infix_grave);
-
 7301.    629    infix(170, ".", infix_dot);
-
 7302.    629    infix(170, "=>", infix_fart_unwrapped);
-
 7303.    629    infix(170, "?.", infix_option_chain);
-
 7304.    629    infix(170, "[", infix_lbracket);
-
 7305.    629    infix(35, "??");
-
 7306.    629    infix(40, "||");
-
 7307.    629    infix(50, "&&");
-
 7308.    629    infix(70, "|");
-
 7309.    629    infix(80, "^");
-
 7310.    629    infix(90, "&");
-
 7311.    629    infixr(150, "**");
-
 7312.    629    postassign("++");
-
 7313.    629    postassign("--");
-
 7314.    629    preassign("++");
-
 7315.    629    preassign("--");
-
 7316.    629    prefix("!!");
-
 7317.    629    prefix("!");
-
 7318.    629    prefix("(", prefix_lparen);
-
 7319.    629    prefix("+");
-
 7320.    629    prefix("-");
-
 7321.    629    prefix("/=", prefix_assign_divide);
-
 7322.    629    prefix("=>", prefix_fart);
-
 7323.    629    prefix("[", prefix_lbracket);
-
 7324.    629    prefix("`", prefix_tick);
-
 7325.    629    prefix("async", prefix_async);
-
 7326.    629    prefix("await", prefix_await);
-
 7327.    629    prefix("function", prefix_function);
-
 7328.    629    prefix("new", prefix_new);
-
 7329.    629    prefix("typeof");
-
 7330.    629    prefix("void", prefix_void);
-
 7331.    629    prefix("{", prefix_lbrace);
-
 7332.    629    prefix("~");
-
 7333.    629    stmt(";", stmt_semicolon);
-
 7334.    629    stmt("async", prefix_async);
-
 7335.    629    stmt("await", prefix_await);
-
 7336.    629    stmt("break", stmt_break);
-
 7337.    629    stmt("const", stmt_var);
-
 7338.    629    stmt("continue", stmt_continue);
-
 7339.    629    stmt("debugger", stmt_debugger);
-
 7340.    629    stmt("delete", stmt_delete);
-
 7341.    629    stmt("do", stmt_do);
-
 7342.    629    stmt("export", stmt_export);
-
 7343.    629    stmt("for", stmt_for);
-
 7344.    629    stmt("function", prefix_function);
-
 7345.    629    stmt("if", stmt_if);
-
 7346.    629    stmt("import", stmt_import);
-
 7347.    629    stmt("let", stmt_var);
-
 7348.    629    stmt("return", stmt_return);
-
 7349.    629    stmt("switch", stmt_switch);
-
 7350.    629    stmt("throw", stmt_throw);
-
 7351.    629    stmt("try", stmt_try);
-
 7352.    629    stmt("var", stmt_var);
-
 7353.    629    stmt("while", stmt_while);
-
 7354.    629    stmt("with", stmt_with);
-
 7355.    629    stmt("{", stmt_lbrace);
-
 7356.    629    symbol(")");
-
 7357.    629    symbol("*/");
-
 7358.    629    symbol(",");
-
 7359.    629    symbol(":");
-
 7360.    629    symbol(";");
-
 7361.    629    symbol("]");
-
 7362.    629    symbol("async");
-
 7363.    629    symbol("await");
-
 7364.    629    symbol("case");
-
 7365.    629    symbol("catch");
-
 7366.    629    symbol("class");
-
 7367.    629    symbol("default");
-
 7368.    629    symbol("else");
-
 7369.    629    symbol("enum");
-
 7370.    629    symbol("finally");
-
 7371.    629    symbol("implements");
-
 7372.    629    symbol("interface");
-
 7373.    629    symbol("package");
-
 7374.    629    symbol("private");
-
 7375.    629    symbol("protected");
-
 7376.    629    symbol("public");
-
 7377.    629    symbol("static");
-
 7378.    629    symbol("super");
-
 7379.    629    symbol("void");
-
 7380.    629    symbol("yield");
-
 7381.    629    symbol("}");
-
 7382.    629    ternary("?", ":");
-
 7383.    629
-
 7384.    629// Init token_nxt.
-
 7385.    629
-
 7386.    629    advance();
-
 7387.    629
-
 7388.    629// Parsing of JSON is simple:
-
 7389.    629
-
 7390.     25    if (state.mode_json) {
-
 7391.     25        state.token_tree = parse_json();
-
 7392.     25        advance("(end)");
-
 7393.     25        return;
-
 7394.    604    }
-
 7395.    604
-
 7396.    604// Because browsers encourage combining of script files, the first token might
-
 7397.    604// be a semicolon to defend against a missing semicolon in the preceding file.
-
 7398.    604
-
 7399.    604    if (option_dict.browser) {
-
 7400.      5        if (token_nxt.id === ";") {
-
 7401.      5            advance(";");
-
 7402.      5        }
-
 7403.      5
-
 7404.      5// If we are not in a browser, then the file form of strict pragma may be used.
-
 7405.      5
-
 7406.    599    } else if (token_nxt.value === "use strict") {
-
 7407.    599        advance("(string)");
-
 7408.    599        advance(";");
-
 7409.    604    }
-
 7410.    604    state.token_tree = parse_statements();
-
 7411.    604    advance("(end)");
-
 7412.    604
-
 7413.    604// Check global functions are ordered.
-
 7414.    604
-
 7415.    604    check_ordered(
-
 7416.    604        "function",
-
 7417.   2001        function_list.map(function ({
-
 7418.   2001            level,
-
 7419.   2001            name
-
 7420.   2001        }) {
-
 7421.    604            return (level === 1) && name;
-
 7422.   2001        }).filter(function (name) {
-
 7423.   1992            return option_dict.beta && name && name.id;
-
 7424.   2001        })
-
 7425.    604    );
-
 7426.    604}
-
 7427.      1
-
 7428.    516function jslint_phase4_walk(state) {
-
 7429.    516
-
 7430.    516// PHASE 4. Walk <token_tree>, traversing all nodes of the tree. It is a
-
 7431.    516//          recursive traversal. Each node may be processed on the way down
-
 7432.    516//          (preaction) and on the way up (postaction).
-
 7433.    516
-
 7434.    516    let {
-
 7435.    516        artifact,
-
 7436.    516        catch_stack,
-
 7437.    516        function_stack,
-
 7438.    516        global_dict,
-
 7439.    516        is_equal,
-
 7440.    516        is_weird,
-
 7441.    516        option_dict,
-
 7442.    516        syntax_dict,
-
 7443.    516        test_cause,
-
 7444.    516        token_global,
-
 7445.    516        warn
-
 7446.    516    } = state;
-
 7447.    516    let block_stack = [];               // The stack of blocks.
-
 7448.    516    let blockage = token_global;        // The current block.
-
 7449.    516    let catchage = catch_stack[0];      // The current catch-block.
-
 7450.    516    let functionage = token_global;     // The current function.
-
 7451.    516    let postaction;
-
 7452.    516    let postamble;
-
 7453.    516    let posts = empty();
-
 7454.    516    let preaction;
-
 7455.    516    let preamble;
-
 7456.    516    let pres = empty();
-
 7457.    516
-
 7458.    516// The relational operators.
-
 7459.    516
-
 7460.    516    let relationop = object_assign_from_list(empty(), [
-
 7461.    516        "!=", "!==", "<", "<=", "==", "===", ">", ">="
-
 7462.    516    ], true);
-
 7463.    516
-
 7464.    516// Ambulation of the parse tree.
-
 7465.    516
-
 7466.   1032    function action(when) {
-
 7467.   1032
-
 7468.   1032// Produce a function that will register task functions that will be called as
-
 7469.   1032// the tree is traversed.
-
 7470.   1032
-
 7471.  19608        return function (arity, id, task) {
-
 7472.  19608            let a_set = when[arity];
-
 7473.  19608            let i_set;
-
 7474.  19608
-
 7475.  19608// The id parameter is optional. If excluded, the task will be applied to all
-
 7476.  19608// ids.
-
 7477.  19608
-
 7478.   4128            if (typeof id !== "string") {
-
 7479.   4128                task = id;
-
 7480.   4128                id = "(all)";
-
 7481.   4128            }
-
 7482.  19608
-
 7483.  19608// If this arity has no registrations yet, then create a set object to hold
-
 7484.  19608// them.
-
 7485.  19608
-
 7486.   5160            if (a_set === undefined) {
-
 7487.   5160                a_set = empty();
-
 7488.   5160                when[arity] = a_set;
-
 7489.   5160            }
-
 7490.  19608
-
 7491.  19608// If this id has no registrations yet, then create a set array to hold them.
-
 7492.  19608
-
 7493.  19608            i_set = a_set[id];
-
 7494.  19092            if (i_set === undefined) {
-
 7495.  19092                i_set = [];
-
 7496.  19092                a_set[id] = i_set;
-
 7497.  19092            }
-
 7498.  19608
-
 7499.  19608// Register the task with the arity and the id.
-
 7500.  19608
-
 7501.  19608            i_set.push(task);
-
 7502.  19608        };
-
 7503.   1032    }
-
 7504.    516
-
 7505.   1032    function amble(when) {
-
 7506.   1032
-
 7507.   1032// Produce a function that will act on the tasks registered by an action
-
 7508.   1032// function while walking the tree.
-
 7509.   1032
-
 7510. 210780        return function (the_token) {
-
 7511. 210780
-
 7512. 210780// Given a task set that was built by an action function, run all
-
 7513. 210780// relevant tasks on the token.
-
 7514. 210780
-
 7515. 210780            let a_set = when[the_token.arity];
-
 7516. 210780            let i_set;
-
 7517. 210780
-
 7518. 210780// If there are tasks associated with the token's arity...
-
 7519. 210780
-
 7520. 144594            if (a_set !== undefined) {
-
 7521. 144594
-
 7522. 144594// If there are tasks associated with the token's id...
-
 7523. 144594
-
 7524. 144594                i_set = a_set[the_token.id];
-
 7525. 144594                if (i_set !== undefined) {
-
 7526. 144594                    i_set.forEach(function (task) {
-
 7527. 144594                        task(the_token);
-
 7528. 144594                    });
-
 7529. 144594                }
-
 7530. 144594
-
 7531. 144594// If there are tasks for all ids.
-
 7532. 144594
-
 7533. 144594                i_set = a_set["(all)"];
-
 7534. 144594                if (i_set !== undefined) {
-
 7535. 144594                    i_set.forEach(function (task) {
-
 7536. 144594                        task(the_token);
-
 7537. 144594                    });
-
 7538. 144594                }
-
 7539. 144594            }
-
 7540. 210780        };
-
 7541.   1032    }
-
 7542.    516
-
 7543.   2823    function init_variable(name) {
-
 7544.   2823        let the_variable = lookup(name);
-
 7545.   2764        if (!the_variable || the_variable.readonly) {
-
 7546.     61            warn("bad_assignment_a", name);
-
 7547.     61            return;
-
 7548.   2762        }
-
 7549.   2762        the_variable.init = true;
-
 7550.   2762    }
-
 7551.    516
-
 7552.  31490    function lookup(thing) {
-
 7553.  31490        let id = thing.id;
-
 7554.  31490        let the_variable;
-
 7555.      1        if (thing.arity !== "variable") {
-
 7556.      1            return;
-
 7557.  31489        }
-
 7558.  31489
-
 7559.  31489// Look up the variable in the current context.
-
 7560.  31489
-
 7561.  31489        the_variable = functionage.context[id] || catchage.context[id];
-
 7562.  31490
-
 7563.  31490// If it isn't local, search all the other contexts. If there are name
-
 7564.  31490// collisions, take the most recent.
-
 7565.  31490
-
 7566.  24614        if (the_variable && the_variable.role === "label") {
-
 7567.      1
-
 7568.      1// test_cause:
-
 7569.      1// ["aa:while(0){aa;}", "lookup", "label_a", "aa", 13]
-
 7570.      1
-
 7571.      1            warn("label_a", thing);
-
 7572.      1            return the_variable;
-
 7573.  31488        }
-
 7574.  31488        if (!the_variable) {
-
 7575.  14775            function_stack.forEach(function ({
-
 7576.  14775                context
-
 7577.  14775            }) {
-
 7578.   6875                if (context[id] && context[id].role !== "label") {
-
 7579.   6875                    the_variable = context[id];
-
 7580.   6875                }
-
 7581.  14775            });
-
 7582.   6875
-
 7583.   6875// If it isn't in any of those either, perhaps it is a predefined global.
-
 7584.   6875// If so, add it to the global context.
-
 7585.   6875
-
 7586.   6875            if (!the_variable && global_dict[id] === undefined) {
-
 7587.   6875
-
 7588.   6875// test_cause:
-
 7589.   6875// ["aa", "lookup", "undeclared_a", "aa", 1]
-
 7590.   6875// ["class aa{}", "lookup", "undeclared_a", "aa", 7]
-
 7591.   6875// ["
-
 7592.   6875// let aa=0;try{aa();}catch(bb){bb();}bb();
-
 7593.   6875// ", "lookup", "undeclared_a", "bb", 36]
-
 7594.   6875// ["
-
 7595.   6875// let aa=0;try{aa();}catch(ignore){bb();}
-
 7596.   6875// ", "lookup", "undeclared_a", "bb", 34]
-
 7597.   6875
-
 7598.   6875                warn("undeclared_a", thing);
-
 7599.   6875                return;
-
 7600.   6875            }
-
 7601.   6875            if (!the_variable) {
-
 7602.   6875                the_variable = {
-
 7603.   6875                    dead: false,
-
 7604.   6875                    id,
-
 7605.   6875                    init: true,
-
 7606.   6875                    parent: token_global,
-
 7607.   6875                    readonly: true,
-
 7608.   6875                    role: "variable",
-
 7609.   6875                    used: 0
-
 7610.   6875                };
-
 7611.   6875                token_global.context[id] = the_variable;
-
 7612.   6875            }
-
 7613.   6875            the_variable.closure = true;
-
 7614.   6875            functionage.context[id] = the_variable;
-
 7615.  31355        }
-
 7616.  31355        if (
-
 7617.  31355            (
-
 7618.  31355                the_variable.calls === undefined
-
 7619.  31355                || functionage.name === undefined
-
 7620.   4364                || the_variable.calls[functionage.name.id] === undefined
-
 7621.  31490            )
-
 7622.  31170            && the_variable.dead
-
 7623.      3        ) {
-
 7624.      3
-
 7625.      3// test_cause:
-
 7626.      3// ["let aa;if(aa){let bb;}bb;", "lookup", "out_of_scope_a", "bb", 23]
-
 7627.      3
-
 7628.      3            warn("out_of_scope_a", thing);
-
 7629.  31355        }
-
 7630.  31355        return the_variable;
-
 7631.  31355    }
-
 7632.    516
-
 7633.   5014    function post_a(thing) {
-
 7634.   5014
-
 7635.   5014// Assignment using = sets the init property of a variable. No other assignment
-
 7636.   5014// operator can do this. A = token keeps that variable (or array of variables
-
 7637.   5014// in case of destructuring) in its name property.
-
 7638.   5014
-
 7639.   5014        const lvalue = thing.expression[0];
-
 7640.   5014        let right;
-
 7641.   4239        if (thing.id === "=") {
-
 7642.   4239            if (thing.names !== undefined) {
-
 7643.   4239
-
 7644.   4239// test_cause:
-
 7645.   4239// ["if(0){aa=0}", "post_a", "=", "", 0]
-
 7646.   4239
-
 7647.   4239                test_cause("=");
-
 7648.   4239
-
 7649.   4239// Probably deadcode.
-
 7650.   4239// if (Array.isArray(thing.names)) {
-
 7651.   4239//     thing.names.forEach(init_variable);
-
 7652.   4239// } else {
-
 7653.   4239//     init_variable(thing.names);
-
 7654.   4239// }
-
 7655.   4239
-
 7656.   4239                jslint_assert(
-
 7657.   4239                    !Array.isArray(thing.names),
-
 7658.   4239                    `Expected !Array.isArray(thing.names).`
-
 7659.   4239                );
-
 7660.   4239                init_variable(thing.names);
-
 7661.   4239            } else {
-
 7662.   4239                if (lvalue.id === "[" || lvalue.id === "{") {
-
 7663.   4239                    lvalue.expression.forEach(function (thing) {
-
 7664.   4239                        if (thing.variable) {
-
 7665.   4239                            thing.variable.init = true;
-
 7666.   4239                        }
-
 7667.   4239                    });
-
 7668.   4239                } else if (
-
 7669.   4239                    lvalue.id === "."
-
 7670.   4239                    && thing.expression[1].id === "undefined"
-
 7671.   4239                ) {
-
 7672.   4239
-
 7673.   4239// test_cause:
-
 7674.   4239// ["aa.aa=undefined", "post_a", "expected_a_b", "undefined", 1]
-
 7675.   4239
-
 7676.   4239                    warn(
-
 7677.   4239                        "expected_a_b",
-
 7678.   4239                        lvalue.expression,
-
 7679.   4239                        "delete",
-
 7680.   4239                        "undefined"
-
 7681.   4239                    );
-
 7682.   4239                }
-
 7683.   4239            }
-
 7684.   4239        } else {
-
 7685.    775            if (lvalue.arity === "variable") {
-
 7686.    775                if (!lvalue.variable || lvalue.variable.readonly) {
-
 7687.    775                    warn("bad_assignment_a", lvalue);
-
 7688.    775                }
-
 7689.    775            }
-
 7690.    775            right = syntax_dict[thing.expression[1].id];
-
 7691.    775            if (
-
 7692.    775                right !== undefined
-
 7693.    775                && (
-
 7694.    775                    right.id === "function"
-
 7695.    775                    || right.id === "=>"
-
 7696.    775                    || (
-
 7697.    775                        right.constant
-
 7698.    775                        && right.id !== "(number)"
-
 7699.    775                        && (right.id !== "(string)" || thing.id !== "+=")
-
 7700.    775                    )
-
 7701.    775                )
-
 7702.    775            ) {
-
 7703.    775
-
 7704.    775// test_cause:
-
 7705.    775// ["aa+=undefined", "post_a", "unexpected_a", "undefined", 5]
-
 7706.    775
-
 7707.    775                warn("unexpected_a", thing.expression[1]);
-
 7708.    775            }
-
 7709.    775        }
-
 7710.   5014    }
-
 7711.    516
-
 7712.    706    function post_a_pluseq(thing) {
-
 7713.    706        const right = thing.expression[1];
-
 7714.    396        if (right.constant) {
-
 7715.    396            if (
-
 7716.    396                right.value === ""
-
 7717.    396                || (right.id === "(number)" && right.value === "0")
-
 7718.    396                || right.id === "(boolean)"
-
 7719.    396                || right.id === "null"
-
 7720.    396                || right.id === "undefined"
-
 7721.    396                || Number.isNaN(right.value)
-
 7722.    396            ) {
-
 7723.    396                warn("unexpected_a", right);
-
 7724.    396            }
-
 7725.    396        }
-
 7726.    706    }
-
 7727.    516
-
 7728.  31901    function post_b(thing) {
-
 7729.  31901        let right;
-
 7730.   3950        if (relationop[thing.id]) {
-
 7731.   3950            if (
-
 7732.   3950                is_weird(thing.expression[0])
-
 7733.   3950                || is_weird(thing.expression[1])
-
 7734.   3950                || is_equal(thing.expression[0], thing.expression[1])
-
 7735.   3950                || (
-
 7736.   3950                    thing.expression[0].constant === true
-
 7737.   3950                    && thing.expression[1].constant === true
-
 7738.   3950                )
-
 7739.   3950            ) {
-
 7740.   3950
-
 7741.   3950// test_cause:
-
 7742.   3950// ["if(0===0){0}", "post_b", "weird_relation_a", "===", 5]
-
 7743.   3950
-
 7744.   3950                warn("weird_relation_a", thing);
-
 7745.   3950            }
-
 7746.   3950        }
-
 7747.   2023        if (thing.id === "+") {
-
 7748.   2023            if (!option_dict.convert) {
-
 7749.   2023                if (thing.expression[0].value === "") {
-
 7750.   2023
-
 7751.   2023// test_cause:
-
 7752.   2023// ["\"\"+0", "post_b", "expected_a_b", "\"\" +", 3]
-
 7753.   2023
-
 7754.   2023                    warn("expected_a_b", thing, "String(...)", "\"\" +");
-
 7755.   2023                } else if (thing.expression[1].value === "") {
-
 7756.   2023
-
 7757.   2023// test_cause:
-
 7758.   2023// ["0+\"\"", "post_b", "expected_a_b", "+ \"\"", 2]
-
 7759.   2023
-
 7760.   2023                    warn("expected_a_b", thing, "String(...)", "+ \"\"");
-
 7761.   2023                }
-
 7762.   2023            }
-
 7763.  29878        } else if (thing.id === "[") {
-
 7764.  29878            if (thing.expression[0].id === "window") {
-
 7765.  29878
-
 7766.  29878// test_cause:
-
 7767.  29878// ["aa=window[0]", "post_b", "weird_expression_a", "window[...]", 10]
-
 7768.  29878
-
 7769.  29878                warn("weird_expression_a", thing, "window[...]");
-
 7770.  29878            }
-
 7771.  29878            if (thing.expression[0].id === "self") {
-
 7772.  29878
-
 7773.  29878// test_cause:
-
 7774.  29878// ["aa=self[0]", "post_b", "weird_expression_a", "self[...]", 8]
-
 7775.  29878
-
 7776.  29878                warn("weird_expression_a", thing, "self[...]");
-
 7777.  29878            }
-
 7778.  29878        } else if (thing.id === "." || thing.id === "?.") {
-
 7779.  29878            if (thing.expression.id === "RegExp") {
-
 7780.  29878
-
 7781.  29878// test_cause:
-
 7782.  29878// ["aa=RegExp.aa", "post_b", "weird_expression_a", ".", 10]
-
 7783.  29878
-
 7784.  29878                warn("weird_expression_a", thing);
-
 7785.  29878            }
-
 7786.  29878        } else if (thing.id !== "=>" && thing.id !== "(") {
-
 7787.  29878            right = thing.expression[1];
-
 7788.  29878            if (
-
 7789.  29878                (thing.id === "+" || thing.id === "-")
-
 7790.  29878                && right.id === thing.id
-
 7791.  29878                && right.arity === "unary"
-
 7792.  29878                && !right.wrapped
-
 7793.  29878            ) {
-
 7794.  29878
-
 7795.  29878// test_cause:
-
 7796.  29878// ["0- -0", "post_b", "wrap_unary", "-", 4]
-
 7797.  29878
-
 7798.  29878                warn("wrap_unary", right);
-
 7799.  29878            }
-
 7800.  29878            if (
-
 7801.  29878                thing.expression[0].constant === true
-
 7802.  29878                && right.constant === true
-
 7803.  29878            ) {
-
 7804.  29878                thing.constant = true;
-
 7805.  29878            }
-
 7806.  29878        }
-
 7807.  31901    }
-
 7808.    516
-
 7809.   1202    function post_b_and(thing) {
-
 7810.   1202        if (
-
 7811.   1202            is_weird(thing.expression[0])
-
 7812.   1197            || is_equal(thing.expression[0], thing.expression[1])
-
 7813.   1183            || thing.expression[0].constant === true
-
 7814.   1181            || thing.expression[1].constant === true
-
 7815.     21        ) {
-
 7816.     21
-
 7817.     21// test_cause:
-
 7818.     21// ["aa=(()=>0)&&(()=>0)", "post_b_and", "weird_condition_a", "&&", 11]
-
 7819.     21// ["aa=(``?``:``)&&(``?``:``)", "post_b_and", "weird_condition_a", "&&", 14]
-
 7820.     21// ["aa=/./&&/./", "post_b_and", "weird_condition_a", "&&", 7]
-
 7821.     21// ["aa=0&&0", "post_b_and", "weird_condition_a", "&&", 5]
-
 7822.     21// ["aa=[]&&[]", "post_b_and", "weird_condition_a", "&&", 6]
-
 7823.     21// ["aa=`${0}`&&`${0}`", "post_b_and", "weird_condition_a", "&&", 10]
-
 7824.     21// ["
-
 7825.     21// aa=function aa(){}&&function aa(){}
-
 7826.     21// ", "post_b_and", "weird_condition_a", "&&", 19]
-
 7827.     21// ["aa={}&&{}", "post_b_and", "weird_condition_a", "&&", 6]
-
 7828.     21
-
 7829.     21            warn("weird_condition_a", thing);
-
 7830.     21        }
-
 7831.   1202    }
-
 7832.    516
-
 7833.   1459    function post_b_lbracket(thing) {
-
 7834.      1        if (thing.expression[0].id === "RegExp") {
-
 7835.      1
-
 7836.      1// test_cause:
-
 7837.      1// ["aa=RegExp[0]", "post_b_lbracket", "weird_expression_a", "[", 10]
-
 7838.      1
-
 7839.      1            warn("weird_expression_a", thing);
-
 7840.      1        }
-
 7841.      1        if (is_weird(thing.expression[1])) {
-
 7842.      1
-
 7843.      1// test_cause:
-
 7844.      1// ["aa[[0]]", "post_b_lbracket", "weird_expression_a", "[", 4]
-
 7845.      1
-
 7846.      1            warn("weird_expression_a", thing.expression[1]);
-
 7847.      1        }
-
 7848.   1459    }
-
 7849.    516
-
 7850.  10405    function post_b_lparen(thing) {
-
 7851.  10405        let arg;
-
 7852.  10405        let array;
-
 7853.  10405        let cack;
-
 7854.  10405        let left = thing.expression[0];
-
 7855.  10405        let new_date;
-
 7856.  10405        let paren;
-
 7857.  10405        let the_new;
-
 7858.    154        if (left.id === "new") {
-
 7859.    154            the_new = left;
-
 7860.    154            left = left.expression;
-
 7861.    154        }
-
 7862.     37        if (left.id === "function") {
-
 7863.     37            if (!thing.wrapped) {
-
 7864.     37
-
 7865.     37// test_cause:
-
 7866.     37// ["aa=function(){}()", "post_b_lparen", "wrap_immediate", "(", 16]
-
 7867.     37
-
 7868.     37                warn("wrap_immediate", thing);
-
 7869.     37            }
-
 7870.  10368        } else if (left.identifier) {
-
 7871.  10368            if (the_new !== undefined) {
-
 7872.  10368                if (
-
 7873.  10368                    left.id[0] > "Z"
-
 7874.  10368                    || left.id === "BigInt"
-
 7875.  10368                    || left.id === "Boolean"
-
 7876.  10368                    || left.id === "Number"
-
 7877.  10368                    || left.id === "String"
-
 7878.  10368                    || left.id === "Symbol"
-
 7879.  10368                ) {
-
 7880.  10368
-
 7881.  10368// test_cause:
-
 7882.  10368// ["new BigInt()", "post_b_lparen", "unexpected_a", "new", 1]
-
 7883.  10368// ["new Boolean()", "post_b_lparen", "unexpected_a", "new", 1]
-
 7884.  10368// ["new Number()", "post_b_lparen", "unexpected_a", "new", 1]
-
 7885.  10368// ["new String()", "post_b_lparen", "unexpected_a", "new", 1]
-
 7886.  10368// ["new Symbol()", "post_b_lparen", "unexpected_a", "new", 1]
-
 7887.  10368// ["new aa()", "post_b_lparen", "unexpected_a", "new", 1]
-
 7888.  10368
-
 7889.  10368                    warn("unexpected_a", the_new);
-
 7890.  10368                } else if (left.id === "Function") {
-
 7891.  10368                    if (!option_dict.eval) {
-
 7892.  10368
-
 7893.  10368// test_cause:
-
 7894.  10368// ["new Function()", "post_b_lparen", "unexpected_a", "new Function", 5]
-
 7895.  10368
-
 7896.  10368                        warn("unexpected_a", left, "new Function");
-
 7897.  10368                    }
-
 7898.  10368                } else if (left.id === "Array") {
-
 7899.  10368                    arg = thing.expression;
-
 7900.  10368                    if (arg.length !== 2 || arg[1].id === "(string)") {
-
 7901.  10368
-
 7902.  10368// test_cause:
-
 7903.  10368// ["new Array()", "post_b_lparen", "expected_a_b", "new Array", 5]
-
 7904.  10368
-
 7905.  10368                        warn("expected_a_b", left, "[]", "new Array");
-
 7906.  10368                    }
-
 7907.  10368                } else if (left.id === "Object") {
-
 7908.  10368
-
 7909.  10368// test_cause:
-
 7910.  10368// ["new Object()", "post_b_lparen", "expected_a_b", "new Object", 5]
-
 7911.  10368
-
 7912.  10368                    warn(
-
 7913.  10368                        "expected_a_b",
-
 7914.  10368                        left,
-
 7915.  10368                        "Object.create(null)",
-
 7916.  10368                        "new Object"
-
 7917.  10368                    );
-
 7918.  10368                }
-
 7919.  10368            } else {
-
 7920.  10368                if (
-
 7921.  10368                    left.id[0] >= "A"
-
 7922.  10368                    && left.id[0] <= "Z"
-
 7923.  10368                    && left.id !== "BigInt"
-
 7924.  10368                    && left.id !== "Boolean"
-
 7925.  10368                    && left.id !== "Number"
-
 7926.  10368                    && left.id !== "String"
-
 7927.  10368                    && left.id !== "Symbol"
-
 7928.  10368                ) {
-
 7929.  10368
-
 7930.  10368// test_cause:
-
 7931.  10368// ["let Aa=Aa()", "post_b_lparen", "expected_a_before_b", "Aa", 8]
-
 7932.  10368
-
 7933.  10368                    warn("expected_a_before_b", left, "new", artifact(left));
-
 7934.  10368                }
-
 7935.  10368            }
-
 7936.  10368        } else if (left.id === ".") {
-
 7937.  10368            cack = the_new !== undefined;
-
 7938.  10368            if (left.expression.id === "Date" && left.name.id === "UTC") {
-
 7939.  10368
-
 7940.  10368// test_cause:
-
 7941.  10368// ["new Date.UTC()", "post_b_lparen", "cack", "", 0]
-
 7942.  10368
-
 7943.  10368                test_cause("cack");
-
 7944.  10368                cack = !cack;
-
 7945.  10368            }
-
 7946.  10368            if (jslint_rgx_cap.test(left.name.id) !== cack) {
-
 7947.  10368                if (the_new !== undefined) {
-
 7948.  10368
-
 7949.  10368// test_cause:
-
 7950.  10368// ["new Date.UTC()", "post_b_lparen", "unexpected_a", "new", 1]
-
 7951.  10368
-
 7952.  10368                    warn("unexpected_a", the_new);
-
 7953.  10368                } else {
-
 7954.  10368
-
 7955.  10368// test_cause:
-
 7956.  10368// ["let Aa=Aa.Aa()", "post_b_lparen", "expected_a_before_b", "Aa", 8]
-
 7957.  10368
-
 7958.  10368                    warn(
-
 7959.  10368                        "expected_a_before_b",
-
 7960.  10368                        left.expression,
-
 7961.  10368                        "new",
-
 7962.  10368                        left.name.id
-
 7963.  10368                    );
-
 7964.  10368                }
-
 7965.  10368            }
-
 7966.  10368            if (left.name.id === "getTime") {
-
 7967.  10368                paren = left.expression;
-
 7968.  10368                if (paren.id === "(") {
-
 7969.  10368                    array = paren.expression;
-
 7970.  10368                    if (array.length === 1) {
-
 7971.  10368                        new_date = array[0];
-
 7972.  10368                        if (
-
 7973.  10368                            new_date.id === "new"
-
 7974.  10368                            && new_date.expression.id === "Date"
-
 7975.  10368                        ) {
-
 7976.  10368
-
 7977.  10368// test_cause:
-
 7978.  10368// ["
-
 7979.  10368// new Date().getTime()
-
 7980.  10368// ", "post_b_lparen", "expected_a_b", "new Date().getTime()", 1]
-
 7981.  10368
-
 7982.  10368                            warn(
-
 7983.  10368                                "expected_a_b",
-
 7984.  10368                                new_date,
-
 7985.  10368                                "Date.now()",
-
 7986.  10368                                "new Date().getTime()"
-
 7987.  10368                            );
-
 7988.  10368                        }
-
 7989.  10368                    }
-
 7990.  10368                }
-
 7991.  10368            }
-
 7992.  10368        }
-
 7993.  10405    }
-
 7994.    516
-
 7995.    969    function post_b_or(thing) {
-
 7996.    969        if (
-
 7997.    969            is_weird(thing.expression[0])
-
 7998.    969            || is_equal(thing.expression[0], thing.expression[1])
-
 7999.    968            || thing.expression[0].constant === true
-
 8000.      2        ) {
-
 8001.      2
-
 8002.      2// test_cause:
-
 8003.      2// ["aa=0||0", "post_b_or", "weird_condition_a", "||", 5]
-
 8004.      2
-
 8005.      2            warn("weird_condition_a", thing);
-
 8006.      2        }
-
 8007.    969    }
-
 8008.    516
-
 8009.     78    function post_s_export(the_thing) {
-
 8010.     78
-
 8011.     78// Some features must be at the most outermost level.
-
 8012.     78
-
 8013.      1        if (blockage !== token_global) {
-
 8014.      1
-
 8015.      1// test_cause:
-
 8016.      1// ["
-
 8017.      1// if(0){import aa from "aa";}
-
 8018.      1// ", "post_s_export", "misplaced_a", "import", 7]
-
 8019.      1
-
 8020.      1            warn("misplaced_a", the_thing);
-
 8021.      1        }
-
 8022.     78    }
-
 8023.    516
-
 8024.      8    function post_s_for(thing) {
-
 8025.      8
-
 8026.      8// Recurse walk_statement().
-
 8027.      8
-
 8028.      8        walk_statement(thing.inc);
-
 8029.      8    }
-
 8030.    516
-
 8031.   2001    function post_s_function(thing) {
-
 8032.   2001        delete functionage.async;
-
 8033.   2001        delete functionage.finally;
-
 8034.   2001        delete functionage.loop;
-
 8035.   2001        delete functionage.statement_prv;
-
 8036.   2001        delete functionage.switch;
-
 8037.   2001        delete functionage.try;
-
 8038.   2001        functionage = function_stack.pop();
-
 8039.      3        if (thing.wrapped) {
-
 8040.      3
-
 8041.      3// test_cause:
-
 8042.      3// ["aa=(function(){})", "post_s_function", "unexpected_parens", "function", 5]
-
 8043.      3
-
 8044.      3            warn("unexpected_parens", thing);
-
 8045.      3        }
-
 8046.   2001        return post_s_lbrace();
-
 8047.   2001    }
-
 8048.    516
-
 8049.     61    function post_s_import(the_thing) {
-
 8050.     61        const name = the_thing.name;
-
 8051.     60        if (name) {
-
 8052.     60            if (Array.isArray(name)) {
-
 8053.     60                name.forEach(function (name) {
-
 8054.     60                    name.dead = false;
-
 8055.     60                    name.init = true;
-
 8056.     60                    blockage.live.push(name);
-
 8057.     60                });
-
 8058.     60            } else {
-
 8059.     60                name.dead = false;
-
 8060.     60                name.init = true;
-
 8061.     60                blockage.live.push(name);
-
 8062.     60            }
-
 8063.     60            return post_s_export(the_thing);
-
 8064.     60        }
-
 8065.     61    }
-
 8066.    516
-
 8067.   7690    function post_s_lbrace() {
-
 8068.   2987        blockage.live.forEach(function (name) {
-
 8069.   2987            name.dead = true;
-
 8070.   2987        });
-
 8071.   7690        delete blockage.live;
-
 8072.   7690        blockage = block_stack.pop();
-
 8073.   7690    }
-
 8074.    516
-
 8075.     56    function post_s_try(thing) {
-
 8076.     54        if (thing.catch) {
-
 8077.     54            if (thing.catch.name) {
-
 8078.     54                Object.assign(catchage.context[thing.catch.name.id], {
-
 8079.     54                    dead: false,
-
 8080.     54                    init: true
-
 8081.     54                });
-
 8082.     54            }
-
 8083.     54
-
 8084.     54// Recurse walk_statement().
-
 8085.     54
-
 8086.     54            walk_statement(thing.catch.block);
-
 8087.     54
-
 8088.     54// Restore previous catch-scope after catch-block.
-
 8089.     54
-
 8090.     54            catchage = catch_stack.pop();
-
 8091.     54        }
-
 8092.     56    }
-
 8093.    516
-
 8094.   2320    function post_s_var(thing) {
-
 8095.   2635        thing.names.forEach(function (name) {
-
 8096.   2635            name.dead = false;
-
 8097.   1245            if (name.expression !== undefined) {
-
 8098.   1245                walk_expression(name.expression);
-
 8099.   1245
-
 8100.   1245// Probably deadcode.
-
 8101.   1245// if (name.id === "{" || name.id === "[") {
-
 8102.   1245//     name.names.forEach(subactivate);
-
 8103.   1245// } else {
-
 8104.   1245//     name.init = true;
-
 8105.   1245// }
-
 8106.   1245
-
 8107.   1245                jslint_assert(
-
 8108.   1245                    !(name.id === "{" || name.id === "["),
-
 8109.   1245                    `Expected !(name.id === "{" || name.id === "[").`
-
 8110.   1245                );
-
 8111.   1245                name.init = true;
-
 8112.   1245            }
-
 8113.   2635            blockage.live.push(name);
-
 8114.   2635        });
-
 8115.   2320    }
-
 8116.    516
-
 8117.    213    function post_t(thing) {
-
 8118.    213        if (
-
 8119.    213            is_weird(thing.expression[0])
-
 8120.    213            || thing.expression[0].constant === true
-
 8121.    206            || is_equal(thing.expression[1], thing.expression[2])
-
 8122.      9        ) {
-
 8123.      9
-
 8124.      9// test_cause:
-
 8125.      9// ["let aa=(aa?`${0}`:`${0}`);", "post_t", "unexpected_a", "?", 11]
-
 8126.      9// ["let aa=(aa?`0`:`0`);", "post_t", "unexpected_a", "?", 11]
-
 8127.      9
-
 8128.      9            warn("unexpected_a", thing);
-
 8129.    204        } else if (is_equal(thing.expression[0], thing.expression[1])) {
-
 8130.    204
-
 8131.    204// test_cause:
-
 8132.    204// ["aa?aa:0", "post_t", "expected_a_b", "?", 3]
-
 8133.    204
-
 8134.    204            warn("expected_a_b", thing, "||", "?");
-
 8135.    204        } else if (is_equal(thing.expression[0], thing.expression[2])) {
-
 8136.    204
-
 8137.    204// test_cause:
-
 8138.    204// ["aa?0:aa", "post_t", "expected_a_b", "?", 3]
-
 8139.    204
-
 8140.    204            warn("expected_a_b", thing, "&&", "?");
-
 8141.    204        } else if (
-
 8142.    204            thing.expression[1].id === "true"
-
 8143.    204            && thing.expression[2].id === "false"
-
 8144.    204        ) {
-
 8145.    204
-
 8146.    204// test_cause:
-
 8147.    204// ["aa?true:false", "post_t", "expected_a_b", "?", 3]
-
 8148.    204
-
 8149.    204            warn("expected_a_b", thing, "!!", "?");
-
 8150.    204        } else if (
-
 8151.    204            thing.expression[1].id === "false"
-
 8152.    204            && thing.expression[2].id === "true"
-
 8153.    204        ) {
-
 8154.    204
-
 8155.    204// test_cause:
-
 8156.    204// ["aa?false:true", "post_t", "expected_a_b", "?", 3]
-
 8157.    204
-
 8158.    204            warn("expected_a_b", thing, "!", "?");
-
 8159.    204        } else if (
-
 8160.    204            thing.expression[0].wrapped !== true
-
 8161.    204            && (
-
 8162.    204                thing.expression[0].id === "||"
-
 8163.    204                || thing.expression[0].id === "&&"
-
 8164.    204            )
-
 8165.    204        ) {
-
 8166.    204
-
 8167.    204// test_cause:
-
 8168.    204// ["(aa&&!aa?0:1)", "post_t", "wrap_condition", "&&", 4]
-
 8169.    204
-
 8170.    204            warn("wrap_condition", thing.expression[0]);
-
 8171.    204        }
-
 8172.    213    }
-
 8173.    516
-
 8174.   4106    function post_u(thing) {
-
 8175.    779        if (thing.id === "`") {
-
 8176.    779            if (thing.expression.every(function (thing) {
-
 8177.    779                return thing.constant;
-
 8178.    779            })) {
-
 8179.    779                thing.constant = true;
-
 8180.    779            }
-
 8181.   3327        } else if (thing.id === "!") {
-
 8182.   3327            if (thing.expression.constant === true) {
-
 8183.   3327                warn("unexpected_a", thing);
-
 8184.   3327            }
-
 8185.   3327        } else if (thing.id === "!!") {
-
 8186.   3327            if (!option_dict.convert) {
-
 8187.   3327
-
 8188.   3327// test_cause:
-
 8189.   3327// ["!!0", "post_u", "expected_a_b", "!!", 1]
-
 8190.   3327
-
 8191.   3327                warn("expected_a_b", thing, "Boolean(...)", "!!");
-
 8192.   3327            }
-
 8193.   3327        } else if (
-
 8194.   3327            thing.id !== "["
-
 8195.   3327            && thing.id !== "{"
-
 8196.   3327            && thing.id !== "function"
-
 8197.   3327            && thing.id !== "new"
-
 8198.   3327        ) {
-
 8199.   3327            if (thing.expression.constant === true) {
-
 8200.   3327                thing.constant = true;
-
 8201.   3327            }
-
 8202.   3327        }
-
 8203.   4106    }
-
 8204.    516
-
 8205.      7    function post_u_plus(thing) {
-
 8206.      7        const right = thing.expression;
-
 8207.      7        if (!option_dict.convert) {
-
 8208.      7
-
 8209.      7// test_cause:
-
 8210.      7// ["aa=+0", "post_u_plus", "expected_a_b", "+", 4]
-
 8211.      7
-
 8212.      7            warn("expected_a_b", thing, "Number(...)", "+");
-
 8213.      7        }
-
 8214.      1        if (right.id === "(" && right.expression[0].id === "new") {
-
 8215.      1            warn("unexpected_a_before_b", thing, "+", "new");
-
 8216.      6        } else if (
-
 8217.      6            right.constant
-
 8218.      6            || right.id === "{"
-
 8219.      6            || (right.id === "[" && right.arity !== "binary")
-
 8220.      6        ) {
-
 8221.      6            warn("unexpected_a", thing, "+");
-
 8222.      6        }
-
 8223.      7    }
-
 8224.    516
-
 8225.  36918    function pre_a_bitwise(thing) {
-
 8226.  36918
-
 8227.  36918// These are the bitwise operators.
-
 8228.  36918
-
 8229.  36916        switch (!option_dict.bitwise && thing.id) {
-
 8230.      2        case "&":
-
 8231.      3        case "&=":
-
 8232.      5        case "<<":
-
 8233.      6        case "<<=":
-
 8234.      8        case ">>":
-
 8235.      9        case ">>=":
-
 8236.     11        case ">>>":
-
 8237.     12        case ">>>=":
-
 8238.     14        case "^":
-
 8239.     15        case "^=":
-
 8240.     17        case "|":
-
 8241.     18        case "|=":
-
 8242.     21        case "~":
-
 8243.     21
-
 8244.     21// test_cause:
-
 8245.     21// ["0&0", "pre_a_bitwise", "unexpected_a", "&", 2]
-
 8246.     21// ["0&=0", "pre_a_bitwise", "unexpected_a", "&=", 2]
-
 8247.     21// ["0<<0", "pre_a_bitwise", "unexpected_a", "<<", 2]
-
 8248.     21// ["0<<=0", "pre_a_bitwise", "unexpected_a", "<<=", 2]
-
 8249.     21// ["0>>0", "pre_a_bitwise", "unexpected_a", ">>", 2]
-
 8250.     21// ["0>>=0", "pre_a_bitwise", "unexpected_a", ">>=", 2]
-
 8251.     21// ["0>>>0", "pre_a_bitwise", "unexpected_a", ">>>", 2]
-
 8252.     21// ["0>>>=0", "pre_a_bitwise", "unexpected_a", ">>>=", 2]
-
 8253.     21// ["0^0", "pre_a_bitwise", "unexpected_a", "^", 2]
-
 8254.     21// ["0^=0", "pre_a_bitwise", "unexpected_a", "^=", 2]
-
 8255.     21// ["0|0", "pre_a_bitwise", "unexpected_a", "|", 2]
-
 8256.     21// ["0|=0", "pre_a_bitwise", "unexpected_a", "|=", 2]
-
 8257.     21// ["~0", "pre_a_bitwise", "unexpected_a", "~", 1]
-
 8258.     21
-
 8259.     21            warn("unexpected_a", thing);
-
 8260.     21            break;
-
 8261.  36918        }
-
 8262.  36918        if (
-
 8263.  36918            thing.id !== "("
-
 8264.  26513            && thing.id !== "&&"
-
 8265.  25311            && thing.id !== "||"
-
 8266.  24342            && thing.id !== "="
-
 8267.  20103            && Array.isArray(thing.expression)
-
 8268.   8495            && thing.expression.length === 2
-
 8269.   8494            && (
-
 8270.   8494                relationop[thing.expression[0].id] === true
-
 8271.   8494                || relationop[thing.expression[1].id] === true
-
 8272.   8494            )
-
 8273.      1        ) {
-
 8274.      1
-
 8275.      1// test_cause:
-
 8276.      1// ["0<0<0", "pre_a_bitwise", "unexpected_a", "<", 4]
-
 8277.      1
-
 8278.      1            warn("unexpected_a", thing);
-
 8279.      1        }
-
 8280.  36918    }
-
 8281.    516
-
 8282.  31901    function pre_b(thing) {
-
 8283.  31901        let left;
-
 8284.  31901        let right;
-
 8285.  31901        let value;
-
 8286.   3950        if (relationop[thing.id] === true) {
-
 8287.   3950            left = thing.expression[0];
-
 8288.   3950            right = thing.expression[1];
-
 8289.   3950            if (left.id === "NaN" || right.id === "NaN") {
-
 8290.   3950
-
 8291.   3950// test_cause:
-
 8292.   3950// ["NaN===NaN", "pre_b", "number_isNaN", "===", 4]
-
 8293.   3950
-
 8294.   3950                warn("number_isNaN", thing);
-
 8295.   3950            } else if (left.id === "typeof") {
-
 8296.   3950                if (right.id !== "(string)") {
-
 8297.   3950                    if (right.id !== "typeof") {
-
 8298.   3950
-
 8299.   3950// test_cause:
-
 8300.   3950// ["typeof 0===0", "pre_b", "expected_string_a", "0", 12]
-
 8301.   3950
-
 8302.   3950                        warn("expected_string_a", right);
-
 8303.   3950                    }
-
 8304.   3950                } else {
-
 8305.   3950                    value = right.value;
-
 8306.   3950                    if (value === "null" || value === "undefined") {
-
 8307.   3950
-
 8308.   3950// test_cause:
-
 8309.   3950// ["
-
 8310.   3950// typeof aa==="undefined"
-
 8311.   3950// ", "pre_b", "unexpected_typeof_a", "undefined", 13]
-
 8312.   3950
-
 8313.   3950                        warn("unexpected_typeof_a", right, value);
-
 8314.   3950                    } else if (
-
 8315.   3950                        value !== "bigint"
-
 8316.   3950                        && value !== "boolean"
-
 8317.   3950                        && value !== "function"
-
 8318.   3950                        && value !== "number"
-
 8319.   3950                        && value !== "object"
-
 8320.   3950                        && value !== "string"
-
 8321.   3950                        && value !== "symbol"
-
 8322.   3950                    ) {
-
 8323.   3950
-
 8324.   3950// test_cause:
-
 8325.   3950// ["typeof 0===\"aa\"", "pre_b", "expected_type_string_a", "aa", 12]
-
 8326.   3950
-
 8327.   3950                        warn("expected_type_string_a", right, value);
-
 8328.   3950                    }
-
 8329.   3950                }
-
 8330.   3950            }
-
 8331.   3950        }
-
 8332.  31901    }
-
 8333.    516
-
 8334.      1    function pre_b_eqeq(thing) {
-
 8335.      1
-
 8336.      1// test_cause:
-
 8337.      1// ["0==0", "pre_b_eqeq", "expected_a_b", "==", 2]
-
 8338.      1
-
 8339.      1        warn("expected_a_b", thing, "===", "==");
-
 8340.      1    }
-
 8341.    516
-
 8342.      1    function pre_b_in(thing) {
-
 8343.      1
-
 8344.      1// test_cause:
-
 8345.      1// ["aa in aa", "pre_b_in", "infix_in", "in", 4]
+
 7196.   2427// ["/*property aa*/\naa.bb", "survey", "unregistered_property_a", "bb", 4]
+
 7197.   2427
+
 7198.   2427                    warn("unregistered_property_a", name);
+
 7199.   2427                }
+
 7200.   2427            } else if (
+
 7201.   2427                !option_dict.nomen
+
 7202.   2427                && name.identifier
+
 7203.   2427                && jslint_rgx_weird_property.test(id)
+
 7204.   2427            ) {
+
 7205.   2427
+
 7206.   2427// test_cause:
+
 7207.   2427// ["aa.$", "survey", "weird_property_a", "$", 4]
+
 7208.   2427// ["aa._", "survey", "weird_property_a", "_", 4]
+
 7209.   2427// ["aa._aa", "survey", "weird_property_a", "_aa", 4]
+
 7210.   2427// ["aa.aaSync", "survey", "weird_property_a", "aaSync", 4]
+
 7211.   2427// ["aa.aa_", "survey", "weird_property_a", "aa_", 4]
+
 7212.   2427
+
 7213.   2427                warn("weird_property_a", name);
+
 7214.   2427            }
+
 7215.   2427            property_dict[id] = 1;
+
 7216.  14513        }
+
 7217.  14513        return id;
+
 7218.  14513    }
+
 7219.    631
+
 7220.    631// These functions are used to specify the grammar of our language:
+
 7221.    631
+
 7222.  82030    function symbol(id, bp) {
+
 7223.  82030
+
 7224.  82030// Create a symbol if it does not already exist in the language's syntax.
+
 7225.  82030
+
 7226.  82030        let the_symbol = syntax_dict[id];
+
 7227.  71303        if (the_symbol === undefined) {
+
 7228.  71303            the_symbol = empty();
+
 7229.  71303            the_symbol.id = id;
+
 7230.  71303            the_symbol.lbp = bp || 0;
+
 7231.  71303            syntax_dict[id] = the_symbol;
+
 7232.  71303        }
+
 7233.  82030        return the_symbol;
+
 7234.  82030    }
+
 7235.    631
+
 7236.    631    function ternary(id1, id2) {
+
 7237.    631
+
 7238.    631// Create a ternary operator.
+
 7239.    631
+
 7240.    631        const the_symbol = symbol(id1, 30);
+
 7241.    213        the_symbol.led_infix = function parse_ternary_led(left) {
+
 7242.    213            const the_token = token_now;
+
 7243.    213            let second;
+
 7244.    213            second = parse_expression(20);
+
 7245.    213            advance(id2);
+
 7246.    213            token_now.arity = "ternary";
+
 7247.    213            the_token.arity = "ternary";
+
 7248.    213            the_token.expression = [left, second, parse_expression(10)];
+
 7249.      5            if (token_nxt.id !== ")") {
+
 7250.      5
+
 7251.      5// test_cause:
+
 7252.      5// ["0?0:0", "parse_ternary_led", "use_open", "?", 2]
+
 7253.      5
+
 7254.      5                warn("use_open", the_token);
+
 7255.      5            }
+
 7256.    213            return the_token;
+
 7257.    213        };
+
 7258.    631        return the_symbol;
+
 7259.    631    }
+
 7260.    631
+
 7261.    631// Now we parse JavaScript.
+
 7262.    631// Begin defining the language.
+
 7263.    631
+
 7264.    631    assignment("%=");
+
 7265.    631    assignment("&=");
+
 7266.    631    assignment("*=");
+
 7267.    631    assignment("+=");
+
 7268.    631    assignment("-=");
+
 7269.    631    assignment("/=");
+
 7270.    631    assignment("<<=");
+
 7271.    631    assignment("=");
+
 7272.    631    assignment(">>=");
+
 7273.    631    assignment(">>>=");
+
 7274.    631    assignment("^=");
+
 7275.    631    assignment("|=");
+
 7276.    631    constant("(number)", "number");
+
 7277.    631    constant("(regexp)", "regexp");
+
 7278.    631    constant("(string)", "string");
+
 7279.    631    constant("Function", "function", constant_Function);
+
 7280.    631    constant("Infinity", "number", Infinity);
+
 7281.    631    constant("NaN", "number", NaN);
+
 7282.    631    constant("arguments", "object", constant_arguments);
+
 7283.    631    constant("eval", "function", constant_eval);
+
 7284.    631    constant("false", "boolean", false);
+
 7285.    631    constant("ignore", "undefined", constant_ignore);
+
 7286.    631    constant("isFinite", "function", constant_isInfinite);
+
 7287.    631    constant("isNaN", "function", constant_isNaN);
+
 7288.    631    constant("null", "null", null);
+
 7289.    631    constant("this", "object", constant_this);
+
 7290.    631    constant("true", "boolean", true);
+
 7291.    631    constant("undefined", "undefined");
+
 7292.    631    infix(100, "!=");
+
 7293.    631    infix(100, "!==");
+
 7294.    631    infix(100, "==");
+
 7295.    631    infix(100, "===");
+
 7296.    631    infix(110, "<");
+
 7297.    631    infix(110, "<=");
+
 7298.    631    infix(110, ">");
+
 7299.    631    infix(110, ">=");
+
 7300.    631    infix(110, "in");
+
 7301.    631    infix(110, "instanceof");
+
 7302.    631    infix(120, "<<");
+
 7303.    631    infix(120, ">>");
+
 7304.    631    infix(120, ">>>");
+
 7305.    631    infix(130, "+");
+
 7306.    631    infix(130, "-");
+
 7307.    631    infix(140, "%");
+
 7308.    631    infix(140, "*");
+
 7309.    631    infix(140, "/");
+
 7310.    631    infix(160, "(", infix_lparen);
+
 7311.    631    infix(160, "`", infix_grave);
+
 7312.    631    infix(170, ".", infix_dot);
+
 7313.    631    infix(170, "=>", infix_fart_unwrapped);
+
 7314.    631    infix(170, "?.", infix_option_chain);
+
 7315.    631    infix(170, "[", infix_lbracket);
+
 7316.    631    infix(35, "??");
+
 7317.    631    infix(40, "||");
+
 7318.    631    infix(50, "&&");
+
 7319.    631    infix(70, "|");
+
 7320.    631    infix(80, "^");
+
 7321.    631    infix(90, "&");
+
 7322.    631    infixr(150, "**");
+
 7323.    631    postassign("++");
+
 7324.    631    postassign("--");
+
 7325.    631    preassign("++");
+
 7326.    631    preassign("--");
+
 7327.    631    prefix("!!");
+
 7328.    631    prefix("!");
+
 7329.    631    prefix("(", prefix_lparen);
+
 7330.    631    prefix("+");
+
 7331.    631    prefix("-");
+
 7332.    631    prefix("/=", prefix_assign_divide);
+
 7333.    631    prefix("=>", prefix_fart);
+
 7334.    631    prefix("[", prefix_lbracket);
+
 7335.    631    prefix("`", prefix_tick);
+
 7336.    631    prefix("async", prefix_async);
+
 7337.    631    prefix("await", prefix_await);
+
 7338.    631    prefix("function", prefix_function);
+
 7339.    631    prefix("new", prefix_new);
+
 7340.    631    prefix("typeof");
+
 7341.    631    prefix("void", prefix_void);
+
 7342.    631    prefix("{", prefix_lbrace);
+
 7343.    631    prefix("~");
+
 7344.    631    stmt(";", stmt_semicolon);
+
 7345.    631    stmt("async", prefix_async);
+
 7346.    631    stmt("await", prefix_await);
+
 7347.    631    stmt("break", stmt_break);
+
 7348.    631    stmt("const", stmt_var);
+
 7349.    631    stmt("continue", stmt_continue);
+
 7350.    631    stmt("debugger", stmt_debugger);
+
 7351.    631    stmt("delete", stmt_delete);
+
 7352.    631    stmt("do", stmt_do);
+
 7353.    631    stmt("export", stmt_export);
+
 7354.    631    stmt("for", stmt_for);
+
 7355.    631    stmt("function", prefix_function);
+
 7356.    631    stmt("if", stmt_if);
+
 7357.    631    stmt("import", stmt_import);
+
 7358.    631    stmt("let", stmt_var);
+
 7359.    631    stmt("return", stmt_return);
+
 7360.    631    stmt("switch", stmt_switch);
+
 7361.    631    stmt("throw", stmt_throw);
+
 7362.    631    stmt("try", stmt_try);
+
 7363.    631    stmt("var", stmt_var);
+
 7364.    631    stmt("while", stmt_while);
+
 7365.    631    stmt("with", stmt_with);
+
 7366.    631    stmt("{", stmt_lbrace);
+
 7367.    631    symbol(")");
+
 7368.    631    symbol("*/");
+
 7369.    631    symbol(",");
+
 7370.    631    symbol(":");
+
 7371.    631    symbol(";");
+
 7372.    631    symbol("]");
+
 7373.    631    symbol("async");
+
 7374.    631    symbol("await");
+
 7375.    631    symbol("case");
+
 7376.    631    symbol("catch");
+
 7377.    631    symbol("class");
+
 7378.    631    symbol("default");
+
 7379.    631    symbol("else");
+
 7380.    631    symbol("enum");
+
 7381.    631    symbol("finally");
+
 7382.    631    symbol("implements");
+
 7383.    631    symbol("interface");
+
 7384.    631    symbol("package");
+
 7385.    631    symbol("private");
+
 7386.    631    symbol("protected");
+
 7387.    631    symbol("public");
+
 7388.    631    symbol("static");
+
 7389.    631    symbol("super");
+
 7390.    631    symbol("void");
+
 7391.    631    symbol("yield");
+
 7392.    631    symbol("}");
+
 7393.    631    ternary("?", ":");
+
 7394.    631
+
 7395.    631// Init token_nxt.
+
 7396.    631
+
 7397.    631    advance();
+
 7398.    631
+
 7399.    631// Parsing of JSON is simple:
+
 7400.    631
+
 7401.     25    if (state.mode_json) {
+
 7402.     25        state.token_tree = parse_json();
+
 7403.     25        advance("(end)");
+
 7404.     25        return;
+
 7405.    606    }
+
 7406.    606
+
 7407.    606// Because browsers encourage combining of script files, the first token might
+
 7408.    606// be a semicolon to defend against a missing semicolon in the preceding file.
+
 7409.    606
+
 7410.    606    if (option_dict.browser) {
+
 7411.      5        if (token_nxt.id === ";") {
+
 7412.      5            advance(";");
+
 7413.      5        }
+
 7414.      5
+
 7415.      5// If we are not in a browser, then the file form of strict pragma may be used.
+
 7416.      5
+
 7417.    601    } else if (token_nxt.value === "use strict") {
+
 7418.    601        advance("(string)");
+
 7419.    601        advance(";");
+
 7420.    606    }
+
 7421.    606    state.token_tree = parse_statements();
+
 7422.    606    advance("(end)");
+
 7423.    606
+
 7424.    606// Check global functions are ordered.
+
 7425.    606
+
 7426.    606    check_ordered(
+
 7427.    606        "function",
+
 7428.   2001        function_list.map(function ({
+
 7429.   2001            level,
+
 7430.   2001            name
+
 7431.   2001        }) {
+
 7432.    606            return (level === 1) && name;
+
 7433.   2001        }).filter(function (name) {
+
 7434.   1992            return option_dict.beta && name && name.id;
+
 7435.   2001        })
+
 7436.    606    );
+
 7437.    606}
+
 7438.      1
+
 7439.    518function jslint_phase4_walk(state) {
+
 7440.    518
+
 7441.    518// PHASE 4. Walk <token_tree>, traversing all nodes of the tree. It is a
+
 7442.    518//          recursive traversal. Each node may be processed on the way down
+
 7443.    518//          (preaction) and on the way up (postaction).
+
 7444.    518
+
 7445.    518    let {
+
 7446.    518        artifact,
+
 7447.    518        catch_stack,
+
 7448.    518        function_stack,
+
 7449.    518        global_dict,
+
 7450.    518        is_equal,
+
 7451.    518        is_weird,
+
 7452.    518        option_dict,
+
 7453.    518        syntax_dict,
+
 7454.    518        test_cause,
+
 7455.    518        token_global,
+
 7456.    518        warn
+
 7457.    518    } = state;
+
 7458.    518    let block_stack = [];               // The stack of blocks.
+
 7459.    518    let blockage = token_global;        // The current block.
+
 7460.    518    let catchage = catch_stack[0];      // The current catch-block.
+
 7461.    518    let functionage = token_global;     // The current function.
+
 7462.    518    let postaction;
+
 7463.    518    let postamble;
+
 7464.    518    let posts = empty();
+
 7465.    518    let preaction;
+
 7466.    518    let preamble;
+
 7467.    518    let pres = empty();
+
 7468.    518
+
 7469.    518// The relational operators.
+
 7470.    518
+
 7471.    518    let relationop = object_assign_from_list(empty(), [
+
 7472.    518        "!=", "!==", "<", "<=", "==", "===", ">", ">="
+
 7473.    518    ], true);
+
 7474.    518
+
 7475.    518// Ambulation of the parse tree.
+
 7476.    518
+
 7477.   1036    function action(when) {
+
 7478.   1036
+
 7479.   1036// Produce a function that will register task functions that will be called as
+
 7480.   1036// the tree is traversed.
+
 7481.   1036
+
 7482.  19684        return function (arity, id, task) {
+
 7483.  19684            let a_set = when[arity];
+
 7484.  19684            let i_set;
+
 7485.  19684
+
 7486.  19684// The id parameter is optional. If excluded, the task will be applied to all
+
 7487.  19684// ids.
+
 7488.  19684
+
 7489.   4144            if (typeof id !== "string") {
+
 7490.   4144                task = id;
+
 7491.   4144                id = "(all)";
+
 7492.   4144            }
+
 7493.  19684
+
 7494.  19684// If this arity has no registrations yet, then create a set object to hold
+
 7495.  19684// them.
+
 7496.  19684
+
 7497.   5180            if (a_set === undefined) {
+
 7498.   5180                a_set = empty();
+
 7499.   5180                when[arity] = a_set;
+
 7500.   5180            }
+
 7501.  19684
+
 7502.  19684// If this id has no registrations yet, then create a set array to hold them.
+
 7503.  19684
+
 7504.  19684            i_set = a_set[id];
+
 7505.  19166            if (i_set === undefined) {
+
 7506.  19166                i_set = [];
+
 7507.  19166                a_set[id] = i_set;
+
 7508.  19166            }
+
 7509.  19684
+
 7510.  19684// Register the task with the arity and the id.
+
 7511.  19684
+
 7512.  19684            i_set.push(task);
+
 7513.  19684        };
+
 7514.   1036    }
+
 7515.    518
+
 7516.   1036    function amble(when) {
+
 7517.   1036
+
 7518.   1036// Produce a function that will act on the tasks registered by an action
+
 7519.   1036// function while walking the tree.
+
 7520.   1036
+
 7521. 210942        return function (the_token) {
+
 7522. 210942
+
 7523. 210942// Given a task set that was built by an action function, run all
+
 7524. 210942// relevant tasks on the token.
+
 7525. 210942
+
 7526. 210942            let a_set = when[the_token.arity];
+
 7527. 210942            let i_set;
+
 7528. 210942
+
 7529. 210942// If there are tasks associated with the token's arity...
+
 7530. 210942
+
 7531. 144702            if (a_set !== undefined) {
+
 7532. 144702
+
 7533. 144702// If there are tasks associated with the token's id...
+
 7534. 144702
+
 7535. 144702                i_set = a_set[the_token.id];
+
 7536. 144702                if (i_set !== undefined) {
+
 7537. 144702                    i_set.forEach(function (task) {
+
 7538. 144702                        task(the_token);
+
 7539. 144702                    });
+
 7540. 144702                }
+
 7541. 144702
+
 7542. 144702// If there are tasks for all ids.
+
 7543. 144702
+
 7544. 144702                i_set = a_set["(all)"];
+
 7545. 144702                if (i_set !== undefined) {
+
 7546. 144702                    i_set.forEach(function (task) {
+
 7547. 144702                        task(the_token);
+
 7548. 144702                    });
+
 7549. 144702                }
+
 7550. 144702            }
+
 7551. 210942        };
+
 7552.   1036    }
+
 7553.    518
+
 7554.   2818    function init_variable(name) {
+
 7555.   2818        let the_variable = lookup(name);
+
 7556.   2759        if (!the_variable || the_variable.readonly) {
+
 7557.     61            warn("bad_assignment_a", name);
+
 7558.     61            return;
+
 7559.   2757        }
+
 7560.   2757        the_variable.init = true;
+
 7561.   2757    }
+
 7562.    518
+
 7563.  31509    function lookup(thing) {
+
 7564.  31509        let id = thing.id;
+
 7565.  31509        let the_variable;
+
 7566.      1        if (thing.arity !== "variable") {
+
 7567.      1            return;
+
 7568.  31508        }
+
 7569.  31508
+
 7570.  31508// Look up the variable in the current context.
+
 7571.  31508
+
 7572.  31508        the_variable = functionage.context[id] || catchage.context[id];
+
 7573.  31509
+
 7574.  31509// If it isn't local, search all the other contexts. If there are name
+
 7575.  31509// collisions, take the most recent.
+
 7576.  31509
+
 7577.  24629        if (the_variable && the_variable.role === "label") {
+
 7578.      1
+
 7579.      1// test_cause:
+
 7580.      1// ["aa:while(0){aa;}", "lookup", "label_a", "aa", 13]
+
 7581.      1
+
 7582.      1            warn("label_a", thing);
+
 7583.      1            return the_variable;
+
 7584.  31507        }
+
 7585.  31507        if (!the_variable) {
+
 7586.  14775            function_stack.forEach(function ({
+
 7587.  14775                context
+
 7588.  14775            }) {
+
 7589.   6879                if (context[id] && context[id].role !== "label") {
+
 7590.   6879                    the_variable = context[id];
+
 7591.   6879                }
+
 7592.  14775            });
+
 7593.   6879
+
 7594.   6879// If it isn't in any of those either, perhaps it is a predefined global.
+
 7595.   6879// If so, add it to the global context.
+
 7596.   6879
+
 7597.   6879            if (!the_variable && global_dict[id] === undefined) {
+
 7598.   6879
+
 7599.   6879// test_cause:
+
 7600.   6879// ["aa", "lookup", "undeclared_a", "aa", 1]
+
 7601.   6879// ["class aa{}", "lookup", "undeclared_a", "aa", 7]
+
 7602.   6879// ["
+
 7603.   6879// let aa=0;try{aa();}catch(bb){bb();}bb();
+
 7604.   6879// ", "lookup", "undeclared_a", "bb", 36]
+
 7605.   6879// ["
+
 7606.   6879// let aa=0;try{aa();}catch(ignore){bb();}
+
 7607.   6879// ", "lookup", "undeclared_a", "bb", 34]
+
 7608.   6879
+
 7609.   6879                warn("undeclared_a", thing);
+
 7610.   6879                return;
+
 7611.   6879            }
+
 7612.   6879            if (!the_variable) {
+
 7613.   6879                the_variable = {
+
 7614.   6879                    dead: false,
+
 7615.   6879                    id,
+
 7616.   6879                    init: true,
+
 7617.   6879                    parent: token_global,
+
 7618.   6879                    readonly: true,
+
 7619.   6879                    role: "variable",
+
 7620.   6879                    used: 0
+
 7621.   6879                };
+
 7622.   6879                token_global.context[id] = the_variable;
+
 7623.   6879            }
+
 7624.   6879            the_variable.closure = true;
+
 7625.   6879            functionage.context[id] = the_variable;
+
 7626.  31370        }
+
 7627.  31370        if (
+
 7628.  31370            (
+
 7629.  31370                the_variable.calls === undefined
+
 7630.  31370                || functionage.name === undefined
+
 7631.   4364                || the_variable.calls[functionage.name.id] === undefined
+
 7632.  31509            )
+
 7633.  31185            && the_variable.dead
+
 7634.      3        ) {
+
 7635.      3
+
 7636.      3// test_cause:
+
 7637.      3// ["let aa;if(aa){let bb;}bb;", "lookup", "out_of_scope_a", "bb", 23]
+
 7638.      3
+
 7639.      3            warn("out_of_scope_a", thing);
+
 7640.  31370        }
+
 7641.  31370        return the_variable;
+
 7642.  31370    }
+
 7643.    518
+
 7644.   5009    function post_a(thing) {
+
 7645.   5009
+
 7646.   5009// Assignment using = sets the init property of a variable. No other assignment
+
 7647.   5009// operator can do this. A = token keeps that variable (or array of variables
+
 7648.   5009// in case of destructuring) in its name property.
+
 7649.   5009
+
 7650.   5009        const lvalue = thing.expression[0];
+
 7651.   5009        let right;
+
 7652.   4234        if (thing.id === "=") {
+
 7653.   4234            if (thing.names !== undefined) {
+
 7654.   4234
+
 7655.   4234// test_cause:
+
 7656.   4234// ["if(0){aa=0}", "post_a", "=", "", 0]
+
 7657.   4234
+
 7658.   4234                test_cause("=");
+
 7659.   4234
+
 7660.   4234// Probably deadcode.
+
 7661.   4234// if (Array.isArray(thing.names)) {
+
 7662.   4234//     thing.names.forEach(init_variable);
+
 7663.   4234// } else {
+
 7664.   4234//     init_variable(thing.names);
+
 7665.   4234// }
+
 7666.   4234
+
 7667.   4234                jslint_assert(
+
 7668.   4234                    !Array.isArray(thing.names),
+
 7669.   4234                    `Expected !Array.isArray(thing.names).`
+
 7670.   4234                );
+
 7671.   4234                init_variable(thing.names);
+
 7672.   4234            } else {
+
 7673.   4234                if (lvalue.id === "[" || lvalue.id === "{") {
+
 7674.   4234                    lvalue.expression.forEach(function (thing) {
+
 7675.   4234                        if (thing.variable) {
+
 7676.   4234                            thing.variable.init = true;
+
 7677.   4234                        }
+
 7678.   4234                    });
+
 7679.   4234                } else if (
+
 7680.   4234                    lvalue.id === "."
+
 7681.   4234                    && thing.expression[1].id === "undefined"
+
 7682.   4234                ) {
+
 7683.   4234
+
 7684.   4234// test_cause:
+
 7685.   4234// ["aa.aa=undefined", "post_a", "expected_a_b", "undefined", 1]
+
 7686.   4234
+
 7687.   4234                    warn(
+
 7688.   4234                        "expected_a_b",
+
 7689.   4234                        lvalue.expression,
+
 7690.   4234                        "delete",
+
 7691.   4234                        "undefined"
+
 7692.   4234                    );
+
 7693.   4234                }
+
 7694.   4234            }
+
 7695.   4234        } else {
+
 7696.    775            if (lvalue.arity === "variable") {
+
 7697.    775                if (!lvalue.variable || lvalue.variable.readonly) {
+
 7698.    775                    warn("bad_assignment_a", lvalue);
+
 7699.    775                }
+
 7700.    775            }
+
 7701.    775            right = syntax_dict[thing.expression[1].id];
+
 7702.    775            if (
+
 7703.    775                right !== undefined
+
 7704.    775                && (
+
 7705.    775                    right.id === "function"
+
 7706.    775                    || right.id === "=>"
+
 7707.    775                    || (
+
 7708.    775                        right.constant
+
 7709.    775                        && right.id !== "(number)"
+
 7710.    775                        && (right.id !== "(string)" || thing.id !== "+=")
+
 7711.    775                    )
+
 7712.    775                )
+
 7713.    775            ) {
+
 7714.    775
+
 7715.    775// test_cause:
+
 7716.    775// ["aa+=undefined", "post_a", "unexpected_a", "undefined", 5]
+
 7717.    775
+
 7718.    775                warn("unexpected_a", thing.expression[1]);
+
 7719.    775            }
+
 7720.    775        }
+
 7721.   5009    }
+
 7722.    518
+
 7723.    706    function post_a_pluseq(thing) {
+
 7724.    706        const right = thing.expression[1];
+
 7725.    396        if (right.constant) {
+
 7726.    396            if (
+
 7727.    396                right.value === ""
+
 7728.    396                || (right.id === "(number)" && right.value === "0")
+
 7729.    396                || right.id === "(boolean)"
+
 7730.    396                || right.id === "null"
+
 7731.    396                || right.id === "undefined"
+
 7732.    396                || Number.isNaN(right.value)
+
 7733.    396            ) {
+
 7734.    396                warn("unexpected_a", right);
+
 7735.    396            }
+
 7736.    396        }
+
 7737.    706    }
+
 7738.    518
+
 7739.  31933    function post_b(thing) {
+
 7740.  31933        let right;
+
 7741.   3960        if (relationop[thing.id]) {
+
 7742.   3960            if (
+
 7743.   3960                is_weird(thing.expression[0])
+
 7744.   3960                || is_weird(thing.expression[1])
+
 7745.   3960                || is_equal(thing.expression[0], thing.expression[1])
+
 7746.   3960                || (
+
 7747.   3960                    thing.expression[0].constant === true
+
 7748.   3960                    && thing.expression[1].constant === true
+
 7749.   3960                )
+
 7750.   3960            ) {
+
 7751.   3960
+
 7752.   3960// test_cause:
+
 7753.   3960// ["if(0===0){0}", "post_b", "weird_relation_a", "===", 5]
+
 7754.   3960
+
 7755.   3960                warn("weird_relation_a", thing);
+
 7756.   3960            }
+
 7757.   3960        }
+
 7758.   2023        if (thing.id === "+") {
+
 7759.   2023            if (!option_dict.convert) {
+
 7760.   2023                if (thing.expression[0].value === "") {
+
 7761.   2023
+
 7762.   2023// test_cause:
+
 7763.   2023// ["\"\"+0", "post_b", "expected_a_b", "\"\" +", 3]
+
 7764.   2023
+
 7765.   2023                    warn("expected_a_b", thing, "String(...)", "\"\" +");
+
 7766.   2023                } else if (thing.expression[1].value === "") {
+
 7767.   2023
+
 7768.   2023// test_cause:
+
 7769.   2023// ["0+\"\"", "post_b", "expected_a_b", "+ \"\"", 2]
+
 7770.   2023
+
 7771.   2023                    warn("expected_a_b", thing, "String(...)", "+ \"\"");
+
 7772.   2023                }
+
 7773.   2023            }
+
 7774.  29910        } else if (thing.id === "[") {
+
 7775.  29910            if (thing.expression[0].id === "window") {
+
 7776.  29910
+
 7777.  29910// test_cause:
+
 7778.  29910// ["aa=window[0]", "post_b", "weird_expression_a", "window[...]", 10]
+
 7779.  29910
+
 7780.  29910                warn("weird_expression_a", thing, "window[...]");
+
 7781.  29910            }
+
 7782.  29910            if (thing.expression[0].id === "self") {
+
 7783.  29910
+
 7784.  29910// test_cause:
+
 7785.  29910// ["aa=self[0]", "post_b", "weird_expression_a", "self[...]", 8]
+
 7786.  29910
+
 7787.  29910                warn("weird_expression_a", thing, "self[...]");
+
 7788.  29910            }
+
 7789.  29910        } else if (thing.id === "." || thing.id === "?.") {
+
 7790.  29910            if (thing.expression.id === "RegExp") {
+
 7791.  29910
+
 7792.  29910// test_cause:
+
 7793.  29910// ["aa=RegExp.aa", "post_b", "weird_expression_a", ".", 10]
+
 7794.  29910
+
 7795.  29910                warn("weird_expression_a", thing);
+
 7796.  29910            }
+
 7797.  29910        } else if (thing.id !== "=>" && thing.id !== "(") {
+
 7798.  29910            right = thing.expression[1];
+
 7799.  29910            if (
+
 7800.  29910                (thing.id === "+" || thing.id === "-")
+
 7801.  29910                && right.id === thing.id
+
 7802.  29910                && right.arity === "unary"
+
 7803.  29910                && !right.wrapped
+
 7804.  29910            ) {
+
 7805.  29910
+
 7806.  29910// test_cause:
+
 7807.  29910// ["0- -0", "post_b", "wrap_unary", "-", 4]
+
 7808.  29910
+
 7809.  29910                warn("wrap_unary", right);
+
 7810.  29910            }
+
 7811.  29910            if (
+
 7812.  29910                thing.expression[0].constant === true
+
 7813.  29910                && right.constant === true
+
 7814.  29910            ) {
+
 7815.  29910                thing.constant = true;
+
 7816.  29910            }
+
 7817.  29910        }
+
 7818.  31933    }
+
 7819.    518
+
 7820.   1202    function post_b_and(thing) {
+
 7821.   1202        if (
+
 7822.   1202            is_weird(thing.expression[0])
+
 7823.   1197            || is_equal(thing.expression[0], thing.expression[1])
+
 7824.   1183            || thing.expression[0].constant === true
+
 7825.   1181            || thing.expression[1].constant === true
+
 7826.     21        ) {
+
 7827.     21
+
 7828.     21// test_cause:
+
 7829.     21// ["aa=(()=>0)&&(()=>0)", "post_b_and", "weird_condition_a", "&&", 11]
+
 7830.     21// ["aa=(``?``:``)&&(``?``:``)", "post_b_and", "weird_condition_a", "&&", 14]
+
 7831.     21// ["aa=/./&&/./", "post_b_and", "weird_condition_a", "&&", 7]
+
 7832.     21// ["aa=0&&0", "post_b_and", "weird_condition_a", "&&", 5]
+
 7833.     21// ["aa=[]&&[]", "post_b_and", "weird_condition_a", "&&", 6]
+
 7834.     21// ["aa=`${0}`&&`${0}`", "post_b_and", "weird_condition_a", "&&", 10]
+
 7835.     21// ["
+
 7836.     21// aa=function aa(){}&&function aa(){}
+
 7837.     21// ", "post_b_and", "weird_condition_a", "&&", 19]
+
 7838.     21// ["aa={}&&{}", "post_b_and", "weird_condition_a", "&&", 6]
+
 7839.     21
+
 7840.     21            warn("weird_condition_a", thing);
+
 7841.     21        }
+
 7842.   1202    }
+
 7843.    518
+
 7844.   1460    function post_b_lbracket(thing) {
+
 7845.      1        if (thing.expression[0].id === "RegExp") {
+
 7846.      1
+
 7847.      1// test_cause:
+
 7848.      1// ["aa=RegExp[0]", "post_b_lbracket", "weird_expression_a", "[", 10]
+
 7849.      1
+
 7850.      1            warn("weird_expression_a", thing);
+
 7851.      1        }
+
 7852.      1        if (is_weird(thing.expression[1])) {
+
 7853.      1
+
 7854.      1// test_cause:
+
 7855.      1// ["aa[[0]]", "post_b_lbracket", "weird_expression_a", "[", 4]
+
 7856.      1
+
 7857.      1            warn("weird_expression_a", thing.expression[1]);
+
 7858.      1        }
+
 7859.   1460    }
+
 7860.    518
+
 7861.  10411    function post_b_lparen(thing) {
+
 7862.  10411        let arg;
+
 7863.  10411        let array;
+
 7864.  10411        let cack;
+
 7865.  10411        let left = thing.expression[0];
+
 7866.  10411        let new_date;
+
 7867.  10411        let paren;
+
 7868.  10411        let the_new;
+
 7869.    154        if (left.id === "new") {
+
 7870.    154            the_new = left;
+
 7871.    154            left = left.expression;
+
 7872.    154        }
+
 7873.     37        if (left.id === "function") {
+
 7874.     37            if (!thing.wrapped) {
+
 7875.     37
+
 7876.     37// test_cause:
+
 7877.     37// ["aa=function(){}()", "post_b_lparen", "wrap_immediate", "(", 16]
+
 7878.     37
+
 7879.     37                warn("wrap_immediate", thing);
+
 7880.     37            }
+
 7881.  10374        } else if (left.identifier) {
+
 7882.  10374            if (the_new !== undefined) {
+
 7883.  10374                if (
+
 7884.  10374                    left.id[0] > "Z"
+
 7885.  10374                    || left.id === "BigInt"
+
 7886.  10374                    || left.id === "Boolean"
+
 7887.  10374                    || left.id === "Number"
+
 7888.  10374                    || left.id === "String"
+
 7889.  10374                    || left.id === "Symbol"
+
 7890.  10374                ) {
+
 7891.  10374
+
 7892.  10374// test_cause:
+
 7893.  10374// ["new BigInt()", "post_b_lparen", "unexpected_a", "new", 1]
+
 7894.  10374// ["new Boolean()", "post_b_lparen", "unexpected_a", "new", 1]
+
 7895.  10374// ["new Number()", "post_b_lparen", "unexpected_a", "new", 1]
+
 7896.  10374// ["new String()", "post_b_lparen", "unexpected_a", "new", 1]
+
 7897.  10374// ["new Symbol()", "post_b_lparen", "unexpected_a", "new", 1]
+
 7898.  10374// ["new aa()", "post_b_lparen", "unexpected_a", "new", 1]
+
 7899.  10374
+
 7900.  10374                    warn("unexpected_a", the_new);
+
 7901.  10374                } else if (left.id === "Function") {
+
 7902.  10374                    if (!option_dict.eval) {
+
 7903.  10374
+
 7904.  10374// test_cause:
+
 7905.  10374// ["new Function()", "post_b_lparen", "unexpected_a", "new Function", 5]
+
 7906.  10374
+
 7907.  10374                        warn("unexpected_a", left, "new Function");
+
 7908.  10374                    }
+
 7909.  10374                } else if (left.id === "Array") {
+
 7910.  10374                    arg = thing.expression;
+
 7911.  10374                    if (arg.length !== 2 || arg[1].id === "(string)") {
+
 7912.  10374
+
 7913.  10374// test_cause:
+
 7914.  10374// ["new Array()", "post_b_lparen", "expected_a_b", "new Array", 5]
+
 7915.  10374
+
 7916.  10374                        warn("expected_a_b", left, "[]", "new Array");
+
 7917.  10374                    }
+
 7918.  10374                } else if (left.id === "Object") {
+
 7919.  10374
+
 7920.  10374// test_cause:
+
 7921.  10374// ["new Object()", "post_b_lparen", "expected_a_b", "new Object", 5]
+
 7922.  10374
+
 7923.  10374                    warn(
+
 7924.  10374                        "expected_a_b",
+
 7925.  10374                        left,
+
 7926.  10374                        "Object.create(null)",
+
 7927.  10374                        "new Object"
+
 7928.  10374                    );
+
 7929.  10374                }
+
 7930.  10374            } else {
+
 7931.  10374                if (
+
 7932.  10374                    left.id[0] >= "A"
+
 7933.  10374                    && left.id[0] <= "Z"
+
 7934.  10374                    && left.id !== "BigInt"
+
 7935.  10374                    && left.id !== "Boolean"
+
 7936.  10374                    && left.id !== "Number"
+
 7937.  10374                    && left.id !== "String"
+
 7938.  10374                    && left.id !== "Symbol"
+
 7939.  10374                ) {
+
 7940.  10374
+
 7941.  10374// test_cause:
+
 7942.  10374// ["let Aa=Aa()", "post_b_lparen", "expected_a_before_b", "Aa", 8]
+
 7943.  10374
+
 7944.  10374                    warn("expected_a_before_b", left, "new", artifact(left));
+
 7945.  10374                }
+
 7946.  10374            }
+
 7947.  10374        } else if (left.id === ".") {
+
 7948.  10374            cack = the_new !== undefined;
+
 7949.  10374            if (left.expression.id === "Date" && left.name.id === "UTC") {
+
 7950.  10374
+
 7951.  10374// test_cause:
+
 7952.  10374// ["new Date.UTC()", "post_b_lparen", "cack", "", 0]
+
 7953.  10374
+
 7954.  10374                test_cause("cack");
+
 7955.  10374                cack = !cack;
+
 7956.  10374            }
+
 7957.  10374            if (jslint_rgx_cap.test(left.name.id) !== cack) {
+
 7958.  10374                if (the_new !== undefined) {
+
 7959.  10374
+
 7960.  10374// test_cause:
+
 7961.  10374// ["new Date.UTC()", "post_b_lparen", "unexpected_a", "new", 1]
+
 7962.  10374
+
 7963.  10374                    warn("unexpected_a", the_new);
+
 7964.  10374                } else {
+
 7965.  10374
+
 7966.  10374// test_cause:
+
 7967.  10374// ["let Aa=Aa.Aa()", "post_b_lparen", "expected_a_before_b", "Aa", 8]
+
 7968.  10374
+
 7969.  10374                    warn(
+
 7970.  10374                        "expected_a_before_b",
+
 7971.  10374                        left.expression,
+
 7972.  10374                        "new",
+
 7973.  10374                        left.name.id
+
 7974.  10374                    );
+
 7975.  10374                }
+
 7976.  10374            }
+
 7977.  10374            if (left.name.id === "getTime") {
+
 7978.  10374                paren = left.expression;
+
 7979.  10374                if (paren.id === "(") {
+
 7980.  10374                    array = paren.expression;
+
 7981.  10374                    if (array.length === 1) {
+
 7982.  10374                        new_date = array[0];
+
 7983.  10374                        if (
+
 7984.  10374                            new_date.id === "new"
+
 7985.  10374                            && new_date.expression.id === "Date"
+
 7986.  10374                        ) {
+
 7987.  10374
+
 7988.  10374// test_cause:
+
 7989.  10374// ["
+
 7990.  10374// new Date().getTime()
+
 7991.  10374// ", "post_b_lparen", "expected_a_b", "new Date().getTime()", 1]
+
 7992.  10374
+
 7993.  10374                            warn(
+
 7994.  10374                                "expected_a_b",
+
 7995.  10374                                new_date,
+
 7996.  10374                                "Date.now()",
+
 7997.  10374                                "new Date().getTime()"
+
 7998.  10374                            );
+
 7999.  10374                        }
+
 8000.  10374                    }
+
 8001.  10374                }
+
 8002.  10374            }
+
 8003.  10374        }
+
 8004.  10411    }
+
 8005.    518
+
 8006.    974    function post_b_or(thing) {
+
 8007.    974        if (
+
 8008.    974            is_weird(thing.expression[0])
+
 8009.    974            || is_equal(thing.expression[0], thing.expression[1])
+
 8010.    973            || thing.expression[0].constant === true
+
 8011.      2        ) {
+
 8012.      2
+
 8013.      2// test_cause:
+
 8014.      2// ["aa=0||0", "post_b_or", "weird_condition_a", "||", 5]
+
 8015.      2
+
 8016.      2            warn("weird_condition_a", thing);
+
 8017.      2        }
+
 8018.    974    }
+
 8019.    518
+
 8020.     78    function post_s_export(the_thing) {
+
 8021.     78
+
 8022.     78// Some features must be at the most outermost level.
+
 8023.     78
+
 8024.      1        if (blockage !== token_global) {
+
 8025.      1
+
 8026.      1// test_cause:
+
 8027.      1// ["
+
 8028.      1// if(0){import aa from "aa";}
+
 8029.      1// ", "post_s_export", "misplaced_a", "import", 7]
+
 8030.      1
+
 8031.      1            warn("misplaced_a", the_thing);
+
 8032.      1        }
+
 8033.     78    }
+
 8034.    518
+
 8035.      8    function post_s_for(thing) {
+
 8036.      8
+
 8037.      8// Recurse walk_statement().
+
 8038.      8
+
 8039.      8        walk_statement(thing.inc);
+
 8040.      8    }
+
 8041.    518
+
 8042.   2001    function post_s_function(thing) {
+
 8043.   2001        delete functionage.async;
+
 8044.   2001        delete functionage.finally;
+
 8045.   2001        delete functionage.loop;
+
 8046.   2001        delete functionage.statement_prv;
+
 8047.   2001        delete functionage.switch;
+
 8048.   2001        delete functionage.try;
+
 8049.   2001        functionage = function_stack.pop();
+
 8050.      3        if (thing.wrapped) {
+
 8051.      3
+
 8052.      3// test_cause:
+
 8053.      3// ["aa=(function(){})", "post_s_function", "unexpected_parens", "function", 5]
+
 8054.      3
+
 8055.      3            warn("unexpected_parens", thing);
+
 8056.      3        }
+
 8057.   2001        return post_s_lbrace();
+
 8058.   2001    }
+
 8059.    518
+
 8060.     61    function post_s_import(the_thing) {
+
 8061.     61        const name = the_thing.name;
+
 8062.     60        if (name) {
+
 8063.     60            if (Array.isArray(name)) {
+
 8064.     60                name.forEach(function (name) {
+
 8065.     60                    name.dead = false;
+
 8066.     60                    name.init = true;
+
 8067.     60                    blockage.live.push(name);
+
 8068.     60                });
+
 8069.     60            } else {
+
 8070.     60                name.dead = false;
+
 8071.     60                name.init = true;
+
 8072.     60                blockage.live.push(name);
+
 8073.     60            }
+
 8074.     60            return post_s_export(the_thing);
+
 8075.     60        }
+
 8076.     61    }
+
 8077.    518
+
 8078.   7695    function post_s_lbrace() {
+
 8079.   2987        blockage.live.forEach(function (name) {
+
 8080.   2987            name.dead = true;
+
 8081.   2987        });
+
 8082.   7695        delete blockage.live;
+
 8083.   7695        blockage = block_stack.pop();
+
 8084.   7695    }
+
 8085.    518
+
 8086.     56    function post_s_try(thing) {
+
 8087.     54        if (thing.catch) {
+
 8088.     54            if (thing.catch.name) {
+
 8089.     54                Object.assign(catchage.context[thing.catch.name.id], {
+
 8090.     54                    dead: false,
+
 8091.     54                    init: true
+
 8092.     54                });
+
 8093.     54            }
+
 8094.     54
+
 8095.     54// Recurse walk_statement().
+
 8096.     54
+
 8097.     54            walk_statement(thing.catch.block);
+
 8098.     54
+
 8099.     54// Restore previous catch-scope after catch-block.
+
 8100.     54
+
 8101.     54            catchage = catch_stack.pop();
+
 8102.     54        }
+
 8103.     56    }
+
 8104.    518
+
 8105.   2320    function post_s_var(thing) {
+
 8106.   2635        thing.names.forEach(function (name) {
+
 8107.   2635            name.dead = false;
+
 8108.   1250            if (name.expression !== undefined) {
+
 8109.   1250                walk_expression(name.expression);
+
 8110.   1250
+
 8111.   1250// Probably deadcode.
+
 8112.   1250// if (name.id === "{" || name.id === "[") {
+
 8113.   1250//     name.names.forEach(subactivate);
+
 8114.   1250// } else {
+
 8115.   1250//     name.init = true;
+
 8116.   1250// }
+
 8117.   1250
+
 8118.   1250                jslint_assert(
+
 8119.   1250                    !(name.id === "{" || name.id === "["),
+
 8120.   1250                    `Expected !(name.id === "{" || name.id === "[").`
+
 8121.   1250                );
+
 8122.   1250                name.init = true;
+
 8123.   1250            }
+
 8124.   2635            blockage.live.push(name);
+
 8125.   2635        });
+
 8126.   2320    }
+
 8127.    518
+
 8128.    213    function post_t(thing) {
+
 8129.    213        if (
+
 8130.    213            is_weird(thing.expression[0])
+
 8131.    213            || thing.expression[0].constant === true
+
 8132.    206            || is_equal(thing.expression[1], thing.expression[2])
+
 8133.      9        ) {
+
 8134.      9
+
 8135.      9// test_cause:
+
 8136.      9// ["let aa=(aa?`${0}`:`${0}`);", "post_t", "unexpected_a", "?", 11]
+
 8137.      9// ["let aa=(aa?`0`:`0`);", "post_t", "unexpected_a", "?", 11]
+
 8138.      9
+
 8139.      9            warn("unexpected_a", thing);
+
 8140.    204        } else if (is_equal(thing.expression[0], thing.expression[1])) {
+
 8141.    204
+
 8142.    204// test_cause:
+
 8143.    204// ["aa?aa:0", "post_t", "expected_a_b", "?", 3]
+
 8144.    204
+
 8145.    204            warn("expected_a_b", thing, "||", "?");
+
 8146.    204        } else if (is_equal(thing.expression[0], thing.expression[2])) {
+
 8147.    204
+
 8148.    204// test_cause:
+
 8149.    204// ["aa?0:aa", "post_t", "expected_a_b", "?", 3]
+
 8150.    204
+
 8151.    204            warn("expected_a_b", thing, "&&", "?");
+
 8152.    204        } else if (
+
 8153.    204            thing.expression[1].id === "true"
+
 8154.    204            && thing.expression[2].id === "false"
+
 8155.    204        ) {
+
 8156.    204
+
 8157.    204// test_cause:
+
 8158.    204// ["aa?true:false", "post_t", "expected_a_b", "?", 3]
+
 8159.    204
+
 8160.    204            warn("expected_a_b", thing, "!!", "?");
+
 8161.    204        } else if (
+
 8162.    204            thing.expression[1].id === "false"
+
 8163.    204            && thing.expression[2].id === "true"
+
 8164.    204        ) {
+
 8165.    204
+
 8166.    204// test_cause:
+
 8167.    204// ["aa?false:true", "post_t", "expected_a_b", "?", 3]
+
 8168.    204
+
 8169.    204            warn("expected_a_b", thing, "!", "?");
+
 8170.    204        } else if (
+
 8171.    204            thing.expression[0].wrapped !== true
+
 8172.    204            && (
+
 8173.    204                thing.expression[0].id === "||"
+
 8174.    204                || thing.expression[0].id === "&&"
+
 8175.    204            )
+
 8176.    204        ) {
+
 8177.    204
+
 8178.    204// test_cause:
+
 8179.    204// ["(aa&&!aa?0:1)", "post_t", "wrap_condition", "&&", 4]
+
 8180.    204
+
 8181.    204            warn("wrap_condition", thing.expression[0]);
+
 8182.    204        }
+
 8183.    213    }
+
 8184.    518
+
 8185.   4106    function post_u(thing) {
+
 8186.    779        if (thing.id === "`") {
+
 8187.    779            if (thing.expression.every(function (thing) {
+
 8188.    779                return thing.constant;
+
 8189.    779            })) {
+
 8190.    779                thing.constant = true;
+
 8191.    779            }
+
 8192.   3327        } else if (thing.id === "!") {
+
 8193.   3327            if (thing.expression.constant === true) {
+
 8194.   3327                warn("unexpected_a", thing);
+
 8195.   3327            }
+
 8196.   3327        } else if (thing.id === "!!") {
+
 8197.   3327            if (!option_dict.convert) {
+
 8198.   3327
+
 8199.   3327// test_cause:
+
 8200.   3327// ["!!0", "post_u", "expected_a_b", "!!", 1]
+
 8201.   3327
+
 8202.   3327                warn("expected_a_b", thing, "Boolean(...)", "!!");
+
 8203.   3327            }
+
 8204.   3327        } else if (
+
 8205.   3327            thing.id !== "["
+
 8206.   3327            && thing.id !== "{"
+
 8207.   3327            && thing.id !== "function"
+
 8208.   3327            && thing.id !== "new"
+
 8209.   3327        ) {
+
 8210.   3327            if (thing.expression.constant === true) {
+
 8211.   3327                thing.constant = true;
+
 8212.   3327            }
+
 8213.   3327        }
+
 8214.   4106    }
+
 8215.    518
+
 8216.      7    function post_u_plus(thing) {
+
 8217.      7        const right = thing.expression;
+
 8218.      7        if (!option_dict.convert) {
+
 8219.      7
+
 8220.      7// test_cause:
+
 8221.      7// ["aa=+0", "post_u_plus", "expected_a_b", "+", 4]
+
 8222.      7
+
 8223.      7            warn("expected_a_b", thing, "Number(...)", "+");
+
 8224.      7        }
+
 8225.      1        if (right.id === "(" && right.expression[0].id === "new") {
+
 8226.      1            warn("unexpected_a_before_b", thing, "+", "new");
+
 8227.      6        } else if (
+
 8228.      6            right.constant
+
 8229.      6            || right.id === "{"
+
 8230.      6            || (right.id === "[" && right.arity !== "binary")
+
 8231.      6        ) {
+
 8232.      6            warn("unexpected_a", thing, "+");
+
 8233.      6        }
+
 8234.      7    }
+
 8235.    518
+
 8236.  36945    function pre_a_bitwise(thing) {
+
 8237.  36945
+
 8238.  36945// These are the bitwise operators.
+
 8239.  36945
+
 8240.  36943        switch (!option_dict.bitwise && thing.id) {
+
 8241.      2        case "&":
+
 8242.      3        case "&=":
+
 8243.      5        case "<<":
+
 8244.      6        case "<<=":
+
 8245.      8        case ">>":
+
 8246.      9        case ">>=":
+
 8247.     11        case ">>>":
+
 8248.     12        case ">>>=":
+
 8249.     14        case "^":
+
 8250.     15        case "^=":
+
 8251.     17        case "|":
+
 8252.     18        case "|=":
+
 8253.     21        case "~":
+
 8254.     21
+
 8255.     21// test_cause:
+
 8256.     21// ["0&0", "pre_a_bitwise", "unexpected_a", "&", 2]
+
 8257.     21// ["0&=0", "pre_a_bitwise", "unexpected_a", "&=", 2]
+
 8258.     21// ["0<<0", "pre_a_bitwise", "unexpected_a", "<<", 2]
+
 8259.     21// ["0<<=0", "pre_a_bitwise", "unexpected_a", "<<=", 2]
+
 8260.     21// ["0>>0", "pre_a_bitwise", "unexpected_a", ">>", 2]
+
 8261.     21// ["0>>=0", "pre_a_bitwise", "unexpected_a", ">>=", 2]
+
 8262.     21// ["0>>>0", "pre_a_bitwise", "unexpected_a", ">>>", 2]
+
 8263.     21// ["0>>>=0", "pre_a_bitwise", "unexpected_a", ">>>=", 2]
+
 8264.     21// ["0^0", "pre_a_bitwise", "unexpected_a", "^", 2]
+
 8265.     21// ["0^=0", "pre_a_bitwise", "unexpected_a", "^=", 2]
+
 8266.     21// ["0|0", "pre_a_bitwise", "unexpected_a", "|", 2]
+
 8267.     21// ["0|=0", "pre_a_bitwise", "unexpected_a", "|=", 2]
+
 8268.     21// ["~0", "pre_a_bitwise", "unexpected_a", "~", 1]
+
 8269.     21
+
 8270.     21            warn("unexpected_a", thing);
+
 8271.     21            break;
+
 8272.  36945        }
+
 8273.  36945        if (
+
 8274.  36945            thing.id !== "("
+
 8275.  26534            && thing.id !== "&&"
+
 8276.  25332            && thing.id !== "||"
+
 8277.  24358            && thing.id !== "="
+
 8278.  20124            && Array.isArray(thing.expression)
+
 8279.   8506            && thing.expression.length === 2
+
 8280.   8505            && (
+
 8281.   8505                relationop[thing.expression[0].id] === true
+
 8282.   8505                || relationop[thing.expression[1].id] === true
+
 8283.   8505            )
+
 8284.      1        ) {
+
 8285.      1
+
 8286.      1// test_cause:
+
 8287.      1// ["0<0<0", "pre_a_bitwise", "unexpected_a", "<", 4]
+
 8288.      1
+
 8289.      1            warn("unexpected_a", thing);
+
 8290.      1        }
+
 8291.  36945    }
+
 8292.    518
+
 8293.  31933    function pre_b(thing) {
+
 8294.  31933        let left;
+
 8295.  31933        let right;
+
 8296.  31933        let value;
+
 8297.   3960        if (relationop[thing.id] === true) {
+
 8298.   3960            left = thing.expression[0];
+
 8299.   3960            right = thing.expression[1];
+
 8300.   3960            if (left.id === "NaN" || right.id === "NaN") {
+
 8301.   3960
+
 8302.   3960// test_cause:
+
 8303.   3960// ["NaN===NaN", "pre_b", "number_isNaN", "===", 4]
+
 8304.   3960
+
 8305.   3960                warn("number_isNaN", thing);
+
 8306.   3960            } else if (left.id === "typeof") {
+
 8307.   3960                if (right.id !== "(string)") {
+
 8308.   3960                    if (right.id !== "typeof") {
+
 8309.   3960
+
 8310.   3960// test_cause:
+
 8311.   3960// ["typeof 0===0", "pre_b", "expected_string_a", "0", 12]
+
 8312.   3960
+
 8313.   3960                        warn("expected_string_a", right);
+
 8314.   3960                    }
+
 8315.   3960                } else {
+
 8316.   3960                    value = right.value;
+
 8317.   3960                    if (value === "null" || value === "undefined") {
+
 8318.   3960
+
 8319.   3960// test_cause:
+
 8320.   3960// ["
+
 8321.   3960// typeof aa==="undefined"
+
 8322.   3960// ", "pre_b", "unexpected_typeof_a", "undefined", 13]
+
 8323.   3960
+
 8324.   3960                        warn("unexpected_typeof_a", right, value);
+
 8325.   3960                    } else if (
+
 8326.   3960                        value !== "bigint"
+
 8327.   3960                        && value !== "boolean"
+
 8328.   3960                        && value !== "function"
+
 8329.   3960                        && value !== "number"
+
 8330.   3960                        && value !== "object"
+
 8331.   3960                        && value !== "string"
+
 8332.   3960                        && value !== "symbol"
+
 8333.   3960                    ) {
+
 8334.   3960
+
 8335.   3960// test_cause:
+
 8336.   3960// ["typeof 0===\"aa\"", "pre_b", "expected_type_string_a", "aa", 12]
+
 8337.   3960
+
 8338.   3960                        warn("expected_type_string_a", right, value);
+
 8339.   3960                    }
+
 8340.   3960                }
+
 8341.   3960            }
+
 8342.   3960        }
+
 8343.  31933    }
+
 8344.    518
+
 8345.      1    function pre_b_eqeq(thing) {
 8346.      1
-
 8347.      1        warn("infix_in", thing);
-
 8348.      1    }
-
 8349.    516
-
 8350.      1    function pre_b_instanceof(thing) {
-
 8351.      1
-
 8352.      1// test_cause:
-
 8353.      1// ["0 instanceof 0", "pre_b_instanceof", "unexpected_a", "instanceof", 3]
+
 8347.      1// test_cause:
+
 8348.      1// ["0==0", "pre_b_eqeq", "expected_a_b", "==", 2]
+
 8349.      1
+
 8350.      1        warn("expected_a_b", thing, "===", "==");
+
 8351.      1    }
+
 8352.    518
+
 8353.      1    function pre_b_in(thing) {
 8354.      1
-
 8355.      1        warn("unexpected_a", thing);
-
 8356.      1    }
-
 8357.    516
-
 8358.  10405    function pre_b_lparen(thing) {
-
 8359.  10405        const left = thing.expression[0];
-
 8360.  10405        let left_variable;
-
 8361.  10405        let parent;
-
 8362.  10405        if (
-
 8363.  10405            left.identifier
-
 8364.   6652            && functionage.context[left.id] === undefined
-
 8365.   3033            && typeof functionage.name === "object"
-
 8366.   2395        ) {
-
 8367.   2395            parent = functionage.name.parent;
-
 8368.   2395            if (parent) {
-
 8369.   2395                left_variable = parent.context[left.id];
-
 8370.   2395                if (
-
 8371.   2395                    left_variable !== undefined
-
 8372.   2395
-
 8373.   2395// Probably deadcode.
-
 8374.   2395// && left_variable.dead
-
 8375.   2395
-
 8376.   2395                    && left_variable.parent === parent
-
 8377.   2395                    && left_variable.calls !== undefined
-
 8378.   2395                    && left_variable.calls[functionage.name.id] !== undefined
-
 8379.   2395                ) {
-
 8380.   2395                    left_variable.dead = false;
-
 8381.   2395                }
-
 8382.   2395            }
-
 8383.   2395        }
-
 8384.  10405    }
-
 8385.    516
-
 8386.      1    function pre_b_noteq(thing) {
-
 8387.      1
-
 8388.      1// test_cause:
-
 8389.      1// ["0!=0", "pre_b_noteq", "expected_a_b", "!=", 2]
-
 8390.      1
-
 8391.      1        warn("expected_a_b", thing, "!==", "!=");
-
 8392.      1    }
-
 8393.    516
-
 8394.    969    function pre_b_or(thing) {
-
 8395.   1938        thing.expression.forEach(function (thang) {
-
 8396.    177            if (thang.id === "&&" && !thang.wrapped) {
-
 8397.      1
-
 8398.      1// test_cause:
-
 8399.      1// ["0&&0||0", "pre_b_or", "and", "&&", 2]
-
 8400.      1
-
 8401.      1                warn("and", thang);
-
 8402.      1            }
-
 8403.   1938        });
-
 8404.    969    }
-
 8405.    516
-
 8406.      8    function pre_s_for(thing) {
-
 8407.      8        let the_variable;
-
 8408.      2        if (thing.name !== undefined) {
-
 8409.      2            thing.name.dead = false;
-
 8410.      2            the_variable = lookup(thing.name);
-
 8411.      2            if (the_variable !== undefined) {
-
 8412.      2                if (the_variable.init && the_variable.readonly) {
-
 8413.      2
-
 8414.      2// test_cause:
-
 8415.      2// ["const aa=0;for(aa in aa){}", "pre_s_for", "bad_assignment_a", "aa", 16]
-
 8416.      2
-
 8417.      2                    warn("bad_assignment_a", thing.name);
-
 8418.      2                }
-
 8419.      2                the_variable.init = true;
-
 8420.      2            }
-
 8421.      2        }
-
 8422.      8
-
 8423.      8// Recurse walk_statement().
-
 8424.      8
-
 8425.      8        walk_statement(thing.initial);
-
 8426.      8    }
-
 8427.    516
-
 8428.   2001    function pre_s_function(thing) {
-
 8429.   2001
-
 8430.   2001// test_cause:
-
 8431.   2001// ["()=>0", "pre_s_function", "", "", 0]
-
 8432.   2001// ["(function (){}())", "pre_s_function", "", "", 0]
-
 8433.   2001// ["function aa(){}", "pre_s_function", "", "", 0]
-
 8434.   2001
-
 8435.   2001        test_cause("");
-
 8436.   1057        if (thing.arity === "statement" && blockage.body !== true) {
-
 8437.      1
-
 8438.      1// test_cause:
-
 8439.      1// ["if(0){function aa(){}\n}", "pre_s_function", "unexpected_a", "function", 7]
-
 8440.      1
-
 8441.      1            warn("unexpected_a", thing);
-
 8442.      1        }
-
 8443.   2001        function_stack.push(functionage);
-
 8444.   2001        block_stack.push(blockage);
-
 8445.   2001        functionage = thing;
-
 8446.   2001        blockage = thing;
-
 8447.   2001        thing.live = [];
-
 8448.   1098        if (typeof thing.name === "object") {
-
 8449.   1098            thing.name.dead = false;
-
 8450.   1098            thing.name.init = true;
-
 8451.   1098        }
-
 8452.      7        if (thing.extra === "get") {
-
 8453.      7            if (thing.parameters.length !== 0) {
-
 8454.      7
-
 8455.      7// test_cause:
-
 8456.      7// ["
-
 8457.      7// /*jslint getset*/
-
 8458.      7// aa={get aa(aa){}}
-
 8459.      7// ", "pre_s_function", "bad_get", "function", 9]
-
 8460.      7
-
 8461.      7                warn("bad_get", thing);
-
 8462.      7            }
-
 8463.   1994        } else if (thing.extra === "set") {
-
 8464.   1994            if (thing.parameters.length !== 1) {
-
 8465.   1994
-
 8466.   1994// test_cause:
-
 8467.   1994// ["
-
 8468.   1994// /*jslint getset*/
-
 8469.   1994// aa={set aa(){}}
-
 8470.   1994// ", "pre_s_function", "bad_set", "function", 9]
-
 8471.   1994
-
 8472.   1994                warn("bad_set", thing);
-
 8473.   1994            }
-
 8474.   1994        }
-
 8475.   2063        thing.parameters.forEach(function (name) {
-
 8476.   2063            walk_expression(name.expression);
-
 8477.   1840            if (name.id === "{" || name.id === "[") {
-
 8478.    267                name.names.forEach(subactivate);
-
 8479.   1796            } else {
-
 8480.   1796                name.dead = false;
-
 8481.   1796                name.init = true;
-
 8482.   1796            }
-
 8483.   2063        });
-
 8484.   2001    }
-
 8485.    516
-
 8486.   5689    function pre_s_lbrace(thing) {
-
 8487.   5689        block_stack.push(blockage);
-
 8488.   5689        blockage = thing;
-
 8489.   5689        thing.live = [];
-
 8490.   5689    }
-
 8491.    516
-
 8492.     56    function pre_try(thing) {
-
 8493.     54        if (thing.catch !== undefined) {
-
 8494.     54
-
 8495.     54// Create new catch-scope for catch-parameter.
-
 8496.     54
-
 8497.     54            catch_stack.push(catchage);
-
 8498.     54            catchage = thing.catch;
-
 8499.     54        }
-
 8500.     56    }
-
 8501.    516
-
 8502.  28665    function pre_v(thing) {
-
 8503.  28665        const the_variable = lookup(thing);
-
 8504.  28591        if (the_variable !== undefined) {
-
 8505.  28591            thing.variable = the_variable;
-
 8506.  28591            the_variable.used += 1;
-
 8507.  28591        }
-
 8508.  28665    }
-
 8509.    516
-
 8510.    717    function subactivate(name) {
-
 8511.    717        name.init = true;
-
 8512.    717        name.dead = false;
-
 8513.    717        blockage.live.push(name);
-
 8514.    717    }
-
 8515.    516
-
 8516. 164404    function walk_expression(thing) {
-
 8517. 103701        if (thing) {
-
 8518. 103701            if (Array.isArray(thing)) {
-
 8519. 103701
-
 8520. 103701// test_cause:
-
 8521. 103701// ["(function(){}())", "walk_expression", "isArray", "", 0]
-
 8522. 103701// ["0&&0", "walk_expression", "isArray", "", 0]
-
 8523. 103701
-
 8524. 103701                test_cause("isArray");
-
 8525. 103701                thing.forEach(walk_expression);
-
 8526. 103701            } else {
-
 8527. 103701                preamble(thing);
-
 8528. 103701                walk_expression(thing.expression);
-
 8529. 103701
-
 8530. 103701// PR-414 - Bugfix - fix fart-body not being walked.
-
 8531. 103701
-
 8532. 103701                if (thing.id === "function" || thing.id === "=>") {
-
 8533. 103701
-
 8534. 103701// test_cause:
-
 8535. 103701// ["aa=()=>0", "walk_expression", "function", "=>", 0]
-
 8536. 103701// ["aa=function(){}", "walk_expression", "function", "function", 0]
-
 8537. 103701
-
 8538. 103701                    test_cause("function", thing.id);
-
 8539. 103701
-
 8540. 103701// Recurse walk_statement().
-
 8541. 103701
-
 8542. 103701                    walk_statement(thing.block);
-
 8543. 103701                }
-
 8544. 103701                if (
-
 8545. 103701                    thing.arity === "preassign" || thing.arity === "postassign"
-
 8546. 103701                ) {
-
 8547. 103701
-
 8548. 103701// test_cause:
-
 8549. 103701// ["aa=++aa", "walk_expression", "unexpected_a", "++", 4]
-
 8550. 103701// ["aa=--aa", "walk_expression", "unexpected_a", "--", 4]
-
 8551. 103701
-
 8552. 103701                    warn("unexpected_a", thing);
-
 8553. 103701                } else if (
-
 8554. 103701                    thing.arity === "statement"
-
 8555. 103701                    || thing.arity === "assignment"
-
 8556. 103701                ) {
-
 8557. 103701
-
 8558. 103701// test_cause:
-
 8559. 103701// ["aa[aa=0]", "walk_expression", "unexpected_statement_a", "=", 6]
-
 8560. 103701
-
 8561. 103701                    warn("unexpected_statement_a", thing);
-
 8562. 103701                }
-
 8563. 103701
-
 8564. 103701// test_cause:
-
 8565. 103701// ["aa=0", "walk_expression", "default", "", 0]
-
 8566. 103701
-
 8567. 103701                test_cause("default");
-
 8568. 103701                postamble(thing);
-
 8569. 103701            }
-
 8570. 103701        }
-
 8571. 164404    }
-
 8572.    516
-
 8573.  78255    function walk_statement(thing) {
-
 8574.  43071        if (!thing) {
-
 8575.  43071            return;
-
 8576.  43071        }
-
 8577.  35184        if (Array.isArray(thing)) {
-
 8578.   7601
-
 8579.   7601// test_cause:
-
 8580.   7601// ["+[]", "walk_statement", "isArray", "", 0]
-
 8581.   7601
-
 8582.   7601            test_cause("isArray");
-
 8583.   7601
-
 8584.   7601// Recurse walk_statement().
-
 8585.   7601
-
 8586.   7601            thing.forEach(walk_statement);
-
 8587.   7601            return;
-
 8588.  27583        }
-
 8589.  27583        preamble(thing);
-
 8590.  27583        walk_expression(thing.expression);
-
 8591.  27583        if (thing.arity === "binary") {
-
 8592.   5658            if (thing.id !== "(") {
-
 8593.   5658
-
 8594.   5658// test_cause:
-
 8595.   5658// ["0&&0", "walk_statement", "unexpected_expression_a", "&&", 2]
-
 8596.   5658
-
 8597.   5658                warn("unexpected_expression_a", thing);
-
 8598.   5658            }
-
 8599.  21925        } else if (
-
 8600.  21925            thing.arity !== "statement"
-
 8601.  21925            && thing.arity !== "assignment"
-
 8602.  21925            && thing.id !== "import"
-
 8603.  21925        ) {
-
 8604.  21925
-
 8605.  21925// test_cause:
-
 8606.  21925// ["!0", "walk_statement", "unexpected_expression_a", "!", 1]
-
 8607.  21925// ["+[]", "walk_statement", "unexpected_expression_a", "+", 1]
-
 8608.  21925// ["+new aa()", "walk_statement", "unexpected_expression_a", "+", 1]
-
 8609.  21925// ["0", "walk_statement", "unexpected_expression_a", "0", 1]
-
 8610.  21925// ["typeof 0", "walk_statement", "unexpected_expression_a", "typeof", 1]
-
 8611.  21925
-
 8612.  21925            warn("unexpected_expression_a", thing);
-
 8613.  27583        }
-
 8614.  27583
-
 8615.  27583// Recurse walk_statement().
-
 8616.  27583
-
 8617.  27583        walk_statement(thing.block);
-
 8618.  27583        walk_statement(thing.else);
-
 8619.  27583        postamble(thing);
-
 8620.  27583    }
-
 8621.    516
-
 8622.    516    postaction = action(posts);
-
 8623.    516    postamble = amble(posts);
-
 8624.    516    preaction = action(pres);
-
 8625.    516    preamble = amble(pres);
-
 8626.    516    postaction("assignment", "+=", post_a_pluseq);
-
 8627.    516    postaction("assignment", post_a);
-
 8628.    516    postaction("binary", "&&", post_b_and);
-
 8629.    516    postaction("binary", "(", post_b_lparen);
-
 8630.    516    postaction("binary", "=>", post_s_function);
-
 8631.    516    postaction("binary", "[", post_b_lbracket);
-
 8632.    516    postaction("binary", "||", post_b_or);
-
 8633.    516    postaction("binary", post_b);
-
 8634.    516    postaction("statement", "const", post_s_var);
-
 8635.    516    postaction("statement", "export", post_s_export);
-
 8636.    516    postaction("statement", "for", post_s_for);
-
 8637.    516    postaction("statement", "function", post_s_function);
-
 8638.    516    postaction("statement", "import", post_s_import);
-
 8639.    516    postaction("statement", "let", post_s_var);
-
 8640.    516    postaction("statement", "try", post_s_try);
-
 8641.    516    postaction("statement", "var", post_s_var);
-
 8642.    516    postaction("statement", "{", post_s_lbrace);
-
 8643.    516    postaction("ternary", post_t);
-
 8644.    516    postaction("unary", "+", post_u_plus);
-
 8645.    516    postaction("unary", "function", post_s_function);
-
 8646.    516    postaction("unary", post_u);
-
 8647.    516    preaction("assignment", pre_a_bitwise);
-
 8648.    516    preaction("binary", "!=", pre_b_noteq);
-
 8649.    516    preaction("binary", "(", pre_b_lparen);
-
 8650.    516    preaction("binary", "==", pre_b_eqeq);
-
 8651.    516    preaction("binary", "=>", pre_s_function);
-
 8652.    516    preaction("binary", "in", pre_b_in);
-
 8653.    516    preaction("binary", "instanceof", pre_b_instanceof);
-
 8654.    516    preaction("binary", "||", pre_b_or);
-
 8655.    516    preaction("binary", pre_b);
-
 8656.    516    preaction("binary", pre_a_bitwise);
-
 8657.    516    preaction("statement", "for", pre_s_for);
-
 8658.    516    preaction("statement", "function", pre_s_function);
-
 8659.    516    preaction("statement", "try", pre_try);
-
 8660.    516    preaction("statement", "{", pre_s_lbrace);
-
 8661.    516    preaction("unary", "function", pre_s_function);
-
 8662.    516    preaction("unary", "~", pre_a_bitwise);
-
 8663.    516    preaction("variable", pre_v);
-
 8664.    516
-
 8665.    516    walk_statement(state.token_tree);
-
 8666.    516}
-
 8667.      1
-
 8668.    208function jslint_phase5_whitage(state) {
-
 8669.    208
-
 8670.    208// PHASE 5. Check whitespace between tokens in <token_list>.
-
 8671.    208
-
 8672.    208    let {
-
 8673.    208        artifact,
-
 8674.    208        catch_list,
-
 8675.    208        function_list,
-
 8676.    208        function_stack,
-
 8677.    208        option_dict,
-
 8678.    208        test_cause,
-
 8679.    208        token_global,
-
 8680.    208        token_list,
-
 8681.    208        warn
-
 8682.    208    } = state;
-
 8683.    208    let closer = "(end)";
-
 8684.    208    let free = false;
-
 8685.    208
-
 8686.    208// free = false
-
 8687.    208
-
 8688.    208// cause:
-
 8689.    208// "()=>0"
-
 8690.    208// "aa()"
-
 8691.    208// "aa(0,0)"
-
 8692.    208// "function(){}"
-
 8693.    208
-
 8694.    208// free = true
-
 8695.    208
-
 8696.    208// cause:
-
 8697.    208// "(0)"
-
 8698.    208// "(aa)"
-
 8699.    208// "aa(0)"
-
 8700.    208// "do{}while()"
-
 8701.    208// "for(){}"
-
 8702.    208// "if(){}"
-
 8703.    208// "switch(){}"
-
 8704.    208// "while(){}"
-
 8705.    208
-
 8706.    208    let left = token_global;
-
 8707.    208    let margin = 0;
-
 8708.    208    let mode_indent = (
-
 8709.    208
-
 8710.    208// PR-330 - Allow 2-space indent.
-
 8711.    208
-
 8712.    208        option_dict.indent2
-
 8713.      5        ? 2
-
 8714.    203        : 4
-
 8715.    208    );
-
 8716.    208    let nr_comments_skipped = 0;
-
 8717.    208    let open = true;
-
 8718.    208    let opening = true;
-
 8719.    208    let right;
+
 8355.      1// test_cause:
+
 8356.      1// ["aa in aa", "pre_b_in", "infix_in", "in", 4]
+
 8357.      1
+
 8358.      1        warn("infix_in", thing);
+
 8359.      1    }
+
 8360.    518
+
 8361.      1    function pre_b_instanceof(thing) {
+
 8362.      1
+
 8363.      1// test_cause:
+
 8364.      1// ["0 instanceof 0", "pre_b_instanceof", "unexpected_a", "instanceof", 3]
+
 8365.      1
+
 8366.      1        warn("unexpected_a", thing);
+
 8367.      1    }
+
 8368.    518
+
 8369.  10411    function pre_b_lparen(thing) {
+
 8370.  10411        const left = thing.expression[0];
+
 8371.  10411        let left_variable;
+
 8372.  10411        let parent;
+
 8373.  10411        if (
+
 8374.  10411            left.identifier
+
 8375.   6658            && functionage.context[left.id] === undefined
+
 8376.   3034            && typeof functionage.name === "object"
+
 8377.   2395        ) {
+
 8378.   2395            parent = functionage.name.parent;
+
 8379.   2395            if (parent) {
+
 8380.   2395                left_variable = parent.context[left.id];
+
 8381.   2395                if (
+
 8382.   2395                    left_variable !== undefined
+
 8383.   2395
+
 8384.   2395// Probably deadcode.
+
 8385.   2395// && left_variable.dead
+
 8386.   2395
+
 8387.   2395                    && left_variable.parent === parent
+
 8388.   2395                    && left_variable.calls !== undefined
+
 8389.   2395                    && left_variable.calls[functionage.name.id] !== undefined
+
 8390.   2395                ) {
+
 8391.   2395                    left_variable.dead = false;
+
 8392.   2395                }
+
 8393.   2395            }
+
 8394.   2395        }
+
 8395.  10411    }
+
 8396.    518
+
 8397.      1    function pre_b_noteq(thing) {
+
 8398.      1
+
 8399.      1// test_cause:
+
 8400.      1// ["0!=0", "pre_b_noteq", "expected_a_b", "!=", 2]
+
 8401.      1
+
 8402.      1        warn("expected_a_b", thing, "!==", "!=");
+
 8403.      1    }
+
 8404.    518
+
 8405.    974    function pre_b_or(thing) {
+
 8406.   1948        thing.expression.forEach(function (thang) {
+
 8407.    177            if (thang.id === "&&" && !thang.wrapped) {
+
 8408.      1
+
 8409.      1// test_cause:
+
 8410.      1// ["0&&0||0", "pre_b_or", "and", "&&", 2]
+
 8411.      1
+
 8412.      1                warn("and", thang);
+
 8413.      1            }
+
 8414.   1948        });
+
 8415.    974    }
+
 8416.    518
+
 8417.      8    function pre_s_for(thing) {
+
 8418.      8        let the_variable;
+
 8419.      2        if (thing.name !== undefined) {
+
 8420.      2            thing.name.dead = false;
+
 8421.      2            the_variable = lookup(thing.name);
+
 8422.      2            if (the_variable !== undefined) {
+
 8423.      2                if (the_variable.init && the_variable.readonly) {
+
 8424.      2
+
 8425.      2// test_cause:
+
 8426.      2// ["const aa=0;for(aa in aa){}", "pre_s_for", "bad_assignment_a", "aa", 16]
+
 8427.      2
+
 8428.      2                    warn("bad_assignment_a", thing.name);
+
 8429.      2                }
+
 8430.      2                the_variable.init = true;
+
 8431.      2            }
+
 8432.      2        }
+
 8433.      8
+
 8434.      8// Recurse walk_statement().
+
 8435.      8
+
 8436.      8        walk_statement(thing.initial);
+
 8437.      8    }
+
 8438.    518
+
 8439.   2001    function pre_s_function(thing) {
+
 8440.   2001
+
 8441.   2001// test_cause:
+
 8442.   2001// ["()=>0", "pre_s_function", "", "", 0]
+
 8443.   2001// ["(function (){}())", "pre_s_function", "", "", 0]
+
 8444.   2001// ["function aa(){}", "pre_s_function", "", "", 0]
+
 8445.   2001
+
 8446.   2001        test_cause("");
+
 8447.   1057        if (thing.arity === "statement" && blockage.body !== true) {
+
 8448.      1
+
 8449.      1// test_cause:
+
 8450.      1// ["if(0){function aa(){}\n}", "pre_s_function", "unexpected_a", "function", 7]
+
 8451.      1
+
 8452.      1            warn("unexpected_a", thing);
+
 8453.      1        }
+
 8454.   2001        function_stack.push(functionage);
+
 8455.   2001        block_stack.push(blockage);
+
 8456.   2001        functionage = thing;
+
 8457.   2001        blockage = thing;
+
 8458.   2001        thing.live = [];
+
 8459.   1098        if (typeof thing.name === "object") {
+
 8460.   1098            thing.name.dead = false;
+
 8461.   1098            thing.name.init = true;
+
 8462.   1098        }
+
 8463.      7        if (thing.extra === "get") {
+
 8464.      7            if (thing.parameters.length !== 0) {
+
 8465.      7
+
 8466.      7// test_cause:
+
 8467.      7// ["
+
 8468.      7// /*jslint getset*/
+
 8469.      7// aa={get aa(aa){}}
+
 8470.      7// ", "pre_s_function", "bad_get", "function", 9]
+
 8471.      7
+
 8472.      7                warn("bad_get", thing);
+
 8473.      7            }
+
 8474.   1994        } else if (thing.extra === "set") {
+
 8475.   1994            if (thing.parameters.length !== 1) {
+
 8476.   1994
+
 8477.   1994// test_cause:
+
 8478.   1994// ["
+
 8479.   1994// /*jslint getset*/
+
 8480.   1994// aa={set aa(){}}
+
 8481.   1994// ", "pre_s_function", "bad_set", "function", 9]
+
 8482.   1994
+
 8483.   1994                warn("bad_set", thing);
+
 8484.   1994            }
+
 8485.   1994        }
+
 8486.   2063        thing.parameters.forEach(function (name) {
+
 8487.   2063            walk_expression(name.expression);
+
 8488.   1840            if (name.id === "{" || name.id === "[") {
+
 8489.    267                name.names.forEach(subactivate);
+
 8490.   1796            } else {
+
 8491.   1796                name.dead = false;
+
 8492.   1796                name.init = true;
+
 8493.   1796            }
+
 8494.   2063        });
+
 8495.   2001    }
+
 8496.    518
+
 8497.   5694    function pre_s_lbrace(thing) {
+
 8498.   5694        block_stack.push(blockage);
+
 8499.   5694        blockage = thing;
+
 8500.   5694        thing.live = [];
+
 8501.   5694    }
+
 8502.    518
+
 8503.     56    function pre_try(thing) {
+
 8504.     54        if (thing.catch !== undefined) {
+
 8505.     54
+
 8506.     54// Create new catch-scope for catch-parameter.
+
 8507.     54
+
 8508.     54            catch_stack.push(catchage);
+
 8509.     54            catchage = thing.catch;
+
 8510.     54        }
+
 8511.     56    }
+
 8512.    518
+
 8513.  28689    function pre_v(thing) {
+
 8514.  28689        const the_variable = lookup(thing);
+
 8515.  28611        if (the_variable !== undefined) {
+
 8516.  28611            thing.variable = the_variable;
+
 8517.  28611            the_variable.used += 1;
+
 8518.  28611        }
+
 8519.  28689    }
+
 8520.    518
+
 8521.    717    function subactivate(name) {
+
 8522.    717        name.init = true;
+
 8523.    717        name.dead = false;
+
 8524.    717        blockage.live.push(name);
+
 8525.    717    }
+
 8526.    518
+
 8527. 164534    function walk_expression(thing) {
+
 8528. 103787        if (thing) {
+
 8529. 103787            if (Array.isArray(thing)) {
+
 8530. 103787
+
 8531. 103787// test_cause:
+
 8532. 103787// ["(function(){}())", "walk_expression", "isArray", "", 0]
+
 8533. 103787// ["0&&0", "walk_expression", "isArray", "", 0]
+
 8534. 103787
+
 8535. 103787                test_cause("isArray");
+
 8536. 103787                thing.forEach(walk_expression);
+
 8537. 103787            } else {
+
 8538. 103787                preamble(thing);
+
 8539. 103787                walk_expression(thing.expression);
+
 8540. 103787
+
 8541. 103787// PR-414 - Bugfix - fix fart-body not being walked.
+
 8542. 103787
+
 8543. 103787                if (thing.id === "function" || thing.id === "=>") {
+
 8544. 103787
+
 8545. 103787// test_cause:
+
 8546. 103787// ["aa=()=>0", "walk_expression", "function", "=>", 0]
+
 8547. 103787// ["aa=function(){}", "walk_expression", "function", "function", 0]
+
 8548. 103787
+
 8549. 103787                    test_cause("function", thing.id);
+
 8550. 103787
+
 8551. 103787// Recurse walk_statement().
+
 8552. 103787
+
 8553. 103787                    walk_statement(thing.block);
+
 8554. 103787                }
+
 8555. 103787                if (
+
 8556. 103787                    thing.arity === "preassign" || thing.arity === "postassign"
+
 8557. 103787                ) {
+
 8558. 103787
+
 8559. 103787// test_cause:
+
 8560. 103787// ["aa=++aa", "walk_expression", "unexpected_a", "++", 4]
+
 8561. 103787// ["aa=--aa", "walk_expression", "unexpected_a", "--", 4]
+
 8562. 103787
+
 8563. 103787                    warn("unexpected_a", thing);
+
 8564. 103787                } else if (
+
 8565. 103787                    thing.arity === "statement"
+
 8566. 103787                    || thing.arity === "assignment"
+
 8567. 103787                ) {
+
 8568. 103787
+
 8569. 103787// test_cause:
+
 8570. 103787// ["aa[aa=0]", "walk_expression", "unexpected_statement_a", "=", 6]
+
 8571. 103787
+
 8572. 103787                    warn("unexpected_statement_a", thing);
+
 8573. 103787                }
+
 8574. 103787
+
 8575. 103787// test_cause:
+
 8576. 103787// ["aa=0", "walk_expression", "default", "", 0]
+
 8577. 103787
+
 8578. 103787                test_cause("default");
+
 8579. 103787                postamble(thing);
+
 8580. 103787            }
+
 8581. 103787        }
+
 8582. 164534    }
+
 8583.    518
+
 8584.  78303    function walk_statement(thing) {
+
 8585.  43095        if (!thing) {
+
 8586.  43095            return;
+
 8587.  43095        }
+
 8588.  35208        if (Array.isArray(thing)) {
+
 8589.   7608
+
 8590.   7608// test_cause:
+
 8591.   7608// ["+[]", "walk_statement", "isArray", "", 0]
+
 8592.   7608
+
 8593.   7608            test_cause("isArray");
+
 8594.   7608
+
 8595.   7608// Recurse walk_statement().
+
 8596.   7608
+
 8597.   7608            thing.forEach(walk_statement);
+
 8598.   7608            return;
+
 8599.  27600        }
+
 8600.  27600        preamble(thing);
+
 8601.  27600        walk_expression(thing.expression);
+
 8602.  27600        if (thing.arity === "binary") {
+
 8603.   5665            if (thing.id !== "(") {
+
 8604.   5665
+
 8605.   5665// test_cause:
+
 8606.   5665// ["0&&0", "walk_statement", "unexpected_expression_a", "&&", 2]
+
 8607.   5665
+
 8608.   5665                warn("unexpected_expression_a", thing);
+
 8609.   5665            }
+
 8610.  21935        } else if (
+
 8611.  21935            thing.arity !== "statement"
+
 8612.  21935            && thing.arity !== "assignment"
+
 8613.  21935            && thing.id !== "import"
+
 8614.  21935        ) {
+
 8615.  21935
+
 8616.  21935// test_cause:
+
 8617.  21935// ["!0", "walk_statement", "unexpected_expression_a", "!", 1]
+
 8618.  21935// ["+[]", "walk_statement", "unexpected_expression_a", "+", 1]
+
 8619.  21935// ["+new aa()", "walk_statement", "unexpected_expression_a", "+", 1]
+
 8620.  21935// ["0", "walk_statement", "unexpected_expression_a", "0", 1]
+
 8621.  21935// ["typeof 0", "walk_statement", "unexpected_expression_a", "typeof", 1]
+
 8622.  21935
+
 8623.  21935            warn("unexpected_expression_a", thing);
+
 8624.  27600        }
+
 8625.  27600
+
 8626.  27600// Recurse walk_statement().
+
 8627.  27600
+
 8628.  27600        walk_statement(thing.block);
+
 8629.  27600        walk_statement(thing.else);
+
 8630.  27600        postamble(thing);
+
 8631.  27600    }
+
 8632.    518
+
 8633.    518    postaction = action(posts);
+
 8634.    518    postamble = amble(posts);
+
 8635.    518    preaction = action(pres);
+
 8636.    518    preamble = amble(pres);
+
 8637.    518    postaction("assignment", "+=", post_a_pluseq);
+
 8638.    518    postaction("assignment", post_a);
+
 8639.    518    postaction("binary", "&&", post_b_and);
+
 8640.    518    postaction("binary", "(", post_b_lparen);
+
 8641.    518    postaction("binary", "=>", post_s_function);
+
 8642.    518    postaction("binary", "[", post_b_lbracket);
+
 8643.    518    postaction("binary", "||", post_b_or);
+
 8644.    518    postaction("binary", post_b);
+
 8645.    518    postaction("statement", "const", post_s_var);
+
 8646.    518    postaction("statement", "export", post_s_export);
+
 8647.    518    postaction("statement", "for", post_s_for);
+
 8648.    518    postaction("statement", "function", post_s_function);
+
 8649.    518    postaction("statement", "import", post_s_import);
+
 8650.    518    postaction("statement", "let", post_s_var);
+
 8651.    518    postaction("statement", "try", post_s_try);
+
 8652.    518    postaction("statement", "var", post_s_var);
+
 8653.    518    postaction("statement", "{", post_s_lbrace);
+
 8654.    518    postaction("ternary", post_t);
+
 8655.    518    postaction("unary", "+", post_u_plus);
+
 8656.    518    postaction("unary", "function", post_s_function);
+
 8657.    518    postaction("unary", post_u);
+
 8658.    518    preaction("assignment", pre_a_bitwise);
+
 8659.    518    preaction("binary", "!=", pre_b_noteq);
+
 8660.    518    preaction("binary", "(", pre_b_lparen);
+
 8661.    518    preaction("binary", "==", pre_b_eqeq);
+
 8662.    518    preaction("binary", "=>", pre_s_function);
+
 8663.    518    preaction("binary", "in", pre_b_in);
+
 8664.    518    preaction("binary", "instanceof", pre_b_instanceof);
+
 8665.    518    preaction("binary", "||", pre_b_or);
+
 8666.    518    preaction("binary", pre_b);
+
 8667.    518    preaction("binary", pre_a_bitwise);
+
 8668.    518    preaction("statement", "for", pre_s_for);
+
 8669.    518    preaction("statement", "function", pre_s_function);
+
 8670.    518    preaction("statement", "try", pre_try);
+
 8671.    518    preaction("statement", "{", pre_s_lbrace);
+
 8672.    518    preaction("unary", "function", pre_s_function);
+
 8673.    518    preaction("unary", "~", pre_a_bitwise);
+
 8674.    518    preaction("variable", pre_v);
+
 8675.    518
+
 8676.    518    walk_statement(state.token_tree);
+
 8677.    518}
+
 8678.      1
+
 8679.    208function jslint_phase5_whitage(state) {
+
 8680.    208
+
 8681.    208// PHASE 5. Check whitespace between tokens in <token_list>.
+
 8682.    208
+
 8683.    208    let {
+
 8684.    208        artifact,
+
 8685.    208        catch_list,
+
 8686.    208        function_list,
+
 8687.    208        function_stack,
+
 8688.    208        option_dict,
+
 8689.    208        test_cause,
+
 8690.    208        token_global,
+
 8691.    208        token_list,
+
 8692.    208        warn
+
 8693.    208    } = state;
+
 8694.    208    let closer = "(end)";
+
 8695.    208    let free = false;
+
 8696.    208
+
 8697.    208// free = false
+
 8698.    208
+
 8699.    208// cause:
+
 8700.    208// "()=>0"
+
 8701.    208// "aa()"
+
 8702.    208// "aa(0,0)"
+
 8703.    208// "function(){}"
+
 8704.    208
+
 8705.    208// free = true
+
 8706.    208
+
 8707.    208// cause:
+
 8708.    208// "(0)"
+
 8709.    208// "(aa)"
+
 8710.    208// "aa(0)"
+
 8711.    208// "do{}while()"
+
 8712.    208// "for(){}"
+
 8713.    208// "if(){}"
+
 8714.    208// "switch(){}"
+
 8715.    208// "while(){}"
+
 8716.    208
+
 8717.    208    let left = token_global;
+
 8718.    208    let margin = 0;
+
 8719.    208    let mode_indent = (
 8720.    208
-
 8721.    208// This is the set of infix operators that require a space on each side.
+
 8721.    208// PR-330 - Allow 2-space indent.
 8722.    208
-
 8723.    208    let spaceop = object_assign_from_list(empty(), [
-
 8724.    208        "!=", "!==", "%", "%=", "&", "&&", "&=", "*", "*=", "+=", "-=", "/",
-
 8725.    208        "/=", "<", "<<", "<<=", "<=", "=", "==", "===", "=>", ">", ">=", ">>",
-
 8726.    208        ">>=", ">>>", ">>>=", "^", "^=", "|", "|=", "||"
-
 8727.    208    ], true);
-
 8728.    208
-
 8729.  38077    function at_margin(fit) {
-
 8730.  38077        const at = margin + fit;
-
 8731.     21        if (right.from !== at) {
-
 8732.     21            return expected_at(at);
-
 8733.     21        }
-
 8734.  38077    }
-
 8735.    208
-
 8736.   2057    function delve(the_function) {
-
 8737.  13014        Object.keys(the_function.context).forEach(function (id) {
-
 8738.  13014            const name = the_function.context[id];
-
 8739.  12979            if (id !== "ignore" && name.parent === the_function) {
-
 8740.   6286
-
 8741.   6286// test_cause:
-
 8742.   6286// ["function aa(aa) {return aa;}", "delve", "id", "", 0]
-
 8743.   6286
-
 8744.   6286                test_cause("id");
-
 8745.   6286                if (
-
 8746.   6286                    name.used === 0
-
 8747.   6286
-
 8748.   6286// Probably deadcode.
-
 8749.   6286// && (
-
 8750.   6286//     name.role !== "function"
-
 8751.   6286//     || name.parent.arity !== "unary"
-
 8752.   6286// )
-
 8753.   6286
-
 8754.   6286                    && jslint_assert(
-
 8755.   6286                        name.role !== "function",
-
 8756.   6286                        `Expected name.role !== "function".`
-
 8757.   6286                    )
-
 8758.   6286                ) {
-
 8759.   6286
-
 8760.   6286// test_cause:
-
 8761.   6286// ["/*jslint node*/\nlet aa;", "delve", "unused_a", "aa", 5]
-
 8762.   6286// ["function aa(aa){return;}", "delve", "unused_a", "aa", 13]
-
 8763.   6286// ["let aa=0;try{aa();}catch(bb){aa();}", "delve", "unused_a", "bb", 26]
+
 8723.    208        option_dict.indent2
+
 8724.      5        ? 2
+
 8725.    203        : 4
+
 8726.    208    );
+
 8727.    208    let nr_comments_skipped = 0;
+
 8728.    208    let open = true;
+
 8729.    208    let opening = true;
+
 8730.    208    let right;
+
 8731.    208
+
 8732.    208// This is the set of infix operators that require a space on each side.
+
 8733.    208
+
 8734.    208    let spaceop = object_assign_from_list(empty(), [
+
 8735.    208        "!=", "!==", "%", "%=", "&", "&&", "&=", "*", "*=", "+=", "-=", "/",
+
 8736.    208        "/=", "<", "<<", "<<=", "<=", "=", "==", "===", "=>", ">", ">=", ">>",
+
 8737.    208        ">>=", ">>>", ">>>=", "^", "^=", "|", "|=", "||"
+
 8738.    208    ], true);
+
 8739.    208
+
 8740.  38092    function at_margin(fit) {
+
 8741.  38092        const at = margin + fit;
+
 8742.     21        if (right.from !== at) {
+
 8743.     21            return expected_at(at);
+
 8744.     21        }
+
 8745.  38092    }
+
 8746.    208
+
 8747.   2057    function delve(the_function) {
+
 8748.  13014        Object.keys(the_function.context).forEach(function (id) {
+
 8749.  13014            const name = the_function.context[id];
+
 8750.  12979            if (id !== "ignore" && name.parent === the_function) {
+
 8751.   6286
+
 8752.   6286// test_cause:
+
 8753.   6286// ["function aa(aa) {return aa;}", "delve", "id", "", 0]
+
 8754.   6286
+
 8755.   6286                test_cause("id");
+
 8756.   6286                if (
+
 8757.   6286                    name.used === 0
+
 8758.   6286
+
 8759.   6286// Probably deadcode.
+
 8760.   6286// && (
+
 8761.   6286//     name.role !== "function"
+
 8762.   6286//     || name.parent.arity !== "unary"
+
 8763.   6286// )
 8764.   6286
-
 8765.   6286                    warn("unused_a", name);
-
 8766.   6286                } else if (!name.init) {
-
 8767.   6286
-
 8768.   6286// test_cause:
-
 8769.   6286// ["/*jslint node*/\nlet aa;aa();", "delve", "uninitialized_a", "aa", 5]
+
 8765.   6286                    && jslint_assert(
+
 8766.   6286                        name.role !== "function",
+
 8767.   6286                        `Expected name.role !== "function".`
+
 8768.   6286                    )
+
 8769.   6286                ) {
 8770.   6286
-
 8771.   6286                    warn("uninitialized_a", name);
-
 8772.   6286                }
-
 8773.   6286            }
-
 8774.  13014        });
-
 8775.   2057    }
-
 8776.    208
-
 8777.     25    function expected_at(at) {
-
 8778.     25
-
 8779.     25// Probably deadcode.
-
 8780.     25// if (right === undefined) {
-
 8781.     25//     right = token_nxt;
-
 8782.     25// }
-
 8783.     25
-
 8784.     25        jslint_assert(
-
 8785.     25            !(right === undefined),
-
 8786.     25            `Expected !(right === undefined).`
-
 8787.     25        );
-
 8788.     25        warn(
-
 8789.     25            "expected_a_at_b_c",
-
 8790.     25            right,
-
 8791.     25            artifact(right),
-
 8792.     25
-
 8793.     25// Fudge column numbers in warning message.
+
 8771.   6286// test_cause:
+
 8772.   6286// ["/*jslint node*/\nlet aa;", "delve", "unused_a", "aa", 5]
+
 8773.   6286// ["function aa(aa){return;}", "delve", "unused_a", "aa", 13]
+
 8774.   6286// ["let aa=0;try{aa();}catch(bb){aa();}", "delve", "unused_a", "bb", 26]
+
 8775.   6286
+
 8776.   6286                    warn("unused_a", name);
+
 8777.   6286                } else if (!name.init) {
+
 8778.   6286
+
 8779.   6286// test_cause:
+
 8780.   6286// ["/*jslint node*/\nlet aa;aa();", "delve", "uninitialized_a", "aa", 5]
+
 8781.   6286
+
 8782.   6286                    warn("uninitialized_a", name);
+
 8783.   6286                }
+
 8784.   6286            }
+
 8785.  13014        });
+
 8786.   2057    }
+
 8787.    208
+
 8788.     25    function expected_at(at) {
+
 8789.     25
+
 8790.     25// Probably deadcode.
+
 8791.     25// if (right === undefined) {
+
 8792.     25//     right = token_nxt;
+
 8793.     25// }
 8794.     25
-
 8795.     25            at + jslint_fudge,
-
 8796.     25            right.from + jslint_fudge
-
 8797.     25        );
-
 8798.     25    }
-
 8799.    208
-
 8800.   3095    function no_space() {
-
 8801.   3094        if (left.line === right.line) {
-
 8802.   3094
-
 8803.   3094// from:
-
 8804.   3094// if (left.line === right.line) {
-
 8805.   3094//     no_space();
-
 8806.   3094// } else {
-
 8807.   3094
-
 8808.   3094            if (left.thru !== right.from && nr_comments_skipped === 0) {
-
 8809.   3094
-
 8810.   3094// test_cause:
-
 8811.   3094// ["let aa = aa( );", "no_space", "unexpected_space_a_b", ")", 14]
-
 8812.   3094
-
 8813.   3094                warn(
-
 8814.   3094                    "unexpected_space_a_b",
-
 8815.   3094                    right,
-
 8816.   3094                    artifact(left),
-
 8817.   3094                    artifact(right)
-
 8818.   3094                );
-
 8819.   3094            }
-
 8820.   3094        } else {
-
 8821.      1
-
 8822.      1// from:
-
 8823.      1// } else if (
-
 8824.      1//     right.arity === "binary"
-
 8825.      1//     && right.id === "("
-
 8826.      1//     && free
-
 8827.      1// ) {
-
 8828.      1//     no_space();
-
 8829.      1// } else if (
-
 8830.      1
-
 8831.      1// Probably deadcode.
-
 8832.      1// if (open) {
-
 8833.      1//     const at = (
-
 8834.      1//         free
-
 8835.      1//         ? margin
-
 8836.      1//         : margin + 8
-
 8837.      1//     );
-
 8838.      1//     if (right.from < at) {
-
 8839.      1//         expected_at(at);
-
 8840.      1//     }
-
 8841.      1// } else {
-
 8842.      1//     if (right.from !== margin + 8) {
-
 8843.      1//         expected_at(margin + 8);
-
 8844.      1//     }
-
 8845.      1// }
-
 8846.      1
-
 8847.      1            jslint_assert(open, `Expected open.`);
-
 8848.      1            jslint_assert(free, `Expected free.`);
-
 8849.      1            if (right.from < margin) {
-
 8850.      1
-
 8851.      1// test_cause:
-
 8852.      1// ["let aa = aa(\naa\n()\n);", "expected_at", "expected_a_at_b_c", "5", 1]
-
 8853.      1
-
 8854.      1                expected_at(margin);
-
 8855.      1            }
-
 8856.      1        }
-
 8857.   3095    }
-
 8858.    208
-
 8859.  96009    function no_space_only() {
-
 8860.  96009        if (
-
 8861.  96009            left.id !== "(global)"
-
 8862.  96007            && left.nr + 1 === right.nr
-
 8863.  96007            && (
-
 8864.  96007                left.line !== right.line
-
 8865.  96007                || left.thru !== right.from
-
 8866.  96007            )
-
 8867.      5        ) {
-
 8868.      5            warn(
-
 8869.      5                "unexpected_space_a_b",
-
 8870.      5                right,
-
 8871.      5                artifact(left),
-
 8872.      5                artifact(right)
-
 8873.      5            );
-
 8874.      5        }
-
 8875.  96009    }
-
 8876.    208
-
 8877.  46187    function one_space() {
-
 8878.  44284        if (left.line === right.line || !open) {
-
 8879.  44284            if (left.thru + 1 !== right.from && nr_comments_skipped === 0) {
-
 8880.  44284                warn(
-
 8881.  44284                    "expected_space_a_b",
-
 8882.  44284                    right,
-
 8883.  44284                    artifact(left),
-
 8884.  44284                    artifact(right)
-
 8885.  44284                );
-
 8886.  44284            }
-
 8887.  44284        } else {
-
 8888.   1903            if (right.from !== margin) {
-
 8889.   1903                expected_at(margin);
-
 8890.   1903            }
-
 8891.   1903        }
-
 8892.  46187    }
-
 8893.    208
-
 8894.   9339    function one_space_only() {
-
 8895.      8        if (left.line !== right.line || left.thru + 1 !== right.from) {
-
 8896.      8            warn("expected_space_a_b", right, artifact(left), artifact(right));
-
 8897.      8        }
-
 8898.   9339    }
-
 8899.    208
-
 8900.  24652    function pop() {
-
 8901.  24652        const previous = function_stack.pop();
-
 8902.  24652        closer = previous.closer;
-
 8903.  24652        free = previous.free;
-
 8904.  24652        margin = previous.margin;
-
 8905.  24652        open = previous.open;
-
 8906.  24652        opening = previous.opening;
-
 8907.  24652    }
-
 8908.    208
-
 8909.  24652    function push() {
-
 8910.  24652        function_stack.push({
-
 8911.  24652            closer,
-
 8912.  24652            free,
-
 8913.  24652            margin,
-
 8914.  24652            open,
-
 8915.  24652            opening
-
 8916.  24652        });
-
 8917.  24652    }
-
 8918.    208
-
 8919.    208// uninitialized_and_unused();
-
 8920.    208// Delve into the functions looking for variables that were not initialized
-
 8921.    208// or used. If the file imports or exports, then its global object is also
-
 8922.    208// delved.
-
 8923.    208
-
 8924.    174    if (state.mode_module === true || option_dict.node) {
-
 8925.     51        delve(token_global);
-
 8926.     51    }
-
 8927.    208    catch_list.forEach(delve);
-
 8928.    208    function_list.forEach(delve);
+
 8795.     25        jslint_assert(
+
 8796.     25            !(right === undefined),
+
 8797.     25            `Expected !(right === undefined).`
+
 8798.     25        );
+
 8799.     25        warn(
+
 8800.     25            "expected_a_at_b_c",
+
 8801.     25            right,
+
 8802.     25            artifact(right),
+
 8803.     25
+
 8804.     25// Fudge column numbers in warning message.
+
 8805.     25
+
 8806.     25            at + jslint_fudge,
+
 8807.     25            right.from + jslint_fudge
+
 8808.     25        );
+
 8809.     25    }
+
 8810.    208
+
 8811.   3095    function no_space() {
+
 8812.   3094        if (left.line === right.line) {
+
 8813.   3094
+
 8814.   3094// from:
+
 8815.   3094// if (left.line === right.line) {
+
 8816.   3094//     no_space();
+
 8817.   3094// } else {
+
 8818.   3094
+
 8819.   3094            if (left.thru !== right.from && nr_comments_skipped === 0) {
+
 8820.   3094
+
 8821.   3094// test_cause:
+
 8822.   3094// ["let aa = aa( );", "no_space", "unexpected_space_a_b", ")", 14]
+
 8823.   3094
+
 8824.   3094                warn(
+
 8825.   3094                    "unexpected_space_a_b",
+
 8826.   3094                    right,
+
 8827.   3094                    artifact(left),
+
 8828.   3094                    artifact(right)
+
 8829.   3094                );
+
 8830.   3094            }
+
 8831.   3094        } else {
+
 8832.      1
+
 8833.      1// from:
+
 8834.      1// } else if (
+
 8835.      1//     right.arity === "binary"
+
 8836.      1//     && right.id === "("
+
 8837.      1//     && free
+
 8838.      1// ) {
+
 8839.      1//     no_space();
+
 8840.      1// } else if (
+
 8841.      1
+
 8842.      1// Probably deadcode.
+
 8843.      1// if (open) {
+
 8844.      1//     const at = (
+
 8845.      1//         free
+
 8846.      1//         ? margin
+
 8847.      1//         : margin + 8
+
 8848.      1//     );
+
 8849.      1//     if (right.from < at) {
+
 8850.      1//         expected_at(at);
+
 8851.      1//     }
+
 8852.      1// } else {
+
 8853.      1//     if (right.from !== margin + 8) {
+
 8854.      1//         expected_at(margin + 8);
+
 8855.      1//     }
+
 8856.      1// }
+
 8857.      1
+
 8858.      1            jslint_assert(open, `Expected open.`);
+
 8859.      1            jslint_assert(free, `Expected free.`);
+
 8860.      1            if (right.from < margin) {
+
 8861.      1
+
 8862.      1// test_cause:
+
 8863.      1// ["let aa = aa(\naa\n()\n);", "expected_at", "expected_a_at_b_c", "5", 1]
+
 8864.      1
+
 8865.      1                expected_at(margin);
+
 8866.      1            }
+
 8867.      1        }
+
 8868.   3095    }
+
 8869.    208
+
 8870.  96059    function no_space_only() {
+
 8871.  96059        if (
+
 8872.  96059            left.id !== "(global)"
+
 8873.  96057            && left.nr + 1 === right.nr
+
 8874.  96057            && (
+
 8875.  96057                left.line !== right.line
+
 8876.  96057                || left.thru !== right.from
+
 8877.  96057            )
+
 8878.      5        ) {
+
 8879.      5            warn(
+
 8880.      5                "unexpected_space_a_b",
+
 8881.      5                right,
+
 8882.      5                artifact(left),
+
 8883.      5                artifact(right)
+
 8884.      5            );
+
 8885.      5        }
+
 8886.  96059    }
+
 8887.    208
+
 8888.  46227    function one_space() {
+
 8889.  44324        if (left.line === right.line || !open) {
+
 8890.  44324            if (left.thru + 1 !== right.from && nr_comments_skipped === 0) {
+
 8891.  44324                warn(
+
 8892.  44324                    "expected_space_a_b",
+
 8893.  44324                    right,
+
 8894.  44324                    artifact(left),
+
 8895.  44324                    artifact(right)
+
 8896.  44324                );
+
 8897.  44324            }
+
 8898.  44324        } else {
+
 8899.   1903            if (right.from !== margin) {
+
 8900.   1903                expected_at(margin);
+
 8901.   1903            }
+
 8902.   1903        }
+
 8903.  46227    }
+
 8904.    208
+
 8905.   9344    function one_space_only() {
+
 8906.      8        if (left.line !== right.line || left.thru + 1 !== right.from) {
+
 8907.      8            warn("expected_space_a_b", right, artifact(left), artifact(right));
+
 8908.      8        }
+
 8909.   9344    }
+
 8910.    208
+
 8911.  24667    function pop() {
+
 8912.  24667        const previous = function_stack.pop();
+
 8913.  24667        closer = previous.closer;
+
 8914.  24667        free = previous.free;
+
 8915.  24667        margin = previous.margin;
+
 8916.  24667        open = previous.open;
+
 8917.  24667        opening = previous.opening;
+
 8918.  24667    }
+
 8919.    208
+
 8920.  24667    function push() {
+
 8921.  24667        function_stack.push({
+
 8922.  24667            closer,
+
 8923.  24667            free,
+
 8924.  24667            margin,
+
 8925.  24667            open,
+
 8926.  24667            opening
+
 8927.  24667        });
+
 8928.  24667    }
 8929.    208
-
 8930.      2    if (option_dict.white) {
-
 8931.      2        return;
-
 8932.    206    }
-
 8933.    206
-
 8934.    206// whitage();
-
 8935.    206// Go through the token list, looking at usage of whitespace.
-
 8936.    206
-
 8937. 207028    token_list.forEach(function whitage(the_token) {
-
 8938. 207028        right = the_token;
-
 8939. 195849        if (right.id === "(comment)" || right.id === "(end)") {
-
 8940.  11387            nr_comments_skipped += 1;
-
 8941. 195641        } else {
-
 8942. 195641
-
 8943. 195641// If left is an opener and right is not the closer, then push the previous
-
 8944. 195641// state. If the token following the opener is on the next line, then this is
-
 8945. 195641// an open form. If the tokens are on the same line, then it is a closed form.
-
 8946. 195641// Open form is more readable, with each item (statement, argument, parameter,
-
 8947. 195641// etc) starting on its own line. Closed form is more compact. Statement blocks
-
 8948. 195641// are always in open form.
-
 8949. 195641
-
 8950. 195641// The open and close pairs.
-
 8951. 195641
-
 8952. 195641            switch (left.id) {
-
 8953. 195641            case "${":
-
 8954. 195641            case "(":
-
 8955. 195641            case "[":
-
 8956. 195641            case "{":
-
 8957. 195641
-
 8958. 195641// test_cause:
-
 8959. 195641// ["let aa=[];", "whitage", "opener", "", 0]
-
 8960. 195641// ["let aa=`${0}`;", "whitage", "opener", "", 0]
-
 8961. 195641// ["let aa=aa();", "whitage", "opener", "", 0]
-
 8962. 195641// ["let aa={};", "whitage", "opener", "", 0]
-
 8963. 195641
-
 8964. 195641                test_cause("opener");
-
 8965. 195641
-
 8966. 195641// Probably deadcode.
-
 8967. 195641// case "${}":
-
 8968. 195641
-
 8969. 195641                jslint_assert(
-
 8970. 195641                    !(left.id + right.id === "${}"),
-
 8971. 195641                    "Expected !(left.id + right.id === \"${}\")."
-
 8972. 195641                );
-
 8973. 195641                switch (left.id + right.id) {
-
 8974. 195641                case "()":
-
 8975. 195641                case "[]":
-
 8976. 195641                case "{}":
-
 8977. 195641
-
 8978. 195641// If left and right are opener and closer, then the placement of right depends
-
 8979. 195641// on the openness. Illegal pairs (like '{]') have already been detected.
-
 8980. 195641
-
 8981. 195641// test_cause:
-
 8982. 195641// ["let aa=[];", "whitage", "opener_closer", "", 0]
-
 8983. 195641// ["let aa=aa();", "whitage", "opener_closer", "", 0]
-
 8984. 195641// ["let aa={};", "whitage", "opener_closer", "", 0]
-
 8985. 195641
-
 8986. 195641                    test_cause("opener_closer");
-
 8987. 195641                    if (left.line === right.line) {
-
 8988. 195641
-
 8989. 195641// test_cause:
-
 8990. 195641// ["let aa = aa( );", "no_space", "unexpected_space_a_b", ")", 14]
-
 8991. 195641
-
 8992. 195641                        no_space();
-
 8993. 195641                    } else {
-
 8994. 195641
-
 8995. 195641// test_cause:
-
 8996. 195641// ["let aa = aa(\n );", "expected_at", "expected_a_at_b_c", "1", 2]
-
 8997. 195641
-
 8998. 195641                        at_margin(0);
-
 8999. 195641                    }
-
 9000. 195641                    break;
-
 9001. 195641                default:
-
 9002. 195641
-
 9003. 195641// test_cause:
-
 9004. 195641// ["let aa=(0);", "whitage", "opener_operand", "", 0]
-
 9005. 195641// ["let aa=[0];", "whitage", "opener_operand", "", 0]
-
 9006. 195641// ["let aa=`${0}`;", "whitage", "opener_operand", "", 0]
-
 9007. 195641// ["let aa=aa(0);", "whitage", "opener_operand", "", 0]
-
 9008. 195641// ["let aa={aa:0};", "whitage", "opener_operand", "", 0]
-
 9009. 195641
-
 9010. 195641                    test_cause("opener_operand");
-
 9011. 195641                    opening = left.open || (left.line !== right.line);
-
 9012. 195641                    push();
-
 9013. 195641                    switch (left.id) {
-
 9014. 195641                    case "${":
-
 9015. 195641                        closer = "}";
-
 9016. 195641                        break;
-
 9017. 195641                    case "(":
-
 9018. 195641                        closer = ")";
-
 9019. 195641                        break;
-
 9020. 195641                    case "[":
-
 9021. 195641                        closer = "]";
-
 9022. 195641                        break;
-
 9023. 195641                    case "{":
-
 9024. 195641                        closer = "}";
-
 9025. 195641                        break;
-
 9026. 195641                    }
-
 9027. 195641                    if (opening) {
-
 9028. 195641
-
 9029. 195641// test_cause:
-
 9030. 195641// ["function aa(){\nreturn;\n}", "whitage", "opening", "", 0]
-
 9031. 195641// ["let aa=(\n0\n);", "whitage", "opening", "", 0]
-
 9032. 195641// ["let aa=[\n0\n];", "whitage", "opening", "", 0]
-
 9033. 195641// ["let aa=`${\n0\n}`;", "whitage", "opening", "", 0]
-
 9034. 195641// ["let aa={\naa:0\n};", "whitage", "opening", "", 0]
-
 9035. 195641
-
 9036. 195641                        test_cause("opening");
-
 9037. 195641                        free = closer === ")" && left.free;
-
 9038. 195641                        open = true;
-
 9039. 195641                        margin += mode_indent;
-
 9040. 195641                        if (right.role === "label") {
-
 9041. 195641                            if (right.from !== 0) {
-
 9042. 195641
-
 9043. 195641// test_cause:
-
 9044. 195641// ["
-
 9045. 195641// function aa() {
-
 9046. 195641//  bb:
-
 9047. 195641//     while (aa) {
-
 9048. 195641//         if (aa) {
-
 9049. 195641//             break bb;
-
 9050. 195641//         }
-
 9051. 195641//     }
-
 9052. 195641// }
-
 9053. 195641// ", "expected_at", "expected_a_at_b_c", "1", 2]
-
 9054. 195641
-
 9055. 195641                                expected_at(0);
-
 9056. 195641                            }
-
 9057. 195641                        } else if (right.switch) {
-
 9058. 195641                            at_margin(-mode_indent);
-
 9059. 195641                        } else {
-
 9060. 195641                            at_margin(0);
-
 9061. 195641                        }
-
 9062. 195641                    } else {
-
 9063. 195641                        if (right.statement || right.role === "label") {
-
 9064. 195641
-
 9065. 195641// test_cause:
-
 9066. 195641// ["
-
 9067. 195641// function aa() {bb:
-
 9068. 195641//     while (aa) {
-
 9069. 195641//         aa();
-
 9070. 195641//     }
-
 9071. 195641// }
-
 9072. 195641// ", "whitage", "expected_line_break_a_b", "bb", 16]
-
 9073. 195641
-
 9074. 195641                            warn(
-
 9075. 195641                                "expected_line_break_a_b",
-
 9076. 195641                                right,
-
 9077. 195641                                artifact(left),
-
 9078. 195641                                artifact(right)
-
 9079. 195641                            );
-
 9080. 195641                        }
-
 9081. 195641
-
 9082. 195641// test_cause:
-
 9083. 195641// ["let aa=(0);", "whitage", "not_free", "", 0]
-
 9084. 195641// ["let aa=[0];", "whitage", "not_free", "", 0]
-
 9085. 195641// ["let aa=`${0}`;", "whitage", "not_free", "", 0]
-
 9086. 195641// ["let aa={aa:0};", "whitage", "not_free", "", 0]
-
 9087. 195641
-
 9088. 195641                        test_cause("not_free");
-
 9089. 195641                        free = false;
-
 9090. 195641                        open = false;
-
 9091. 195641
-
 9092. 195641// test_cause:
-
 9093. 195641// ["let aa = ( 0 );", "no_space_only", "unexpected_space_a_b", "0", 12]
-
 9094. 195641
-
 9095. 195641                        no_space_only();
-
 9096. 195641                    }
-
 9097. 195641                }
-
 9098. 195641                break;
-
 9099. 195641            default:
-
 9100. 195641                if (right.statement === true) {
-
 9101. 195641                    if (left.id === "else") {
-
 9102. 195641
-
 9103. 195641// test_cause:
-
 9104. 195641// ["
-
 9105. 195641// let aa = 0;
-
 9106. 195641// if (aa) {
-
 9107. 195641//     aa();
-
 9108. 195641// } else  if (aa) {
-
 9109. 195641//     aa();
-
 9110. 195641// }
-
 9111. 195641// ", "one_space_only", "expected_space_a_b", "if", 9]
-
 9112. 195641
-
 9113. 195641                        one_space_only();
-
 9114. 195641                    } else {
-
 9115. 195641
-
 9116. 195641// test_cause:
-
 9117. 195641// [" let aa = 0;", "expected_at", "expected_a_at_b_c", "1", 2]
-
 9118. 195641
-
 9119. 195641                        at_margin(0);
-
 9120. 195641                        open = false;
-
 9121. 195641                    }
-
 9122. 195641
-
 9123. 195641// If right is a closer, then pop the previous state.
-
 9124. 195641
-
 9125. 195641                } else if (right.id === closer) {
-
 9126. 195641                    pop();
-
 9127. 195641                    if (opening && right.id !== ";") {
-
 9128. 195641                        at_margin(0);
-
 9129. 195641                    } else {
-
 9130. 195641                        no_space_only();
-
 9131. 195641                    }
-
 9132. 195641                } else {
-
 9133. 195641
-
 9134. 195641// Left is not an opener, and right is not a closer.
-
 9135. 195641// The nature of left and right will determine the space between them.
-
 9136. 195641
-
 9137. 195641// If left is ',' or ';' or right is a statement then if open,
-
 9138. 195641// right must go at the margin, or if closed, a space between.
-
 9139. 195641
-
 9140. 195641                    if (right.switch) {
-
 9141. 195641                        at_margin(-mode_indent);
-
 9142. 195641                    } else if (right.role === "label") {
-
 9143. 195641                        if (right.from !== 0) {
-
 9144. 195641
-
 9145. 195641// test_cause:
-
 9146. 195641// ["
-
 9147. 195641// function aa() {
-
 9148. 195641//     aa();cc:
-
 9149. 195641//     while (aa) {
-
 9150. 195641//         if (aa) {
-
 9151. 195641//             break cc;
-
 9152. 195641//         }
-
 9153. 195641//     }
-
 9154. 195641// }
-
 9155. 195641// ", "expected_at", "expected_a_at_b_c", "1", 10]
-
 9156. 195641
-
 9157. 195641                            expected_at(0);
-
 9158. 195641                        }
-
 9159. 195641                    } else if (left.id === ",") {
-
 9160. 195641                        if (!open || (
-
 9161. 195641                            (free || closer === "]")
-
 9162. 195641                            && left.line === right.line
-
 9163. 195641                        )) {
-
 9164. 195641
-
 9165. 195641// test_cause:
-
 9166. 195641// ["let {aa,bb} = 0;", "one_space", "expected_space_a_b", "bb", 9]
-
 9167. 195641
-
 9168. 195641                            one_space();
-
 9169. 195641                        } else {
-
 9170. 195641
-
 9171. 195641// test_cause:
-
 9172. 195641// ["
-
 9173. 195641// function aa() {
-
 9174. 195641//     aa(
-
 9175. 195641//         0,0
-
 9176. 195641//     );
-
 9177. 195641// }
-
 9178. 195641// ", "expected_at", "expected_a_at_b_c", "9", 11]
-
 9179. 195641
-
 9180. 195641                            at_margin(0);
-
 9181. 195641                        }
-
 9182. 195641
-
 9183. 195641// If right is a ternary operator, line it up on the margin.
-
 9184. 195641
-
 9185. 195641                    } else if (right.arity === "ternary") {
-
 9186. 195641                        if (open) {
-
 9187. 195641
-
 9188. 195641// test_cause:
-
 9189. 195641// ["
-
 9190. 195641// let aa = (
-
 9191. 195641//     aa
-
 9192. 195641//     ? 0
-
 9193. 195641// : 1
-
 9194. 195641// );
-
 9195. 195641// ", "expected_at", "expected_a_at_b_c", "5", 1]
-
 9196. 195641
-
 9197. 195641                            at_margin(0);
-
 9198. 195641                        } else {
-
 9199. 195641
-
 9200. 195641// test_cause:
-
 9201. 195641// ["let aa = (aa ? 0 : 1);", "whitage", "use_open", "?", 14]
-
 9202. 195641
-
 9203. 195641                            warn("use_open", right);
-
 9204. 195641                        }
-
 9205. 195641                    } else if (
-
 9206. 195641                        right.arity === "binary"
-
 9207. 195641                        && right.id === "("
-
 9208. 195641                        && free
-
 9209. 195641                    ) {
-
 9210. 195641
-
 9211. 195641// test_cause:
-
 9212. 195641// ["let aa = aa(\naa ()\n);", "no_space", "unexpected_space_a_b", "(", 4]
-
 9213. 195641
-
 9214. 195641                        no_space();
-
 9215. 195641                    } else if (
-
 9216. 195641                        left.id === "."
-
 9217. 195641                        || left.id === "?."
-
 9218. 195641                        || left.id === "..."
-
 9219. 195641                        || right.id === ","
-
 9220. 195641                        || right.id === ";"
-
 9221. 195641                        || right.id === ":"
-
 9222. 195641                        || (
-
 9223. 195641                            right.arity === "binary"
-
 9224. 195641                            && (right.id === "(" || right.id === "[")
-
 9225. 195641                        )
-
 9226. 195641                        || (
-
 9227. 195641                            right.arity === "function"
-
 9228. 195641                            && left.id !== "function"
-
 9229. 195641                        )
-
 9230. 195641                        || (right.id === "." || right.id === "?.")
-
 9231. 195641                    ) {
-
 9232. 195641
-
 9233. 195641// test_cause:
-
 9234. 195641// ["let aa = 0 ;", "no_space_only", "unexpected_space_a_b", ";", 12]
-
 9235. 195641// ["let aa = aa ?.aa;", "no_space_only", "unexpected_space_a_b", "?.", 13]
-
 9236. 195641
-
 9237. 195641                        no_space_only();
-
 9238. 195641                    } else if (left.id === ";") {
-
 9239. 195641
-
 9240. 195641// test_cause:
-
 9241. 195641// ["
-
 9242. 195641// /*jslint for*/
-
 9243. 195641// function aa() {
-
 9244. 195641//     for (
-
 9245. 195641//         aa();
-
 9246. 195641// aa;
-
 9247. 195641//         aa()
-
 9248. 195641//     ) {
-
 9249. 195641//         aa();
-
 9250. 195641//     }
-
 9251. 195641// }
-
 9252. 195641// ", "expected_at", "expected_a_at_b_c", "9", 1]
-
 9253. 195641
-
 9254. 195641                        if (open) {
-
 9255. 195641                            at_margin(0);
-
 9256. 195641                        }
-
 9257. 195641                    } else if (
-
 9258. 195641                        left.arity === "ternary"
-
 9259. 195641                        || left.id === "case"
-
 9260. 195641                        || left.id === "catch"
-
 9261. 195641                        || left.id === "else"
-
 9262. 195641                        || left.id === "finally"
-
 9263. 195641                        || left.id === "while"
-
 9264. 195641                        || left.id === "await"
-
 9265. 195641                        || right.id === "catch"
-
 9266. 195641                        || right.id === "else"
-
 9267. 195641                        || right.id === "finally"
-
 9268. 195641                        || (right.id === "while" && !right.statement)
-
 9269. 195641                        || (left.id === ")" && right.id === "{")
-
 9270. 195641                    ) {
-
 9271. 195641
-
 9272. 195641// test_cause:
-
 9273. 195641// ["
-
 9274. 195641// function aa() {
-
 9275. 195641//     do {
-
 9276. 195641//         aa();
-
 9277. 195641//     } while(aa());
-
 9278. 195641// }
-
 9279. 195641// ", "one_space_only", "expected_space_a_b", "(", 12]
-
 9280. 195641
-
 9281. 195641                        one_space_only();
-
 9282. 195641                    } else if (
-
 9283. 195641
-
 9284. 195641// There is a space between left and right.
-
 9285. 195641
-
 9286. 195641                        spaceop[left.id] === true
-
 9287. 195641                        || spaceop[right.id] === true
-
 9288. 195641                        || (
-
 9289. 195641                            left.arity === "binary"
-
 9290. 195641                            && (left.id === "+" || left.id === "-")
-
 9291. 195641                        )
-
 9292. 195641                        || (
-
 9293. 195641                            right.arity === "binary"
-
 9294. 195641                            && (right.id === "+" || right.id === "-")
-
 9295. 195641                        )
-
 9296. 195641                        || left.id === "function"
-
 9297. 195641                        || left.id === ":"
-
 9298. 195641                        || left.id === "async"
-
 9299. 195641                        || (
-
 9300. 195641                            (
-
 9301. 195641                                left.identifier
-
 9302. 195641                                || left.id === "(string)"
-
 9303. 195641                                || left.id === "(number)"
-
 9304. 195641                            )
-
 9305. 195641                            && (
-
 9306. 195641                                right.identifier
-
 9307. 195641                                || right.id === "(string)"
-
 9308. 195641                                || right.id === "(number)"
-
 9309. 195641                            )
-
 9310. 195641                        )
-
 9311. 195641                        || (left.arity === "statement" && right.id !== ";")
-
 9312. 195641                    ) {
-
 9313. 195641
-
 9314. 195641// test_cause:
-
 9315. 195641// ["let aa=0;", "one_space", "expected_space_a_b", "0", 8]
-
 9316. 195641// ["let aa={\naa:\n0\n};", "expected_at", "expected_a_at_b_c", "5", 1]
-
 9317. 195641
-
 9318. 195641                        one_space();
-
 9319. 195641                    } else if (left.arity === "unary" && left.id !== "`") {
-
 9320. 195641                        no_space_only();
-
 9321. 195641                    }
-
 9322. 195641                }
-
 9323. 195641            }
-
 9324. 195641            nr_comments_skipped = 0;
-
 9325. 195641            delete left.calls;
-
 9326. 195641            delete left.dead;
-
 9327. 195641            delete left.free;
-
 9328. 195641            delete left.init;
-
 9329. 195641            delete left.open;
-
 9330. 195641            delete left.used;
-
 9331. 195641            left = right;
-
 9332. 195641        }
-
 9333. 207028    });
-
 9334.    206}
-
 9335.      1
-
 9336.      6function jslint_report({
-
 9337.      6    exports,
-
 9338.      6    froms,
-
 9339.      6    functions,
-
 9340.      6    global,
-
 9341.      6    json,
-
 9342.      6    module,
-
 9343.      6    property,
-
 9344.      6    stop,
-
 9345.      6    warnings
-
 9346.      6}) {
-
 9347.      6
-
 9348.      6// This function will create human-readable, html-report
-
 9349.      6// for warnings, properties, and functions from jslint-result-object.
-
 9350.      6//
-
 9351.      6// Example usage:
-
 9352.      6//  let result = jslint("console.log('hello world')");
-
 9353.      6//  let html = jslint_report(result);
-
 9354.      6
-
 9355.      6    let html = "";
-
 9356.      6    let length_80 = 1111;
-
 9357.      6
-
 9358.    328    function address(line = 1, column = 1) {
-
 9359.    328
-
 9360.    328// This function will create HTML address element from <line> and <column>
-
 9361.    328
-
 9362.    328        return `<address>${Number(line)}: ${Number(column)}</address>`;
-
 9363.    328
-
 9364.    328    }
+
 8930.    208// uninitialized_and_unused();
+
 8931.    208// Delve into the functions looking for variables that were not initialized
+
 8932.    208// or used. If the file imports or exports, then its global object is also
+
 8933.    208// delved.
+
 8934.    208
+
 8935.    174    if (state.mode_module === true || option_dict.node) {
+
 8936.     51        delve(token_global);
+
 8937.     51    }
+
 8938.    208    catch_list.forEach(delve);
+
 8939.    208    function_list.forEach(delve);
+
 8940.    208
+
 8941.      2    if (option_dict.white) {
+
 8942.      2        return;
+
 8943.    206    }
+
 8944.    206
+
 8945.    206// whitage();
+
 8946.    206// Go through the token list, looking at usage of whitespace.
+
 8947.    206
+
 8948. 207158    token_list.forEach(function whitage(the_token) {
+
 8949. 207158        right = the_token;
+
 8950. 195959        if (right.id === "(comment)" || right.id === "(end)") {
+
 8951.  11407            nr_comments_skipped += 1;
+
 8952. 195751        } else {
+
 8953. 195751
+
 8954. 195751// If left is an opener and right is not the closer, then push the previous
+
 8955. 195751// state. If the token following the opener is on the next line, then this is
+
 8956. 195751// an open form. If the tokens are on the same line, then it is a closed form.
+
 8957. 195751// Open form is more readable, with each item (statement, argument, parameter,
+
 8958. 195751// etc) starting on its own line. Closed form is more compact. Statement blocks
+
 8959. 195751// are always in open form.
+
 8960. 195751
+
 8961. 195751// The open and close pairs.
+
 8962. 195751
+
 8963. 195751            switch (left.id) {
+
 8964. 195751            case "${":
+
 8965. 195751            case "(":
+
 8966. 195751            case "[":
+
 8967. 195751            case "{":
+
 8968. 195751
+
 8969. 195751// test_cause:
+
 8970. 195751// ["let aa=[];", "whitage", "opener", "", 0]
+
 8971. 195751// ["let aa=`${0}`;", "whitage", "opener", "", 0]
+
 8972. 195751// ["let aa=aa();", "whitage", "opener", "", 0]
+
 8973. 195751// ["let aa={};", "whitage", "opener", "", 0]
+
 8974. 195751
+
 8975. 195751                test_cause("opener");
+
 8976. 195751
+
 8977. 195751// Probably deadcode.
+
 8978. 195751// case "${}":
+
 8979. 195751
+
 8980. 195751                jslint_assert(
+
 8981. 195751                    !(left.id + right.id === "${}"),
+
 8982. 195751                    "Expected !(left.id + right.id === \"${}\")."
+
 8983. 195751                );
+
 8984. 195751                switch (left.id + right.id) {
+
 8985. 195751                case "()":
+
 8986. 195751                case "[]":
+
 8987. 195751                case "{}":
+
 8988. 195751
+
 8989. 195751// If left and right are opener and closer, then the placement of right depends
+
 8990. 195751// on the openness. Illegal pairs (like '{]') have already been detected.
+
 8991. 195751
+
 8992. 195751// test_cause:
+
 8993. 195751// ["let aa=[];", "whitage", "opener_closer", "", 0]
+
 8994. 195751// ["let aa=aa();", "whitage", "opener_closer", "", 0]
+
 8995. 195751// ["let aa={};", "whitage", "opener_closer", "", 0]
+
 8996. 195751
+
 8997. 195751                    test_cause("opener_closer");
+
 8998. 195751                    if (left.line === right.line) {
+
 8999. 195751
+
 9000. 195751// test_cause:
+
 9001. 195751// ["let aa = aa( );", "no_space", "unexpected_space_a_b", ")", 14]
+
 9002. 195751
+
 9003. 195751                        no_space();
+
 9004. 195751                    } else {
+
 9005. 195751
+
 9006. 195751// test_cause:
+
 9007. 195751// ["let aa = aa(\n );", "expected_at", "expected_a_at_b_c", "1", 2]
+
 9008. 195751
+
 9009. 195751                        at_margin(0);
+
 9010. 195751                    }
+
 9011. 195751                    break;
+
 9012. 195751                default:
+
 9013. 195751
+
 9014. 195751// test_cause:
+
 9015. 195751// ["let aa=(0);", "whitage", "opener_operand", "", 0]
+
 9016. 195751// ["let aa=[0];", "whitage", "opener_operand", "", 0]
+
 9017. 195751// ["let aa=`${0}`;", "whitage", "opener_operand", "", 0]
+
 9018. 195751// ["let aa=aa(0);", "whitage", "opener_operand", "", 0]
+
 9019. 195751// ["let aa={aa:0};", "whitage", "opener_operand", "", 0]
+
 9020. 195751
+
 9021. 195751                    test_cause("opener_operand");
+
 9022. 195751                    opening = left.open || (left.line !== right.line);
+
 9023. 195751                    push();
+
 9024. 195751                    switch (left.id) {
+
 9025. 195751                    case "${":
+
 9026. 195751                        closer = "}";
+
 9027. 195751                        break;
+
 9028. 195751                    case "(":
+
 9029. 195751                        closer = ")";
+
 9030. 195751                        break;
+
 9031. 195751                    case "[":
+
 9032. 195751                        closer = "]";
+
 9033. 195751                        break;
+
 9034. 195751                    case "{":
+
 9035. 195751                        closer = "}";
+
 9036. 195751                        break;
+
 9037. 195751                    }
+
 9038. 195751                    if (opening) {
+
 9039. 195751
+
 9040. 195751// test_cause:
+
 9041. 195751// ["function aa(){\nreturn;\n}", "whitage", "opening", "", 0]
+
 9042. 195751// ["let aa=(\n0\n);", "whitage", "opening", "", 0]
+
 9043. 195751// ["let aa=[\n0\n];", "whitage", "opening", "", 0]
+
 9044. 195751// ["let aa=`${\n0\n}`;", "whitage", "opening", "", 0]
+
 9045. 195751// ["let aa={\naa:0\n};", "whitage", "opening", "", 0]
+
 9046. 195751
+
 9047. 195751                        test_cause("opening");
+
 9048. 195751                        free = closer === ")" && left.free;
+
 9049. 195751                        open = true;
+
 9050. 195751                        margin += mode_indent;
+
 9051. 195751                        if (right.role === "label") {
+
 9052. 195751                            if (right.from !== 0) {
+
 9053. 195751
+
 9054. 195751// test_cause:
+
 9055. 195751// ["
+
 9056. 195751// function aa() {
+
 9057. 195751//  bb:
+
 9058. 195751//     while (aa) {
+
 9059. 195751//         if (aa) {
+
 9060. 195751//             break bb;
+
 9061. 195751//         }
+
 9062. 195751//     }
+
 9063. 195751// }
+
 9064. 195751// ", "expected_at", "expected_a_at_b_c", "1", 2]
+
 9065. 195751
+
 9066. 195751                                expected_at(0);
+
 9067. 195751                            }
+
 9068. 195751                        } else if (right.switch) {
+
 9069. 195751                            at_margin(-mode_indent);
+
 9070. 195751                        } else {
+
 9071. 195751                            at_margin(0);
+
 9072. 195751                        }
+
 9073. 195751                    } else {
+
 9074. 195751                        if (right.statement || right.role === "label") {
+
 9075. 195751
+
 9076. 195751// test_cause:
+
 9077. 195751// ["
+
 9078. 195751// function aa() {bb:
+
 9079. 195751//     while (aa) {
+
 9080. 195751//         aa();
+
 9081. 195751//     }
+
 9082. 195751// }
+
 9083. 195751// ", "whitage", "expected_line_break_a_b", "bb", 16]
+
 9084. 195751
+
 9085. 195751                            warn(
+
 9086. 195751                                "expected_line_break_a_b",
+
 9087. 195751                                right,
+
 9088. 195751                                artifact(left),
+
 9089. 195751                                artifact(right)
+
 9090. 195751                            );
+
 9091. 195751                        }
+
 9092. 195751
+
 9093. 195751// test_cause:
+
 9094. 195751// ["let aa=(0);", "whitage", "not_free", "", 0]
+
 9095. 195751// ["let aa=[0];", "whitage", "not_free", "", 0]
+
 9096. 195751// ["let aa=`${0}`;", "whitage", "not_free", "", 0]
+
 9097. 195751// ["let aa={aa:0};", "whitage", "not_free", "", 0]
+
 9098. 195751
+
 9099. 195751                        test_cause("not_free");
+
 9100. 195751                        free = false;
+
 9101. 195751                        open = false;
+
 9102. 195751
+
 9103. 195751// test_cause:
+
 9104. 195751// ["let aa = ( 0 );", "no_space_only", "unexpected_space_a_b", "0", 12]
+
 9105. 195751
+
 9106. 195751                        no_space_only();
+
 9107. 195751                    }
+
 9108. 195751                }
+
 9109. 195751                break;
+
 9110. 195751            default:
+
 9111. 195751                if (right.statement === true) {
+
 9112. 195751                    if (left.id === "else") {
+
 9113. 195751
+
 9114. 195751// test_cause:
+
 9115. 195751// ["
+
 9116. 195751// let aa = 0;
+
 9117. 195751// if (aa) {
+
 9118. 195751//     aa();
+
 9119. 195751// } else  if (aa) {
+
 9120. 195751//     aa();
+
 9121. 195751// }
+
 9122. 195751// ", "one_space_only", "expected_space_a_b", "if", 9]
+
 9123. 195751
+
 9124. 195751                        one_space_only();
+
 9125. 195751                    } else {
+
 9126. 195751
+
 9127. 195751// test_cause:
+
 9128. 195751// [" let aa = 0;", "expected_at", "expected_a_at_b_c", "1", 2]
+
 9129. 195751
+
 9130. 195751                        at_margin(0);
+
 9131. 195751                        open = false;
+
 9132. 195751                    }
+
 9133. 195751
+
 9134. 195751// If right is a closer, then pop the previous state.
+
 9135. 195751
+
 9136. 195751                } else if (right.id === closer) {
+
 9137. 195751                    pop();
+
 9138. 195751                    if (opening && right.id !== ";") {
+
 9139. 195751                        at_margin(0);
+
 9140. 195751                    } else {
+
 9141. 195751                        no_space_only();
+
 9142. 195751                    }
+
 9143. 195751                } else {
+
 9144. 195751
+
 9145. 195751// Left is not an opener, and right is not a closer.
+
 9146. 195751// The nature of left and right will determine the space between them.
+
 9147. 195751
+
 9148. 195751// If left is ',' or ';' or right is a statement then if open,
+
 9149. 195751// right must go at the margin, or if closed, a space between.
+
 9150. 195751
+
 9151. 195751                    if (right.switch) {
+
 9152. 195751                        at_margin(-mode_indent);
+
 9153. 195751                    } else if (right.role === "label") {
+
 9154. 195751                        if (right.from !== 0) {
+
 9155. 195751
+
 9156. 195751// test_cause:
+
 9157. 195751// ["
+
 9158. 195751// function aa() {
+
 9159. 195751//     aa();cc:
+
 9160. 195751//     while (aa) {
+
 9161. 195751//         if (aa) {
+
 9162. 195751//             break cc;
+
 9163. 195751//         }
+
 9164. 195751//     }
+
 9165. 195751// }
+
 9166. 195751// ", "expected_at", "expected_a_at_b_c", "1", 10]
+
 9167. 195751
+
 9168. 195751                            expected_at(0);
+
 9169. 195751                        }
+
 9170. 195751                    } else if (left.id === ",") {
+
 9171. 195751                        if (!open || (
+
 9172. 195751                            (free || closer === "]")
+
 9173. 195751                            && left.line === right.line
+
 9174. 195751                        )) {
+
 9175. 195751
+
 9176. 195751// test_cause:
+
 9177. 195751// ["let {aa,bb} = 0;", "one_space", "expected_space_a_b", "bb", 9]
+
 9178. 195751
+
 9179. 195751                            one_space();
+
 9180. 195751                        } else {
+
 9181. 195751
+
 9182. 195751// test_cause:
+
 9183. 195751// ["
+
 9184. 195751// function aa() {
+
 9185. 195751//     aa(
+
 9186. 195751//         0,0
+
 9187. 195751//     );
+
 9188. 195751// }
+
 9189. 195751// ", "expected_at", "expected_a_at_b_c", "9", 11]
+
 9190. 195751
+
 9191. 195751                            at_margin(0);
+
 9192. 195751                        }
+
 9193. 195751
+
 9194. 195751// If right is a ternary operator, line it up on the margin.
+
 9195. 195751
+
 9196. 195751                    } else if (right.arity === "ternary") {
+
 9197. 195751                        if (open) {
+
 9198. 195751
+
 9199. 195751// test_cause:
+
 9200. 195751// ["
+
 9201. 195751// let aa = (
+
 9202. 195751//     aa
+
 9203. 195751//     ? 0
+
 9204. 195751// : 1
+
 9205. 195751// );
+
 9206. 195751// ", "expected_at", "expected_a_at_b_c", "5", 1]
+
 9207. 195751
+
 9208. 195751                            at_margin(0);
+
 9209. 195751                        } else {
+
 9210. 195751
+
 9211. 195751// test_cause:
+
 9212. 195751// ["let aa = (aa ? 0 : 1);", "whitage", "use_open", "?", 14]
+
 9213. 195751
+
 9214. 195751                            warn("use_open", right);
+
 9215. 195751                        }
+
 9216. 195751                    } else if (
+
 9217. 195751                        right.arity === "binary"
+
 9218. 195751                        && right.id === "("
+
 9219. 195751                        && free
+
 9220. 195751                    ) {
+
 9221. 195751
+
 9222. 195751// test_cause:
+
 9223. 195751// ["let aa = aa(\naa ()\n);", "no_space", "unexpected_space_a_b", "(", 4]
+
 9224. 195751
+
 9225. 195751                        no_space();
+
 9226. 195751                    } else if (
+
 9227. 195751                        left.id === "."
+
 9228. 195751                        || left.id === "?."
+
 9229. 195751                        || left.id === "..."
+
 9230. 195751                        || right.id === ","
+
 9231. 195751                        || right.id === ";"
+
 9232. 195751                        || right.id === ":"
+
 9233. 195751                        || (
+
 9234. 195751                            right.arity === "binary"
+
 9235. 195751                            && (right.id === "(" || right.id === "[")
+
 9236. 195751                        )
+
 9237. 195751                        || (
+
 9238. 195751                            right.arity === "function"
+
 9239. 195751                            && left.id !== "function"
+
 9240. 195751                        )
+
 9241. 195751                        || (right.id === "." || right.id === "?.")
+
 9242. 195751                    ) {
+
 9243. 195751
+
 9244. 195751// test_cause:
+
 9245. 195751// ["let aa = 0 ;", "no_space_only", "unexpected_space_a_b", ";", 12]
+
 9246. 195751// ["let aa = aa ?.aa;", "no_space_only", "unexpected_space_a_b", "?.", 13]
+
 9247. 195751
+
 9248. 195751                        no_space_only();
+
 9249. 195751                    } else if (left.id === ";") {
+
 9250. 195751
+
 9251. 195751// test_cause:
+
 9252. 195751// ["
+
 9253. 195751// /*jslint for*/
+
 9254. 195751// function aa() {
+
 9255. 195751//     for (
+
 9256. 195751//         aa();
+
 9257. 195751// aa;
+
 9258. 195751//         aa()
+
 9259. 195751//     ) {
+
 9260. 195751//         aa();
+
 9261. 195751//     }
+
 9262. 195751// }
+
 9263. 195751// ", "expected_at", "expected_a_at_b_c", "9", 1]
+
 9264. 195751
+
 9265. 195751                        if (open) {
+
 9266. 195751                            at_margin(0);
+
 9267. 195751                        }
+
 9268. 195751                    } else if (
+
 9269. 195751                        left.arity === "ternary"
+
 9270. 195751                        || left.id === "case"
+
 9271. 195751                        || left.id === "catch"
+
 9272. 195751                        || left.id === "else"
+
 9273. 195751                        || left.id === "finally"
+
 9274. 195751                        || left.id === "while"
+
 9275. 195751                        || left.id === "await"
+
 9276. 195751                        || right.id === "catch"
+
 9277. 195751                        || right.id === "else"
+
 9278. 195751                        || right.id === "finally"
+
 9279. 195751                        || (right.id === "while" && !right.statement)
+
 9280. 195751                        || (left.id === ")" && right.id === "{")
+
 9281. 195751                    ) {
+
 9282. 195751
+
 9283. 195751// test_cause:
+
 9284. 195751// ["
+
 9285. 195751// function aa() {
+
 9286. 195751//     do {
+
 9287. 195751//         aa();
+
 9288. 195751//     } while(aa());
+
 9289. 195751// }
+
 9290. 195751// ", "one_space_only", "expected_space_a_b", "(", 12]
+
 9291. 195751
+
 9292. 195751                        one_space_only();
+
 9293. 195751                    } else if (
+
 9294. 195751
+
 9295. 195751// There is a space between left and right.
+
 9296. 195751
+
 9297. 195751                        spaceop[left.id] === true
+
 9298. 195751                        || spaceop[right.id] === true
+
 9299. 195751                        || (
+
 9300. 195751                            left.arity === "binary"
+
 9301. 195751                            && (left.id === "+" || left.id === "-")
+
 9302. 195751                        )
+
 9303. 195751                        || (
+
 9304. 195751                            right.arity === "binary"
+
 9305. 195751                            && (right.id === "+" || right.id === "-")
+
 9306. 195751                        )
+
 9307. 195751                        || left.id === "function"
+
 9308. 195751                        || left.id === ":"
+
 9309. 195751                        || left.id === "async"
+
 9310. 195751                        || (
+
 9311. 195751                            (
+
 9312. 195751                                left.identifier
+
 9313. 195751                                || left.id === "(string)"
+
 9314. 195751                                || left.id === "(number)"
+
 9315. 195751                            )
+
 9316. 195751                            && (
+
 9317. 195751                                right.identifier
+
 9318. 195751                                || right.id === "(string)"
+
 9319. 195751                                || right.id === "(number)"
+
 9320. 195751                            )
+
 9321. 195751                        )
+
 9322. 195751                        || (left.arity === "statement" && right.id !== ";")
+
 9323. 195751                    ) {
+
 9324. 195751
+
 9325. 195751// test_cause:
+
 9326. 195751// ["let aa=0;", "one_space", "expected_space_a_b", "0", 8]
+
 9327. 195751// ["let aa={\naa:\n0\n};", "expected_at", "expected_a_at_b_c", "5", 1]
+
 9328. 195751
+
 9329. 195751                        one_space();
+
 9330. 195751                    } else if (left.arity === "unary" && left.id !== "`") {
+
 9331. 195751                        no_space_only();
+
 9332. 195751                    }
+
 9333. 195751                }
+
 9334. 195751            }
+
 9335. 195751            nr_comments_skipped = 0;
+
 9336. 195751            delete left.calls;
+
 9337. 195751            delete left.dead;
+
 9338. 195751            delete left.free;
+
 9339. 195751            delete left.init;
+
 9340. 195751            delete left.open;
+
 9341. 195751            delete left.used;
+
 9342. 195751            left = right;
+
 9343. 195751        }
+
 9344. 207158    });
+
 9345.    206}
+
 9346.      1
+
 9347.      6function jslint_report({
+
 9348.      6    exports,
+
 9349.      6    froms,
+
 9350.      6    functions,
+
 9351.      6    global,
+
 9352.      6    json,
+
 9353.      6    module,
+
 9354.      6    property,
+
 9355.      6    stop,
+
 9356.      6    warnings
+
 9357.      6}) {
+
 9358.      6
+
 9359.      6// This function will create human-readable, html-report
+
 9360.      6// for warnings, properties, and functions from jslint-result-object.
+
 9361.      6//
+
 9362.      6// Example usage:
+
 9363.      6//  let result = jslint("console.log('hello world')");
+
 9364.      6//  let html = jslint_report(result);
 9365.      6
-
 9366.   2256    function detail(title, list) {
-
 9367.   2256        return (
-
 9368.   2256            (Array.isArray(list) && list.length > 0)
-
 9369.    781            ? (
-
 9370.    781
-
 9371.    781// Google Lighthouse Accessibility - <dl>'s do not contain only properly-ordered
-
 9372.    781// <dt> and <dd> groups, <script>, <template> or <div> elements.
-
 9373.    781
-
 9374.    781                "<dl>"
-
 9375.    781                + "<dt>" + htmlEscape(title) + "</dt>"
-
 9376.    781                + "<dd>" + list.join(", ") + "</dd>"
-
 9377.    781                + "</dl>"
-
 9378.    781            )
-
 9379.   1475            : ""
-
 9380.   2256        );
-
 9381.   2256    }
-
 9382.      6
-
 9383.      6    html += String(`
-
 9384.      6<style class="JSLINT_REPORT_STYLE">
-
 9385.      6/* jslint utility2:true */
-
 9386.      6/*csslint box-model: false, ids:false */
-
 9387.      6/*csslint ignore:start*/
-
 9388.      6@font-face {
-
 9389.      6    font-display: swap;
-
 9390.      6    font-family: "Daley";
-
 9391.      6    src: url(
-
 9392.      6"data:font/woff2;base64,d09GMgABAAAAABy4AA4AAAAAThwAABxiAAEAAAAAAAAAAAAA\
-
 9393.      6AAAAAAAAAAAAAAAABmAAgiQINAmcDBEICuc41DEBNgIkA4R2C4I+AAQgBYkuByAMgScfYUIF\
-
 9394.      67NgjsHGAbcDVFkXZ5Jwd+P96IGPc9rl9ETBEaCzCJkvY2UpziRZ7zftZWk8052U9+NqX6vXL\
-
 9395.      6KDflSQnlJ0bP+QnPQAy744n9mup6H9PaCDFwM5zjf8exB89bZ1cdrYOP0NgnuRDRWlk9u/fE\
-
 9396.      6llkxqmfH8lmRQ/DAmER9opk9wR6suc1LvTiXNEe1vbhUCH2USgnEwH3vUm05JQqejGvZvOtz\
-
 9397.      67sIKEGgLdDNl/IrfqWVZG/wr42ekomEm91VA1p4LhHBuFzHF8//u7vvbREHMQqGtNLmiOOD/\
-
 9398.      6X7WWiwqyCE98qt0jk5JJmgR5WJJElBmzRb1F7a66MmSLTNWZ2XSHfKBSKHoVteSEJ6EOdvVw\
-
 9399.      6fNZOtXKDe39jXdRlkmMnOWIOFBgeEK/b0mFsgffnPyyAitNyutKky7J8a8MSEkAKGLgfptnS\
-
 9400.      6/gDRSo7vwdNUmQDB7oP6pK7QF5d9SrY8M/tkrXcurSIQAmX7tz7pd33LIB7GQkBQ/k81s/0D\
-
 9401.      6gpt4gbw7x0Cn/PocitK5KIGPGQIzQzAMuCeC2ERAidx9TySVqX06goT0SFFOOV9Kuxdi5Rg7\
-
 9402.      6l6n3c+nKRemidOm2dtFV1jXMk4rP2m6RJ8xEdPYONLTbeMgaJ1nwS2W4su3MHwqkkvJ2PdDU\
-
 9403.      6r7pgAnVRt4Kh789FXlD0r3p6jUtNO19O1s74U9pnIxqFpw+mBgF+8y30PAyw1dzlknLLVcSB\
-
 9404.      6J2OuCr9eV5Efew6cOGd47ZEfhrW7HXI+FBNFvWgWnugUU4UvlrV63niv2ZPeKu8M76y/HQaG\
-
 9405.      6weU+4Gzp+Y+cfb9R9djDWcd1Svr1xG7l+j/yf3eM996548qlC+dOzOqQ8//Lo0uaSEQCFuLD\
-
 9406.      6/bXyWhJ6aPmyaRonVPxGABFL4/0slcKI6f+PmT0M+QRsplmWnv4F49VT+JsPifoa6aeyr2Hz\
-
 9407.      6EeLdP1FEOV/ZN+c9sAuoNh0BRS0xgCCc9wME5s0HOKj/wc0fWYsTbFQpsZL5SayJPkL45kDo\
-
 9408.      6DcJJ10MvD0ZSq7FEIr1TfqZ7NC6s75zSp8viaNO5/PczYCV9z6NTa0KBdnGBg6kbdeBkRLfU\
-
 9409.      6qRd3D9Pqw5jWCc5WM/i95OE8731MBd1u2EmsXIa5dCvavY32U1Ytza4nfbERg6OVRZka7jq0\
-
 9410.      6r2FcXNDyEhXheaHtaU1o1kvO9MuBOHqugLUEzN+4jznu0oK9wZPur1lWVFfxl8lZzn2XwcjZ\
-
 9411.      6Csg/RJy0mAMMmgnqXS8ELhOCRUSLzvsM5gAPudEh2lVoRxGgyUVnArZMruE0YS1PqFMD3upb\
-
 9412.      6jVoecGj1KpWl6/ZysuyzkG4SGA4bps6FBQSg4e4IxNUgdmosmoDn0TpIex/s1BFau6GBNO4z\
-
 9413.      6cvWXypm4hEg5k3llelySFqNmUtRZ3PHBA7p4MBX1nK4awwAV6kWzIVbUA67A55QKYbMsgVaH\
-
 9414.      6c1ZxKuZ0DCyqxCsJjLyCEY36gf0wjAu3t0zemc87PmBCJbU9Lso0YAaYJUx8wsR02hYz5hGy\
-
 9415.      6Js0+A4uHGZgfuf5SOR9iBQuLhpOExaIFrHj6JlXanebzGHp2ELDh6av09PVE1fmdsj2oHRWs\
-
 9416.      6fOtYrV6wRCyx7XogHqvpnZiPBBdNcL6kIoS9UI/DOIlumlveSgv9oqMBYp7WZ2fGxAXmZmaG\
-
 9417.      6OCyJG6+wAszZFCQw/EXVjx+YA2uVyN6bhNWiZhgtYjAwR5U/7uV1scghiTGiAPZbA5ZqHw5u\
-
 9418.      6Yu1cDjhRwREBFyq2wa0R8GgceDUKPo2BX+MhoAkQ1EQIaZqVHMwH3xM+P32TTA34tmOMNZ4n\
-
 9419.      6mHXqn49fmE3qX1+wMNYoYetOsPx6wxKzkURImERJIjGSSJwkkiCJJEkiKZJImiSSIYlkSYqK\
-
 9420.      6UBu0UOopuLMmasiJW0PMFOO2UgbDif2NaQUqkBbyaGjdTUvuyamEQwCq9DWsxsG9qPt+VFqV\
-
 9421.      66cIsXcyWujWIEtNFdeia9ssNrJUpe3IDMPQZOReC8x+qvt17drPWdcHeL0gTarWwoQ6o828o\
-
 9422.      60EJzrA20yZsgVyVHdlCJOF3NaACxHbP38TA+MGx3St9c5t2CxbGtunB4J9AF4Px2rSr1wyK9\
-
 9423.      69KoXBR13vw9Fk9qhTX0ivZoanrvhLa5oiJO8cqR0lX7QtJ2c1a62V3PMtutaaoit+hxtXuC5\
-
 9424.      6ZUXJePSR6btQlt5g7PqPQ822g7F8D123pc4kaGXz7qYztJxDXCxJr7foKqxwy4rikI/NvINx\
-
 9425.      6bkArRTTnnMWy6YA8J39LfTweThKsqlt7Mz078NDSOPOGgtGTpeG8ZRBF+xKBjdSoNe8gE6uC\
-
 9426.      6ucOH98jE4+cv1JEjI555TFjYj4+0KdFlojzJGWp2wc1tCaYGSeO8dBfT0u3lpDY3tazzu4wn\
-
 9427.      6lF9wzy2nK+sTr/qEVdANoZ0ToBdD+MY4ewOHNnkXPBvKVXLSbEGfGVD0Nzr0Fs3HID3Y1Kqx\
-
 9428.      6mzJ6p1C1/R6Xneyw/q9YRDLahbnsI1u76XzMLPqsK0yvQDeQ4TMR41709sIssmEgs0XH1lcj\
-
 9429.      67HLnUG6u2Xpy5vbOowIGqrR6cwF0TLGI5PF7pkbzIVYQU0sIaoNgul3LGAH2B1nREFYXUMia\
-
 9430.      6prCeAzggGxrC5gIK2dK0exs/AIRKdlIIuxkUspdSsU+rqXagqXaooXakqTiWS/a0E7zA6QIK\
-
 9431.      6OdMUznMAh+RCQ7hcQCFXmspr3ciuds/6gPsZFPIgpfJhwUIepRAeZ1DIk5Tue4oKfSfKZyNV\
-
 9432.      6pKU/J7J4Abx1EMV5mXSRDl6lMfU6jfBmBww4k7f6gLzTB+J9od/kA/uGj2mET2nkn7+zQ/JF\
-
 9433.      6H5Kv+pB804fkOyvwI43wM438V5sdkd/6iPzRR+SvPiL/WIH/aYRxGqMb/Oqe3d54+LWR1vr2\
-
 9434.      6knnnc467iD247eXBA3YYBAiFfierClXz/8jyL3Qh/zP8y+Y/1eN8jq+SKZAML/lIidjwZ8N4\
-
 9435.      6aLthvhxGUkGPo+p0eHKZ0sT5FsqJcQCy9UhHIvcJFIlIvANTPFWUTUhSiVdsNRnvwEQxm5uc\
-
 9436.      6ksjdv5evJfpOgI6c7juH8pnG2RKwlXaDYe9g8rMwYfML3A2SMWeBDopJJsmS5dUE2KttnmQa\
-
 9437.      6JZlMspvEpJioiEDFNpPUTbwqG3Zjhx2VCeJrIf60s2mI6blZMZVyAyYzI+1a2Y0AIqcbLUgR\
-
 9438.      66iRbNtnp82GrImXW0YbcbczDgqQDWNdTenvtTAlT9iPHenluV+d3eed1/5MjMBrX2LgrK2ml\
-
 9439.      6FuoDOz036n/kaHbAeszR3jHoI4NWB3lusTfuVgkMUkLQaH0F6+pSCS11fXRwT421vs9s7axd\
-
 9440.      6nvtF7/eeIeq9s1aCLsLWdh+w7sXz3IYdEsSQ0LVsebmES/vXDU9k653W4MiNq8bMj5nLioCY\
-
 9441.      6edGgOT6tmYwqiOW1ugiEmew6iwjvvYb3SaeZJb7XNufOo9oH8FTneWGL+BLiclptpnhPwcui\
-
 9442.      6T+rzcF34+ycsL7p3AveuML9i9h13beylyg8CzEz5HppadqmmDxKrAquG9L3ztedRoWxEsAYt\
-
 9443.      6OM1Eu0G0gyTHkxf7cSkHJQRbA4xmlqHWkv1C0KhFhBq1z81Wq1CZoWic8TJ570WfSj5qsM+Q\
-
 9444.      6nl4k3H5+P+P3zlv9ltQrzv41qyiSwV/gOadyQBchsmwDGu/JI8tXflE8jqUVA0Zw0SKbdDC9\
-
 9445.      6c4FR+fak95SdF7uqpoRe9z6YRv+85YUzF4qJy6Q8GOVNwUn/ymyjNNbmcuVfXYeH2osLdCte\
-
 9446.      6ebmZRyUfQQZA1BSCLK4PWA/z1kBvDZm0t+i3or1LkMD6en95pGG0UOa8ZJXgS9TdEA1I2mZw\
-
 9447.      61JOWWxDu0NEh4rM19H55rvueMBUZV1RjkmB3oxkXhAckpa5gzzxUDA2VLOrWFAXx+4gmfU17\
-
 9448.      65o3v9H7EYdvGFuM+tDB3TA4ITjVUKduO/R4bXRAcPXZusWkN+t59sFz7Hyi0FkSdzrHXQVFq\
-
 9449.      6b8c9k9eLRjVlBbNvt4172CanYg/F3Rket1zCTc77UZ61Gq/Be9J8hrKrxbDZMEotf5o8zHDc\
-
 9450.      6/UJaEtdhgwHEcBEQKM+6NBWIewLmI1sHuWYAedZCw8U1hJfSWcld+2tv3jpCFc5FnosLWC0+\
-
 9451.      6DnAlnOXUXLoMXrmCVerNQkZHvRm8YtE12vG8+N/vOnPcu3vM1uOnzE3u3VP2ppmLZawm2NuO\
-
 9452.      6tPa7xwHFCgVKpox5PVrOmaDHrThk1tX864a2+/qhJd3nCFRQ+bfUKI4O+Wgk5byB3saMcUfV\
-
 9453.      6C8G137yMd16zRm3ZSq+UrDlk5ha3TiAj0b74prWO/vYG+RC+ronP1/McDtefBtY1XhZE0PIB\
-
 9454.      6wTe7CBTte2U6KPbYd5GffApQlDGssdfmxYGSlnHrQt7++KEwUg3ikkoQyKPixgUDB6Lozjv5\
-
 9455.      6vM5PBnllt+UzMnP6DStFsOfossbXOefWhQApACCNpkTYGAONIowDfndqDKRFuzn685nthZPe\
-
 9456.      6vEL7TIWkXAG2yxKBH90+yMzuRzWn3KMmyKGwZWnIErlJ9Vwt8OtR6+4TKad5y9+ViBtTzVG+\
-
 9457.      6tpv/xiLrcGKJRtYvCUlGeL4Dwy1jo1CSQe0X71EXK1YG44ztxTONjIslL8SwY0Cki0k0vsX/\
-
 9458.      6/xz7CxkAc9dEdJZhMy/JCGzD2FAGtUcag0tc2e2miJkp477V2qTKB+nFnDl/noxpXJ+yqVdO\
-
 9459.      6wNjbplmeiuburg9ii1Z1zwtG8QjcJAiVPSOV2mHzq1Qt7p2+YCcIKPmFusE5O+m8s+Wd8o3t\
-
 9460.      6qO1b1IZF8N0tx6RQnZ9Ux3gXijHlolixst6vhJV6ao0ZFzSprfAc3x0MLvxU0OsmXEVddMVK\
-
 9461.      629CC6mPgPtXTUW7tVnZxwm0DTJwNOeVRV4axMSPlpgyv1Va1MQhQqWwUOb0s+gVLOecos4Nf\
-
 9462.      6eqlFW3fLQrlP86R4XRxrDHF0VIx6ArM5/sTWtObY6U2aosgxbN6FUa1iNTUpMThk1sUfJOC6\
-
 9463.      6s1SKo9D0g1NfiVmavyful/K7nZdDgutV1A26i7FR3r16bv3zz1cGw+ta17IX/+ripyutix3C\
-
 9464.      6xNmCxs7uiqKu9/Zjjn06tblXpJxlaLF5Od0d5W9QhQrs2u6UN0trQlCyEK2j9VYgCEIDrhQN\
-
 9465.      6c00rxg/FOfZ1N+nLV7RXDsYP+p0EzqKcuPujzuzEQsu2mFf4nYvf3Yp32rq/RYLetDLuOOTc\
-
 9466.      60WXBtgoech7AHUxAxPBg81qWCsYlzTofRU5/MpuyNoegR6mCJO5ckrLOhWbG7xo/VGwGgpRb\
-
 9467.      6+Ch+TmlcuY6Qct/2x3gxzeDUU9u+ltexrjelJ0VRR9KXH/AqrbYxHa0vmQ/kBnE5EORBK1ZH\
-
 9468.      6mTSy7A8DJMgzzqDsu9ML5J3ufkuUNDCfN5UKAjBgw2I/QlS8MQ6o/ll9dTAdoM7HYtV4cNWE\
-
 9469.      6U4pOl5Y4SIzdMbNSjXFmsBV1uXXf7GaBZZslpFGFiIpokSzxWj4hjlGl4VKJDACo7ScxQf29\
-
 9470.      6kM8gHD3nUJkwkN2aW2TGttqwOrygJ7r9nYX2tYqy7Z3TQV5ocWzUI8l871y3LsQLoTgEO76B\
-
 9471.      6Upp69hy6VKRpZvpvgfQ2T06qgXjxh38eatREitX6bzKggIYmN4sAkA3a5oeJZDK3ahQrVJwa\
-
 9472.      6AD65cEGBkS/tKH9TtybiREEWCMcKD0HH0gELtjB+KNSk7bspmpr6eb0CscIiFyZpmXu8+gxw\
-
 9473.      6O7pJNbAK2h9q2c5dMHBaoi5DylbNGdweVVdN3Jm9u6YXXlmx4nYY2vIPfSkrE/vyv9gn/Z+j\
-
 9474.      6R3HKExaUhdV0Az77YWbQPhNfjw+F0vTteSMin+wIfxyPe0DEoI4uz6o2IXwsZC7sg8MicQ3o\
-
 9475.      6wys+NJYKVW72YiVQ5LKDVwrEg2jNVM6XdNjbsHlRDcAkD08o5iWtFB2dVoydRmmDRLalE+4t\
-
 9476.      63gBbAPa7n7qXXXbTZTJXZKy5+1W0K7dgYEcIlu90ovC0C+5gxXiKtZisT14qDJ7f2ksyK59U\
-
 9477.      6r3QeHtBb24mPz7YDB3rgMTyUZ/fxM8h2i1Z21B8/VA5+9l7BKaOJZ15lWsyPv/z6CjU32ZKq\
-
 9478.      6+QFeyUywxYnUxUmcQfGc1Sp69oE2n6zFL8BXf5rc3cJMM6S97gagTT1bi7cmAV4MibkC4rz/\
-
 9479.      6icmmFtMlo5aN1Wp3uxsBfd4+9T42xmxvd79FV/hfuviBcrIaX092PrY5rle9FR4wTnDzrwj4\
-
 9480.      67frD2d0KsMcdcADQ1Yu1LECg9Wj3yOS8OhrJdQBqXqsam17vmt2wjjjouHE/EO9sGPdqt23v\
-
 9481.      6j8rL6wid6ulagtNK5p1hjRkFtUxTIaZnIXk63Zb3P0t5MQ+3vxHIFrmgAdWwiDuA67tbVIF6\
-
 9482.      6wJ53z0uhyhsfH9bgF0kPT9v2hrT3HKIBgUXIYoxsVU+uryemiUiQEwh+BfxP//qLShlumR26\
-
 9483.      6I8OqjD+x3hHDj/IrEWmvyL6ioG/atfxe+5GzIqRgfaoayWOiTk+YixO15KDO6Os3XACDjboe\
-
 9484.      6ryXXOuEmTpDsc7czk+H04Kw1PNJazW32CAURHwBldqK0/nqYHtcrtLyyTYmoD8hbcnJUfa3U\
-
 9485.      63FxWNus7uic3Qm1BzEecJW0MAz+W2CyN9FLIy+EpSy6CjkXsllZw1uBs1SxrQWM97/vnHu7m\
-
 9486.      6OtrkRl8AtBN3RDxI/fg7dZLLtDFYuCYYPMwXiO6ZIpwJ1GGydI9oUYYgnQQKDKoMTcwsjrfe\
-
 9487.      6Tcht6y18bLcpNfX41WE27447vLNzHuF+j15co5N7Py8vKUpTCoghHMEYKkM6y02lvX+9XiFg\
-
 9488.      6xBKMRNiwX69+LJb2Xa5WGqo7Rlk0cxsLVd0l2UXAW5jORg31sFMKYWXsDcRUKRDP8Q87OjiM\
-
 9489.      6dI1hNEt43netf8rOyfp+L58fq3holY9gxXwRJLY6gahgLQi4hS8w9LS+rFcJtdSCBrQLWsMs\
-
 9490.      6aDg/n8/P8/N+fcyoLepYr3W/CIUT7HsRQTtkduddbVfbo6Twt6fyJVPRrUGqRkWp3rdry65v\
-
 9491.      6sPYInyq1mPHrQDrqGJYI/LzA/QAzAXLnx+lu9uxHTEka9xgWgRvqEioskh+UWgD4nDvTAxaz\
-
 9492.      63v9BqqmFuQwy1wSXye1Df1NXVF7G8bUFxUE4F9axG5fm+vFQJvP8iuYjrFveB6++AqmJTQJ0\
-
 9493.      69GHjbPhzdSzkZGxokQzONVs0R0FCPJz1hJKbvDKsaj9hT0vp/gH5oiT8pAbWsBChwAbxHgDd\
-
 9494.      659iJVZE3bAzPRN1RuG+MT7th+J3i6KFwVJvPvsGRDIZW4P2rVfiKjDVBM2Va+w6PgI0c5u3K\
-
 9495.      6O7MrWryPhXFFdBoAwi2JCaW9sZ3fTagQ4Tld6u4djwcWzeCdiYoeNbfalsRYo740afYQ1Rid\
-
 9496.      6Bp/E9mbcTemEjoWWXIU7I5nK5H/BEqmZnPMyhDV234BTLQKCe6nhU+frwQo1gNFWf+eQGN62\
-
 9497.      6aeF7BuzaN/94W2xlKd8t8KMA/3uoxymFt19OlCjYZeaMWbTKM9Yog9zDhptYMOzIQAoO7kn6\
-
 9498.      6nTao8CxjrRRgjKe7mKa+tzuufhAAZtgjA92THkulWvIzEi0++j1DvXMnupDUS8aVusWain+c\
-
 9499.      6CcvmR5orC+RcJs3wVahLYyEcqbvAS2e0QJ6BlU36R/IEd9Aol9q+M+UGvlo8EyRzISvqusNS\
-
 9500.      67ePQ6cQzG1s725db4jNYNHAfF3KFG8wHqDwZDpWDsJ5qRLXR1ulFx85GhkypPubYaCiOQ5DR\
-
 9501.      6PQUiNpgk4fLJHenSMLMiswXsqW4Cpln1rFoHzpOoBbuZIixmVyhKajeqlFmp8zNAEsbEJz0g\
-
 9502.      6X0qlQuykZhf82pkhq2hWtCtYUdBODn6iPTBJT5Zk8IqFxqfBeFKjXk/sMeumhT8muOtq2Bgn\
-
 9503.      6dR4fj6RoOi0zI25kajAXlDZhUhS39jipk39h/69AfDPBLmOxhDj7Lg/WUTbOwJiJ3p7WtOpm\
-
 9504.      6ypARmhorQifINNm1CNS99GfDcLbD8sn8Fvlmvn7CmW65Pdmu6bKtuE0tn7NglIX1e/JAJP+G\
-
 9505.      6gB3At7cSOp92rl0lp0pp0xVb5YaQedwGgcJA1pT4cy24lS+jvzDw86YTfb2igJm5MysHmejW\
-
 9506.      6ZTGXpoAoLBLucUGEz/DwbjqOdzGAl5jy5VoCQws5zNYl4SVt030aZulYMgpDBPZd+kL0wV+w\
-
 9507.      6nob2LPRDQGEbdUoeFm4fEKio9c/ferVlpSO8Bx7OFZyHip1PIizvoqFe02kpmS17TvIOty42\
-
 9508.      6+Q0QaCnOpeLsPwwo+vixIeIeUjucUsKejVlez35qyuC0mm5pJJJLEVP2JAe/LTOwUUfKJkNy\
-
 9509.      6lEe3Kdth241ZNQmkVcAIh6DZJBzvQov5fn3JZA0phBWdNq5iTsm5N2D8gyve3V3X2o3zF3VY\
-
 9510.      6OqEBgTIADAbC69z7vOKJjGOzHRmUUwLU66iabtIbqR6SPOHCL+fCTfvpKcB/oG2p3wRKErEJ\
-
 9511.      6v1YOfu9iaKEMLXS3ptdH8fwN2Rdww9bZ7rFa2bwrzcyux3o+hPV6bJZpb71j7lLAdzge3VX7\
-
 9512.      69uSCdz6f/FDb7+wzWnbbDSPj9R20+PybDUm/lVAsTuF0aycFQwJfPCUwcBvCGWEq6xoTIEOy\
-
 9513.      6b0bLta20+LYRYdyEceX7ypfezQKIy5OvJTAHCJy/WyOYaDVyPucMsHnZ0GCH75Cd//te1Bv2\
-
 9514.      6RkMykqYurBiNbuH3Xfuprirr4Dd453O6abAYGb5tw1d6wrBL8p1J1Sx9Lgw7yxqYn0FTrc0y\
-
 9515.      659yLlV+4zIkLfZlPFRVnanHpTyrIlpn4lGkt269+JXnIWhEQWNvuVsrt531jr+8AHkVZfQU8\
-
 9516.      68U/4AUZMuOj5iliigFrof/usmloYEI1f8erhJku75snYW7YmFmUcoC7UtG/KfJRuz6j0tWPa\
-
 9517.      656J5QA0rJHwSIhNT4GWvez19HT2lia+Pz7/+MVEWlvjY6+9P85a0y9qWkTzQ7nF0wDXpQpw3\
-
 9518.      6K4xnfK2L08b5MrxdeI+DDfVDeV2JY0Fp6KH602tj2MbxxKM8oG+wTkE/dr8jyo4Sfs/IV6uf\
-
 9519.      6+IIXpH2Nca1+WCJV5qEv193bcUELLR4iFu83xUedKy9353tn+3o01dF2bNEQ3fK9Q5tCXrCi\
-
 9520.      6La+woCuvEeYrr+PiN2+i2V/eDJck580pyra8BV5ZIZbpe3kr5vJD3pqoGsnbcl/d+ndvR23b\
-
 9521.      6K41M4dKwaAwDaMA1gZGBoQWAcYE9mYkmQOnAjkaG41FkGkIP2BAIgKvUvzhpE5JbA6lze2iL\
-
 9522.      65Nr+AwiDo2W4BStvK30dKy0JGNbzAY5akexsrV0xo5K8rY50LOTLvDyukIZNbRLKOCk18mD3\
-
 9523.      6WxmZGlsCMxNdGFYGNJnetUWyCPgo4BONEL4I9b8UeEBGYXuCdCd+DkctrqVLYXGSfE46kvAu\
-
 9524.      6+ltK5SRxQPnjUqyJXsSYs6VY6WPKfns9+IXjHhd5wQvGipgFdMwVEQ+A7a2AAS0clQwH7KHW\
-
 9525.      6SEGjhnklSVRghMtPy6gEtJRIKJeYkpQyQiequQunFOOU4BLdK1yp55olZS6npyPhMnvK7xIa\
-
 9526.      6pyNj+JctcQLXenBOCms46aMkenIx45WpXqxxVJQLz/vgpmAVa0fmDv6Pue9xVTBPfVxCUGfj\
-
 9527.      61R8uVi8Zu9nRFqk/t0gR6wmWOlzuKRqk33HpO8qQ+nbGoEZLL/0Va156SJ+u+t86/os7ic49\
-
 9528.      6/7xoEqvL+2E8VOyCTuT/7j269Zy4jUtN+g4="
-
 9529.      6    ) format("woff2");
-
 9530.      6}
-
 9531.      6.JSLINT_,
-
 9532.      6.JSLINT_ address,
-
 9533.      6.JSLINT_ button,
-
 9534.      6.JSLINT_ cite,
-
 9535.      6.JSLINT_ dd,
-
 9536.      6.JSLINT_ dfn,
-
 9537.      6.JSLINT_ dl,
-
 9538.      6.JSLINT_ dt,
-
 9539.      6.JSLINT_ fieldset,
-
 9540.      6.JSLINT_ fieldset > div,
-
 9541.      6.JSLINT_ input,
-
 9542.      6.JSLINT_ label,
-
 9543.      6.JSLINT_ legend,
-
 9544.      6.JSLINT_ ol,
-
 9545.      6.JSLINT_ samp,
-
 9546.      6.JSLINT_ style,
-
 9547.      6.JSLINT_ textarea,
-
 9548.      6.JSLINT_ ul {
-
 9549.      6    border: 0;
-
 9550.      6    box-sizing: border-box;
-
 9551.      6    margin: 0;
-
 9552.      6    padding: 0;
-
 9553.      6}
-
 9554.      6/* disable text inflation algorithm used on some smartphones and tablets */
-
 9555.      6.JSLINT_ {
-
 9556.      6    -ms-text-size-adjust: none;
-
 9557.      6    -webkit-text-size-adjust: none;
-
 9558.      6    text-size-adjust: none;
-
 9559.      6}
-
 9560.      6.JSLINT_REPORT_ div {
+
 9366.      6    let html = "";
+
 9367.      6    let length_80 = 1111;
+
 9368.      6
+
 9369.    328    function address(line = 1, column = 1) {
+
 9370.    328
+
 9371.    328// This function will create HTML address element from <line> and <column>
+
 9372.    328
+
 9373.    328        return `<address>${Number(line)}: ${Number(column)}</address>`;
+
 9374.    328
+
 9375.    328    }
+
 9376.      6
+
 9377.   2256    function detail(title, list) {
+
 9378.   2256        return (
+
 9379.   2256            (Array.isArray(list) && list.length > 0)
+
 9380.    781            ? (
+
 9381.    781
+
 9382.    781// Google Lighthouse Accessibility - <dl>'s do not contain only properly-ordered
+
 9383.    781// <dt> and <dd> groups, <script>, <template> or <div> elements.
+
 9384.    781
+
 9385.    781                "<dl>"
+
 9386.    781                + "<dt>" + htmlEscape(title) + "</dt>"
+
 9387.    781                + "<dd>" + list.join(", ") + "</dd>"
+
 9388.    781                + "</dl>"
+
 9389.    781            )
+
 9390.   1475            : ""
+
 9391.   2256        );
+
 9392.   2256    }
+
 9393.      6
+
 9394.      6    html += String(`
+
 9395.      6<style class="JSLINT_REPORT_STYLE">
+
 9396.      6/* jslint utility2:true */
+
 9397.      6/*csslint box-model: false, ids:false */
+
 9398.      6/*csslint ignore:start*/
+
 9399.      6@font-face {
+
 9400.      6    font-display: swap;
+
 9401.      6    font-family: "Daley";
+
 9402.      6    src: url(
+
 9403.      6"data:font/woff2;base64,d09GMgABAAAAABy4AA4AAAAAThwAABxiAAEAAAAAAAAAAAAA\
+
 9404.      6AAAAAAAAAAAAAAAABmAAgiQINAmcDBEICuc41DEBNgIkA4R2C4I+AAQgBYkuByAMgScfYUIF\
+
 9405.      67NgjsHGAbcDVFkXZ5Jwd+P96IGPc9rl9ETBEaCzCJkvY2UpziRZ7zftZWk8052U9+NqX6vXL\
+
 9406.      6KDflSQnlJ0bP+QnPQAy744n9mup6H9PaCDFwM5zjf8exB89bZ1cdrYOP0NgnuRDRWlk9u/fE\
+
 9407.      6llkxqmfH8lmRQ/DAmER9opk9wR6suc1LvTiXNEe1vbhUCH2USgnEwH3vUm05JQqejGvZvOtz\
+
 9408.      67sIKEGgLdDNl/IrfqWVZG/wr42ekomEm91VA1p4LhHBuFzHF8//u7vvbREHMQqGtNLmiOOD/\
+
 9409.      6X7WWiwqyCE98qt0jk5JJmgR5WJJElBmzRb1F7a66MmSLTNWZ2XSHfKBSKHoVteSEJ6EOdvVw\
+
 9410.      6fNZOtXKDe39jXdRlkmMnOWIOFBgeEK/b0mFsgffnPyyAitNyutKky7J8a8MSEkAKGLgfptnS\
+
 9411.      6/gDRSo7vwdNUmQDB7oP6pK7QF5d9SrY8M/tkrXcurSIQAmX7tz7pd33LIB7GQkBQ/k81s/0D\
+
 9412.      6gpt4gbw7x0Cn/PocitK5KIGPGQIzQzAMuCeC2ERAidx9TySVqX06goT0SFFOOV9Kuxdi5Rg7\
+
 9413.      6l6n3c+nKRemidOm2dtFV1jXMk4rP2m6RJ8xEdPYONLTbeMgaJ1nwS2W4su3MHwqkkvJ2PdDU\
+
 9414.      6r7pgAnVRt4Kh789FXlD0r3p6jUtNO19O1s74U9pnIxqFpw+mBgF+8y30PAyw1dzlknLLVcSB\
+
 9415.      6J2OuCr9eV5Efew6cOGd47ZEfhrW7HXI+FBNFvWgWnugUU4UvlrV63niv2ZPeKu8M76y/HQaG\
+
 9416.      6weU+4Gzp+Y+cfb9R9djDWcd1Svr1xG7l+j/yf3eM996548qlC+dOzOqQ8//Lo0uaSEQCFuLD\
+
 9417.      6/bXyWhJ6aPmyaRonVPxGABFL4/0slcKI6f+PmT0M+QRsplmWnv4F49VT+JsPifoa6aeyr2Hz\
+
 9418.      6EeLdP1FEOV/ZN+c9sAuoNh0BRS0xgCCc9wME5s0HOKj/wc0fWYsTbFQpsZL5SayJPkL45kDo\
+
 9419.      6DcJJ10MvD0ZSq7FEIr1TfqZ7NC6s75zSp8viaNO5/PczYCV9z6NTa0KBdnGBg6kbdeBkRLfU\
+
 9420.      6qRd3D9Pqw5jWCc5WM/i95OE8731MBd1u2EmsXIa5dCvavY32U1Ytza4nfbERg6OVRZka7jq0\
+
 9421.      6r2FcXNDyEhXheaHtaU1o1kvO9MuBOHqugLUEzN+4jznu0oK9wZPur1lWVFfxl8lZzn2XwcjZ\
+
 9422.      6Csg/RJy0mAMMmgnqXS8ELhOCRUSLzvsM5gAPudEh2lVoRxGgyUVnArZMruE0YS1PqFMD3upb\
+
 9423.      6jVoecGj1KpWl6/ZysuyzkG4SGA4bps6FBQSg4e4IxNUgdmosmoDn0TpIex/s1BFau6GBNO4z\
+
 9424.      6cvWXypm4hEg5k3llelySFqNmUtRZ3PHBA7p4MBX1nK4awwAV6kWzIVbUA67A55QKYbMsgVaH\
+
 9425.      6c1ZxKuZ0DCyqxCsJjLyCEY36gf0wjAu3t0zemc87PmBCJbU9Lso0YAaYJUx8wsR02hYz5hGy\
+
 9426.      6Js0+A4uHGZgfuf5SOR9iBQuLhpOExaIFrHj6JlXanebzGHp2ELDh6av09PVE1fmdsj2oHRWs\
+
 9427.      6fOtYrV6wRCyx7XogHqvpnZiPBBdNcL6kIoS9UI/DOIlumlveSgv9oqMBYp7WZ2fGxAXmZmaG\
+
 9428.      6OCyJG6+wAszZFCQw/EXVjx+YA2uVyN6bhNWiZhgtYjAwR5U/7uV1scghiTGiAPZbA5ZqHw5u\
+
 9429.      6Yu1cDjhRwREBFyq2wa0R8GgceDUKPo2BX+MhoAkQ1EQIaZqVHMwH3xM+P32TTA34tmOMNZ4n\
+
 9430.      6mHXqn49fmE3qX1+wMNYoYetOsPx6wxKzkURImERJIjGSSJwkkiCJJEkiKZJImiSSIYlkSYqK\
+
 9431.      6UBu0UOopuLMmasiJW0PMFOO2UgbDif2NaQUqkBbyaGjdTUvuyamEQwCq9DWsxsG9qPt+VFqV\
+
 9432.      66cIsXcyWujWIEtNFdeia9ssNrJUpe3IDMPQZOReC8x+qvt17drPWdcHeL0gTarWwoQ6o828o\
+
 9433.      60EJzrA20yZsgVyVHdlCJOF3NaACxHbP38TA+MGx3St9c5t2CxbGtunB4J9AF4Px2rSr1wyK9\
+
 9434.      69KoXBR13vw9Fk9qhTX0ivZoanrvhLa5oiJO8cqR0lX7QtJ2c1a62V3PMtutaaoit+hxtXuC5\
+
 9435.      6ZUXJePSR6btQlt5g7PqPQ822g7F8D123pc4kaGXz7qYztJxDXCxJr7foKqxwy4rikI/NvINx\
+
 9436.      6bkArRTTnnMWy6YA8J39LfTweThKsqlt7Mz078NDSOPOGgtGTpeG8ZRBF+xKBjdSoNe8gE6uC\
+
 9437.      6ucOH98jE4+cv1JEjI555TFjYj4+0KdFlojzJGWp2wc1tCaYGSeO8dBfT0u3lpDY3tazzu4wn\
+
 9438.      6lF9wzy2nK+sTr/qEVdANoZ0ToBdD+MY4ewOHNnkXPBvKVXLSbEGfGVD0Nzr0Fs3HID3Y1Kqx\
+
 9439.      6mzJ6p1C1/R6Xneyw/q9YRDLahbnsI1u76XzMLPqsK0yvQDeQ4TMR41709sIssmEgs0XH1lcj\
+
 9440.      67HLnUG6u2Xpy5vbOowIGqrR6cwF0TLGI5PF7pkbzIVYQU0sIaoNgul3LGAH2B1nREFYXUMia\
+
 9441.      6prCeAzggGxrC5gIK2dK0exs/AIRKdlIIuxkUspdSsU+rqXagqXaooXakqTiWS/a0E7zA6QIK\
+
 9442.      6OdMUznMAh+RCQ7hcQCFXmspr3ciuds/6gPsZFPIgpfJhwUIepRAeZ1DIk5Tue4oKfSfKZyNV\
+
 9443.      6pKU/J7J4Abx1EMV5mXSRDl6lMfU6jfBmBww4k7f6gLzTB+J9od/kA/uGj2mET2nkn7+zQ/JF\
+
 9444.      6H5Kv+pB804fkOyvwI43wM438V5sdkd/6iPzRR+SvPiL/WIH/aYRxGqMb/Oqe3d54+LWR1vr2\
+
 9445.      6knnnc467iD247eXBA3YYBAiFfierClXz/8jyL3Qh/zP8y+Y/1eN8jq+SKZAML/lIidjwZ8N4\
+
 9446.      6aLthvhxGUkGPo+p0eHKZ0sT5FsqJcQCy9UhHIvcJFIlIvANTPFWUTUhSiVdsNRnvwEQxm5uc\
+
 9447.      6ksjdv5evJfpOgI6c7juH8pnG2RKwlXaDYe9g8rMwYfML3A2SMWeBDopJJsmS5dUE2KttnmQa\
+
 9448.      6JZlMspvEpJioiEDFNpPUTbwqG3Zjhx2VCeJrIf60s2mI6blZMZVyAyYzI+1a2Y0AIqcbLUgR\
+
 9449.      66iRbNtnp82GrImXW0YbcbczDgqQDWNdTenvtTAlT9iPHenluV+d3eed1/5MjMBrX2LgrK2ml\
+
 9450.      6FuoDOz036n/kaHbAeszR3jHoI4NWB3lusTfuVgkMUkLQaH0F6+pSCS11fXRwT421vs9s7axd\
+
 9451.      6nvtF7/eeIeq9s1aCLsLWdh+w7sXz3IYdEsSQ0LVsebmES/vXDU9k653W4MiNq8bMj5nLioCY\
+
 9452.      6edGgOT6tmYwqiOW1ugiEmew6iwjvvYb3SaeZJb7XNufOo9oH8FTneWGL+BLiclptpnhPwcui\
+
 9453.      6T+rzcF34+ycsL7p3AveuML9i9h13beylyg8CzEz5HppadqmmDxKrAquG9L3ztedRoWxEsAYt\
+
 9454.      6OM1Eu0G0gyTHkxf7cSkHJQRbA4xmlqHWkv1C0KhFhBq1z81Wq1CZoWic8TJ570WfSj5qsM+Q\
+
 9455.      6nl4k3H5+P+P3zlv9ltQrzv41qyiSwV/gOadyQBchsmwDGu/JI8tXflE8jqUVA0Zw0SKbdDC9\
+
 9456.      6c4FR+fak95SdF7uqpoRe9z6YRv+85YUzF4qJy6Q8GOVNwUn/ymyjNNbmcuVfXYeH2osLdCte\
+
 9457.      6ebmZRyUfQQZA1BSCLK4PWA/z1kBvDZm0t+i3or1LkMD6en95pGG0UOa8ZJXgS9TdEA1I2mZw\
+
 9458.      61JOWWxDu0NEh4rM19H55rvueMBUZV1RjkmB3oxkXhAckpa5gzzxUDA2VLOrWFAXx+4gmfU17\
+
 9459.      65o3v9H7EYdvGFuM+tDB3TA4ITjVUKduO/R4bXRAcPXZusWkN+t59sFz7Hyi0FkSdzrHXQVFq\
+
 9460.      6b8c9k9eLRjVlBbNvt4172CanYg/F3Rket1zCTc77UZ61Gq/Be9J8hrKrxbDZMEotf5o8zHDc\
+
 9461.      6/UJaEtdhgwHEcBEQKM+6NBWIewLmI1sHuWYAedZCw8U1hJfSWcld+2tv3jpCFc5FnosLWC0+\
+
 9462.      6DnAlnOXUXLoMXrmCVerNQkZHvRm8YtE12vG8+N/vOnPcu3vM1uOnzE3u3VP2ppmLZawm2NuO\
+
 9463.      6tPa7xwHFCgVKpox5PVrOmaDHrThk1tX864a2+/qhJd3nCFRQ+bfUKI4O+Wgk5byB3saMcUfV\
+
 9464.      6C8G137yMd16zRm3ZSq+UrDlk5ha3TiAj0b74prWO/vYG+RC+ronP1/McDtefBtY1XhZE0PIB\
+
 9465.      6wTe7CBTte2U6KPbYd5GffApQlDGssdfmxYGSlnHrQt7++KEwUg3ikkoQyKPixgUDB6Lozjv5\
+
 9466.      6vM5PBnllt+UzMnP6DStFsOfossbXOefWhQApACCNpkTYGAONIowDfndqDKRFuzn685nthZPe\
+
 9467.      6vEL7TIWkXAG2yxKBH90+yMzuRzWn3KMmyKGwZWnIErlJ9Vwt8OtR6+4TKad5y9+ViBtTzVG+\
+
 9468.      6tpv/xiLrcGKJRtYvCUlGeL4Dwy1jo1CSQe0X71EXK1YG44ztxTONjIslL8SwY0Cki0k0vsX/\
+
 9469.      6/xz7CxkAc9dEdJZhMy/JCGzD2FAGtUcag0tc2e2miJkp477V2qTKB+nFnDl/noxpXJ+yqVdO\
+
 9470.      6wNjbplmeiuburg9ii1Z1zwtG8QjcJAiVPSOV2mHzq1Qt7p2+YCcIKPmFusE5O+m8s+Wd8o3t\
+
 9471.      6qO1b1IZF8N0tx6RQnZ9Ux3gXijHlolixst6vhJV6ao0ZFzSprfAc3x0MLvxU0OsmXEVddMVK\
+
 9472.      629CC6mPgPtXTUW7tVnZxwm0DTJwNOeVRV4axMSPlpgyv1Va1MQhQqWwUOb0s+gVLOecos4Nf\
+
 9473.      6eqlFW3fLQrlP86R4XRxrDHF0VIx6ArM5/sTWtObY6U2aosgxbN6FUa1iNTUpMThk1sUfJOC6\
+
 9474.      6s1SKo9D0g1NfiVmavyful/K7nZdDgutV1A26i7FR3r16bv3zz1cGw+ta17IX/+ripyutix3C\
+
 9475.      6xNmCxs7uiqKu9/Zjjn06tblXpJxlaLF5Od0d5W9QhQrs2u6UN0trQlCyEK2j9VYgCEIDrhQN\
+
 9476.      6c00rxg/FOfZ1N+nLV7RXDsYP+p0EzqKcuPujzuzEQsu2mFf4nYvf3Yp32rq/RYLetDLuOOTc\
+
 9477.      60WXBtgoech7AHUxAxPBg81qWCsYlzTofRU5/MpuyNoegR6mCJO5ckrLOhWbG7xo/VGwGgpRb\
+
 9478.      6+Ch+TmlcuY6Qct/2x3gxzeDUU9u+ltexrjelJ0VRR9KXH/AqrbYxHa0vmQ/kBnE5EORBK1ZH\
+
 9479.      6mTSy7A8DJMgzzqDsu9ML5J3ufkuUNDCfN5UKAjBgw2I/QlS8MQ6o/ll9dTAdoM7HYtV4cNWE\
+
 9480.      6U4pOl5Y4SIzdMbNSjXFmsBV1uXXf7GaBZZslpFGFiIpokSzxWj4hjlGl4VKJDACo7ScxQf29\
+
 9481.      6kM8gHD3nUJkwkN2aW2TGttqwOrygJ7r9nYX2tYqy7Z3TQV5ocWzUI8l871y3LsQLoTgEO76B\
+
 9482.      6Upp69hy6VKRpZvpvgfQ2T06qgXjxh38eatREitX6bzKggIYmN4sAkA3a5oeJZDK3ahQrVJwa\
+
 9483.      6AD65cEGBkS/tKH9TtybiREEWCMcKD0HH0gELtjB+KNSk7bspmpr6eb0CscIiFyZpmXu8+gxw\
+
 9484.      6O7pJNbAK2h9q2c5dMHBaoi5DylbNGdweVVdN3Jm9u6YXXlmx4nYY2vIPfSkrE/vyv9gn/Z+j\
+
 9485.      6R3HKExaUhdV0Az77YWbQPhNfjw+F0vTteSMin+wIfxyPe0DEoI4uz6o2IXwsZC7sg8MicQ3o\
+
 9486.      6wys+NJYKVW72YiVQ5LKDVwrEg2jNVM6XdNjbsHlRDcAkD08o5iWtFB2dVoydRmmDRLalE+4t\
+
 9487.      63gBbAPa7n7qXXXbTZTJXZKy5+1W0K7dgYEcIlu90ovC0C+5gxXiKtZisT14qDJ7f2ksyK59U\
+
 9488.      6r3QeHtBb24mPz7YDB3rgMTyUZ/fxM8h2i1Z21B8/VA5+9l7BKaOJZ15lWsyPv/z6CjU32ZKq\
+
 9489.      6+QFeyUywxYnUxUmcQfGc1Sp69oE2n6zFL8BXf5rc3cJMM6S97gagTT1bi7cmAV4MibkC4rz/\
+
 9490.      6icmmFtMlo5aN1Wp3uxsBfd4+9T42xmxvd79FV/hfuviBcrIaX092PrY5rle9FR4wTnDzrwj4\
+
 9491.      67frD2d0KsMcdcADQ1Yu1LECg9Wj3yOS8OhrJdQBqXqsam17vmt2wjjjouHE/EO9sGPdqt23v\
+
 9492.      6j8rL6wid6ulagtNK5p1hjRkFtUxTIaZnIXk63Zb3P0t5MQ+3vxHIFrmgAdWwiDuA67tbVIF6\
+
 9493.      6wJ53z0uhyhsfH9bgF0kPT9v2hrT3HKIBgUXIYoxsVU+uryemiUiQEwh+BfxP//qLShlumR26\
+
 9494.      6I8OqjD+x3hHDj/IrEWmvyL6ioG/atfxe+5GzIqRgfaoayWOiTk+YixO15KDO6Os3XACDjboe\
+
 9495.      6ryXXOuEmTpDsc7czk+H04Kw1PNJazW32CAURHwBldqK0/nqYHtcrtLyyTYmoD8hbcnJUfa3U\
+
 9496.      63FxWNus7uic3Qm1BzEecJW0MAz+W2CyN9FLIy+EpSy6CjkXsllZw1uBs1SxrQWM97/vnHu7m\
+
 9497.      6OtrkRl8AtBN3RDxI/fg7dZLLtDFYuCYYPMwXiO6ZIpwJ1GGydI9oUYYgnQQKDKoMTcwsjrfe\
+
 9498.      6Tcht6y18bLcpNfX41WE27447vLNzHuF+j15co5N7Py8vKUpTCoghHMEYKkM6y02lvX+9XiFg\
+
 9499.      6xBKMRNiwX69+LJb2Xa5WGqo7Rlk0cxsLVd0l2UXAW5jORg31sFMKYWXsDcRUKRDP8Q87OjiM\
+
 9500.      6dI1hNEt43netf8rOyfp+L58fq3holY9gxXwRJLY6gahgLQi4hS8w9LS+rFcJtdSCBrQLWsMs\
+
 9501.      6aDg/n8/P8/N+fcyoLepYr3W/CIUT7HsRQTtkduddbVfbo6Twt6fyJVPRrUGqRkWp3rdry65v\
+
 9502.      6sPYInyq1mPHrQDrqGJYI/LzA/QAzAXLnx+lu9uxHTEka9xgWgRvqEioskh+UWgD4nDvTAxaz\
+
 9503.      63v9BqqmFuQwy1wSXye1Df1NXVF7G8bUFxUE4F9axG5fm+vFQJvP8iuYjrFveB6++AqmJTQJ0\
+
 9504.      69GHjbPhzdSzkZGxokQzONVs0R0FCPJz1hJKbvDKsaj9hT0vp/gH5oiT8pAbWsBChwAbxHgDd\
+
 9505.      659iJVZE3bAzPRN1RuG+MT7th+J3i6KFwVJvPvsGRDIZW4P2rVfiKjDVBM2Va+w6PgI0c5u3K\
+
 9506.      6O7MrWryPhXFFdBoAwi2JCaW9sZ3fTagQ4Tld6u4djwcWzeCdiYoeNbfalsRYo740afYQ1Rid\
+
 9507.      6Bp/E9mbcTemEjoWWXIU7I5nK5H/BEqmZnPMyhDV234BTLQKCe6nhU+frwQo1gNFWf+eQGN62\
+
 9508.      6aeF7BuzaN/94W2xlKd8t8KMA/3uoxymFt19OlCjYZeaMWbTKM9Yog9zDhptYMOzIQAoO7kn6\
+
 9509.      6nTao8CxjrRRgjKe7mKa+tzuufhAAZtgjA92THkulWvIzEi0++j1DvXMnupDUS8aVusWain+c\
+
 9510.      6CcvmR5orC+RcJs3wVahLYyEcqbvAS2e0QJ6BlU36R/IEd9Aol9q+M+UGvlo8EyRzISvqusNS\
+
 9511.      67ePQ6cQzG1s725db4jNYNHAfF3KFG8wHqDwZDpWDsJ5qRLXR1ulFx85GhkypPubYaCiOQ5DR\
+
 9512.      6PQUiNpgk4fLJHenSMLMiswXsqW4Cpln1rFoHzpOoBbuZIixmVyhKajeqlFmp8zNAEsbEJz0g\
+
 9513.      6X0qlQuykZhf82pkhq2hWtCtYUdBODn6iPTBJT5Zk8IqFxqfBeFKjXk/sMeumhT8muOtq2Bgn\
+
 9514.      6dR4fj6RoOi0zI25kajAXlDZhUhS39jipk39h/69AfDPBLmOxhDj7Lg/WUTbOwJiJ3p7WtOpm\
+
 9515.      6ypARmhorQifINNm1CNS99GfDcLbD8sn8Fvlmvn7CmW65Pdmu6bKtuE0tn7NglIX1e/JAJP+G\
+
 9516.      6gB3At7cSOp92rl0lp0pp0xVb5YaQedwGgcJA1pT4cy24lS+jvzDw86YTfb2igJm5MysHmejW\
+
 9517.      6ZTGXpoAoLBLucUGEz/DwbjqOdzGAl5jy5VoCQws5zNYl4SVt030aZulYMgpDBPZd+kL0wV+w\
+
 9518.      6nob2LPRDQGEbdUoeFm4fEKio9c/ferVlpSO8Bx7OFZyHip1PIizvoqFe02kpmS17TvIOty42\
+
 9519.      6+Q0QaCnOpeLsPwwo+vixIeIeUjucUsKejVlez35qyuC0mm5pJJJLEVP2JAe/LTOwUUfKJkNy\
+
 9520.      6lEe3Kdth241ZNQmkVcAIh6DZJBzvQov5fn3JZA0phBWdNq5iTsm5N2D8gyve3V3X2o3zF3VY\
+
 9521.      6OqEBgTIADAbC69z7vOKJjGOzHRmUUwLU66iabtIbqR6SPOHCL+fCTfvpKcB/oG2p3wRKErEJ\
+
 9522.      6v1YOfu9iaKEMLXS3ptdH8fwN2Rdww9bZ7rFa2bwrzcyux3o+hPV6bJZpb71j7lLAdzge3VX7\
+
 9523.      69uSCdz6f/FDb7+wzWnbbDSPj9R20+PybDUm/lVAsTuF0aycFQwJfPCUwcBvCGWEq6xoTIEOy\
+
 9524.      6b0bLta20+LYRYdyEceX7ypfezQKIy5OvJTAHCJy/WyOYaDVyPucMsHnZ0GCH75Cd//te1Bv2\
+
 9525.      6RkMykqYurBiNbuH3Xfuprirr4Dd453O6abAYGb5tw1d6wrBL8p1J1Sx9Lgw7yxqYn0FTrc0y\
+
 9526.      659yLlV+4zIkLfZlPFRVnanHpTyrIlpn4lGkt269+JXnIWhEQWNvuVsrt531jr+8AHkVZfQU8\
+
 9527.      68U/4AUZMuOj5iliigFrof/usmloYEI1f8erhJku75snYW7YmFmUcoC7UtG/KfJRuz6j0tWPa\
+
 9528.      656J5QA0rJHwSIhNT4GWvez19HT2lia+Pz7/+MVEWlvjY6+9P85a0y9qWkTzQ7nF0wDXpQpw3\
+
 9529.      6K4xnfK2L08b5MrxdeI+DDfVDeV2JY0Fp6KH602tj2MbxxKM8oG+wTkE/dr8jyo4Sfs/IV6uf\
+
 9530.      6+IIXpH2Nca1+WCJV5qEv193bcUELLR4iFu83xUedKy9353tn+3o01dF2bNEQ3fK9Q5tCXrCi\
+
 9531.      6La+woCuvEeYrr+PiN2+i2V/eDJck580pyra8BV5ZIZbpe3kr5vJD3pqoGsnbcl/d+ndvR23b\
+
 9532.      6K41M4dKwaAwDaMA1gZGBoQWAcYE9mYkmQOnAjkaG41FkGkIP2BAIgKvUvzhpE5JbA6lze2iL\
+
 9533.      65Nr+AwiDo2W4BStvK30dKy0JGNbzAY5akexsrV0xo5K8rY50LOTLvDyukIZNbRLKOCk18mD3\
+
 9534.      6WxmZGlsCMxNdGFYGNJnetUWyCPgo4BONEL4I9b8UeEBGYXuCdCd+DkctrqVLYXGSfE46kvAu\
+
 9535.      6+ltK5SRxQPnjUqyJXsSYs6VY6WPKfns9+IXjHhd5wQvGipgFdMwVEQ+A7a2AAS0clQwH7KHW\
+
 9536.      6SEGjhnklSVRghMtPy6gEtJRIKJeYkpQyQiequQunFOOU4BLdK1yp55olZS6npyPhMnvK7xIa\
+
 9537.      6pyNj+JctcQLXenBOCms46aMkenIx45WpXqxxVJQLz/vgpmAVa0fmDv6Pue9xVTBPfVxCUGfj\
+
 9538.      61R8uVi8Zu9nRFqk/t0gR6wmWOlzuKRqk33HpO8qQ+nbGoEZLL/0Va156SJ+u+t86/os7ic49\
+
 9539.      6/7xoEqvL+2E8VOyCTuT/7j269Zy4jUtN+g4="
+
 9540.      6    ) format("woff2");
+
 9541.      6}
+
 9542.      6.JSLINT_,
+
 9543.      6.JSLINT_ address,
+
 9544.      6.JSLINT_ button,
+
 9545.      6.JSLINT_ cite,
+
 9546.      6.JSLINT_ dd,
+
 9547.      6.JSLINT_ dfn,
+
 9548.      6.JSLINT_ dl,
+
 9549.      6.JSLINT_ dt,
+
 9550.      6.JSLINT_ fieldset,
+
 9551.      6.JSLINT_ fieldset > div,
+
 9552.      6.JSLINT_ input,
+
 9553.      6.JSLINT_ label,
+
 9554.      6.JSLINT_ legend,
+
 9555.      6.JSLINT_ ol,
+
 9556.      6.JSLINT_ samp,
+
 9557.      6.JSLINT_ style,
+
 9558.      6.JSLINT_ textarea,
+
 9559.      6.JSLINT_ ul {
+
 9560.      6    border: 0;
 9561.      6    box-sizing: border-box;
-
 9562.      6}
-
 9563.      6/*csslint ignore:end*/
-
 9564.      6
-
 9565.      6/* css - jslint_report - font */
-
 9566.      6.JSLINT_,
-
 9567.      6.JSLINT_ fieldset legend,
-
 9568.      6.JSLINT_ .center {
-
 9569.      6    font-family: daley, sans-serif;
-
 9570.      6    font-size: 14px;
-
 9571.      6}
-
 9572.      6.JSLINT_ fieldset textarea,
-
 9573.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS dt,
-
 9574.      6.JSLINT_ #JSLINT_REPORT_WARNINGS samp {
-
 9575.      6    font-size: 12px;
-
 9576.      6}
-
 9577.      6.JSLINT_ fieldset textarea,
-
 9578.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS > div {
-
 9579.      6    font-family: monospace;
-
 9580.      6}
-
 9581.      6.JSLINT_ fieldset > div {
-
 9582.      6    font-family: sans-serif;
-
 9583.      6}
-
 9584.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level dfn {
-
 9585.      6    font-style: normal;
-
 9586.      6    font-weight: bold;
+
 9562.      6    margin: 0;
+
 9563.      6    padding: 0;
+
 9564.      6}
+
 9565.      6/* disable text inflation algorithm used on some smartphones and tablets */
+
 9566.      6.JSLINT_ {
+
 9567.      6    -ms-text-size-adjust: none;
+
 9568.      6    -webkit-text-size-adjust: none;
+
 9569.      6    text-size-adjust: none;
+
 9570.      6}
+
 9571.      6.JSLINT_REPORT_ div {
+
 9572.      6    box-sizing: border-box;
+
 9573.      6}
+
 9574.      6/*csslint ignore:end*/
+
 9575.      6
+
 9576.      6/* css - jslint_report - font */
+
 9577.      6.JSLINT_,
+
 9578.      6.JSLINT_ fieldset legend,
+
 9579.      6.JSLINT_ .center {
+
 9580.      6    font-family: daley, sans-serif;
+
 9581.      6    font-size: 14px;
+
 9582.      6}
+
 9583.      6.JSLINT_ fieldset textarea,
+
 9584.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS dt,
+
 9585.      6.JSLINT_ #JSLINT_REPORT_WARNINGS samp {
+
 9586.      6    font-size: 12px;
 9587.      6}
-
 9588.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level dt {
-
 9589.      6    font-style: italic;
-
 9590.      6}
-
 9591.      6.JSLINT_ #JSLINT_REPORT_TITLE {
-
 9592.      6    font-size: 32px;
-
 9593.      6}
-
 9594.      6
-
 9595.      6/* css - jslint_report - general */
-
 9596.      6.JSLINT_ {
-
 9597.      6    background: antiquewhite;
+
 9588.      6.JSLINT_ fieldset textarea,
+
 9589.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS > div {
+
 9590.      6    font-family: monospace;
+
 9591.      6}
+
 9592.      6.JSLINT_ fieldset > div {
+
 9593.      6    font-family: sans-serif;
+
 9594.      6}
+
 9595.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level dfn {
+
 9596.      6    font-style: normal;
+
 9597.      6    font-weight: bold;
 9598.      6}
-
 9599.      6.JSLINT_ fieldset {
-
 9600.      6    background: gainsboro;
-
 9601.      6    clear: both;
-
 9602.      6    margin: 16px 40px;
-
 9603.      6    width: auto;
+
 9599.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level dt {
+
 9600.      6    font-style: italic;
+
 9601.      6}
+
 9602.      6.JSLINT_ #JSLINT_REPORT_TITLE {
+
 9603.      6    font-size: 32px;
 9604.      6}
-
 9605.      6.JSLINT_ fieldset address {
-
 9606.      6    float: right;
-
 9607.      6}
-
 9608.      6.JSLINT_ fieldset legend,
-
 9609.      6.JSLINT_ .center {
-
 9610.      6    text-align: center;
-
 9611.      6}
-
 9612.      6.JSLINT_ fieldset legend {
-
 9613.      6    background: darkslategray;
-
 9614.      6    color: white;
-
 9615.      6    padding: 4px 0;
-
 9616.      6    width: 100%;
-
 9617.      6}
-
 9618.      6.JSLINT_ fieldset textarea {
-
 9619.      6    padding: 4px;
-
 9620.      6    resize: none;
-
 9621.      6    white-space: pre;
-
 9622.      6    width: 100%;
-
 9623.      6}
-
 9624.      6.JSLINT_ fieldset textarea::selection {
-
 9625.      6    background: wheat;
-
 9626.      6}
-
 9627.      6.JSLINT_ fieldset > div {
-
 9628.      6    padding: 16px;
-
 9629.      6    width: 100%;
-
 9630.      6    word-wrap: break-word;
-
 9631.      6}
-
 9632.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level {
-
 9633.      6    background: cornsilk;
-
 9634.      6    padding: 8px 16px;
-
 9635.      6}
-
 9636.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level dd {
-
 9637.      6    line-height: 20px;
-
 9638.      6    padding-left: 120px;
-
 9639.      6}
-
 9640.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level dfn {
-
 9641.      6    display: block;
-
 9642.      6    line-height: 20px;
-
 9643.      6}
-
 9644.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level dl {
-
 9645.      6    position: relative
+
 9605.      6
+
 9606.      6/* css - jslint_report - general */
+
 9607.      6.JSLINT_ {
+
 9608.      6    background: antiquewhite;
+
 9609.      6}
+
 9610.      6.JSLINT_ fieldset {
+
 9611.      6    background: gainsboro;
+
 9612.      6    clear: both;
+
 9613.      6    margin: 16px 40px;
+
 9614.      6    width: auto;
+
 9615.      6}
+
 9616.      6.JSLINT_ fieldset address {
+
 9617.      6    float: right;
+
 9618.      6}
+
 9619.      6.JSLINT_ fieldset legend,
+
 9620.      6.JSLINT_ .center {
+
 9621.      6    text-align: center;
+
 9622.      6}
+
 9623.      6.JSLINT_ fieldset legend {
+
 9624.      6    background: darkslategray;
+
 9625.      6    color: white;
+
 9626.      6    padding: 4px 0;
+
 9627.      6    width: 100%;
+
 9628.      6}
+
 9629.      6.JSLINT_ fieldset textarea {
+
 9630.      6    padding: 4px;
+
 9631.      6    resize: none;
+
 9632.      6    white-space: pre;
+
 9633.      6    width: 100%;
+
 9634.      6}
+
 9635.      6.JSLINT_ fieldset textarea::selection {
+
 9636.      6    background: wheat;
+
 9637.      6}
+
 9638.      6.JSLINT_ fieldset > div {
+
 9639.      6    padding: 16px;
+
 9640.      6    width: 100%;
+
 9641.      6    word-wrap: break-word;
+
 9642.      6}
+
 9643.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level {
+
 9644.      6    background: cornsilk;
+
 9645.      6    padding: 8px 16px;
 9646.      6}
-
 9647.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level dt {
+
 9647.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level dd {
 9648.      6    line-height: 20px;
-
 9649.      6    position: absolute;
-
 9650.      6    text-align: right;
-
 9651.      6    width: 100px;
-
 9652.      6}
-
 9653.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level0 {
-
 9654.      6    background: white;
-
 9655.      6}
-
 9656.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level1 {
-
 9657.      6    /* yellow */
-
 9658.      6    background: #ffffe0;
-
 9659.      6    margin-left: 16px;
-
 9660.      6}
-
 9661.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level2 {
-
 9662.      6    /* green */
-
 9663.      6    background: #e0ffe0;
-
 9664.      6    margin-left: 32px;
-
 9665.      6}
-
 9666.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level3 {
-
 9667.      6    /* blue */
-
 9668.      6    background: #D0D0ff;
-
 9669.      6    margin-left: 48px;
-
 9670.      6}
-
 9671.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level4 {
-
 9672.      6    /* purple */
-
 9673.      6    background: #ffe0ff;
-
 9674.      6    margin-left: 64px;
-
 9675.      6}
-
 9676.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level5 {
-
 9677.      6    /* red */
-
 9678.      6    background: #ffe0e0;
-
 9679.      6    margin-left: 80px;
-
 9680.      6}
-
 9681.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level6 {
-
 9682.      6    /* orange */
-
 9683.      6    background: #ffe390;
-
 9684.      6    margin-left: 96px;
-
 9685.      6}
-
 9686.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level7 {
-
 9687.      6    /* gray */
-
 9688.      6    background: #e0e0e0;
-
 9689.      6    margin-left: 112px;
-
 9690.      6}
-
 9691.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level8 {
-
 9692.      6    margin-left: 128px;
-
 9693.      6}
-
 9694.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level9 {
-
 9695.      6    margin-left: 144px;
+
 9649.      6    padding-left: 120px;
+
 9650.      6}
+
 9651.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level dfn {
+
 9652.      6    display: block;
+
 9653.      6    line-height: 20px;
+
 9654.      6}
+
 9655.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level dl {
+
 9656.      6    position: relative
+
 9657.      6}
+
 9658.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level dt {
+
 9659.      6    line-height: 20px;
+
 9660.      6    position: absolute;
+
 9661.      6    text-align: right;
+
 9662.      6    width: 100px;
+
 9663.      6}
+
 9664.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level0 {
+
 9665.      6    background: white;
+
 9666.      6}
+
 9667.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level1 {
+
 9668.      6    /* yellow */
+
 9669.      6    background: #ffffe0;
+
 9670.      6    margin-left: 16px;
+
 9671.      6}
+
 9672.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level2 {
+
 9673.      6    /* green */
+
 9674.      6    background: #e0ffe0;
+
 9675.      6    margin-left: 32px;
+
 9676.      6}
+
 9677.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level3 {
+
 9678.      6    /* blue */
+
 9679.      6    background: #D0D0ff;
+
 9680.      6    margin-left: 48px;
+
 9681.      6}
+
 9682.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level4 {
+
 9683.      6    /* purple */
+
 9684.      6    background: #ffe0ff;
+
 9685.      6    margin-left: 64px;
+
 9686.      6}
+
 9687.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level5 {
+
 9688.      6    /* red */
+
 9689.      6    background: #ffe0e0;
+
 9690.      6    margin-left: 80px;
+
 9691.      6}
+
 9692.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level6 {
+
 9693.      6    /* orange */
+
 9694.      6    background: #ffe390;
+
 9695.      6    margin-left: 96px;
 9696.      6}
-
 9697.      6.JSLINT_ #JSLINT_REPORT_PROPERTIES {
-
 9698.      6    background: transparent;
-
 9699.      6}
-
 9700.      6.JSLINT_ #JSLINT_REPORT_PROPERTIES textarea {
-
 9701.      6    background: honeydew;
-
 9702.      6    height: 100px;
-
 9703.      6}
-
 9704.      6.JSLINT_ #JSLINT_REPORT_TITLE {
-
 9705.      6    color: darkslategray;
-
 9706.      6    padding-top: 16px;
+
 9697.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level7 {
+
 9698.      6    /* gray */
+
 9699.      6    background: #e0e0e0;
+
 9700.      6    margin-left: 112px;
+
 9701.      6}
+
 9702.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level8 {
+
 9703.      6    margin-left: 128px;
+
 9704.      6}
+
 9705.      6.JSLINT_ #JSLINT_REPORT_FUNCTIONS .level9 {
+
 9706.      6    margin-left: 144px;
 9707.      6}
-
 9708.      6.JSLINT_ #JSLINT_REPORT_WARNINGS cite {
-
 9709.      6    display: block;
-
 9710.      6    margin: 16px 0 4px 0;
-
 9711.      6    overflow-x: hidden;
-
 9712.      6    white-space: pre-line;
-
 9713.      6}
-
 9714.      6.JSLINT_ #JSLINT_REPORT_WARNINGS cite:nth-child(1) {
-
 9715.      6    margin-top: 0;
-
 9716.      6}
-
 9717.      6.JSLINT_ #JSLINT_REPORT_WARNINGS samp {
-
 9718.      6    background: lavenderblush;
-
 9719.      6    display: block;
-
 9720.      6    padding: 4px;
-
 9721.      6    white-space: pre-wrap;
-
 9722.      6}
-
 9723.      6.JSLINT_ #JSLINT_REPORT_WARNINGS > div {
-
 9724.      6    background: pink;
-
 9725.      6    max-height: 400px;
-
 9726.      6    overflow-y: auto;
+
 9708.      6.JSLINT_ #JSLINT_REPORT_PROPERTIES {
+
 9709.      6    background: transparent;
+
 9710.      6}
+
 9711.      6.JSLINT_ #JSLINT_REPORT_PROPERTIES textarea {
+
 9712.      6    background: honeydew;
+
 9713.      6    height: 100px;
+
 9714.      6}
+
 9715.      6.JSLINT_ #JSLINT_REPORT_TITLE {
+
 9716.      6    color: darkslategray;
+
 9717.      6    padding-top: 16px;
+
 9718.      6}
+
 9719.      6.JSLINT_ #JSLINT_REPORT_WARNINGS cite {
+
 9720.      6    display: block;
+
 9721.      6    margin: 16px 0 4px 0;
+
 9722.      6    overflow-x: hidden;
+
 9723.      6    white-space: pre-line;
+
 9724.      6}
+
 9725.      6.JSLINT_ #JSLINT_REPORT_WARNINGS cite:nth-child(1) {
+
 9726.      6    margin-top: 0;
 9727.      6}
-
 9728.      6.JSLINT_ #JSLINT_REPORT_WARNINGS > legend {
-
 9729.      6/* Google Lighthouse Accessibility - Background and foreground colors do not */
-
 9730.      6/* have a sufficient contrast ratio. */
-
 9731.      6    /* background: indianred; */
-
 9732.      6    background: #b44;
+
 9728.      6.JSLINT_ #JSLINT_REPORT_WARNINGS samp {
+
 9729.      6    background: lavenderblush;
+
 9730.      6    display: block;
+
 9731.      6    padding: 4px;
+
 9732.      6    white-space: pre-wrap;
 9733.      6}
-
 9734.      6</style>
-
 9735.      6            `).trim() + "\n";
-
 9736.      6
-
 9737.      6// Produce the Title.
-
 9738.      6
-
 9739.      6    html += "<div class=\"center\" id=\"JSLINT_REPORT_TITLE\">\n";
-
 9740.      6    html += "JSLint Report\n";
-
 9741.      6    html += "</div>\n";
-
 9742.      6
-
 9743.      6// Produce the HTML Error Report.
-
 9744.      6// <cite>
-
 9745.      6//     <address>LINE_NUMBER</address>
-
 9746.      6//     MESSAGE
-
 9747.      6// </cite>
-
 9748.      6// <samp>EVIDENCE</samp>
+
 9734.      6.JSLINT_ #JSLINT_REPORT_WARNINGS > div {
+
 9735.      6    background: pink;
+
 9736.      6    max-height: 400px;
+
 9737.      6    overflow-y: auto;
+
 9738.      6}
+
 9739.      6.JSLINT_ #JSLINT_REPORT_WARNINGS > legend {
+
 9740.      6/* Google Lighthouse Accessibility - Background and foreground colors do not */
+
 9741.      6/* have a sufficient contrast ratio. */
+
 9742.      6    /* background: indianred; */
+
 9743.      6    background: #b44;
+
 9744.      6}
+
 9745.      6</style>
+
 9746.      6            `).trim() + "\n";
+
 9747.      6
+
 9748.      6// Produce the Title.
 9749.      6
-
 9750.      6    html += "<fieldset id=\"JSLINT_REPORT_WARNINGS\">\n";
-
 9751.      6    html += "<legend>Report: Warnings (" + warnings.length + ")</legend>\n";
-
 9752.      6    html += "<div>\n";
-
 9753.      1    if (stop) {
-
 9754.      1        html += "<div class=\"center\">JSLint was unable to finish.</div>\n";
-
 9755.      1    }
-
 9756.      7    warnings.forEach(function ({
-
 9757.      7        column,
-
 9758.      7        line,
-
 9759.      7        line_source,
-
 9760.      7        message,
-
 9761.      7        stack_trace = ""
-
 9762.      7    }, ii) {
-
 9763.      7        html += (
-
 9764.      7            "<cite>"
-
 9765.      7            + address(line, column)
-
 9766.      7            + htmlEscape((ii + 1) + ". " + message)
-
 9767.      7            + "</cite>"
-
 9768.      7            + "<samp>"
-
 9769.      7            + htmlEscape(line_source.slice(0, 400) + "\n" + stack_trace)
-
 9770.      7            + "</samp>\n"
-
 9771.      7        );
-
 9772.      7    });
-
 9773.      3    if (warnings.length === 0) {
-
 9774.      3        html += "<div class=\"center\">There are no warnings.</div>\n";
-
 9775.      3    }
-
 9776.      6    html += "</div>\n";
-
 9777.      6    html += "</fieldset>\n";
-
 9778.      6
-
 9779.      6// Produce the /*property*/ directive.
-
 9780.      6
-
 9781.      6    html += "<fieldset id=\"JSLINT_REPORT_PROPERTIES\">\n";
-
 9782.      6    html += (
-
 9783.      6        "<legend>Report: Properties ("
-
 9784.      6        + Object.keys(property).length
-
 9785.      6        + ")</legend>\n"
-
 9786.      6    );
-
 9787.      6    html += "<label>\n";
-
 9788.      6    html += "<textarea readonly>";
-
 9789.      6    html += "/*property";
-
 9790.    301    Object.keys(property).sort().forEach(function (key, ii) {
-
 9791.    300        if (ii !== 0) {
-
 9792.    300            html += ",";
-
 9793.    300            length_80 += 2;
-
 9794.    300        }
-
 9795.     42        if (length_80 + key.length >= 80) {
-
 9796.     42            length_80 = 4;
-
 9797.     42            html += "\n   ";
-
 9798.     42        }
-
 9799.    301        html += " " + key;
-
 9800.    301        length_80 += key.length;
-
 9801.    301    });
-
 9802.      6    html += "\n*/\n";
-
 9803.      6    html += "</textarea>\n";
-
 9804.      6    html += "</label>\n";
-
 9805.      6    html += "</fieldset>\n";
-
 9806.      6
-
 9807.      6// Produce the HTML Function Report.
-
 9808.      6// <div class=LEVEL>
-
 9809.      6//     <address>LINE_NUMBER</address>
-
 9810.      6//     <dfn>FUNCTION_NAME_AND_SIGNATURE</dfn>
-
 9811.      6//     <dl>
-
 9812.      6//         <dt>DETAIL</dt>
-
 9813.      6//         <dd>NAMES</dd>
-
 9814.      6//     </dl>
-
 9815.      6// </div>
-
 9816.      6
-
 9817.      6    html += "<fieldset id=\"JSLINT_REPORT_FUNCTIONS\">\n";
-
 9818.      6    html += "<legend>Report: Functions (" + functions.length + ")</legend>\n";
-
 9819.      6    html += "<div>\n";
-
 9820.      2    if (json) {
-
 9821.      2
-
 9822.      2// Bugfix - fix website crashing when linting pure json-object.
-
 9823.      2// return (
-
 9824.      2
-
 9825.      2        html += (
-
 9826.      2            warnings.length === 0
-
 9827.      2            ? "<div class=\"center\">JSON: good.</div>\n"
-
 9828.      2            : "<div class=\"center\">JSON: bad.</div>\n"
-
 9829.      2        );
-
 9830.      4    } else if (functions.length === 0) {
-
 9831.      4        html += "<div class=\"center\">There are no functions.</div>\n";
-
 9832.      4    }
-
 9833.      6    exports = Object.keys(exports).sort();
-
 9834.      6    froms.sort();
-
 9835.      6    global = Object.keys(global.context).sort();
-
 9836.      6    module = (
-
 9837.      6        module
-
 9838.      1        ? "module"
-
 9839.      5        : "global"
-
 9840.      6    );
-
 9841.      3    if (global.length + froms.length + exports.length > 0) {
-
 9842.      3        if (functions.length === 0) {
-
 9843.      3            html += "<br>\n";
-
 9844.      3        }
-
 9845.      3        html += "<div class=\"level level0\">\n";
-
 9846.      3        html += detail(module, global);
-
 9847.      3        html += detail("import from", froms);
-
 9848.      3        html += detail("export", exports);
-
 9849.      3        html += "</div>\n";
-
 9850.      3    }
-
 9851.    321    functions.forEach(function (the_function) {
-
 9852.    321        let {
-
 9853.    321            context,
-
 9854.    321            from,
-
 9855.    321            id,
-
 9856.    321            level,
-
 9857.    321            line,
-
 9858.    321            name,
-
 9859.    321
-
 9860.    321// Bugfix - fix html-report from crashing if parameters is undefined.
-
 9861.    321
-
 9862.    321            parameters = [],
-
 9863.    321            signature
-
 9864.    321        } = the_function;
-
 9865.    321        let list = Object.keys(context);
-
 9866.    321        let params;
-
 9867.    321        html += (
-
 9868.    321            "<div class=\"level level" + htmlEscape(level) + "\">"
-
 9869.    321            + address(line, from + 1)
-
 9870.    321            + "<dfn>"
-
 9871.    321            + (
-
 9872.    321                id === "=>"
-
 9873.      1                ? (
-
 9874.      1                    "\u00ab" + htmlEscape(name) + "\u00bb"
-
 9875.      1                    + htmlEscape(signature)
-
 9876.      1                    + " =>"
-
 9877.      1                )
-
 9878.    320                : (
-
 9879.    320                    typeof name === "string"
-
 9880.    320                    ? "\u00ab" + htmlEscape(name) + "\u00bb"
-
 9881.    320                    : htmlEscape(name.id)
-
 9882.    320                ) + htmlEscape(signature)
-
 9883.    321            )
-
 9884.    321            + "</dfn>"
-
 9885.    321        );
-
 9886.    321        params = [];
-
 9887.    470        parameters.forEach(function extract({
-
 9888.    470            id,
-
 9889.    470            names
-
 9890.    470        }) {
-
 9891.    470            switch (id) {
-
 9892.      6            case "[":
-
 9893.     42            case "{":
-
 9894.     42
-
 9895.     42// Recurse extract().
-
 9896.     42
-
 9897.     42                names.forEach(extract);
-
 9898.     42                break;
-
 9899.      4            case "ignore":
-
 9900.      4                break;
-
 9901.    424            default:
-
 9902.    424                params.push(id);
-
 9903.    470            }
-
 9904.    470        });
-
 9905.    321        html += detail("parameter", params.sort());
-
 9906.    321        list.sort();
-
 9907.   2203        html += detail("variable", list.filter(function (id) {
-
 9908.   2203            return (
-
 9909.   2203                context[id].role === "variable"
-
 9910.   1693                && context[id].parent === the_function
-
 9911.   2203            );
-
 9912.   2203        }));
-
 9913.   2203        html += detail("exception", list.filter(function (id) {
-
 9914.   2203            return context[id].role === "exception";
-
 9915.   2203        }));
-
 9916.   2203        html += detail("closure", list.filter(function (id) {
-
 9917.   2203            return (
-
 9918.   2203                context[id].closure === true
-
 9919.   1494                && context[id].parent === the_function
-
 9920.   2203            );
-
 9921.   2203        }));
-
 9922.   2203        html += detail("outer", list.filter(function (id) {
-
 9923.   2203            return (
-
 9924.   2203                context[id].parent !== the_function
-
 9925.   1190                && context[id].parent.id !== "(global)"
-
 9926.   2203            );
-
 9927.   2203        }));
-
 9928.   2203        html += detail(module, list.filter(function (id) {
-
 9929.   2203            return context[id].parent.id === "(global)";
-
 9930.   2203        }));
-
 9931.   2203        html += detail("label", list.filter(function (id) {
-
 9932.   2203            return context[id].role === "label";
-
 9933.   2203        }));
-
 9934.    321        html += "</div>\n";
-
 9935.    321    });
-
 9936.      6    html += "</div>\n";
-
 9937.      6    html += "</fieldset>\n";
-
 9938.      6    return html;
-
 9939.      6}
-
 9940.      1
-
 9941.     10async function jstestDescribe(description, testFunction) {
-
 9942.     10
-
 9943.     10// This function will create-and-run test-group <testFunction>
-
 9944.     10// with given <description>.
-
 9945.     10
-
 9946.     10    let message;
-
 9947.     10    let result;
-
 9948.     10    let timerTimeout;
-
 9949.     10
-
 9950.     10// Init jstestTimeStart.
-
 9951.     10
-
 9952.      1    if (jstestTimeStart === undefined) {
-
 9953.      1        jstestTimeStart = jstestTimeStart || Date.now();
-
 9954.      1        process.on("exit", jstestOnExit);
-
 9955.      1    }
+
 9750.      6    html += "<div class=\"center\" id=\"JSLINT_REPORT_TITLE\">\n";
+
 9751.      6    html += "JSLint Report\n";
+
 9752.      6    html += "</div>\n";
+
 9753.      6
+
 9754.      6// Produce the HTML Error Report.
+
 9755.      6// <cite>
+
 9756.      6//     <address>LINE_NUMBER</address>
+
 9757.      6//     MESSAGE
+
 9758.      6// </cite>
+
 9759.      6// <samp>EVIDENCE</samp>
+
 9760.      6
+
 9761.      6    html += "<fieldset id=\"JSLINT_REPORT_WARNINGS\">\n";
+
 9762.      6    html += "<legend>Report: Warnings (" + warnings.length + ")</legend>\n";
+
 9763.      6    html += "<div>\n";
+
 9764.      1    if (stop) {
+
 9765.      1        html += "<div class=\"center\">JSLint was unable to finish.</div>\n";
+
 9766.      1    }
+
 9767.      7    warnings.forEach(function ({
+
 9768.      7        column,
+
 9769.      7        line,
+
 9770.      7        line_source,
+
 9771.      7        message,
+
 9772.      7        stack_trace = ""
+
 9773.      7    }, ii) {
+
 9774.      7        html += (
+
 9775.      7            "<cite>"
+
 9776.      7            + address(line, column)
+
 9777.      7            + htmlEscape((ii + 1) + ". " + message)
+
 9778.      7            + "</cite>"
+
 9779.      7            + "<samp>"
+
 9780.      7            + htmlEscape(line_source.slice(0, 400) + "\n" + stack_trace)
+
 9781.      7            + "</samp>\n"
+
 9782.      7        );
+
 9783.      7    });
+
 9784.      3    if (warnings.length === 0) {
+
 9785.      3        html += "<div class=\"center\">There are no warnings.</div>\n";
+
 9786.      3    }
+
 9787.      6    html += "</div>\n";
+
 9788.      6    html += "</fieldset>\n";
+
 9789.      6
+
 9790.      6// Produce the /*property*/ directive.
+
 9791.      6
+
 9792.      6    html += "<fieldset id=\"JSLINT_REPORT_PROPERTIES\">\n";
+
 9793.      6    html += (
+
 9794.      6        "<legend>Report: Properties ("
+
 9795.      6        + Object.keys(property).length
+
 9796.      6        + ")</legend>\n"
+
 9797.      6    );
+
 9798.      6    html += "<label>\n";
+
 9799.      6    html += "<textarea readonly>";
+
 9800.      6    html += "/*property";
+
 9801.    301    Object.keys(property).sort().forEach(function (key, ii) {
+
 9802.    300        if (ii !== 0) {
+
 9803.    300            html += ",";
+
 9804.    300            length_80 += 2;
+
 9805.    300        }
+
 9806.     42        if (length_80 + key.length >= 80) {
+
 9807.     42            length_80 = 4;
+
 9808.     42            html += "\n   ";
+
 9809.     42        }
+
 9810.    301        html += " " + key;
+
 9811.    301        length_80 += key.length;
+
 9812.    301    });
+
 9813.      6    html += "\n*/\n";
+
 9814.      6    html += "</textarea>\n";
+
 9815.      6    html += "</label>\n";
+
 9816.      6    html += "</fieldset>\n";
+
 9817.      6
+
 9818.      6// Produce the HTML Function Report.
+
 9819.      6// <div class=LEVEL>
+
 9820.      6//     <address>LINE_NUMBER</address>
+
 9821.      6//     <dfn>FUNCTION_NAME_AND_SIGNATURE</dfn>
+
 9822.      6//     <dl>
+
 9823.      6//         <dt>DETAIL</dt>
+
 9824.      6//         <dd>NAMES</dd>
+
 9825.      6//     </dl>
+
 9826.      6// </div>
+
 9827.      6
+
 9828.      6    html += "<fieldset id=\"JSLINT_REPORT_FUNCTIONS\">\n";
+
 9829.      6    html += "<legend>Report: Functions (" + functions.length + ")</legend>\n";
+
 9830.      6    html += "<div>\n";
+
 9831.      2    if (json) {
+
 9832.      2
+
 9833.      2// Bugfix - fix website crashing when linting pure json-object.
+
 9834.      2// return (
+
 9835.      2
+
 9836.      2        html += (
+
 9837.      2            warnings.length === 0
+
 9838.      2            ? "<div class=\"center\">JSON: good.</div>\n"
+
 9839.      2            : "<div class=\"center\">JSON: bad.</div>\n"
+
 9840.      2        );
+
 9841.      4    } else if (functions.length === 0) {
+
 9842.      4        html += "<div class=\"center\">There are no functions.</div>\n";
+
 9843.      4    }
+
 9844.      6    exports = Object.keys(exports).sort();
+
 9845.      6    froms.sort();
+
 9846.      6    global = Object.keys(global.context).sort();
+
 9847.      6    module = (
+
 9848.      6        module
+
 9849.      1        ? "module"
+
 9850.      5        : "global"
+
 9851.      6    );
+
 9852.      3    if (global.length + froms.length + exports.length > 0) {
+
 9853.      3        if (functions.length === 0) {
+
 9854.      3            html += "<br>\n";
+
 9855.      3        }
+
 9856.      3        html += "<div class=\"level level0\">\n";
+
 9857.      3        html += detail(module, global);
+
 9858.      3        html += detail("import from", froms);
+
 9859.      3        html += detail("export", exports);
+
 9860.      3        html += "</div>\n";
+
 9861.      3    }
+
 9862.    321    functions.forEach(function (the_function) {
+
 9863.    321        let {
+
 9864.    321            context,
+
 9865.    321            from,
+
 9866.    321            id,
+
 9867.    321            level,
+
 9868.    321            line,
+
 9869.    321            name,
+
 9870.    321
+
 9871.    321// Bugfix - fix html-report from crashing if parameters is undefined.
+
 9872.    321
+
 9873.    321            parameters = [],
+
 9874.    321            signature
+
 9875.    321        } = the_function;
+
 9876.    321        let list = Object.keys(context);
+
 9877.    321        let params;
+
 9878.    321        html += (
+
 9879.    321            "<div class=\"level level" + htmlEscape(level) + "\">"
+
 9880.    321            + address(line, from + 1)
+
 9881.    321            + "<dfn>"
+
 9882.    321            + (
+
 9883.    321                id === "=>"
+
 9884.      1                ? (
+
 9885.      1                    "\u00ab" + htmlEscape(name) + "\u00bb"
+
 9886.      1                    + htmlEscape(signature)
+
 9887.      1                    + " =>"
+
 9888.      1                )
+
 9889.    320                : (
+
 9890.    320                    typeof name === "string"
+
 9891.    320                    ? "\u00ab" + htmlEscape(name) + "\u00bb"
+
 9892.    320                    : htmlEscape(name.id)
+
 9893.    320                ) + htmlEscape(signature)
+
 9894.    321            )
+
 9895.    321            + "</dfn>"
+
 9896.    321        );
+
 9897.    321        params = [];
+
 9898.    470        parameters.forEach(function extract({
+
 9899.    470            id,
+
 9900.    470            names
+
 9901.    470        }) {
+
 9902.    470            switch (id) {
+
 9903.      6            case "[":
+
 9904.     42            case "{":
+
 9905.     42
+
 9906.     42// Recurse extract().
+
 9907.     42
+
 9908.     42                names.forEach(extract);
+
 9909.     42                break;
+
 9910.      4            case "ignore":
+
 9911.      4                break;
+
 9912.    424            default:
+
 9913.    424                params.push(id);
+
 9914.    470            }
+
 9915.    470        });
+
 9916.    321        html += detail("parameter", params.sort());
+
 9917.    321        list.sort();
+
 9918.   2203        html += detail("variable", list.filter(function (id) {
+
 9919.   2203            return (
+
 9920.   2203                context[id].role === "variable"
+
 9921.   1693                && context[id].parent === the_function
+
 9922.   2203            );
+
 9923.   2203        }));
+
 9924.   2203        html += detail("exception", list.filter(function (id) {
+
 9925.   2203            return context[id].role === "exception";
+
 9926.   2203        }));
+
 9927.   2203        html += detail("closure", list.filter(function (id) {
+
 9928.   2203            return (
+
 9929.   2203                context[id].closure === true
+
 9930.   1494                && context[id].parent === the_function
+
 9931.   2203            );
+
 9932.   2203        }));
+
 9933.   2203        html += detail("outer", list.filter(function (id) {
+
 9934.   2203            return (
+
 9935.   2203                context[id].parent !== the_function
+
 9936.   1190                && context[id].parent.id !== "(global)"
+
 9937.   2203            );
+
 9938.   2203        }));
+
 9939.   2203        html += detail(module, list.filter(function (id) {
+
 9940.   2203            return context[id].parent.id === "(global)";
+
 9941.   2203        }));
+
 9942.   2203        html += detail("label", list.filter(function (id) {
+
 9943.   2203            return context[id].role === "label";
+
 9944.   2203        }));
+
 9945.    321        html += "</div>\n";
+
 9946.    321    });
+
 9947.      6    html += "</div>\n";
+
 9948.      6    html += "</fieldset>\n";
+
 9949.      6    return html;
+
 9950.      6}
+
 9951.      1
+
 9952.     10async function jstestDescribe(description, testFunction) {
+
 9953.     10
+
 9954.     10// This function will create-and-run test-group <testFunction>
+
 9955.     10// with given <description>.
 9956.     10
-
 9957.     10// PR-457 - Wait awhile for imports to initialize.
-
 9958.     10
-
 9959.     10    await new Promise(function (resolve) {
-
 9960.     10        setTimeout(resolve);
-
 9961.     10    });
+
 9957.     10    let message;
+
 9958.     10    let result;
+
 9959.     10    let timerTimeout;
+
 9960.     10
+
 9961.     10// Init jstestTimeStart.
 9962.     10
-
 9963.     10// Init jstestItList.
-
 9964.     10
-
 9965.     10    jstestItList = [];
-
 9966.     10    testFunction();
+
 9963.      1    if (jstestTimeStart === undefined) {
+
 9964.      1        jstestTimeStart = jstestTimeStart || Date.now();
+
 9965.      1        process.on("exit", jstestOnExit);
+
 9966.      1    }
 9967.     10
-
 9968.     10// Wait for jstestItList to resolve.
+
 9968.     10// PR-457 - Wait awhile for imports to initialize.
 9969.     10
-
 9970.     10    timerTimeout = setTimeout(noop, 0x7fffffff);
-
 9971.     10    result = await Promise.all(jstestItList);
-
 9972.     10    clearTimeout(timerTimeout);
+
 9970.     10    await new Promise(function (resolve) {
+
 9971.     10        setTimeout(resolve);
+
 9972.     10    });
 9973.     10
-
 9974.     10// Print test results.
+
 9974.     10// Init jstestItList.
 9975.     10
-
 9976.     10    message = (
-
 9977.     10        "\n  " + (Date.now() - jstestTimeStart) + "ms"
-
 9978.     10        + " - test describe - " + description + "\n"
-
 9979.     66        + result.map(function ([
-
 9980.     66            err, description, mode
-
 9981.     66        ]) {
-
 9982.     66            jstestItCount += 1;
-
 9983.      1            if (err) {
-
 9984.      1                jstestCountFailed += 1;
-
 9985.      1                err = (
-
 9986.      1                    "    \u001b[31m\u2718 " + jstestItCount + ". test it - "
-
 9987.      1                    + description + "\n" + err.stack + "\u001b[39m"
-
 9988.      1                );
-
 9989.      1                if (mode === "pass") {
-
 9990.      1                    jstestCountFailed -= 1;
-
 9991.      1                    err = "";
-
 9992.      1                }
-
 9993.      1            }
-
 9994.     66            return err || (
-
 9995.     66                "    \u001b[32m\u2714 " + jstestItCount + ". test it - "
-
 9996.     66                + description + "\u001b[39m"
-
 9997.     66            );
-
 9998.     66        }).join("\n")
-
 9999.     10    );
-
10000.     10    console.error(message);
-
10001.     10}
-
10002.      1
-
10003.     66function jstestIt(description, testFunction, mode) {
-
10004.     66
-
10005.     66// This function will create-and-run test-case <testFunction>
-
10006.     66// inside current test-group with given <description>.
-
10007.     66
-
10008.     66    jstestCountTotal += 1;
-
10009.     66    jstestItList.push(new Promise(async function (resolve) {
-
10010.     66        let err;
-
10011.     66        try {
-
10012.     65            await testFunction();
-
10013.     65        } catch (errCaught) {
-
10014.      1            err = errCaught;
-
10015.      1        }
-
10016.     66        resolve([err, description, mode]);
-
10017.     66    }));
-
10018.     66}
-
10019.      1
-
10020.      2function jstestOnExit(exitCode, mode) {
-
10021.      2
-
10022.      2// This function will on process-exit, print test-report
-
10023.      2// and exit with non-zero exit-code if any test failed.
-
10024.      2
-
10025.      2    let message = (
-
10026.      2        (
-
10027.      2            (jstestCountFailed || mode === "testsFailed")
-
10028.      1            ? "\n\u001b[31m"
-
10029.      1            : "\n\u001b[32m"
-
10030.      2        )
-
10031.      2        + "  tests total  - " + jstestCountTotal + "\n"
-
10032.      2        + "  tests failed - " + jstestCountFailed + "\n"
-
10033.      2        + "\n"
-
10034.      2        + "  time finished - "
-
10035.      2        + Number(Date.now() - jstestTimeStart).toLocaleString()
-
10036.      2        + " ms\n"
-
10037.      2        + "\u001b[39m"
-
10038.      2    );
-
10039.      1    if (mode !== "testsFailed") {
-
10040.      1        console.error(message);
-
10041.      1    }
-
10042.      2    process.exitCode = exitCode || jstestCountFailed;
-
10043.      2    return message;
-
10044.      2}
-
10045.      1
-
10046.    107async function moduleFsInit() {
-
10047.    107
-
10048.    107// This function will import nodejs builtin-modules if they have not yet been
-
10049.    107// imported.
-
10050.    107
-
10051.    107// State 3 - Modules already imported.
-
10052.    107
-
10053.    104    if (moduleFs !== undefined) {
-
10054.    104        return;
-
10055.    104    }
-
10056.      3
-
10057.      3// State 2 - Wait while modules are importing.
-
10058.      3
-
10059.      3    if (moduleFsInitResolveList !== undefined) {
-
10060.      2        return new Promise(function (resolve) {
-
10061.      2            moduleFsInitResolveList.push(resolve);
-
10062.      2        });
-
10063.      2    }
-
10064.      1
-
10065.      1// State 1 - Start importing modules.
-
10066.      1
-
10067.      1    moduleFsInitResolveList = [];
-
10068.      1    [
-
10069.      1        moduleChildProcess,
-
10070.      1        moduleFs,
-
10071.      1        modulePath,
-
10072.      1        moduleUrl
-
10073.      1    ] = await Promise.all([
-
10074.      1        import("child_process"),
-
10075.      1        import("fs"),
-
10076.      1        import("path"),
-
10077.      1        import("url")
-
10078.      1    ]);
-
10079.      2    while (moduleFsInitResolveList.length > 0) {
-
10080.      2        moduleFsInitResolveList.shift()();
-
10081.      2    }
-
10082.    107}
-
10083.      1
-
10084.   2728function noop(val) {
-
10085.   2728
-
10086.   2728// This function will do nothing except return <val>.
-
10087.   2728
-
10088.   2728    return val;
-
10089.   2728}
-
10090.      1
-
10091.  12919function objectDeepCopyWithKeysSorted(obj) {
-
10092.  12919
-
10093.  12919// This function will recursively deep-copy <obj> with keys sorted.
-
10094.  12919
-
10095.  12919    let sorted;
-
10096.   8995    if (typeof obj !== "object" || !obj) {
-
10097.   8995        return obj;
-
10098.   8995    }
-
10099.   3924
-
10100.   3924// Recursively deep-copy list with child-keys sorted.
-
10101.   3924
-
10102.   3924    if (Array.isArray(obj)) {
-
10103.   1338        return obj.map(objectDeepCopyWithKeysSorted);
-
10104.   2586    }
-
10105.   2586
-
10106.   2586// Recursively deep-copy obj with keys sorted.
-
10107.   2586
-
10108.   2586    sorted = Object.create(null);
-
10109.   7457    Object.keys(obj).sort().forEach(function (key) {
-
10110.   7457        sorted[key] = objectDeepCopyWithKeysSorted(obj[key]);
-
10111.   7457    });
-
10112.   2586    return sorted;
-
10113.   2586}
-
10114.      1
-
10115.   2783function object_assign_from_list(dict, list, val) {
-
10116.   2783
-
10117.   2783// Assign each property-name from <list> to <dict>.
-
10118.   2783
-
10119.  89614    list.forEach(function (key) {
-
10120.  89614        dict[key] = val;
-
10121.  89614    });
-
10122.   2783    return dict;
-
10123.   2783}
-
10124.      1
-
10125.     97function v8CoverageListMerge(processCovs) {
-
10126.     97
-
10127.     97// This function is derived from MIT Licensed v8-coverage at
-
10128.     97// https://github.com/demurgos/v8-coverage/tree/master/ts
-
10129.     97// https://github.com/demurgos/v8-coverage/blob/master/ts/LICENSE.md
-
10130.     97//
-
10131.     97// Merges a list of v8 process coverages.
-
10132.     97// The result is normalized.
-
10133.     97// The input values may be mutated, it is not safe to use them after passing
-
10134.     97// them to this function.
-
10135.     97// The computation is synchronous.
-
10136.     97// @param processCovs Process coverages to merge.
-
10137.     97// @return Merged process coverage.
-
10138.     97
-
10139.     97    let resultMerged = [];      // List of merged scripts from processCovs.
-
10140.     97    let urlToScriptDict = new Map();    // Map scriptCov.url to scriptCovs.
-
10141.     97
-
10142.   1094    function compareRangeList(aa, bb) {
-
10143.   1094
-
10144.   1094// Compares two range coverages.
-
10145.   1094// The ranges are first ordered by ascending `startOffset` and then by
-
10146.   1094// descending `endOffset`.
-
10147.   1094// This corresponds to a pre-order tree traversal.
-
10148.   1094
-
10149.   1065        if (aa.startOffset !== bb.startOffset) {
-
10150.   1065            return aa.startOffset - bb.startOffset;
-
10151.   1065        }
-
10152.     29        return bb.endOffset - aa.endOffset;
-
10153.     29    }
-
10154.     97
-
10155.   1707    function dictKeyValueAppend(dict, key, val) {
-
10156.   1707
-
10157.   1707// This function will append <val> to list <dict>[<key>].
-
10158.   1707
-
10159.   1707        let list = dict.get(key);
-
10160.   1165        if (list === undefined) {
-
10161.   1165            list = [];
-
10162.   1165            dict.set(key, list);
-
10163.   1165        }
-
10164.   1707        list.push(val);
-
10165.   1707    }
-
10166.     97
-
10167.    384    function mergeTreeList(parentTrees) {
-
10168.    384
-
10169.    384// This function will return RangeTree object with <parentTrees> merged into
-
10170.    384// property-children.
-
10171.    384// @precondition Same `start` and `end` for all the parentTrees
-
10172.    384
-
10173.    119        if (parentTrees.length <= 1) {
-
10174.    119            return parentTrees[0];
-
10175.    265        }
-
10176.    265
-
10177.    265// new RangeTree().
-
10178.    265
-
10179.    265        return {
-
10180.    265
-
10181.    265// Merge parentTrees into property-children.
-
10182.    265
-
10183.    265            children: mergeTreeListToChildren(parentTrees),
-
10184.    669            delta: parentTrees.reduce(function (aa, bb) {
-
10185.    669                return aa + bb.delta;
-
10186.    669            }, 0),
-
10187.    265            end: parentTrees[0].end,
-
10188.    265            start: parentTrees[0].start
-
10189.    265        };
-
10190.    265    }
-
10191.     97
-
10192.    265    function mergeTreeListToChildren(parentTrees) {
+
 9976.     10    jstestItList = [];
+
 9977.     10    testFunction();
+
 9978.     10
+
 9979.     10// Wait for jstestItList to resolve.
+
 9980.     10
+
 9981.     10    timerTimeout = setTimeout(noop, 0x7fffffff);
+
 9982.     10    result = await Promise.all(jstestItList);
+
 9983.     10    clearTimeout(timerTimeout);
+
 9984.     10
+
 9985.     10// Print test results.
+
 9986.     10
+
 9987.     10    message = (
+
 9988.     10        "\n  " + (Date.now() - jstestTimeStart) + "ms"
+
 9989.     10        + " - test describe - " + description + "\n"
+
 9990.     66        + result.map(function ([
+
 9991.     66            err, description, mode
+
 9992.     66        ]) {
+
 9993.     66            jstestItCount += 1;
+
 9994.      1            if (err) {
+
 9995.      1                jstestCountFailed += 1;
+
 9996.      1                err = (
+
 9997.      1                    "    \u001b[31m\u2718 " + jstestItCount + ". test it - "
+
 9998.      1                    + description + "\n" + err.stack + "\u001b[39m"
+
 9999.      1                );
+
10000.      1                if (mode === "pass") {
+
10001.      1                    jstestCountFailed -= 1;
+
10002.      1                    err = "";
+
10003.      1                }
+
10004.      1            }
+
10005.     66            return err || (
+
10006.     66                "    \u001b[32m\u2714 " + jstestItCount + ". test it - "
+
10007.     66                + description + "\u001b[39m"
+
10008.     66            );
+
10009.     66        }).join("\n")
+
10010.     10    );
+
10011.     10    console.error(message);
+
10012.     10}
+
10013.      1
+
10014.     66function jstestIt(description, testFunction, mode) {
+
10015.     66
+
10016.     66// This function will create-and-run test-case <testFunction>
+
10017.     66// inside current test-group with given <description>.
+
10018.     66
+
10019.     66    jstestCountTotal += 1;
+
10020.     66    jstestItList.push(new Promise(async function (resolve) {
+
10021.     66        let err;
+
10022.     66        try {
+
10023.     65            await testFunction();
+
10024.     65        } catch (errCaught) {
+
10025.      1            err = errCaught;
+
10026.      1        }
+
10027.     66        resolve([err, description, mode]);
+
10028.     66    }));
+
10029.     66}
+
10030.      1
+
10031.      2function jstestOnExit(exitCode, mode) {
+
10032.      2
+
10033.      2// This function will on process-exit, print test-report
+
10034.      2// and exit with non-zero exit-code if any test failed.
+
10035.      2
+
10036.      2    let message = (
+
10037.      2        (
+
10038.      2            (jstestCountFailed || mode === "testsFailed")
+
10039.      1            ? "\n\u001b[31m"
+
10040.      1            : "\n\u001b[32m"
+
10041.      2        )
+
10042.      2        + "  tests total  - " + jstestCountTotal + "\n"
+
10043.      2        + "  tests failed - " + jstestCountFailed + "\n"
+
10044.      2        + "\n"
+
10045.      2        + "  time finished - "
+
10046.      2        + Number(Date.now() - jstestTimeStart).toLocaleString()
+
10047.      2        + " ms\n"
+
10048.      2        + "\u001b[39m"
+
10049.      2    );
+
10050.      1    if (mode !== "testsFailed") {
+
10051.      1        console.error(message);
+
10052.      1    }
+
10053.      2    process.exitCode = exitCode || jstestCountFailed;
+
10054.      2    return message;
+
10055.      2}
+
10056.      1
+
10057.    107async function moduleFsInit() {
+
10058.    107
+
10059.    107// This function will import nodejs builtin-modules if they have not yet been
+
10060.    107// imported.
+
10061.    107
+
10062.    107// State 3 - Modules already imported.
+
10063.    107
+
10064.    104    if (moduleFs !== undefined) {
+
10065.    104        return;
+
10066.    104    }
+
10067.      3
+
10068.      3// State 2 - Wait while modules are importing.
+
10069.      3
+
10070.      3    if (moduleFsInitResolveList !== undefined) {
+
10071.      2        return new Promise(function (resolve) {
+
10072.      2            moduleFsInitResolveList.push(resolve);
+
10073.      2        });
+
10074.      2    }
+
10075.      1
+
10076.      1// State 1 - Start importing modules.
+
10077.      1
+
10078.      1    moduleFsInitResolveList = [];
+
10079.      1    [
+
10080.      1        moduleChildProcess,
+
10081.      1        moduleFs,
+
10082.      1        modulePath,
+
10083.      1        moduleUrl
+
10084.      1    ] = await Promise.all([
+
10085.      1        import("child_process"),
+
10086.      1        import("fs"),
+
10087.      1        import("path"),
+
10088.      1        import("url")
+
10089.      1    ]);
+
10090.      2    while (moduleFsInitResolveList.length > 0) {
+
10091.      2        moduleFsInitResolveList.shift()();
+
10092.      2    }
+
10093.    107}
+
10094.      1
+
10095.   2728function noop(val) {
+
10096.   2728
+
10097.   2728// This function will do nothing except return <val>.
+
10098.   2728
+
10099.   2728    return val;
+
10100.   2728}
+
10101.      1
+
10102.  12919function objectDeepCopyWithKeysSorted(obj) {
+
10103.  12919
+
10104.  12919// This function will recursively deep-copy <obj> with keys sorted.
+
10105.  12919
+
10106.  12919    let sorted;
+
10107.   8995    if (typeof obj !== "object" || !obj) {
+
10108.   8995        return obj;
+
10109.   8995    }
+
10110.   3924
+
10111.   3924// Recursively deep-copy list with child-keys sorted.
+
10112.   3924
+
10113.   3924    if (Array.isArray(obj)) {
+
10114.   1338        return obj.map(objectDeepCopyWithKeysSorted);
+
10115.   2586    }
+
10116.   2586
+
10117.   2586// Recursively deep-copy obj with keys sorted.
+
10118.   2586
+
10119.   2586    sorted = Object.create(null);
+
10120.   7457    Object.keys(obj).sort().forEach(function (key) {
+
10121.   7457        sorted[key] = objectDeepCopyWithKeysSorted(obj[key]);
+
10122.   7457    });
+
10123.   2586    return sorted;
+
10124.   2586}
+
10125.      1
+
10126.   2791function object_assign_from_list(dict, list, val) {
+
10127.   2791
+
10128.   2791// Assign each property-name from <list> to <dict>.
+
10129.   2791
+
10130.  89862    list.forEach(function (key) {
+
10131.  89862        dict[key] = val;
+
10132.  89862    });
+
10133.   2791    return dict;
+
10134.   2791}
+
10135.      1
+
10136.     97function v8CoverageListMerge(processCovs) {
+
10137.     97
+
10138.     97// This function is derived from MIT Licensed v8-coverage at
+
10139.     97// https://github.com/demurgos/v8-coverage/tree/master/ts
+
10140.     97// https://github.com/demurgos/v8-coverage/blob/master/ts/LICENSE.md
+
10141.     97//
+
10142.     97// Merges a list of v8 process coverages.
+
10143.     97// The result is normalized.
+
10144.     97// The input values may be mutated, it is not safe to use them after passing
+
10145.     97// them to this function.
+
10146.     97// The computation is synchronous.
+
10147.     97// @param processCovs Process coverages to merge.
+
10148.     97// @return Merged process coverage.
+
10149.     97
+
10150.     97    let resultMerged = [];      // List of merged scripts from processCovs.
+
10151.     97    let urlToScriptDict = new Map();    // Map scriptCov.url to scriptCovs.
+
10152.     97
+
10153.   1094    function compareRangeList(aa, bb) {
+
10154.   1094
+
10155.   1094// Compares two range coverages.
+
10156.   1094// The ranges are first ordered by ascending `startOffset` and then by
+
10157.   1094// descending `endOffset`.
+
10158.   1094// This corresponds to a pre-order tree traversal.
+
10159.   1094
+
10160.   1065        if (aa.startOffset !== bb.startOffset) {
+
10161.   1065            return aa.startOffset - bb.startOffset;
+
10162.   1065        }
+
10163.     29        return bb.endOffset - aa.endOffset;
+
10164.     29    }
+
10165.     97
+
10166.   1707    function dictKeyValueAppend(dict, key, val) {
+
10167.   1707
+
10168.   1707// This function will append <val> to list <dict>[<key>].
+
10169.   1707
+
10170.   1707        let list = dict.get(key);
+
10171.   1165        if (list === undefined) {
+
10172.   1165            list = [];
+
10173.   1165            dict.set(key, list);
+
10174.   1165        }
+
10175.   1707        list.push(val);
+
10176.   1707    }
+
10177.     97
+
10178.    384    function mergeTreeList(parentTrees) {
+
10179.    384
+
10180.    384// This function will return RangeTree object with <parentTrees> merged into
+
10181.    384// property-children.
+
10182.    384// @precondition Same `start` and `end` for all the parentTrees
+
10183.    384
+
10184.    119        if (parentTrees.length <= 1) {
+
10185.    119            return parentTrees[0];
+
10186.    265        }
+
10187.    265
+
10188.    265// new RangeTree().
+
10189.    265
+
10190.    265        return {
+
10191.    265
+
10192.    265// Merge parentTrees into property-children.
10193.    265
-
10194.    265// This function will return <resultChildren> with <parentTrees> merged.
-
10195.    265
-
10196.    265        let openRange;
-
10197.    265        let parentToChildDict = new Map();      // Map parent to child.
-
10198.    265        let queueList;
-
10199.    265        let queueListIi = 0;
-
10200.    265        let queueOffset;
-
10201.    265        let queueTrees;
-
10202.    265        let resultChildren = [];
-
10203.    265        let startToTreeDict = new Map();        // Map tree.start to tree.
-
10204.    639        function nextXxx() {
-
10205.    639
-
10206.    639// Increment nextOffset, nextTrees.
-
10207.    639
-
10208.    639            let [
-
10209.    639                nextOffset, nextTrees
-
10210.    300            ] = queueList[queueListIi] || [];
-
10211.    639            let openRangeEnd;
-
10212.    583            if (queueTrees === undefined) {
-
10213.    583                queueListIi += 1;
-
10214.    583
-
10215.    583// Increment nextOffset, nextTrees.
-
10216.    583
-
10217.    583            } else if (nextOffset === undefined || nextOffset > queueOffset) {
-
10218.     56                nextOffset = queueOffset;
-
10219.     56                nextTrees = queueTrees;
-
10220.     56                queueTrees = undefined;
-
10221.     56
-
10222.     56// Concat queueTrees to nextTrees.
-
10223.     56
-
10224.     56            } else {
-
10225.     56                if (nextOffset === queueOffset) {
-
10226.     56                    queueTrees.forEach(function (tree) {
-
10227.     56                        nextTrees.push(tree);
-
10228.     56                    });
-
10229.     56                    queueTrees = undefined;
-
10230.     56                }
-
10231.     56                queueListIi += 1;
-
10232.     56            }
-
10233.    639
-
10234.    639// Reached end of queueList.
-
10235.    639
-
10236.    265            if (nextOffset === undefined) {
-
10237.    265                if (openRange !== undefined) {
-
10238.    265
-
10239.    265// Append nested-children from parentToChildDict (within openRange) to
-
10240.    265// resultChildren.
-
10241.    265
-
10242.    265                    resultAppendNextChild();
-
10243.    265                }
-
10244.    265                return true;
-
10245.    374            }
-
10246.    374            if (openRange !== undefined && openRange.end <= nextOffset) {
-
10247.    129
-
10248.    129// Append nested-children from parentToChildDict (within openRange) to
-
10249.    129// resultChildren.
-
10250.    129
-
10251.    129                resultAppendNextChild();
-
10252.    129                openRange = undefined;
-
10253.    374            }
-
10254.    374            if (openRange === undefined) {
-
10255.    292                openRangeEnd = nextOffset + 1;
-
10256.    502                nextTrees.forEach(function ({
-
10257.    502                    parentIi,
-
10258.    502                    tree
-
10259.    502                }) {
-
10260.    502                    openRangeEnd = Math.max(openRangeEnd, tree.end);
-
10261.    502
-
10262.    502// Append children from nextTrees to parentToChildDict.
-
10263.    502
-
10264.    502                    dictKeyValueAppend(parentToChildDict, parentIi, tree);
-
10265.    502                });
-
10266.    292                queueOffset = openRangeEnd;
-
10267.    292                openRange = {
-
10268.    292                    end: openRangeEnd,
-
10269.    292                    start: nextOffset
-
10270.    292                };
-
10271.    292            } else {
-
10272.    114                nextTrees.forEach(function ({
-
10273.    114                    parentIi,
-
10274.    114                    tree
-
10275.    114                }) {
-
10276.    114                    let right;
-
10277.     82                    if (tree.end > openRange.end) {
-
10278.     82                        right = treeSplit(tree, openRange.end);
-
10279.     82                        if (queueTrees === undefined) {
-
10280.     82                            queueTrees = [];
-
10281.     82                        }
-
10282.     82
-
10283.     82// new RangeTreeWithParent().
-
10284.     82
-
10285.     82                        queueTrees.push({
-
10286.     82                            parentIi,
-
10287.     82                            tree: right
-
10288.     82                        });
-
10289.     82                    }
-
10290.    114
-
10291.    114// Append children from nextTrees to parentToChildDict.
-
10292.    114
-
10293.    114                    dictKeyValueAppend(parentToChildDict, parentIi, tree);
-
10294.    114                });
-
10295.     82            }
-
10296.    639        }
-
10297.    292        function resultAppendNextChild() {
-
10298.    292
-
10299.    292// This function will append next child to <resultChildren>.
-
10300.    292
-
10301.    292            let treesMatching = [];
-
10302.    589            parentToChildDict.forEach(function (nested) {
-
10303.    589                if (
-
10304.    589                    nested.length === 1
-
10305.    563                    && nested[0].start === openRange.start
-
10306.    480                    && nested[0].end === openRange.end
-
10307.    468                ) {
-
10308.    468                    treesMatching.push(nested[0]);
-
10309.    468                } else {
-
10310.    121
-
10311.    121// new rangeTreeCreate().
-
10312.    121
-
10313.    121                    treesMatching.push({
-
10314.    121                        children: nested,
-
10315.    121                        delta: 0,
-
10316.    121                        end: openRange.end,
-
10317.    121                        start: openRange.start
-
10318.    121                    });
-
10319.    121                }
-
10320.    589            });
-
10321.    292            parentToChildDict.clear();
-
10322.    292
-
10323.    292// Recurse mergeTreeList().
-
10324.    292
-
10325.    292            resultChildren.push(mergeTreeList(treesMatching));
-
10326.    292        }
-
10327.     75        function treeSplit(tree, offset) {
-
10328.     75
-
10329.     75// This function will split <tree> along <offset> and return the right-side.
-
10330.     75// @precondition `tree.start < offset && offset < tree.end`
-
10331.     75// @return RangeTree Right part
-
10332.     75
-
10333.     75            let child;
-
10334.     75            let ii = 0;
-
10335.     75            let leftChildLen = tree.children.length;
-
10336.     75            let mid;
-
10337.     75            let resultTree;
-
10338.     75            let rightChildren;
+
10194.    265            children: mergeTreeListToChildren(parentTrees),
+
10195.    669            delta: parentTrees.reduce(function (aa, bb) {
+
10196.    669                return aa + bb.delta;
+
10197.    669            }, 0),
+
10198.    265            end: parentTrees[0].end,
+
10199.    265            start: parentTrees[0].start
+
10200.    265        };
+
10201.    265    }
+
10202.     97
+
10203.    265    function mergeTreeListToChildren(parentTrees) {
+
10204.    265
+
10205.    265// This function will return <resultChildren> with <parentTrees> merged.
+
10206.    265
+
10207.    265        let openRange;
+
10208.    265        let parentToChildDict = new Map();      // Map parent to child.
+
10209.    265        let queueList;
+
10210.    265        let queueListIi = 0;
+
10211.    265        let queueOffset;
+
10212.    265        let queueTrees;
+
10213.    265        let resultChildren = [];
+
10214.    265        let startToTreeDict = new Map();        // Map tree.start to tree.
+
10215.    639        function nextXxx() {
+
10216.    639
+
10217.    639// Increment nextOffset, nextTrees.
+
10218.    639
+
10219.    639            let [
+
10220.    639                nextOffset, nextTrees
+
10221.    300            ] = queueList[queueListIi] || [];
+
10222.    639            let openRangeEnd;
+
10223.    583            if (queueTrees === undefined) {
+
10224.    583                queueListIi += 1;
+
10225.    583
+
10226.    583// Increment nextOffset, nextTrees.
+
10227.    583
+
10228.    583            } else if (nextOffset === undefined || nextOffset > queueOffset) {
+
10229.     56                nextOffset = queueOffset;
+
10230.     56                nextTrees = queueTrees;
+
10231.     56                queueTrees = undefined;
+
10232.     56
+
10233.     56// Concat queueTrees to nextTrees.
+
10234.     56
+
10235.     56            } else {
+
10236.     56                if (nextOffset === queueOffset) {
+
10237.     56                    queueTrees.forEach(function (tree) {
+
10238.     56                        nextTrees.push(tree);
+
10239.     56                    });
+
10240.     56                    queueTrees = undefined;
+
10241.     56                }
+
10242.     56                queueListIi += 1;
+
10243.     56            }
+
10244.    639
+
10245.    639// Reached end of queueList.
+
10246.    639
+
10247.    265            if (nextOffset === undefined) {
+
10248.    265                if (openRange !== undefined) {
+
10249.    265
+
10250.    265// Append nested-children from parentToChildDict (within openRange) to
+
10251.    265// resultChildren.
+
10252.    265
+
10253.    265                    resultAppendNextChild();
+
10254.    265                }
+
10255.    265                return true;
+
10256.    374            }
+
10257.    374            if (openRange !== undefined && openRange.end <= nextOffset) {
+
10258.    129
+
10259.    129// Append nested-children from parentToChildDict (within openRange) to
+
10260.    129// resultChildren.
+
10261.    129
+
10262.    129                resultAppendNextChild();
+
10263.    129                openRange = undefined;
+
10264.    374            }
+
10265.    374            if (openRange === undefined) {
+
10266.    292                openRangeEnd = nextOffset + 1;
+
10267.    502                nextTrees.forEach(function ({
+
10268.    502                    parentIi,
+
10269.    502                    tree
+
10270.    502                }) {
+
10271.    502                    openRangeEnd = Math.max(openRangeEnd, tree.end);
+
10272.    502
+
10273.    502// Append children from nextTrees to parentToChildDict.
+
10274.    502
+
10275.    502                    dictKeyValueAppend(parentToChildDict, parentIi, tree);
+
10276.    502                });
+
10277.    292                queueOffset = openRangeEnd;
+
10278.    292                openRange = {
+
10279.    292                    end: openRangeEnd,
+
10280.    292                    start: nextOffset
+
10281.    292                };
+
10282.    292            } else {
+
10283.    114                nextTrees.forEach(function ({
+
10284.    114                    parentIi,
+
10285.    114                    tree
+
10286.    114                }) {
+
10287.    114                    let right;
+
10288.     82                    if (tree.end > openRange.end) {
+
10289.     82                        right = treeSplit(tree, openRange.end);
+
10290.     82                        if (queueTrees === undefined) {
+
10291.     82                            queueTrees = [];
+
10292.     82                        }
+
10293.     82
+
10294.     82// new RangeTreeWithParent().
+
10295.     82
+
10296.     82                        queueTrees.push({
+
10297.     82                            parentIi,
+
10298.     82                            tree: right
+
10299.     82                        });
+
10300.     82                    }
+
10301.    114
+
10302.    114// Append children from nextTrees to parentToChildDict.
+
10303.    114
+
10304.    114                    dictKeyValueAppend(parentToChildDict, parentIi, tree);
+
10305.    114                });
+
10306.     82            }
+
10307.    639        }
+
10308.    292        function resultAppendNextChild() {
+
10309.    292
+
10310.    292// This function will append next child to <resultChildren>.
+
10311.    292
+
10312.    292            let treesMatching = [];
+
10313.    589            parentToChildDict.forEach(function (nested) {
+
10314.    589                if (
+
10315.    589                    nested.length === 1
+
10316.    563                    && nested[0].start === openRange.start
+
10317.    480                    && nested[0].end === openRange.end
+
10318.    468                ) {
+
10319.    468                    treesMatching.push(nested[0]);
+
10320.    468                } else {
+
10321.    121
+
10322.    121// new rangeTreeCreate().
+
10323.    121
+
10324.    121                    treesMatching.push({
+
10325.    121                        children: nested,
+
10326.    121                        delta: 0,
+
10327.    121                        end: openRange.end,
+
10328.    121                        start: openRange.start
+
10329.    121                    });
+
10330.    121                }
+
10331.    589            });
+
10332.    292            parentToChildDict.clear();
+
10333.    292
+
10334.    292// Recurse mergeTreeList().
+
10335.    292
+
10336.    292            resultChildren.push(mergeTreeList(treesMatching));
+
10337.    292        }
+
10338.     75        function treeSplit(tree, offset) {
10339.     75
-
10340.     75// TODO(perf): Binary search (check overhead) //jslint-ignore-line
-
10341.     75
-
10342.     19            while (ii < tree.children.length) {
-
10343.     19                child = tree.children[ii];
-
10344.     19                if (child.start < offset && offset < child.end) {
-
10345.     19
-
10346.     19// Recurse treeSplit().
-
10347.     19
-
10348.     19                    mid = treeSplit(child, offset);
-
10349.     19                    leftChildLen = ii + 1;
-
10350.     19                    break;
-
10351.     19                }
-
10352.     19                if (child.start >= offset) {
-
10353.     19                    leftChildLen = ii;
-
10354.     19                    break;
-
10355.     19                }
-
10356.     19                ii += 1;
-
10357.     19            }
-
10358.     75            rightChildren = tree.children.splice(
-
10359.     75                leftChildLen,
-
10360.     75                tree.children.length - leftChildLen
-
10361.     75            );
-
10362.      4            if (mid !== undefined) {
-
10363.      4                rightChildren.unshift(mid);
-
10364.      4            }
-
10365.     75
-
10366.     75// new rangeTreeCreate().
-
10367.     75
-
10368.     75            resultTree = {
-
10369.     75                children: rightChildren,
-
10370.     75                delta: tree.delta,
-
10371.     75                end: tree.end,
-
10372.     75                start: offset
-
10373.     75            };
-
10374.     75            tree.end = offset;
-
10375.     75            return resultTree;
-
10376.     75        }
-
10377.    265
-
10378.    265// Init startToTreeDict.
-
10379.    265
-
10380.    669        parentTrees.forEach(function (parentTree, parentIi) {
-
10381.    545            parentTree.children.forEach(function (child) {
-
10382.    545
-
10383.    545// Append child with child.start to startToTreeDict.
-
10384.    545
-
10385.    545                dictKeyValueAppend(startToTreeDict, child.start, {
-
10386.    545                    parentIi,
-
10387.    545                    tree: child
-
10388.    545                });
-
10389.    545            });
-
10390.    669        });
-
10391.    265
-
10392.    265// init queueList.
-
10393.    265
-
10394.    335        queueList = Array.from(startToTreeDict).map(function ([
-
10395.    335            startOffset, trees
-
10396.    335        ]) {
-
10397.    335
-
10398.    335// new StartEvent().
-
10399.    335
-
10400.    335            return [
-
10401.    335                startOffset, trees
-
10402.    335            ];
-
10403.    217        }).sort(function (aa, bb) {
-
10404.    217            return aa[0] - bb[0];
-
10405.    217        });
-
10406.    639        while (true) {
-
10407.    639            if (nextXxx()) {
-
10408.    639                break;
-
10409.    639            }
-
10410.    639        }
-
10411.    265        return resultChildren;
-
10412.    265    }
-
10413.     97
-
10414.    689    function sortFunc(funcCov) {
-
10415.    689
-
10416.    689// This function will normalize-and-sort <funcCov>.ranges.
-
10417.    689// Sorts the ranges (pre-order sort).
-
10418.    689// TODO: Tree-based normalization of the ranges. //jslint-ignore-line
-
10419.    689// @param funcCov Function coverage to normalize.
-
10420.    689
-
10421.    689        funcCov.ranges = treeToRanges(treeFromSortedRanges(
-
10422.    689            funcCov.ranges.sort(compareRangeList)
-
10423.    689        ));
-
10424.    689        return funcCov;
-
10425.    689    }
-
10426.     97
-
10427.    129    function sortScript(scriptCov) {
-
10428.    129
-
10429.    129// This function will normalize-and-sort <scriptCov>.functions.
-
10430.    129
-
10431.    129// Normalize-and-sort functions[xxx].ranges.
-
10432.    129
-
10433.    688        scriptCov.functions.forEach(function (funcCov) {
-
10434.    688            sortFunc(funcCov);
-
10435.    688        });
-
10436.    129
-
10437.    129// Sort functions by root range (pre-order sort).
-
10438.    129
-
10439.    559        scriptCov.functions.sort(function (aa, bb) {
-
10440.    559            return compareRangeList(aa.ranges[0], bb.ranges[0]);
-
10441.    559        });
-
10442.    129        return scriptCov;
-
10443.    129    }
-
10444.     97
-
10445.    888    function treeFromSortedRanges(ranges) {
-
10446.    888
-
10447.    888// @precondition `ranges` are well-formed and pre-order sorted
-
10448.    888
-
10449.    888        let root;
-
10450.    888        let stack = [];   // Stack of parent trees and parent counts.
-
10451.   1856        ranges.forEach(function (range) {
-
10452.   1856
-
10453.   1856// new rangeTreeCreate().
-
10454.   1856
-
10455.   1856            let node = {
-
10456.   1856                children: [],
-
10457.   1856                delta: range.count,
-
10458.   1856                end: range.endOffset,
-
10459.   1856                start: range.startOffset
-
10460.   1856            };
-
10461.   1856            let parent;
-
10462.   1856            let parentCount;
-
10463.    888            if (root === undefined) {
-
10464.    888                root = node;
-
10465.    888                stack.push([
-
10466.    888                    node, range.count
-
10467.    888                ]);
-
10468.    888                return;
-
10469.    968            }
-
10470.   1565            while (true) {
-
10471.   1565                [
-
10472.   1565                    parent, parentCount
-
10473.   1565                ] = stack[stack.length - 1];
-
10474.   1565
-
10475.   1565// assert: `top !== undefined` (the ranges are sorted)
-
10476.   1565
-
10477.   1565                if (range.startOffset < parent.end) {
-
10478.   1565                    break;
-
10479.   1565                }
-
10480.   1565                stack.pop();
-
10481.   1565            }
-
10482.    968            node.delta -= parentCount;
-
10483.    968            parent.children.push(node);
-
10484.    968            stack.push([
-
10485.    968                node, range.count
-
10486.    968            ]);
-
10487.    968        });
-
10488.    888        return root;
-
10489.    888    }
-
10490.     97
-
10491.    781    function treeToRanges(tree) {
-
10492.    781
-
10493.    781// Get the range coverages corresponding to the tree.
-
10494.    781// The ranges are pre-order sorted.
-
10495.    781
-
10496.    781        let count;
-
10497.    781        let cur;
-
10498.    781        let ii;
-
10499.    781        let parentCount;
-
10500.    781        let ranges = [];
-
10501.    781        let stack = [           // Stack of parent trees and counts.
-
10502.    781            [
-
10503.    781                tree, 0
-
10504.    781            ]
-
10505.    781        ];
-
10506.   1630        function normalizeRange(tree) {
-
10507.   1630
-
10508.   1630// @internal
-
10509.   1630
-
10510.   1630            let children = [];
-
10511.   1630            let curEnd;
-
10512.   1630            let head;
-
10513.   1630            let tail = [];
-
10514.    849            function endChain() {
-
10515.     18                if (tail.length !== 0) {
-
10516.     18                    head.end = tail[tail.length - 1].end;
-
10517.     18                    tail.forEach(function (tailTree) {
-
10518.     18                        tailTree.children.forEach(function (subChild) {
-
10519.     18                            subChild.delta += tailTree.delta - head.delta;
-
10520.     18                            head.children.push(subChild);
-
10521.     18                        });
-
10522.     18                    });
-
10523.     18                    tail.length = 0;
-
10524.     18                }
-
10525.    849
-
10526.    849// Recurse normalizeRange().
-
10527.    849
-
10528.    849                normalizeRange(head);
-
10529.    849                children.push(head);
-
10530.    849            }
-
10531.    867            tree.children.forEach(function (child) {
-
10532.    432                if (head === undefined) {
-
10533.    432                    head = child;
-
10534.    435                } else if (
-
10535.    435                    child.delta === head.delta && child.start === curEnd
-
10536.    435                ) {
-
10537.    435                    tail.push(child);
-
10538.    435                } else {
-
10539.    435                    endChain();
-
10540.    435                    head = child;
-
10541.    435                }
-
10542.    867                curEnd = child.end;
-
10543.    867            });
-
10544.    432            if (head !== undefined) {
-
10545.    432                endChain();
-
10546.    432            }
-
10547.    238            if (children.length === 1) {
-
10548.    238                if (
-
10549.    238                    children[0].start === tree.start
-
10550.    238                    && children[0].end === tree.end
-
10551.    238                ) {
-
10552.    238                    tree.delta += children[0].delta;
-
10553.    238                    tree.children = children[0].children;
-
10554.    238
-
10555.    238// `.lazyCount` is zero for both (both are after normalization)
-
10556.    238
-
10557.    238                    return;
-
10558.    238                }
-
10559.   1624            }
-
10560.   1624            tree.children = children;
-
10561.   1624        }
-
10562.    781        normalizeRange(tree);
-
10563.   1624        while (stack.length > 0) {
-
10564.   1624            [
-
10565.   1624                cur, parentCount
-
10566.   1624            ] = stack.pop();
-
10567.   1624            count = parentCount + cur.delta;
-
10568.   1624            ranges.push({
-
10569.   1624                count,
-
10570.   1624                endOffset: cur.end,
-
10571.   1624                startOffset: cur.start
-
10572.   1624            });
-
10573.   1624            ii = cur.children.length - 1;
-
10574.   1624            while (ii >= 0) {
-
10575.   1624                stack.push([
-
10576.   1624                    cur.children[ii], count
-
10577.   1624                ]);
-
10578.   1624                ii -= 1;
-
10579.   1624            }
-
10580.   1624        }
-
10581.    781        return ranges;
-
10582.    781    }
-
10583.     97
-
10584.      1    if (processCovs.length === 0) {
-
10585.      1        return {
-
10586.      1            result: []
-
10587.      1        };
-
10588.     96    }
-
10589.     96
-
10590.     96// Init urlToScriptDict.
-
10591.     96
-
10592.    234    processCovs.forEach(function ({
-
10593.    234        result
-
10594.    234    }) {
-
10595.    269        result.forEach(function (scriptCov) {
-
10596.    269            dictKeyValueAppend(urlToScriptDict, scriptCov.url, scriptCov);
-
10597.    269        });
-
10598.    234    });
-
10599.    129    urlToScriptDict.forEach(function (scriptCovs) {
-
10600.    129
-
10601.    129// assert: `scriptCovs.length > 0`
-
10602.    129
-
10603.    129// function mergeScriptList(scriptCovs) {
-
10604.    129// Merges a list of matching script coverages.
-
10605.    129// Scripts are matching if they have the same `url`.
-
10606.    129// The result is normalized.
-
10607.    129// The input values may be mutated, it is not safe to use them after passing
-
10608.    129// them to this function.
-
10609.    129// The computation is synchronous.
-
10610.    129// @param scriptCovs Process coverages to merge.
-
10611.    129// @return Merged script coverage, or `undefined` if the input list was empty.
-
10612.    129
-
10613.    129        let functions = [];
-
10614.    129
-
10615.    129// Map funcCovRoot.startOffset:funcCovRoot.endOffset to funcCov.
-
10616.    129
-
10617.    129        let rangeToFuncDict = new Map();
-
10618.    129
-
10619.    129// Probably deadcode.
-
10620.    129// if (scriptCovs.length === 0) {
-
10621.    129//     return undefined;
-
10622.    129// }
+
10340.     75// This function will split <tree> along <offset> and return the right-side.
+
10341.     75// @precondition `tree.start < offset && offset < tree.end`
+
10342.     75// @return RangeTree Right part
+
10343.     75
+
10344.     75            let child;
+
10345.     75            let ii = 0;
+
10346.     75            let leftChildLen = tree.children.length;
+
10347.     75            let mid;
+
10348.     75            let resultTree;
+
10349.     75            let rightChildren;
+
10350.     75
+
10351.     75// TODO(perf): Binary search (check overhead) //jslint-ignore-line
+
10352.     75
+
10353.     19            while (ii < tree.children.length) {
+
10354.     19                child = tree.children[ii];
+
10355.     19                if (child.start < offset && offset < child.end) {
+
10356.     19
+
10357.     19// Recurse treeSplit().
+
10358.     19
+
10359.     19                    mid = treeSplit(child, offset);
+
10360.     19                    leftChildLen = ii + 1;
+
10361.     19                    break;
+
10362.     19                }
+
10363.     19                if (child.start >= offset) {
+
10364.     19                    leftChildLen = ii;
+
10365.     19                    break;
+
10366.     19                }
+
10367.     19                ii += 1;
+
10368.     19            }
+
10369.     75            rightChildren = tree.children.splice(
+
10370.     75                leftChildLen,
+
10371.     75                tree.children.length - leftChildLen
+
10372.     75            );
+
10373.      4            if (mid !== undefined) {
+
10374.      4                rightChildren.unshift(mid);
+
10375.      4            }
+
10376.     75
+
10377.     75// new rangeTreeCreate().
+
10378.     75
+
10379.     75            resultTree = {
+
10380.     75                children: rightChildren,
+
10381.     75                delta: tree.delta,
+
10382.     75                end: tree.end,
+
10383.     75                start: offset
+
10384.     75            };
+
10385.     75            tree.end = offset;
+
10386.     75            return resultTree;
+
10387.     75        }
+
10388.    265
+
10389.    265// Init startToTreeDict.
+
10390.    265
+
10391.    669        parentTrees.forEach(function (parentTree, parentIi) {
+
10392.    545            parentTree.children.forEach(function (child) {
+
10393.    545
+
10394.    545// Append child with child.start to startToTreeDict.
+
10395.    545
+
10396.    545                dictKeyValueAppend(startToTreeDict, child.start, {
+
10397.    545                    parentIi,
+
10398.    545                    tree: child
+
10399.    545                });
+
10400.    545            });
+
10401.    669        });
+
10402.    265
+
10403.    265// init queueList.
+
10404.    265
+
10405.    335        queueList = Array.from(startToTreeDict).map(function ([
+
10406.    335            startOffset, trees
+
10407.    335        ]) {
+
10408.    335
+
10409.    335// new StartEvent().
+
10410.    335
+
10411.    335            return [
+
10412.    335                startOffset, trees
+
10413.    335            ];
+
10414.    217        }).sort(function (aa, bb) {
+
10415.    217            return aa[0] - bb[0];
+
10416.    217        });
+
10417.    639        while (true) {
+
10418.    639            if (nextXxx()) {
+
10419.    639                break;
+
10420.    639            }
+
10421.    639        }
+
10422.    265        return resultChildren;
+
10423.    265    }
+
10424.     97
+
10425.    689    function sortFunc(funcCov) {
+
10426.    689
+
10427.    689// This function will normalize-and-sort <funcCov>.ranges.
+
10428.    689// Sorts the ranges (pre-order sort).
+
10429.    689// TODO: Tree-based normalization of the ranges. //jslint-ignore-line
+
10430.    689// @param funcCov Function coverage to normalize.
+
10431.    689
+
10432.    689        funcCov.ranges = treeToRanges(treeFromSortedRanges(
+
10433.    689            funcCov.ranges.sort(compareRangeList)
+
10434.    689        ));
+
10435.    689        return funcCov;
+
10436.    689    }
+
10437.     97
+
10438.    129    function sortScript(scriptCov) {
+
10439.    129
+
10440.    129// This function will normalize-and-sort <scriptCov>.functions.
+
10441.    129
+
10442.    129// Normalize-and-sort functions[xxx].ranges.
+
10443.    129
+
10444.    688        scriptCov.functions.forEach(function (funcCov) {
+
10445.    688            sortFunc(funcCov);
+
10446.    688        });
+
10447.    129
+
10448.    129// Sort functions by root range (pre-order sort).
+
10449.    129
+
10450.    559        scriptCov.functions.sort(function (aa, bb) {
+
10451.    559            return compareRangeList(aa.ranges[0], bb.ranges[0]);
+
10452.    559        });
+
10453.    129        return scriptCov;
+
10454.    129    }
+
10455.     97
+
10456.    888    function treeFromSortedRanges(ranges) {
+
10457.    888
+
10458.    888// @precondition `ranges` are well-formed and pre-order sorted
+
10459.    888
+
10460.    888        let root;
+
10461.    888        let stack = [];   // Stack of parent trees and parent counts.
+
10462.   1856        ranges.forEach(function (range) {
+
10463.   1856
+
10464.   1856// new rangeTreeCreate().
+
10465.   1856
+
10466.   1856            let node = {
+
10467.   1856                children: [],
+
10468.   1856                delta: range.count,
+
10469.   1856                end: range.endOffset,
+
10470.   1856                start: range.startOffset
+
10471.   1856            };
+
10472.   1856            let parent;
+
10473.   1856            let parentCount;
+
10474.    888            if (root === undefined) {
+
10475.    888                root = node;
+
10476.    888                stack.push([
+
10477.    888                    node, range.count
+
10478.    888                ]);
+
10479.    888                return;
+
10480.    968            }
+
10481.   1565            while (true) {
+
10482.   1565                [
+
10483.   1565                    parent, parentCount
+
10484.   1565                ] = stack[stack.length - 1];
+
10485.   1565
+
10486.   1565// assert: `top !== undefined` (the ranges are sorted)
+
10487.   1565
+
10488.   1565                if (range.startOffset < parent.end) {
+
10489.   1565                    break;
+
10490.   1565                }
+
10491.   1565                stack.pop();
+
10492.   1565            }
+
10493.    968            node.delta -= parentCount;
+
10494.    968            parent.children.push(node);
+
10495.    968            stack.push([
+
10496.    968                node, range.count
+
10497.    968            ]);
+
10498.    968        });
+
10499.    888        return root;
+
10500.    888    }
+
10501.     97
+
10502.    781    function treeToRanges(tree) {
+
10503.    781
+
10504.    781// Get the range coverages corresponding to the tree.
+
10505.    781// The ranges are pre-order sorted.
+
10506.    781
+
10507.    781        let count;
+
10508.    781        let cur;
+
10509.    781        let ii;
+
10510.    781        let parentCount;
+
10511.    781        let ranges = [];
+
10512.    781        let stack = [           // Stack of parent trees and counts.
+
10513.    781            [
+
10514.    781                tree, 0
+
10515.    781            ]
+
10516.    781        ];
+
10517.   1630        function normalizeRange(tree) {
+
10518.   1630
+
10519.   1630// @internal
+
10520.   1630
+
10521.   1630            let children = [];
+
10522.   1630            let curEnd;
+
10523.   1630            let head;
+
10524.   1630            let tail = [];
+
10525.    849            function endChain() {
+
10526.     18                if (tail.length !== 0) {
+
10527.     18                    head.end = tail[tail.length - 1].end;
+
10528.     18                    tail.forEach(function (tailTree) {
+
10529.     18                        tailTree.children.forEach(function (subChild) {
+
10530.     18                            subChild.delta += tailTree.delta - head.delta;
+
10531.     18                            head.children.push(subChild);
+
10532.     18                        });
+
10533.     18                    });
+
10534.     18                    tail.length = 0;
+
10535.     18                }
+
10536.    849
+
10537.    849// Recurse normalizeRange().
+
10538.    849
+
10539.    849                normalizeRange(head);
+
10540.    849                children.push(head);
+
10541.    849            }
+
10542.    867            tree.children.forEach(function (child) {
+
10543.    432                if (head === undefined) {
+
10544.    432                    head = child;
+
10545.    435                } else if (
+
10546.    435                    child.delta === head.delta && child.start === curEnd
+
10547.    435                ) {
+
10548.    435                    tail.push(child);
+
10549.    435                } else {
+
10550.    435                    endChain();
+
10551.    435                    head = child;
+
10552.    435                }
+
10553.    867                curEnd = child.end;
+
10554.    867            });
+
10555.    432            if (head !== undefined) {
+
10556.    432                endChain();
+
10557.    432            }
+
10558.    238            if (children.length === 1) {
+
10559.    238                if (
+
10560.    238                    children[0].start === tree.start
+
10561.    238                    && children[0].end === tree.end
+
10562.    238                ) {
+
10563.    238                    tree.delta += children[0].delta;
+
10564.    238                    tree.children = children[0].children;
+
10565.    238
+
10566.    238// `.lazyCount` is zero for both (both are after normalization)
+
10567.    238
+
10568.    238                    return;
+
10569.    238                }
+
10570.   1624            }
+
10571.   1624            tree.children = children;
+
10572.   1624        }
+
10573.    781        normalizeRange(tree);
+
10574.   1624        while (stack.length > 0) {
+
10575.   1624            [
+
10576.   1624                cur, parentCount
+
10577.   1624            ] = stack.pop();
+
10578.   1624            count = parentCount + cur.delta;
+
10579.   1624            ranges.push({
+
10580.   1624                count,
+
10581.   1624                endOffset: cur.end,
+
10582.   1624                startOffset: cur.start
+
10583.   1624            });
+
10584.   1624            ii = cur.children.length - 1;
+
10585.   1624            while (ii >= 0) {
+
10586.   1624                stack.push([
+
10587.   1624                    cur.children[ii], count
+
10588.   1624                ]);
+
10589.   1624                ii -= 1;
+
10590.   1624            }
+
10591.   1624        }
+
10592.    781        return ranges;
+
10593.    781    }
+
10594.     97
+
10595.      1    if (processCovs.length === 0) {
+
10596.      1        return {
+
10597.      1            result: []
+
10598.      1        };
+
10599.     96    }
+
10600.     96
+
10601.     96// Init urlToScriptDict.
+
10602.     96
+
10603.    234    processCovs.forEach(function ({
+
10604.    234        result
+
10605.    234    }) {
+
10606.    269        result.forEach(function (scriptCov) {
+
10607.    269            dictKeyValueAppend(urlToScriptDict, scriptCov.url, scriptCov);
+
10608.    269        });
+
10609.    234    });
+
10610.    129    urlToScriptDict.forEach(function (scriptCovs) {
+
10611.    129
+
10612.    129// assert: `scriptCovs.length > 0`
+
10613.    129
+
10614.    129// function mergeScriptList(scriptCovs) {
+
10615.    129// Merges a list of matching script coverages.
+
10616.    129// Scripts are matching if they have the same `url`.
+
10617.    129// The result is normalized.
+
10618.    129// The input values may be mutated, it is not safe to use them after passing
+
10619.    129// them to this function.
+
10620.    129// The computation is synchronous.
+
10621.    129// @param scriptCovs Process coverages to merge.
+
10622.    129// @return Merged script coverage, or `undefined` if the input list was empty.
10623.    129
-
10624.     96        if (scriptCovs.length === 1) {
-
10625.     96            resultMerged.push(sortScript(scriptCovs[0]));
-
10626.     96            return;
-
10627.     96        }
-
10628.     96
-
10629.     96// Init rangeToFuncDict.
-
10630.     96// Map funcCovRoot.startOffset:funcCovRoot.endOffset to funcCov.
-
10631.     96
-
10632.    226        scriptCovs.forEach(function ({
-
10633.    226            functions
-
10634.    226        }) {
-
10635.    277            functions.forEach(function (funcCov) {
-
10636.    277                dictKeyValueAppend(
-
10637.    277                    rangeToFuncDict,
-
10638.    277
-
10639.    277// This string can be used to match function with same root range.
-
10640.    277// The string is derived from the start and end offsets of the root range of
-
10641.    277// the function.
-
10642.    277// This assumes that `ranges` is non-empty (true for valid function coverages).
-
10643.    277
-
10644.    277                    (
-
10645.    277                        funcCov.ranges[0].startOffset
-
10646.    277                        + ";" + funcCov.ranges[0].endOffset
-
10647.    277                    ),
-
10648.    277                    funcCov
-
10649.    277                );
-
10650.    277            });
-
10651.    226        });
-
10652.    112        rangeToFuncDict.forEach(function (funcCovs) {
-
10653.    112
-
10654.    112// assert: `funcCovs.length > 0`
-
10655.    112
-
10656.    112// function mergeFuncList(funcCovs) {
-
10657.    112// Merges a list of matching function coverages.
-
10658.    112// Functions are matching if their root ranges have the same span.
-
10659.    112// The result is normalized.
-
10660.    112// The input values may be mutated, it is not safe to use them after passing
-
10661.    112// them to this function.
-
10662.    112// The computation is synchronous.
-
10663.    112// @param funcCovs Function coverages to merge.
-
10664.    112// @return Merged function coverage, or `undefined` if the input list was empty.
-
10665.    112
-
10666.    112            let count = 0;
-
10667.    112            let isBlockCoverage;
-
10668.    112            let merged;
-
10669.    112            let ranges;
-
10670.    112            let trees = [];
-
10671.    112
-
10672.    112// Probably deadcode.
-
10673.    112// if (funcCovs.length === 0) {
-
10674.    112//     return undefined;
-
10675.    112// }
+
10624.    129        let functions = [];
+
10625.    129
+
10626.    129// Map funcCovRoot.startOffset:funcCovRoot.endOffset to funcCov.
+
10627.    129
+
10628.    129        let rangeToFuncDict = new Map();
+
10629.    129
+
10630.    129// Probably deadcode.
+
10631.    129// if (scriptCovs.length === 0) {
+
10632.    129//     return undefined;
+
10633.    129// }
+
10634.    129
+
10635.     96        if (scriptCovs.length === 1) {
+
10636.     96            resultMerged.push(sortScript(scriptCovs[0]));
+
10637.     96            return;
+
10638.     96        }
+
10639.     96
+
10640.     96// Init rangeToFuncDict.
+
10641.     96// Map funcCovRoot.startOffset:funcCovRoot.endOffset to funcCov.
+
10642.     96
+
10643.    226        scriptCovs.forEach(function ({
+
10644.    226            functions
+
10645.    226        }) {
+
10646.    277            functions.forEach(function (funcCov) {
+
10647.    277                dictKeyValueAppend(
+
10648.    277                    rangeToFuncDict,
+
10649.    277
+
10650.    277// This string can be used to match function with same root range.
+
10651.    277// The string is derived from the start and end offsets of the root range of
+
10652.    277// the function.
+
10653.    277// This assumes that `ranges` is non-empty (true for valid function coverages).
+
10654.    277
+
10655.    277                    (
+
10656.    277                        funcCov.ranges[0].startOffset
+
10657.    277                        + ";" + funcCov.ranges[0].endOffset
+
10658.    277                    ),
+
10659.    277                    funcCov
+
10660.    277                );
+
10661.    277            });
+
10662.    226        });
+
10663.    112        rangeToFuncDict.forEach(function (funcCovs) {
+
10664.    112
+
10665.    112// assert: `funcCovs.length > 0`
+
10666.    112
+
10667.    112// function mergeFuncList(funcCovs) {
+
10668.    112// Merges a list of matching function coverages.
+
10669.    112// Functions are matching if their root ranges have the same span.
+
10670.    112// The result is normalized.
+
10671.    112// The input values may be mutated, it is not safe to use them after passing
+
10672.    112// them to this function.
+
10673.    112// The computation is synchronous.
+
10674.    112// @param funcCovs Function coverages to merge.
+
10675.    112// @return Merged function coverage, or `undefined` if the input list was empty.
10676.    112
-
10677.     96            if (funcCovs.length === 1) {
-
10678.     96                functions.push(sortFunc(funcCovs[0]));
-
10679.     96                return;
-
10680.    111            }
-
10681.    111
-
10682.    111// assert: `funcCovs[0].ranges.length > 0`
-
10683.    111
-
10684.    276            funcCovs.forEach(function (funcCov) {
-
10685.    276
-
10686.    276// assert: `funcCov.ranges.length > 0`
-
10687.    276// assert: `funcCov.ranges` is sorted
-
10688.    276
-
10689.    276                count += (
-
10690.    276                    funcCov.count !== undefined
-
10691.    111                    ? funcCov.count
-
10692.    274                    : funcCov.ranges[0].count
-
10693.    276                );
-
10694.    199                if (funcCov.isBlockCoverage) {
-
10695.    199                    trees.push(treeFromSortedRanges(funcCov.ranges));
-
10696.    199                }
-
10697.    276            });
-
10698.    111            if (trees.length > 0) {
-
10699.     96                isBlockCoverage = true;
-
10700.     96                ranges = treeToRanges(mergeTreeList(trees));
-
10701.     96            } else {
-
10702.     96                isBlockCoverage = false;
-
10703.     96                ranges = [
-
10704.     96                    {
-
10705.     96                        count,
-
10706.     96                        endOffset: funcCovs[0].ranges[0].endOffset,
-
10707.     96                        startOffset: funcCovs[0].ranges[0].startOffset
-
10708.     96                    }
-
10709.     96                ];
-
10710.    111            }
-
10711.    111            merged = {
-
10712.    111                functionName: funcCovs[0].functionName,
-
10713.    111                isBlockCoverage,
-
10714.    111                ranges
-
10715.    111            };
-
10716.    111            if (count !== ranges[0].count) {
-
10717.     96                merged.count = count;
-
10718.    111            }
-
10719.    111
-
10720.    111// assert: `merged` is normalized
-
10721.    111
-
10722.    111            functions.push(merged);
-
10723.    111        });
-
10724.     96        resultMerged.push(sortScript({
-
10725.     96            functions,
-
10726.     96            scriptId: scriptCovs[0].scriptId,
-
10727.     96            url: scriptCovs[0].url
-
10728.     96        }));
-
10729.     96    });
-
10730.     96
-
10731.     96// Sorts the scripts alphabetically by `url`.
-
10732.     96// Reassigns script ids: the script at index `0` receives `"0"`, the script at
-
10733.     96// index `1` receives `"1"` etc.
-
10734.     96
-
10735.     96    Object.entries(resultMerged.sort(function (aa, bb) {
-
10736.     96        return (
-
10737.     96            aa.url > bb.url
-
10738.     96            ? 1
-
10739.     96            : -1
-
10740.     96        );
-
10741.    129    })).forEach(function ([
-
10742.    129        scriptId, scriptCov
-
10743.    129    ]) {
-
10744.    129        scriptCov.scriptId = scriptId.toString(10);
-
10745.    129    });
-
10746.     96    return {
-
10747.     96        result: resultMerged
-
10748.     96    };
-
10749.     96}
-
10750.      1
-
10751.      8async function v8CoverageReportCreate({
-
10752.      8    consoleError,
-
10753.      8    coverageDir,
-
10754.      8    processArgv = []
-
10755.      8}) {
-
10756.      8
-
10757.      8// This function will create html-coverage-reports directly from
-
10758.      8// v8-coverage-files in <coverageDir>.
-
10759.      8// 1. Spawn node.js program <processArgv> with NODE_V8_COVERAGE.
-
10760.      8// 2. Merge JSON v8-coverage-files in <coverageDir>.
-
10761.      8// 3. Create html-coverage-reports in <coverageDir>.
-
10762.      8
-
10763.      8    let cwd;
-
10764.      8    let excludeList = [];
-
10765.      8    let exitCode = 0;
-
10766.      8    let fileDict;
-
10767.      8    let includeList = [];
-
10768.      8    let modeIncludeNodeModules;
-
10769.      8    let processArgElem;
-
10770.      8    let promiseList = [];
-
10771.      8    let v8CoverageObj;
-
10772.      8
-
10773.     13    function htmlRender({
-
10774.     13        fileList,
-
10775.     13        lineList,
-
10776.     13        modeIndex,
-
10777.     13        pathname
-
10778.     13    }) {
-
10779.     13        let html;
-
10780.     13        let padLines;
-
10781.     13        let padPathname;
-
10782.     13        let txt;
-
10783.     13        let txtBorder;
-
10784.     13        html = "";
-
10785.     13        html += String(`
-
10786.     13<!DOCTYPE html>
-
10787.     13<html lang="en">
-
10788.     13<head>
-
10789.     13<title>V8 Coverage Report</title>
-
10790.     13<style>
-
10791.     13/* jslint utility2:true */
-
10792.     13/*csslint ignore:start*/
-
10793.     13.coverage,
-
10794.     13.coverage a,
-
10795.     13.coverage div,
-
10796.     13.coverage pre,
-
10797.     13.coverage span,
-
10798.     13.coverage table,
-
10799.     13.coverage tbody,
-
10800.     13.coverage td,
-
10801.     13.coverage th,
-
10802.     13.coverage thead,
-
10803.     13.coverage tr {
-
10804.     13    box-sizing: border-box;
-
10805.     13    font-family: monospace;
-
10806.     13}
-
10807.     13/*csslint ignore:end*/
-
10808.     13
-
10809.     13/* css - coverage_report - general */
-
10810.     13body {
-
10811.     13    margin: 0;
-
10812.     13}
-
10813.     13.coverage pre {
-
10814.     13    margin: 5px 0;
-
10815.     13}
-
10816.     13.coverage table {
-
10817.     13    border-collapse: collapse;
-
10818.     13}
-
10819.     13.coverage td,
-
10820.     13.coverage th {
-
10821.     13    border: 1px solid #777;
-
10822.     13    line-height: 20px;
-
10823.     13    margin: 0;
-
10824.     13    padding: 5px 10px;
-
10825.     13}
-
10826.     13.coverage td span {
-
10827.     13    display: inline-block;
-
10828.     13    width: 100%;
+
10677.    112            let count = 0;
+
10678.    112            let isBlockCoverage;
+
10679.    112            let merged;
+
10680.    112            let ranges;
+
10681.    112            let trees = [];
+
10682.    112
+
10683.    112// Probably deadcode.
+
10684.    112// if (funcCovs.length === 0) {
+
10685.    112//     return undefined;
+
10686.    112// }
+
10687.    112
+
10688.     96            if (funcCovs.length === 1) {
+
10689.     96                functions.push(sortFunc(funcCovs[0]));
+
10690.     96                return;
+
10691.    111            }
+
10692.    111
+
10693.    111// assert: `funcCovs[0].ranges.length > 0`
+
10694.    111
+
10695.    276            funcCovs.forEach(function (funcCov) {
+
10696.    276
+
10697.    276// assert: `funcCov.ranges.length > 0`
+
10698.    276// assert: `funcCov.ranges` is sorted
+
10699.    276
+
10700.    276                count += (
+
10701.    276                    funcCov.count !== undefined
+
10702.    111                    ? funcCov.count
+
10703.    274                    : funcCov.ranges[0].count
+
10704.    276                );
+
10705.    199                if (funcCov.isBlockCoverage) {
+
10706.    199                    trees.push(treeFromSortedRanges(funcCov.ranges));
+
10707.    199                }
+
10708.    276            });
+
10709.    111            if (trees.length > 0) {
+
10710.     96                isBlockCoverage = true;
+
10711.     96                ranges = treeToRanges(mergeTreeList(trees));
+
10712.     96            } else {
+
10713.     96                isBlockCoverage = false;
+
10714.     96                ranges = [
+
10715.     96                    {
+
10716.     96                        count,
+
10717.     96                        endOffset: funcCovs[0].ranges[0].endOffset,
+
10718.     96                        startOffset: funcCovs[0].ranges[0].startOffset
+
10719.     96                    }
+
10720.     96                ];
+
10721.    111            }
+
10722.    111            merged = {
+
10723.    111                functionName: funcCovs[0].functionName,
+
10724.    111                isBlockCoverage,
+
10725.    111                ranges
+
10726.    111            };
+
10727.    111            if (count !== ranges[0].count) {
+
10728.     96                merged.count = count;
+
10729.    111            }
+
10730.    111
+
10731.    111// assert: `merged` is normalized
+
10732.    111
+
10733.    111            functions.push(merged);
+
10734.    111        });
+
10735.     96        resultMerged.push(sortScript({
+
10736.     96            functions,
+
10737.     96            scriptId: scriptCovs[0].scriptId,
+
10738.     96            url: scriptCovs[0].url
+
10739.     96        }));
+
10740.     96    });
+
10741.     96
+
10742.     96// Sorts the scripts alphabetically by `url`.
+
10743.     96// Reassigns script ids: the script at index `0` receives `"0"`, the script at
+
10744.     96// index `1` receives `"1"` etc.
+
10745.     96
+
10746.     96    Object.entries(resultMerged.sort(function (aa, bb) {
+
10747.     96        return (
+
10748.     96            aa.url > bb.url
+
10749.     96            ? 1
+
10750.     96            : -1
+
10751.     96        );
+
10752.    129    })).forEach(function ([
+
10753.    129        scriptId, scriptCov
+
10754.    129    ]) {
+
10755.    129        scriptCov.scriptId = scriptId.toString(10);
+
10756.    129    });
+
10757.     96    return {
+
10758.     96        result: resultMerged
+
10759.     96    };
+
10760.     96}
+
10761.      1
+
10762.      8async function v8CoverageReportCreate({
+
10763.      8    consoleError,
+
10764.      8    coverageDir,
+
10765.      8    processArgv = []
+
10766.      8}) {
+
10767.      8
+
10768.      8// This function will create html-coverage-reports directly from
+
10769.      8// v8-coverage-files in <coverageDir>.
+
10770.      8// 1. Spawn node.js program <processArgv> with NODE_V8_COVERAGE.
+
10771.      8// 2. Merge JSON v8-coverage-files in <coverageDir>.
+
10772.      8// 3. Create html-coverage-reports in <coverageDir>.
+
10773.      8
+
10774.      8    let cwd;
+
10775.      8    let excludeList = [];
+
10776.      8    let exitCode = 0;
+
10777.      8    let fileDict;
+
10778.      8    let includeList = [];
+
10779.      8    let modeIncludeNodeModules;
+
10780.      8    let processArgElem;
+
10781.      8    let promiseList = [];
+
10782.      8    let v8CoverageObj;
+
10783.      8
+
10784.     13    function htmlRender({
+
10785.     13        fileList,
+
10786.     13        lineList,
+
10787.     13        modeIndex,
+
10788.     13        pathname
+
10789.     13    }) {
+
10790.     13        let html;
+
10791.     13        let padLines;
+
10792.     13        let padPathname;
+
10793.     13        let txt;
+
10794.     13        let txtBorder;
+
10795.     13        html = "";
+
10796.     13        html += String(`
+
10797.     13<!DOCTYPE html>
+
10798.     13<html lang="en">
+
10799.     13<head>
+
10800.     13<title>V8 Coverage Report</title>
+
10801.     13<style>
+
10802.     13/* jslint utility2:true */
+
10803.     13/*csslint ignore:start*/
+
10804.     13.coverage,
+
10805.     13.coverage a,
+
10806.     13.coverage div,
+
10807.     13.coverage pre,
+
10808.     13.coverage span,
+
10809.     13.coverage table,
+
10810.     13.coverage tbody,
+
10811.     13.coverage td,
+
10812.     13.coverage th,
+
10813.     13.coverage thead,
+
10814.     13.coverage tr {
+
10815.     13    box-sizing: border-box;
+
10816.     13    font-family: monospace;
+
10817.     13}
+
10818.     13/*csslint ignore:end*/
+
10819.     13
+
10820.     13/* css - coverage_report - general */
+
10821.     13body {
+
10822.     13    margin: 0;
+
10823.     13}
+
10824.     13.coverage pre {
+
10825.     13    margin: 5px 0;
+
10826.     13}
+
10827.     13.coverage table {
+
10828.     13    border-collapse: collapse;
10829.     13}
-
10830.     13.coverage .content {
-
10831.     13    padding: 0 5px;
-
10832.     13}
-
10833.     13.coverage .content a {
-
10834.     13    text-decoration: none;
-
10835.     13}
-
10836.     13.coverage .count {
-
10837.     13    margin: 0 5px;
-
10838.     13    padding: 0 5px;
-
10839.     13}
-
10840.     13.coverage .footer,
-
10841.     13.coverage .header {
-
10842.     13    padding: 20px;
+
10830.     13.coverage td,
+
10831.     13.coverage th {
+
10832.     13    border: 1px solid #777;
+
10833.     13    line-height: 20px;
+
10834.     13    margin: 0;
+
10835.     13    padding: 5px 10px;
+
10836.     13}
+
10837.     13.coverage td span {
+
10838.     13    display: inline-block;
+
10839.     13    width: 100%;
+
10840.     13}
+
10841.     13.coverage .content {
+
10842.     13    padding: 0 5px;
10843.     13}
-
10844.     13.coverage .footer {
-
10845.     13    text-align: center;
+
10844.     13.coverage .content a {
+
10845.     13    text-decoration: none;
10846.     13}
-
10847.     13.coverage .percentbar {
-
10848.     13    height: 12px;
-
10849.     13    margin: 2px 0;
-
10850.     13    min-width: 200px;
-
10851.     13    position: relative;
-
10852.     13    width: 100%;
-
10853.     13}
-
10854.     13.coverage .percentbar div {
-
10855.     13    height: 100%;
-
10856.     13    position: absolute;
+
10847.     13.coverage .count {
+
10848.     13    margin: 0 5px;
+
10849.     13    padding: 0 5px;
+
10850.     13}
+
10851.     13.coverage .footer,
+
10852.     13.coverage .header {
+
10853.     13    padding: 20px;
+
10854.     13}
+
10855.     13.coverage .footer {
+
10856.     13    text-align: center;
10857.     13}
-
10858.     13.coverage .title {
-
10859.     13    font-size: large;
-
10860.     13    font-weight: bold;
-
10861.     13    margin-bottom: 10px;
-
10862.     13}
-
10863.     13
-
10864.     13/* css - coverage_report - color */
-
10865.     13.coverage td,
-
10866.     13.coverage th {
-
10867.     13    background: #fff;
+
10858.     13.coverage .percentbar {
+
10859.     13    height: 12px;
+
10860.     13    margin: 2px 0;
+
10861.     13    min-width: 200px;
+
10862.     13    position: relative;
+
10863.     13    width: 100%;
+
10864.     13}
+
10865.     13.coverage .percentbar div {
+
10866.     13    height: 100%;
+
10867.     13    position: absolute;
10868.     13}
-
10869.     13.coverage .count,
-
10870.     13.coverage .coverageHigh {
-
10871.     13    background: #9d9;
-
10872.     13}
-
10873.     13.coverage .count {
-
10874.     13    color: #666;
-
10875.     13}
-
10876.     13.coverage .coverageIgnore {
-
10877.     13    background: #ccc;
-
10878.     13}
-
10879.     13.coverage .coverageLow,
-
10880.     13.coverage .uncovered {
-
10881.     13    background: #ebb;
-
10882.     13}
-
10883.     13.coverage .coverageMedium {
-
10884.     13    background: #fd7;
-
10885.     13}
-
10886.     13.coverage .footer,
-
10887.     13.coverage .header,
-
10888.     13.coverage .lineno {
-
10889.     13    background: #ddd;
-
10890.     13}
-
10891.     13.coverage .percentbar {
-
10892.     13    background: #999;
+
10869.     13.coverage .title {
+
10870.     13    font-size: large;
+
10871.     13    font-weight: bold;
+
10872.     13    margin-bottom: 10px;
+
10873.     13}
+
10874.     13
+
10875.     13/* css - coverage_report - color */
+
10876.     13.coverage td,
+
10877.     13.coverage th {
+
10878.     13    background: #fff;
+
10879.     13}
+
10880.     13.coverage .count,
+
10881.     13.coverage .coverageHigh {
+
10882.     13    background: #9d9;
+
10883.     13}
+
10884.     13.coverage .count {
+
10885.     13    color: #666;
+
10886.     13}
+
10887.     13.coverage .coverageIgnore {
+
10888.     13    background: #ccc;
+
10889.     13}
+
10890.     13.coverage .coverageLow,
+
10891.     13.coverage .uncovered {
+
10892.     13    background: #ebb;
10893.     13}
-
10894.     13.coverage .percentbar div {
-
10895.     13    background: #666;
+
10894.     13.coverage .coverageMedium {
+
10895.     13    background: #fd7;
10896.     13}
-
10897.     13
-
10898.     13/* css - coverage_report - important */
-
10899.     13.coverage pre:hover span,
-
10900.     13.coverage tr:hover td {
-
10901.     13    background: #7d7;
-
10902.     13}
-
10903.     13.coverage pre:hover span.uncovered,
-
10904.     13.coverage tr:hover td.coverageLow {
-
10905.     13    background: #f99;
-
10906.     13}
-
10907.     13</style>
-
10908.     13</head>
-
10909.     13<body class="coverage">
-
10910.     13<!-- header start -->
-
10911.     13<div class="header">
-
10912.     13<div class="title">V8 Coverage Report</div>
-
10913.     13<table>
-
10914.     13<thead>
-
10915.     13    <tr>
-
10916.     13    <th>Files covered</th>
-
10917.     13    <th>Lines</th>
-
10918.     13    <th>Remaining</th>
-
10919.     13    </tr>
-
10920.     13</thead>
-
10921.     13<tbody>
-
10922.     13        `).trim() + "\n";
-
10923.      7        if (modeIndex) {
-
10924.      7            padLines = String("(ignore) 100.00 %").length;
-
10925.      7            padPathname = 32;
-
10926.      7            fileList.unshift({
-
10927.      7                linesCovered: 0,
-
10928.      7                linesTotal: 0,
-
10929.      7                modeCoverageIgnoreFile: "",
-
10930.      7                pathname: "./"
-
10931.      7            });
-
10932.      7            fileList.slice(1).forEach(function ({
-
10933.      7                linesCovered,
-
10934.      7                linesTotal,
-
10935.      7                modeCoverageIgnoreFile,
-
10936.      7                pathname
-
10937.      7            }) {
-
10938.      7                if (!modeCoverageIgnoreFile) {
-
10939.      7                    fileList[0].linesCovered += linesCovered;
-
10940.      7                    fileList[0].linesTotal += linesTotal;
-
10941.      7                }
-
10942.      7                padPathname = Math.max(padPathname, pathname.length + 2);
-
10943.      7                padLines = Math.max(
-
10944.      7                    padLines,
-
10945.      7                    String(linesCovered + " / " + linesTotal).length
-
10946.      7                );
-
10947.      7            });
-
10948.      7        }
-
10949.     13        txtBorder = (
-
10950.     13            "+" + "-".repeat(padPathname + 2) + "+"
-
10951.     13            + "-".repeat(padLines + 2) + "+"
-
10952.     13            + "-".repeat(padLines + 2) + "+\n"
-
10953.     13        );
-
10954.     13        txt = "";
-
10955.     13        txt += "V8 Coverage Report\n";
-
10956.     13        txt += txtBorder;
-
10957.     13        txt += (
-
10958.     13            "| " + String("Files covered").padEnd(padPathname, " ") + " | "
-
10959.     13            + String("Lines").padStart(padLines, " ") + " | "
-
10960.     13            + String("Remaining").padStart(padLines, " ") + " |\n"
-
10961.     13        );
-
10962.     13        txt += txtBorder;
-
10963.     19        fileList.forEach(function ({
-
10964.     19            linesCovered,
-
10965.     19            linesTotal,
-
10966.     19            modeCoverageIgnoreFile,
-
10967.     19            pathname
-
10968.     19        }, ii) {
-
10969.     19            let coverageLevel;
-
10970.     19            let coveragePct;
-
10971.     19            let fill;
-
10972.     19            let str1;
-
10973.     19            let str2;
-
10974.     19            let xx1;
-
10975.     19            let xx2;
-
10976.      2            coveragePct = Math.floor(10000 * linesCovered / linesTotal || 0);
-
10977.     19            coverageLevel = (
-
10978.     19                modeCoverageIgnoreFile
-
10979.      2                ? "coverageIgnore"
-
10980.     17                : coveragePct >= 8000
-
10981.     17                ? "coverageHigh"
-
10982.     17                : coveragePct >= 5000
-
10983.     17                ? "coverageMedium"
-
10984.     17                : "coverageLow"
-
10985.     19            );
-
10986.     19            coveragePct = String(coveragePct).replace((
-
10987.     19                /..$/m
-
10988.     19            ), ".$&");
-
10989.     13            if (modeIndex && ii === 0) {
-
10990.      7                fill = (
-
10991.      7
-
10992.      7// Badge-color rgb-red.
-
10993.      7
-
10994.      7                    "#" + Math.round(
-
10995.      7                        (100 - Number(coveragePct)) * 2.21
-
10996.      7                    ).toString(16).padStart(2, "0")
-
10997.      7
-
10998.      7// Badge-color rgb-green.
-
10999.      7
-
11000.      7                    + Math.round(
-
11001.      7                        Number(coveragePct) * 2.21
-
11002.      7                    ).toString(16).padStart(2, "0")
-
11003.      7
-
11004.      7// Badge-color rgb-blue.
-
11005.      7
-
11006.      7                    + "00"
-
11007.      7                );
-
11008.      7                str1 = "coverage";
-
11009.      7                str2 = coveragePct + " %";
-
11010.      7                xx1 = 6 * str1.length + 20;
-
11011.      7                xx2 = 6 * str2.length + 20;
-
11012.      7
-
11013.      7// Fs - write coverage_badge.svg.
+
10897.     13.coverage .footer,
+
10898.     13.coverage .header,
+
10899.     13.coverage .lineno {
+
10900.     13    background: #ddd;
+
10901.     13}
+
10902.     13.coverage .percentbar {
+
10903.     13    background: #999;
+
10904.     13}
+
10905.     13.coverage .percentbar div {
+
10906.     13    background: #666;
+
10907.     13}
+
10908.     13
+
10909.     13/* css - coverage_report - important */
+
10910.     13.coverage pre:hover span,
+
10911.     13.coverage tr:hover td {
+
10912.     13    background: #7d7;
+
10913.     13}
+
10914.     13.coverage pre:hover span.uncovered,
+
10915.     13.coverage tr:hover td.coverageLow {
+
10916.     13    background: #f99;
+
10917.     13}
+
10918.     13</style>
+
10919.     13</head>
+
10920.     13<body class="coverage">
+
10921.     13<!-- header start -->
+
10922.     13<div class="header">
+
10923.     13<div class="title">V8 Coverage Report</div>
+
10924.     13<table>
+
10925.     13<thead>
+
10926.     13    <tr>
+
10927.     13    <th>Files covered</th>
+
10928.     13    <th>Lines</th>
+
10929.     13    <th>Remaining</th>
+
10930.     13    </tr>
+
10931.     13</thead>
+
10932.     13<tbody>
+
10933.     13        `).trim() + "\n";
+
10934.      7        if (modeIndex) {
+
10935.      7            padLines = String("(ignore) 100.00 %").length;
+
10936.      7            padPathname = 32;
+
10937.      7            fileList.unshift({
+
10938.      7                linesCovered: 0,
+
10939.      7                linesTotal: 0,
+
10940.      7                modeCoverageIgnoreFile: "",
+
10941.      7                pathname: "./"
+
10942.      7            });
+
10943.      7            fileList.slice(1).forEach(function ({
+
10944.      7                linesCovered,
+
10945.      7                linesTotal,
+
10946.      7                modeCoverageIgnoreFile,
+
10947.      7                pathname
+
10948.      7            }) {
+
10949.      7                if (!modeCoverageIgnoreFile) {
+
10950.      7                    fileList[0].linesCovered += linesCovered;
+
10951.      7                    fileList[0].linesTotal += linesTotal;
+
10952.      7                }
+
10953.      7                padPathname = Math.max(padPathname, pathname.length + 2);
+
10954.      7                padLines = Math.max(
+
10955.      7                    padLines,
+
10956.      7                    String(linesCovered + " / " + linesTotal).length
+
10957.      7                );
+
10958.      7            });
+
10959.      7        }
+
10960.     13        txtBorder = (
+
10961.     13            "+" + "-".repeat(padPathname + 2) + "+"
+
10962.     13            + "-".repeat(padLines + 2) + "+"
+
10963.     13            + "-".repeat(padLines + 2) + "+\n"
+
10964.     13        );
+
10965.     13        txt = "";
+
10966.     13        txt += "V8 Coverage Report\n";
+
10967.     13        txt += txtBorder;
+
10968.     13        txt += (
+
10969.     13            "| " + String("Files covered").padEnd(padPathname, " ") + " | "
+
10970.     13            + String("Lines").padStart(padLines, " ") + " | "
+
10971.     13            + String("Remaining").padStart(padLines, " ") + " |\n"
+
10972.     13        );
+
10973.     13        txt += txtBorder;
+
10974.     19        fileList.forEach(function ({
+
10975.     19            linesCovered,
+
10976.     19            linesTotal,
+
10977.     19            modeCoverageIgnoreFile,
+
10978.     19            pathname
+
10979.     19        }, ii) {
+
10980.     19            let coverageLevel;
+
10981.     19            let coveragePct;
+
10982.     19            let fill;
+
10983.     19            let str1;
+
10984.     19            let str2;
+
10985.     19            let xx1;
+
10986.     19            let xx2;
+
10987.      2            coveragePct = Math.floor(10000 * linesCovered / linesTotal || 0);
+
10988.     19            coverageLevel = (
+
10989.     19                modeCoverageIgnoreFile
+
10990.      2                ? "coverageIgnore"
+
10991.     17                : coveragePct >= 8000
+
10992.     17                ? "coverageHigh"
+
10993.     17                : coveragePct >= 5000
+
10994.     17                ? "coverageMedium"
+
10995.     17                : "coverageLow"
+
10996.     19            );
+
10997.     19            coveragePct = String(coveragePct).replace((
+
10998.     19                /..$/m
+
10999.     19            ), ".$&");
+
11000.     13            if (modeIndex && ii === 0) {
+
11001.      7                fill = (
+
11002.      7
+
11003.      7// Badge-color rgb-red.
+
11004.      7
+
11005.      7                    "#" + Math.round(
+
11006.      7                        (100 - Number(coveragePct)) * 2.21
+
11007.      7                    ).toString(16).padStart(2, "0")
+
11008.      7
+
11009.      7// Badge-color rgb-green.
+
11010.      7
+
11011.      7                    + Math.round(
+
11012.      7                        Number(coveragePct) * 2.21
+
11013.      7                    ).toString(16).padStart(2, "0")
11014.      7
-
11015.      7                promiseList.push(fsWriteFileWithParents((
-
11016.      7                    coverageDir + "coverage_badge.svg"
-
11017.      7                ), String(`
-
11018.      7<svg height="20" width="${xx1 + xx2}" xmlns="http://www.w3.org/2000/svg">
-
11019.      7<rect fill="#555" height="20" width="${xx1 + xx2}"/>
-
11020.      7<rect fill="${fill}" height="20" width="${xx2}" x="${xx1}"/>
-
11021.      7<g
-
11022.      7    fill="#fff"
-
11023.      7    font-family="verdana, geneva, dejavu sans, sans-serif"
-
11024.      7    font-size="11"
-
11025.      7    font-weight="bold"
-
11026.      7    text-anchor="middle"
-
11027.      7>
-
11028.      7<text x="${0.5 * xx1}" y="14">${str1}</text>
-
11029.      7<text x="${xx1 + 0.5 * xx2}" y="14">${str2}</text>
-
11030.      7</g>
-
11031.      7</svg>
-
11032.      7                `).trim() + "\n"));
-
11033.      7                pathname = "";
-
11034.      7            }
-
11035.     19            txt += (
-
11036.     19                "| "
-
11037.     19                + String("./" + pathname).padEnd(padPathname, " ") + " | "
-
11038.     19                + String(
-
11039.     19                    modeCoverageIgnoreFile + " " + coveragePct + " %"
-
11040.     19                ).padStart(padLines, " ") + " | "
-
11041.     19                + " ".repeat(padLines) + " |\n"
-
11042.     19            );
-
11043.     19            txt += (
-
11044.     19                "| " + "*".repeat(
-
11045.     19                    Math.round(0.01 * coveragePct * padPathname)
-
11046.     19                ).padEnd(padPathname, "_") + " | "
-
11047.     19                + String(
-
11048.     19                    linesCovered + " / " + linesTotal
-
11049.     19                ).padStart(padLines, " ") + " | "
-
11050.     19                + String(
-
11051.     19                    (linesTotal - linesCovered) + " / " + linesTotal
-
11052.     19                ).padStart(padLines, " ") + " |\n"
+
11015.      7// Badge-color rgb-blue.
+
11016.      7
+
11017.      7                    + "00"
+
11018.      7                );
+
11019.      7                str1 = "coverage";
+
11020.      7                str2 = coveragePct + " %";
+
11021.      7                xx1 = 6 * str1.length + 20;
+
11022.      7                xx2 = 6 * str2.length + 20;
+
11023.      7
+
11024.      7// Fs - write coverage_badge.svg.
+
11025.      7
+
11026.      7                promiseList.push(fsWriteFileWithParents((
+
11027.      7                    coverageDir + "coverage_badge.svg"
+
11028.      7                ), String(`
+
11029.      7<svg height="20" width="${xx1 + xx2}" xmlns="http://www.w3.org/2000/svg">
+
11030.      7<rect fill="#555" height="20" width="${xx1 + xx2}"/>
+
11031.      7<rect fill="${fill}" height="20" width="${xx2}" x="${xx1}"/>
+
11032.      7<g
+
11033.      7    fill="#fff"
+
11034.      7    font-family="verdana, geneva, dejavu sans, sans-serif"
+
11035.      7    font-size="11"
+
11036.      7    font-weight="bold"
+
11037.      7    text-anchor="middle"
+
11038.      7>
+
11039.      7<text x="${0.5 * xx1}" y="14">${str1}</text>
+
11040.      7<text x="${xx1 + 0.5 * xx2}" y="14">${str2}</text>
+
11041.      7</g>
+
11042.      7</svg>
+
11043.      7                `).trim() + "\n"));
+
11044.      7                pathname = "";
+
11045.      7            }
+
11046.     19            txt += (
+
11047.     19                "| "
+
11048.     19                + String("./" + pathname).padEnd(padPathname, " ") + " | "
+
11049.     19                + String(
+
11050.     19                    modeCoverageIgnoreFile + " " + coveragePct + " %"
+
11051.     19                ).padStart(padLines, " ") + " | "
+
11052.     19                + " ".repeat(padLines) + " |\n"
11053.     19            );
-
11054.     19            txt += txtBorder;
-
11055.     19            pathname = htmlEscape(pathname);
-
11056.     19
-
11057.     19// CL-37251d17 - Bugfix - Fix incorrect http-link to index.html.
-
11058.     19
-
11059.     19            html += String(`
-
11060.     19    <tr>
-
11061.     19    <td class="${coverageLevel}">
-
11062.     19            ${(
-
11063.     19                modeIndex
-
11064.     13                ? (
-
11065.     13                    "<a href=\"" + (pathname || "index") + ".html\">. / "
-
11066.     13                    + pathname + "</a><br>"
-
11067.     13                )
-
11068.      6                : (
-
11069.      6                    "<a href=\""
-
11070.      6                    + "../".repeat(pathname.split("/").length - 1)
-
11071.      6                    + "index.html\">. / </a>"
-
11072.      6                    + pathname + "<br>"
-
11073.      6                )
-
11074.     19            )}
-
11075.     19        <div class="percentbar">
-
11076.     19            <div style="width: ${coveragePct}%;"></div>
-
11077.     19        </div>
-
11078.     19    </td>
-
11079.     19    <td style="text-align: right;">
-
11080.     19        ${modeCoverageIgnoreFile} ${coveragePct} %<br>
-
11081.     19        ${linesCovered} / ${linesTotal}
-
11082.     19    </td>
-
11083.     19    <td style="text-align: right;">
-
11084.     19        <br>
-
11085.     19        ${linesTotal - linesCovered} / ${linesTotal}
-
11086.     19    </td>
-
11087.     19    </tr>
-
11088.     19        `).trim() + "\n";
-
11089.     19        });
-
11090.     13        html += String(`
-
11091.     13</tbody>
-
11092.     13</table>
-
11093.     13</div>
-
11094.     13<!-- header end -->
-
11095.     13        `).trim() + "\n";
-
11096.      6        if (!modeIndex) {
-
11097.      6            html += String(`
-
11098.      6<!-- content start -->
-
11099.      6<div class="content">
-
11100.      6            `).trim() + "\n";
-
11101.  11842            lineList.forEach(function ({
-
11102.  11842                count,
-
11103.  11842                holeList,
-
11104.  11842                line,
-
11105.  11842                startOffset
-
11106.  11842            }, ii) {
-
11107.  11842                let chunk;
-
11108.  11842                let inHole;
-
11109.  11842                let lineHtml;
-
11110.  11842                let lineId;
-
11111.  11842                lineHtml = "";
-
11112.  11842                lineId = "line_" + (ii + 1);
-
11113.  11842                switch (count) {
-
11114.     32                case -1:
-
11115.  11208                case 0:
-
11116.  11208                    if (holeList.length === 0) {
-
11117.  11208                        lineHtml += "</span>";
-
11118.  11208                        lineHtml += "<span class=\"uncovered\">";
-
11119.  11208                        lineHtml += htmlEscape(line);
-
11120.  11208                        break;
-
11121.  11208                    }
-
11122.  11208                    line = line.split("").map(function (char) {
-
11123.  11208                        return {
-
11124.  11208                            char,
-
11125.  11208                            isHole: undefined
-
11126.  11208                        };
-
11127.  11208                    });
-
11128.  11208                    holeList.forEach(function ([
-
11129.  11208                        aa, bb
-
11130.  11208                    ]) {
-
11131.  11208                        aa = Math.max(aa - startOffset, 0);
-
11132.  11208                        bb = Math.min(bb - startOffset, line.length);
-
11133.  11208                        while (aa < bb) {
-
11134.  11208                            line[aa].isHole = true;
-
11135.  11208                            aa += 1;
-
11136.  11208                        }
-
11137.  11208                    });
-
11138.  11208                    chunk = "";
-
11139.  11208                    line.forEach(function ({
-
11140.  11208                        char,
-
11141.  11208                        isHole
-
11142.  11208                    }) {
-
11143.  11208                        if (inHole !== isHole) {
-
11144.  11208                            lineHtml += htmlEscape(chunk);
-
11145.  11208                            lineHtml += "</span><span";
-
11146.  11208
-
11147.  11208// Coverage-hack - Ugly-hack around possible deadcode where isHole is always
-
11148.  11208// true.
-
11149.  11208
-
11150.  11208                            if (isHole) {
-
11151.  11208                                lineHtml += " class=\"uncovered\"";
-
11152.  11208                            }
-
11153.  11208                            lineHtml += ">";
-
11154.  11208                            chunk = "";
-
11155.  11208                            inHole = isHole;
-
11156.  11208                        }
-
11157.  11208                        chunk += char;
-
11158.  11208                    });
-
11159.  11208                    lineHtml += htmlEscape(chunk);
-
11160.  11208                    break;
-
11161.    634                default:
-
11162.    634                    lineHtml += htmlEscape(line);
-
11163.  11842                }
-
11164.  11842                html += String(`
-
11165.  11842<pre>
-
11166.  11842<span class="lineno">
-
11167.  11842<a href="#${lineId}" id="${lineId}">${String(ii + 1).padStart(5, " ")}.</a>
-
11168.  11842</span>
-
11169.  11842<span class="count
-
11170.  11842                ${(
-
11171.  11842                    count <= 0
-
11172.  11208                    ? "uncovered"
-
11173.    634                    : ""
-
11174.  11842                )}"
-
11175.  11842>
-
11176.  11176${String(count || "-0").padStart(7, " ")}
-
11177.  11842</span>
-
11178.  11842<span>${lineHtml}</span>
-
11179.  11842</pre>
-
11180.  11842                `).replace((
-
11181.  11842                    /\n/g
-
11182.  11842                ), "").trim() + "\n";
-
11183.  11842            });
-
11184.      6            html += String(`
-
11185.      6</div>
-
11186.      6<!-- content end -->
-
11187.      6            `).trim() + "\n";
-
11188.      6        }
-
11189.     13        html += String(`
-
11190.     13<div class="footer">
-
11191.     13    [
-
11192.     13    This document was created with
-
11193.     13    <a href="https://github.com/jslint-org/jslint">JSLint</a>
-
11194.     13    ]
-
11195.     13</div>
-
11196.     13</body>
-
11197.     13</html>
-
11198.     13        `).trim() + "\n";
-
11199.     13
-
11200.     13// Fs - write <file>.html.
-
11201.     13
-
11202.     13        promiseList.push(fsWriteFileWithParents(pathname + ".html", html));
-
11203.      6        if (!modeIndex) {
-
11204.      6            return;
-
11205.      7        }
-
11206.      7
-
11207.      7// Fs - write coverage_report.txt.
-
11208.      7
-
11209.      7        consoleError("\n" + txt);
-
11210.      7        promiseList.push(fsWriteFileWithParents((
-
11211.      7            coverageDir + "coverage_report.txt"
-
11212.      7        ), txt));
-
11213.      7    }
-
11214.      8
-
11215.      8/*
-
11216.      8function sentinel() {}
-
11217.      8*/
-
11218.      8
-
11219.      8    await moduleFsInit();
-
11220.      1    consoleError = consoleError || console.error;
-
11221.      8    cwd = process.cwd().replace((
-
11222.      8        /\\/g
-
11223.      8    ), "/") + "/";
-
11224.      8
-
11225.      8// Init coverageDir.
-
11226.      8// Assert coverageDir is subdirectory of cwd.
-
11227.      8
-
11228.      8    assertOrThrow(coverageDir, "invalid coverageDir " + coverageDir);
+
11054.     19            txt += (
+
11055.     19                "| " + "*".repeat(
+
11056.     19                    Math.round(0.01 * coveragePct * padPathname)
+
11057.     19                ).padEnd(padPathname, "_") + " | "
+
11058.     19                + String(
+
11059.     19                    linesCovered + " / " + linesTotal
+
11060.     19                ).padStart(padLines, " ") + " | "
+
11061.     19                + String(
+
11062.     19                    (linesTotal - linesCovered) + " / " + linesTotal
+
11063.     19                ).padStart(padLines, " ") + " |\n"
+
11064.     19            );
+
11065.     19            txt += txtBorder;
+
11066.     19            pathname = htmlEscape(pathname);
+
11067.     19
+
11068.     19// CL-37251d17 - Bugfix - Fix incorrect http-link to index.html.
+
11069.     19
+
11070.     19            html += String(`
+
11071.     19    <tr>
+
11072.     19    <td class="${coverageLevel}">
+
11073.     19            ${(
+
11074.     19                modeIndex
+
11075.     13                ? (
+
11076.     13                    "<a href=\"" + (pathname || "index") + ".html\">. / "
+
11077.     13                    + pathname + "</a><br>"
+
11078.     13                )
+
11079.      6                : (
+
11080.      6                    "<a href=\""
+
11081.      6                    + "../".repeat(pathname.split("/").length - 1)
+
11082.      6                    + "index.html\">. / </a>"
+
11083.      6                    + pathname + "<br>"
+
11084.      6                )
+
11085.     19            )}
+
11086.     19        <div class="percentbar">
+
11087.     19            <div style="width: ${coveragePct}%;"></div>
+
11088.     19        </div>
+
11089.     19    </td>
+
11090.     19    <td style="text-align: right;">
+
11091.     19        ${modeCoverageIgnoreFile} ${coveragePct} %<br>
+
11092.     19        ${linesCovered} / ${linesTotal}
+
11093.     19    </td>
+
11094.     19    <td style="text-align: right;">
+
11095.     19        <br>
+
11096.     19        ${linesTotal - linesCovered} / ${linesTotal}
+
11097.     19    </td>
+
11098.     19    </tr>
+
11099.     19        `).trim() + "\n";
+
11100.     19        });
+
11101.     13        html += String(`
+
11102.     13</tbody>
+
11103.     13</table>
+
11104.     13</div>
+
11105.     13<!-- header end -->
+
11106.     13        `).trim() + "\n";
+
11107.      6        if (!modeIndex) {
+
11108.      6            html += String(`
+
11109.      6<!-- content start -->
+
11110.      6<div class="content">
+
11111.      6            `).trim() + "\n";
+
11112.  11853            lineList.forEach(function ({
+
11113.  11853                count,
+
11114.  11853                holeList,
+
11115.  11853                line,
+
11116.  11853                startOffset
+
11117.  11853            }, ii) {
+
11118.  11853                let chunk;
+
11119.  11853                let inHole;
+
11120.  11853                let lineHtml;
+
11121.  11853                let lineId;
+
11122.  11853                lineHtml = "";
+
11123.  11853                lineId = "line_" + (ii + 1);
+
11124.  11853                switch (count) {
+
11125.     32                case -1:
+
11126.  11219                case 0:
+
11127.  11219                    if (holeList.length === 0) {
+
11128.  11219                        lineHtml += "</span>";
+
11129.  11219                        lineHtml += "<span class=\"uncovered\">";
+
11130.  11219                        lineHtml += htmlEscape(line);
+
11131.  11219                        break;
+
11132.  11219                    }
+
11133.  11219                    line = line.split("").map(function (char) {
+
11134.  11219                        return {
+
11135.  11219                            char,
+
11136.  11219                            isHole: undefined
+
11137.  11219                        };
+
11138.  11219                    });
+
11139.  11219                    holeList.forEach(function ([
+
11140.  11219                        aa, bb
+
11141.  11219                    ]) {
+
11142.  11219                        aa = Math.max(aa - startOffset, 0);
+
11143.  11219                        bb = Math.min(bb - startOffset, line.length);
+
11144.  11219                        while (aa < bb) {
+
11145.  11219                            line[aa].isHole = true;
+
11146.  11219                            aa += 1;
+
11147.  11219                        }
+
11148.  11219                    });
+
11149.  11219                    chunk = "";
+
11150.  11219                    line.forEach(function ({
+
11151.  11219                        char,
+
11152.  11219                        isHole
+
11153.  11219                    }) {
+
11154.  11219                        if (inHole !== isHole) {
+
11155.  11219                            lineHtml += htmlEscape(chunk);
+
11156.  11219                            lineHtml += "</span><span";
+
11157.  11219
+
11158.  11219// Coverage-hack - Ugly-hack around possible deadcode where isHole is always
+
11159.  11219// true.
+
11160.  11219
+
11161.  11219                            if (isHole) {
+
11162.  11219                                lineHtml += " class=\"uncovered\"";
+
11163.  11219                            }
+
11164.  11219                            lineHtml += ">";
+
11165.  11219                            chunk = "";
+
11166.  11219                            inHole = isHole;
+
11167.  11219                        }
+
11168.  11219                        chunk += char;
+
11169.  11219                    });
+
11170.  11219                    lineHtml += htmlEscape(chunk);
+
11171.  11219                    break;
+
11172.    634                default:
+
11173.    634                    lineHtml += htmlEscape(line);
+
11174.  11853                }
+
11175.  11853                html += String(`
+
11176.  11853<pre>
+
11177.  11853<span class="lineno">
+
11178.  11853<a href="#${lineId}" id="${lineId}">${String(ii + 1).padStart(5, " ")}.</a>
+
11179.  11853</span>
+
11180.  11853<span class="count
+
11181.  11853                ${(
+
11182.  11853                    count <= 0
+
11183.  11219                    ? "uncovered"
+
11184.    634                    : ""
+
11185.  11853                )}"
+
11186.  11853>
+
11187.  11187${String(count || "-0").padStart(7, " ")}
+
11188.  11853</span>
+
11189.  11853<span>${lineHtml}</span>
+
11190.  11853</pre>
+
11191.  11853                `).replace((
+
11192.  11853                    /\n/g
+
11193.  11853                ), "").trim() + "\n";
+
11194.  11853            });
+
11195.      6            html += String(`
+
11196.      6</div>
+
11197.      6<!-- content end -->
+
11198.      6            `).trim() + "\n";
+
11199.      6        }
+
11200.     13        html += String(`
+
11201.     13<div class="footer">
+
11202.     13    [
+
11203.     13    This document was created with
+
11204.     13    <a href="https://github.com/jslint-org/jslint">JSLint</a>
+
11205.     13    ]
+
11206.     13</div>
+
11207.     13</body>
+
11208.     13</html>
+
11209.     13        `).trim() + "\n";
+
11210.     13
+
11211.     13// Fs - write <file>.html.
+
11212.     13
+
11213.     13        promiseList.push(fsWriteFileWithParents(pathname + ".html", html));
+
11214.      6        if (!modeIndex) {
+
11215.      6            return;
+
11216.      7        }
+
11217.      7
+
11218.      7// Fs - write coverage_report.txt.
+
11219.      7
+
11220.      7        consoleError("\n" + txt);
+
11221.      7        promiseList.push(fsWriteFileWithParents((
+
11222.      7            coverageDir + "coverage_report.txt"
+
11223.      7        ), txt));
+
11224.      7    }
+
11225.      8
+
11226.      8/*
+
11227.      8function sentinel() {}
+
11228.      8*/
11229.      8
-
11230.      8// CL-61b11012 - coverage - Relax requirement for coverageDir to be in cwd.
-
11231.      8//     assertOrThrow(
-
11232.      8//         pathnameRelativeCwd(coverageDir),
-
11233.      8//         "coverageDir " + coverageDir + " is not subdirectory of cwd " + cwd
-
11234.      8//     );
+
11230.      8    await moduleFsInit();
+
11231.      1    consoleError = consoleError || console.error;
+
11232.      8    cwd = process.cwd().replace((
+
11233.      8        /\\/g
+
11234.      8    ), "/") + "/";
11235.      8
-
11236.      8    coverageDir = modulePath.resolve(coverageDir).replace((
-
11237.      8        /\\/g
-
11238.      8    ), "/") + "/";
-
11239.      8
-
11240.      8    processArgv = processArgv.slice();
-
11241.      9    while (processArgv[0] && processArgv[0][0] === "-") {
-
11242.      3        processArgElem = processArgv.shift().split("=");
-
11243.      3        processArgElem[1] = processArgElem.slice(1).join("=");
-
11244.      3        switch (processArgElem[0]) {
-
11245.      3
-
11246.      3// PR-371 - Add cli-option `--exclude=...`.
-
11247.      3
-
11248.      3        case "--exclude":
-
11249.      3            excludeList.push(processArgElem[1]);
-
11250.      3            break;
-
11251.      3
-
11252.      3// PR-371 - Add cli-option `--include=...`
-
11253.      3
-
11254.      3        case "--include":
-
11255.      3            includeList.push(processArgElem[1]);
-
11256.      3            break;
-
11257.      3
-
11258.      3// PR-400
-
11259.      3// Disable default-coverage of directory `node_modules`,
-
11260.      3// but allow override with cli-option `--include-node-modules=1`.
-
11261.      3
-
11262.      3        case "--include-node-modules":
-
11263.      3            modeIncludeNodeModules = !(
-
11264.      3                /0|false|null|undefined/
-
11265.      3            ).test(processArgElem[1]);
-
11266.      3            break;
-
11267.      3        }
-
11268.      7    }
-
11269.      7
-
11270.      7// 1. Spawn node.js program <processArgv> with coverage
-
11271.      7
-
11272.      7    if (processArgv.length > 0) {
-
11273.      6
-
11274.      6// Remove old coverage-files.
-
11275.      6
-
11276.      6        await fsWriteFileWithParents(coverageDir + "/touch.txt", "");
-
11277.      6        await Promise.all(Array.from(
-
11278.      6            await moduleFs.promises.readdir(coverageDir)
-
11279.     11        ).map(async function (file) {
-
11280.     11            if ((
-
11281.     11                /^coverage-\d+?-\d+?-\d+?\.json$/
-
11282.      6            ).test(file)) {
-
11283.      6                consoleError("rm file " + coverageDir + file);
-
11284.      6                await moduleFs.promises.unlink(coverageDir + file);
-
11285.      6            }
-
11286.     11        }));
-
11287.      6        exitCode = await new Promise(function (resolve) {
-
11288.      6            let processArgv0 = processArgv[0];
-
11289.      6
-
11290.      6// If win32 environment, then replace program npm with npm.cmd.
-
11291.      6// Coverage-hack - Ugly-hack to get test-coverage under both win32 and linux.
-
11292.      6
-
11293.      6            if (processArgv0 === "npm") {
-
11294.      6                processArgv0 = process.platform.replace(
-
11295.      6                    "win32",
-
11296.      6                    "npm.cmd"
-
11297.      6                ).replace(
-
11298.      6                    process.platform,
-
11299.      6                    "npm"
-
11300.      6                );
-
11301.      6            }
-
11302.      6            moduleChildProcess.spawn(
-
11303.      6                processArgv0,
-
11304.      6                processArgv.slice(1),
-
11305.      6                {
-
11306.      6                    env: Object.assign({}, process.env, {
-
11307.      6                        NODE_V8_COVERAGE: coverageDir
-
11308.      6                    }),
-
11309.      6
-
11310.      6// PR-465
-
11311.      6// https://nodejs.org/en/blog/vulnerability/april-2024-security-releases-2
-
11312.      6// Node.js will now error with EINVAL if a .bat or .cmd file is passed to
-
11313.      6// child_process.spawn and child_process.spawnSync without the shell option set.
-
11314.      6
-
11315.      6                    shell: (
-
11316.      6                        processArgv0.endsWith(".bat")
-
11317.      6                        || processArgv0.endsWith(".cmd")
-
11318.      6                    ),
-
11319.      6                    stdio: ["ignore", 1, 2]
-
11320.      6                }
-
11321.      6            ).on("exit", resolve);
-
11322.      6        });
-
11323.      6        consoleError(
-
11324.      6            `v8CoverageReportCreate - program exited with exitCode=${exitCode}`
-
11325.      6        );
-
11326.      7    }
-
11327.      7
-
11328.      7// 2. Merge JSON v8-coverage-files in <coverageDir>.
-
11329.      7
-
11330.      7    consoleError("v8CoverageReportCreate - merging coverage files...");
-
11331.      7    v8CoverageObj = await moduleFs.promises.readdir(coverageDir);
-
11332.     18    v8CoverageObj = v8CoverageObj.filter(function (file) {
-
11333.     18        return (
-
11334.     18            /^coverage-\d+?-\d+?-\d+?\.json$/
-
11335.     18        ).test(file);
-
11336.     18    });
-
11337.      7    v8CoverageObj = await Promise.all(v8CoverageObj.map(async function (file) {
-
11338.      7        let data;
-
11339.      7        let pathnameDict = Object.create(null);
-
11340.      7        data = await moduleFs.promises.readFile(coverageDir + file, "utf8");
-
11341.      7        data = JSON.parse(data);
-
11342.    479        data.result.forEach(function (scriptCov) {
-
11343.    479            let pathname = scriptCov.url;
-
11344.    479
-
11345.    479// Filter out internal coverages.
-
11346.    479
-
11347.    398            if (!pathname.startsWith("file:///")) {
-
11348.    398                return;
-
11349.    398            }
-
11350.     81
-
11351.     81// Normalize pathname.
-
11352.     81
-
11353.     81            pathname = moduleUrl.fileURLToPath(pathname);
-
11354.     81            pathname = modulePath.resolve(pathname).replace((
-
11355.     81                /\\/g
-
11356.     81            ), "/");
-
11357.     81
-
11358.     81// Filter files outside of cwd.
-
11359.     81
-
11360.     81            if (pathname.indexOf("[") >= 0 || !pathname.startsWith(cwd)) {
-
11361.     75                return;
-
11362.     75            }
-
11363.      7
-
11364.      7// Normalize pathname relative to cwd.
-
11365.      7
-
11366.      7            pathname = pathname.slice(cwd.length);
-
11367.      7            scriptCov.url = pathname;
-
11368.      7            pathnameDict[pathname] = scriptCov;
-
11369.      7        });
-
11370.      7
-
11371.      7// PR-400 - Filter directory `node_modules`.
-
11372.      7
-
11373.      7        if (!modeIncludeNodeModules) {
-
11374.      7            excludeList.push("node_modules/");
-
11375.      7        }
+
11236.      8// Init coverageDir.
+
11237.      8// Assert coverageDir is subdirectory of cwd.
+
11238.      8
+
11239.      8    assertOrThrow(coverageDir, "invalid coverageDir " + coverageDir);
+
11240.      8
+
11241.      8// CL-61b11012 - coverage - Relax requirement for coverageDir to be in cwd.
+
11242.      8//     assertOrThrow(
+
11243.      8//         pathnameRelativeCwd(coverageDir),
+
11244.      8//         "coverageDir " + coverageDir + " is not subdirectory of cwd " + cwd
+
11245.      8//     );
+
11246.      8
+
11247.      8    coverageDir = modulePath.resolve(coverageDir).replace((
+
11248.      8        /\\/g
+
11249.      8    ), "/") + "/";
+
11250.      8
+
11251.      8    processArgv = processArgv.slice();
+
11252.      9    while (processArgv[0] && processArgv[0][0] === "-") {
+
11253.      3        processArgElem = processArgv.shift().split("=");
+
11254.      3        processArgElem[1] = processArgElem.slice(1).join("=");
+
11255.      3        switch (processArgElem[0]) {
+
11256.      3
+
11257.      3// PR-371 - Add cli-option `--exclude=...`.
+
11258.      3
+
11259.      3        case "--exclude":
+
11260.      3            excludeList.push(processArgElem[1]);
+
11261.      3            break;
+
11262.      3
+
11263.      3// PR-371 - Add cli-option `--include=...`
+
11264.      3
+
11265.      3        case "--include":
+
11266.      3            includeList.push(processArgElem[1]);
+
11267.      3            break;
+
11268.      3
+
11269.      3// PR-400
+
11270.      3// Disable default-coverage of directory `node_modules`,
+
11271.      3// but allow override with cli-option `--include-node-modules=1`.
+
11272.      3
+
11273.      3        case "--include-node-modules":
+
11274.      3            modeIncludeNodeModules = !(
+
11275.      3                /0|false|null|undefined/
+
11276.      3            ).test(processArgElem[1]);
+
11277.      3            break;
+
11278.      3        }
+
11279.      7    }
+
11280.      7
+
11281.      7// 1. Spawn node.js program <processArgv> with coverage
+
11282.      7
+
11283.      7    if (processArgv.length > 0) {
+
11284.      6
+
11285.      6// Remove old coverage-files.
+
11286.      6
+
11287.      6        await fsWriteFileWithParents(coverageDir + "/touch.txt", "");
+
11288.      6        await Promise.all(Array.from(
+
11289.      6            await moduleFs.promises.readdir(coverageDir)
+
11290.     11        ).map(async function (file) {
+
11291.     11            if ((
+
11292.     11                /^coverage-\d+?-\d+?-\d+?\.json$/
+
11293.      6            ).test(file)) {
+
11294.      6                consoleError("rm file " + coverageDir + file);
+
11295.      6                await moduleFs.promises.unlink(coverageDir + file);
+
11296.      6            }
+
11297.     11        }));
+
11298.      6        exitCode = await new Promise(function (resolve) {
+
11299.      6            let processArgv0 = processArgv[0];
+
11300.      6
+
11301.      6// If win32 environment, then replace program npm with npm.cmd.
+
11302.      6// Coverage-hack - Ugly-hack to get test-coverage under both win32 and linux.
+
11303.      6
+
11304.      6            if (processArgv0 === "npm") {
+
11305.      6                processArgv0 = process.platform.replace(
+
11306.      6                    "win32",
+
11307.      6                    "npm.cmd"
+
11308.      6                ).replace(
+
11309.      6                    process.platform,
+
11310.      6                    "npm"
+
11311.      6                );
+
11312.      6            }
+
11313.      6            moduleChildProcess.spawn(
+
11314.      6                processArgv0,
+
11315.      6                processArgv.slice(1),
+
11316.      6                {
+
11317.      6                    env: Object.assign({}, process.env, {
+
11318.      6                        NODE_V8_COVERAGE: coverageDir
+
11319.      6                    }),
+
11320.      6
+
11321.      6// PR-465
+
11322.      6// https://nodejs.org/en/blog/vulnerability/april-2024-security-releases-2
+
11323.      6// Node.js will now error with EINVAL if a .bat or .cmd file is passed to
+
11324.      6// child_process.spawn and child_process.spawnSync without the shell option set.
+
11325.      6
+
11326.      6                    shell: (
+
11327.      6                        processArgv0.endsWith(".bat")
+
11328.      6                        || processArgv0.endsWith(".cmd")
+
11329.      6                    ),
+
11330.      6                    stdio: ["ignore", 1, 2]
+
11331.      6                }
+
11332.      6            ).on("exit", resolve);
+
11333.      6        });
+
11334.      6        consoleError(
+
11335.      6            `v8CoverageReportCreate - program exited with exitCode=${exitCode}`
+
11336.      6        );
+
11337.      7    }
+
11338.      7
+
11339.      7// 2. Merge JSON v8-coverage-files in <coverageDir>.
+
11340.      7
+
11341.      7    consoleError("v8CoverageReportCreate - merging coverage files...");
+
11342.      7    v8CoverageObj = await moduleFs.promises.readdir(coverageDir);
+
11343.     18    v8CoverageObj = v8CoverageObj.filter(function (file) {
+
11344.     18        return (
+
11345.     18            /^coverage-\d+?-\d+?-\d+?\.json$/
+
11346.     18        ).test(file);
+
11347.     18    });
+
11348.      7    v8CoverageObj = await Promise.all(v8CoverageObj.map(async function (file) {
+
11349.      7        let data;
+
11350.      7        let pathnameDict = Object.create(null);
+
11351.      7        data = await moduleFs.promises.readFile(coverageDir + file, "utf8");
+
11352.      7        data = JSON.parse(data);
+
11353.    473        data.result.forEach(function (scriptCov) {
+
11354.    473            let pathname = scriptCov.url;
+
11355.    473
+
11356.    473// Filter out internal coverages.
+
11357.    473
+
11358.    393            if (!pathname.startsWith("file:///")) {
+
11359.    393                return;
+
11360.    393            }
+
11361.     80
+
11362.     80// Normalize pathname.
+
11363.     80
+
11364.     80            pathname = moduleUrl.fileURLToPath(pathname);
+
11365.     80            pathname = modulePath.resolve(pathname).replace((
+
11366.     80                /\\/g
+
11367.     80            ), "/");
+
11368.     80
+
11369.     80// Filter files outside of cwd.
+
11370.     80
+
11371.     80            if (pathname.indexOf("[") >= 0 || !pathname.startsWith(cwd)) {
+
11372.     74                return;
+
11373.     74            }
+
11374.      7
+
11375.      7// Normalize pathname relative to cwd.
11376.      7
-
11377.      7// PR-400 - Filter files by glob-patterns in excludeList, includeList.
-
11378.      7
-
11379.      7        data.result = globExclude({
-
11380.      7            excludeList,
-
11381.      7            includeList,
-
11382.      7            pathnameList: Object.keys(pathnameDict)
-
11383.      7        }).pathnameList.map(function (pathname) {
-
11384.      7            return pathnameDict[pathname];
-
11385.      7        });
-
11386.      7        return data;
-
11387.      7    }));
-
11388.      7
-
11389.      7// Merge v8CoverageObj.
-
11390.      7
-
11391.      7    v8CoverageObj = v8CoverageListMerge(v8CoverageObj);
-
11392.      7
-
11393.      7// Debug v8CoverageObj.
-
11394.      7
-
11395.      7    await fsWriteFileWithParents(
-
11396.      7        coverageDir + "v8_coverage_merged.json",
-
11397.      7        JSON.stringify(v8CoverageObj, undefined, 1)
-
11398.      7    );
+
11377.      7            pathname = pathname.slice(cwd.length);
+
11378.      7            scriptCov.url = pathname;
+
11379.      7            pathnameDict[pathname] = scriptCov;
+
11380.      7        });
+
11381.      7
+
11382.      7// PR-400 - Filter directory `node_modules`.
+
11383.      7
+
11384.      7        if (!modeIncludeNodeModules) {
+
11385.      7            excludeList.push("node_modules/");
+
11386.      7        }
+
11387.      7
+
11388.      7// PR-400 - Filter files by glob-patterns in excludeList, includeList.
+
11389.      7
+
11390.      7        data.result = globExclude({
+
11391.      7            excludeList,
+
11392.      7            includeList,
+
11393.      7            pathnameList: Object.keys(pathnameDict)
+
11394.      7        }).pathnameList.map(function (pathname) {
+
11395.      7            return pathnameDict[pathname];
+
11396.      7        });
+
11397.      7        return data;
+
11398.      7    }));
11399.      7
-
11400.      7// 3. Create html-coverage-reports in <coverageDir>.
+
11400.      7// Merge v8CoverageObj.
11401.      7
-
11402.      7    consoleError("v8CoverageReportCreate - creating html-coverage-report...");
-
11403.      7    fileDict = Object.create(null);
-
11404.      7    await Promise.all(v8CoverageObj.result.map(async function ({
-
11405.      7        functions,
-
11406.      7        url: pathname
-
11407.      7    }) {
-
11408.      7        let lineList;
-
11409.      7        let linesCovered;
-
11410.      7        let linesTotal;
-
11411.      7        let source;
-
11412.      7        source = await moduleFs.promises.readFile(pathname, "utf8");
-
11413.      7        lineList = [{}];
-
11414.      7        source.replace((
-
11415.      7            /^.*$/gm
-
11416.  11842        ), function (line, startOffset) {
-
11417.  11842            lineList[lineList.length - 1].endOffset = startOffset - 1;
-
11418.  11842            lineList.push({
-
11419.  11842                count: -1,
-
11420.  11842                endOffset: 0,
-
11421.  11842                holeList: [],
-
11422.  11842                line,
-
11423.  11842                startOffset
-
11424.  11842            });
-
11425.  11842            return "";
-
11426.  11842        });
-
11427.      7        lineList.shift();
-
11428.      7        lineList[lineList.length - 1].endOffset = source.length;
-
11429.     41        functions.reverse().forEach(function ({
-
11430.     41            ranges
-
11431.     41        }) {
-
11432.     65            ranges.reverse().forEach(function ({
-
11433.     65                count,
-
11434.     65                endOffset,
-
11435.     65                startOffset
-
11436.     65            }, ii, list) {
-
11437. 579497                lineList.forEach(function (elem) {
-
11438. 579497                    if (!(
-
11439. 579497                        (
-
11440. 579497                            elem.startOffset <= startOffset
-
11441. 205552                            && startOffset <= elem.endOffset
-
11442. 579432                        ) || (
-
11443. 579432                            elem.startOffset <= endOffset
-
11444. 579432                            && endOffset <= elem.endOffset
-
11445. 579432                        ) || (
-
11446. 579376                            startOffset <= elem.startOffset
-
11447. 579376                            && elem.endOffset <= endOffset
-
11448. 579376                        )
-
11449. 555969                    )) {
-
11450. 555969                        return;
-
11451. 555969                    }
-
11452.  23528
-
11453.  23528// Handle tree-root.
-
11454.  23528
-
11455.  23528                    if (ii + 1 === list.length) {
-
11456.  23259                        if (elem.count === -1) {
-
11457.  23259                            elem.count = count;
-
11458.  23259                        }
-
11459.  23259                        return;
-
11460.  23259                    }
-
11461.    269
-
11462.    269// Handle tree-children.
-
11463.    269
-
11464.    269                    if (elem.count !== 0) {
-
11465.    170                        elem.count = Math.max(count, elem.count);
-
11466.    269                    }
-
11467.    269                    if (count === 0) {
-
11468.    203                        elem.count = 0;
-
11469.    203                        elem.holeList.push([
-
11470.    203                            startOffset, endOffset
-
11471.    203                        ]);
-
11472.    203                    }
-
11473. 579497                });
-
11474.     65            });
-
11475.     41        });
-
11476.      7        linesTotal = lineList.length;
-
11477.  11842        linesCovered = lineList.filter(function ({
-
11478.  11842            count
-
11479.  11842        }) {
-
11480.  11842            return count > 0;
-
11481.  11842        }).length;
-
11482.      7        await moduleFs.promises.mkdir((
-
11483.      7            modulePath.dirname(coverageDir + pathname)
-
11484.      7        ), {
-
11485.      7            recursive: true
-
11486.      7        });
-
11487.      7        fileDict[pathname] = {
-
11488.      7            lineList,
-
11489.      7            linesCovered,
-
11490.      7            linesTotal,
-
11491.      7            modeCoverageIgnoreFile: (
-
11492.      7                (
-
11493.      7                    /^\/\*coverage-ignore-file\*\/$/m
-
11494.      7                ).test(source.slice(0, 65536))
-
11495.      7                ? "(ignore)"
-
11496.      7                : ""
-
11497.      7            ),
-
11498.      7            pathname
-
11499.      7        };
-
11500.      7        htmlRender({
-
11501.      7            fileList: [
-
11502.      7                fileDict[pathname]
-
11503.      7            ],
-
11504.      7            lineList,
-
11505.      7            pathname: coverageDir + pathname
-
11506.      7        });
-
11507.      7    }));
-
11508.      7    htmlRender({
-
11509.      7        fileList: Object.keys(fileDict).sort().map(function (pathname) {
-
11510.      7            return fileDict[pathname];
-
11511.      7        }),
-
11512.      7        modeIndex: true,
-
11513.      7        pathname: coverageDir + "index"
-
11514.      7    });
-
11515.      7    await Promise.all(promiseList);
-
11516.      7    assertOrThrow(
-
11517.      7        exitCode === 0,
-
11518.      7        "v8CoverageReportCreate - nonzero exitCode " + exitCode
-
11519.      7    );
-
11520.      7}
-
11521.      1
-
11522.      1/*
-
11523.      1function sentinel() {}
-
11524.      1*/
-
11525.      1
-
11526.      1// Export jslint as cjs/esm.
-
11527.      1
-
11528.      1jslint_export = Object.freeze(Object.assign(jslint, {
-
11529.      1    assertErrorThrownAsync,
-
11530.      1    assertJsonEqual,
-
11531.      1    assertOrThrow,
-
11532.      1    debugInline,
-
11533.      1    fsWriteFileWithParents,
-
11534.      1    globExclude,
-
11535.      1    htmlEscape,
-
11536.      1    jslint,
-
11537.      1    jslint_apidoc,
-
11538.      1    jslint_assert,
-
11539.      1    jslint_charset_ascii,
-
11540.      1    jslint_cli,
-
11541.      1    jslint_edition,
-
11542.      1    jslint_phase1_split,
-
11543.      1    jslint_phase2_lex,
-
11544.      1    jslint_phase3_parse,
-
11545.      1    jslint_phase4_walk,
-
11546.      1    jslint_phase5_whitage,
-
11547.      1    jslint_report,
-
11548.      1    jstestDescribe,
-
11549.      1    jstestIt,
-
11550.      1    jstestOnExit,
-
11551.      1    moduleFsInit,
-
11552.      1    noop,
-
11553.      1    objectDeepCopyWithKeysSorted,
-
11554.      1    v8CoverageListMerge,
-
11555.      1    v8CoverageReportCreate
-
11556.      1}));
-
11557.      1// module.exports = jslint_export;              // Export jslint as cjs.
-
11558.      1export default Object.freeze(jslint_export);    // Export jslint as esm.
-
11559.      1jslint_import_meta_url = import.meta.url;
-
11560.      1
-
11561.      1// Run jslint_cli.
-
11562.      1jslint_cli({});
-
11563.      1
+
11402.      7    v8CoverageObj = v8CoverageListMerge(v8CoverageObj);
+
11403.      7
+
11404.      7// Debug v8CoverageObj.
+
11405.      7
+
11406.      7    await fsWriteFileWithParents(
+
11407.      7        coverageDir + "v8_coverage_merged.json",
+
11408.      7        JSON.stringify(v8CoverageObj, undefined, 1)
+
11409.      7    );
+
11410.      7
+
11411.      7// 3. Create html-coverage-reports in <coverageDir>.
+
11412.      7
+
11413.      7    consoleError("v8CoverageReportCreate - creating html-coverage-report...");
+
11414.      7    fileDict = Object.create(null);
+
11415.      7    await Promise.all(v8CoverageObj.result.map(async function ({
+
11416.      7        functions,
+
11417.      7        url: pathname
+
11418.      7    }) {
+
11419.      7        let lineList;
+
11420.      7        let linesCovered;
+
11421.      7        let linesTotal;
+
11422.      7        let source;
+
11423.      7        source = await moduleFs.promises.readFile(pathname, "utf8");
+
11424.      7        lineList = [{}];
+
11425.      7        source.replace((
+
11426.      7            /^.*$/gm
+
11427.  11853        ), function (line, startOffset) {
+
11428.  11853            lineList[lineList.length - 1].endOffset = startOffset - 1;
+
11429.  11853            lineList.push({
+
11430.  11853                count: -1,
+
11431.  11853                endOffset: 0,
+
11432.  11853                holeList: [],
+
11433.  11853                line,
+
11434.  11853                startOffset
+
11435.  11853            });
+
11436.  11853            return "";
+
11437.  11853        });
+
11438.      7        lineList.shift();
+
11439.      7        lineList[lineList.length - 1].endOffset = source.length;
+
11440.     41        functions.reverse().forEach(function ({
+
11441.     41            ranges
+
11442.     41        }) {
+
11443.     65            ranges.reverse().forEach(function ({
+
11444.     65                count,
+
11445.     65                endOffset,
+
11446.     65                startOffset
+
11447.     65            }, ii, list) {
+
11448. 580047                lineList.forEach(function (elem) {
+
11449. 580047                    if (!(
+
11450. 580047                        (
+
11451. 580047                            elem.startOffset <= startOffset
+
11452. 205728                            && startOffset <= elem.endOffset
+
11453. 579982                        ) || (
+
11454. 579982                            elem.startOffset <= endOffset
+
11455. 579982                            && endOffset <= elem.endOffset
+
11456. 579982                        ) || (
+
11457. 579926                            startOffset <= elem.startOffset
+
11458. 579926                            && elem.endOffset <= endOffset
+
11459. 579926                        )
+
11460. 556497                    )) {
+
11461. 556497                        return;
+
11462. 556497                    }
+
11463.  23550
+
11464.  23550// Handle tree-root.
+
11465.  23550
+
11466.  23550                    if (ii + 1 === list.length) {
+
11467.  23281                        if (elem.count === -1) {
+
11468.  23281                            elem.count = count;
+
11469.  23281                        }
+
11470.  23281                        return;
+
11471.  23281                    }
+
11472.    269
+
11473.    269// Handle tree-children.
+
11474.    269
+
11475.    269                    if (elem.count !== 0) {
+
11476.    170                        elem.count = Math.max(count, elem.count);
+
11477.    269                    }
+
11478.    269                    if (count === 0) {
+
11479.    203                        elem.count = 0;
+
11480.    203                        elem.holeList.push([
+
11481.    203                            startOffset, endOffset
+
11482.    203                        ]);
+
11483.    203                    }
+
11484. 580047                });
+
11485.     65            });
+
11486.     41        });
+
11487.      7        linesTotal = lineList.length;
+
11488.  11853        linesCovered = lineList.filter(function ({
+
11489.  11853            count
+
11490.  11853        }) {
+
11491.  11853            return count > 0;
+
11492.  11853        }).length;
+
11493.      7        await moduleFs.promises.mkdir((
+
11494.      7            modulePath.dirname(coverageDir + pathname)
+
11495.      7        ), {
+
11496.      7            recursive: true
+
11497.      7        });
+
11498.      7        fileDict[pathname] = {
+
11499.      7            lineList,
+
11500.      7            linesCovered,
+
11501.      7            linesTotal,
+
11502.      7            modeCoverageIgnoreFile: (
+
11503.      7                (
+
11504.      7                    /^\/\*coverage-ignore-file\*\/$/m
+
11505.      7                ).test(source.slice(0, 65536))
+
11506.      7                ? "(ignore)"
+
11507.      7                : ""
+
11508.      7            ),
+
11509.      7            pathname
+
11510.      7        };
+
11511.      7        htmlRender({
+
11512.      7            fileList: [
+
11513.      7                fileDict[pathname]
+
11514.      7            ],
+
11515.      7            lineList,
+
11516.      7            pathname: coverageDir + pathname
+
11517.      7        });
+
11518.      7    }));
+
11519.      7    htmlRender({
+
11520.      7        fileList: Object.keys(fileDict).sort().map(function (pathname) {
+
11521.      7            return fileDict[pathname];
+
11522.      7        }),
+
11523.      7        modeIndex: true,
+
11524.      7        pathname: coverageDir + "index"
+
11525.      7    });
+
11526.      7    await Promise.all(promiseList);
+
11527.      7    assertOrThrow(
+
11528.      7        exitCode === 0,
+
11529.      7        "v8CoverageReportCreate - nonzero exitCode " + exitCode
+
11530.      7    );
+
11531.      7}
+
11532.      1
+
11533.      1/*
+
11534.      1function sentinel() {}
+
11535.      1*/
+
11536.      1
+
11537.      1// Export jslint as cjs/esm.
+
11538.      1
+
11539.      1jslint_export = Object.freeze(Object.assign(jslint, {
+
11540.      1    assertErrorThrownAsync,
+
11541.      1    assertJsonEqual,
+
11542.      1    assertOrThrow,
+
11543.      1    debugInline,
+
11544.      1    fsWriteFileWithParents,
+
11545.      1    globExclude,
+
11546.      1    htmlEscape,
+
11547.      1    jslint,
+
11548.      1    jslint_apidoc,
+
11549.      1    jslint_assert,
+
11550.      1    jslint_charset_ascii,
+
11551.      1    jslint_cli,
+
11552.      1    jslint_edition,
+
11553.      1    jslint_phase1_split,
+
11554.      1    jslint_phase2_lex,
+
11555.      1    jslint_phase3_parse,
+
11556.      1    jslint_phase4_walk,
+
11557.      1    jslint_phase5_whitage,
+
11558.      1    jslint_report,
+
11559.      1    jstestDescribe,
+
11560.      1    jstestIt,
+
11561.      1    jstestOnExit,
+
11562.      1    moduleFsInit,
+
11563.      1    noop,
+
11564.      1    objectDeepCopyWithKeysSorted,
+
11565.      1    v8CoverageListMerge,
+
11566.      1    v8CoverageReportCreate
+
11567.      1}));
+
11568.      1// module.exports = jslint_export;              // Export jslint as cjs.
+
11569.      1export default Object.freeze(jslint_export);    // Export jslint as esm.
+
11570.      1jslint_import_meta_url = import.meta.url;
+
11571.      1
+
11572.      1// Run jslint_cli.
+
11573.      1jslint_cli({});
+
11574.      1
  163.      1    + "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"