From ddf6b27cfb3261a3334d97d1561dc8c366d1557f Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Wed, 1 May 2024 11:52:45 +0800 Subject: [PATCH 01/38] chore: insiders changelog --- CHANGELOG.md | 10 ++++++++++ insiders.json | 10 +++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 901d81fb4b..55fb576af4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 2.1.0-insiders.8 (2024/5/1) + +Download Pages: [GitHub Releases](https://github.com/volarjs/insiders/releases/tag/v2.1.0-insiders.8), [爱发电电圈](https://afdian.net/p/f45436ca076d11ef9b7352540025c377) + +> [Join the Insiders Program](https://github.com/vuejs/language-tools/wiki/Get-Insiders-Edition) for more exclusive features and updates. + +### Other Changes + +- Merged [v2.0.16](https://github.com/vuejs/language-tools/blob/master/CHANGELOG.md#2016-202451). + ## 2.0.16 (2024/5/1) ### Bug Fixes diff --git a/insiders.json b/insiders.json index 08b2b346d2..e113b6e054 100644 --- a/insiders.json +++ b/insiders.json @@ -1,6 +1,14 @@ { - "latest": "2.1.0-insiders.7", + "latest": "2.1.0-insiders.8", "versions": [ + { + "version": "2.1.0-insiders.8", + "date": "2024-5-1", + "downloads": { + "GitHub": "https://github.com/volarjs/insiders/releases/tag/v2.1.0-insiders.8", + "AFDIAN": "https://afdian.net/p/f45436ca076d11ef9b7352540025c377" + } + }, { "version": "2.1.0-insiders.7", "date": "2024-4-30", From d587ba044ca4a1cf795f135752aaa2c36cb66e95 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 2 May 2024 00:22:29 +0000 Subject: [PATCH 02/38] ci(language-service): update html data --- packages/language-service/data/template/cs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/language-service/data/template/cs.json b/packages/language-service/data/template/cs.json index a89db435dd..8d31e4fafe 100644 --- a/packages/language-service/data/template/cs.json +++ b/packages/language-service/data/template/cs.json @@ -1156,7 +1156,7 @@ "name": "v-once", "description": { "kind": "markdown", - "value": "\nVykreslit element nebo komponentu pouze jednou a přeskočit budoucí aktualizace.\n\n- **Nepředpokládá výraz** \n\n- **Podrobnosti**\n\n Při dalších překreslováních budou element/komponenta a všichni potomci považováni za statický obsah a přeskočeni. To lze použít k optimalizaci výkonu aktualizace.\n\n ```html\n \n Toto se nikdy nezmění: {{msg}}\n \n
\n

komentář

\n

{{msg}}

\n
\n \n \n \n \n ```\n\n Od verze 3.2 si můžete také část šablony „zapamatovat“ (memoize) s podmínkami neplatnosti pomocí [`v-memo`](#v-memo).\n\n- **Viz také:**\n - [Syntaxe šablon - Interpolace textu](https://cs.vuejs.org/guide/essentials/template-syntax.html#text-interpolation)\n - [v-memo](#v-memo)\n" + "value": "\nVykreslit element nebo komponentu pouze jednou a přeskočit budoucí aktualizace.\n\n- **Nepředpokládá výraz** \n\n- **Podrobnosti**\n\n Při dalších překreslováních budou element/komponenta a všichni potomci považováni za statický obsah a přeskočeni. To lze použít k optimalizaci výkonu aktualizace.\n\n ```html\n \n Toto se nikdy nezmění: {{msg}}\n \n
\n

Komentář

\n

{{msg}}

\n
\n \n \n \n \n ```\n\n Od verze 3.2 si můžete také část šablony „zapamatovat“ (memoize) s podmínkami neplatnosti pomocí [`v-memo`](#v-memo).\n\n- **Viz také:**\n - [Syntaxe šablon - Interpolace textu](https://cs.vuejs.org/guide/essentials/template-syntax.html#text-interpolation)\n - [v-memo](#v-memo)\n" }, "references": [ { From a71e305fab0bda4f8b6bde12f825749a33dbfc77 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 2 May 2024 11:17:52 +0800 Subject: [PATCH 03/38] fix(language-core): hover not working for intrinsic element event name --- .../lib/codegen/template/elementEvents.ts | 13 ++++++-- .../lib/codegen/template/elementProps.ts | 30 +++++++++---------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/packages/language-core/lib/codegen/template/elementEvents.ts b/packages/language-core/lib/codegen/template/elementEvents.ts index eafa4d9d2b..ee0644f47d 100644 --- a/packages/language-core/lib/codegen/template/elementEvents.ts +++ b/packages/language-core/lib/codegen/template/elementEvents.ts @@ -30,7 +30,7 @@ export function* generateElementEvents( yield `let ${eventVar} = { '${prop.arg.loc.source}': __VLS_pickEvent(`; yield `${eventsVar}['${prop.arg.loc.source}'], `; yield `({} as __VLS_FunctionalComponentProps)`; - yield* generateEventArg(options, ctx, prop.arg, true); + yield* generateEventArg(options, ctx, prop.arg, true, false); yield `) }${endOfLine}`; yield `${eventVar} = { `; if (prop.arg.loc.source.startsWith('[') && prop.arg.loc.source.endsWith(']')) { @@ -105,7 +105,14 @@ export function* generateEventArg( ctx: TemplateCodegenContext, arg: CompilerDOM.SimpleExpressionNode, access: boolean, + enableHover: boolean, ): Generator { + const features = enableHover + ? { + ...ctx.codeFeatures.withoutHighlightAndCompletion, + ...eventArgFeatures, + } + : eventArgFeatures; if (arg.loc.source.startsWith('[') && arg.loc.source.endsWith(']')) { yield `[`; yield* generateInterpolation( @@ -124,7 +131,7 @@ export function* generateEventArg( if (access) { yield `.`; } - yield ['', 'template', arg.loc.start.offset, eventArgFeatures]; + yield ['', 'template', arg.loc.start.offset, features]; yield `on`; yield* generateCamelized( capitalize(arg.loc.source), @@ -139,7 +146,7 @@ export function* generateEventArg( yield* wrapWith( arg.loc.start.offset, arg.loc.end.offset, - eventArgFeatures, + features, `'`, ['', 'template', arg.loc.start.offset, combineLastMapping], 'on', diff --git a/packages/language-core/lib/codegen/template/elementProps.ts b/packages/language-core/lib/codegen/template/elementProps.ts index e1e4ba00cc..99382ac6c4 100644 --- a/packages/language-core/lib/codegen/template/elementProps.ts +++ b/packages/language-core/lib/codegen/template/elementProps.ts @@ -37,7 +37,21 @@ export function* generateElementProps( classAttrNum++; } - if (!isIntrinsicElement) { + if (isIntrinsicElement) { + for (const prop of props) { + if ( + prop.type === CompilerDOM.NodeTypes.DIRECTIVE + && prop.name === 'on' + && prop.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION + ) { + yield* generateEventArg(options, ctx, prop.arg, false, true); + yield `: `; + yield* generateEventExpression(options, ctx, prop); + yield `,${newLine}`; + } + } + } + else { let generatedEvent = false; for (const prop of props) { if ( @@ -59,20 +73,6 @@ export function* generateElementProps( yield `}, `; } } - else { - for (const prop of props) { - if ( - prop.type === CompilerDOM.NodeTypes.DIRECTIVE - && prop.name === 'on' - && prop.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION - ) { - yield* generateEventArg(options, ctx, prop.arg, false); - yield `: `; - yield* generateEventExpression(options, ctx, prop); - yield `,${newLine}`; - } - } - } for (const prop of props) { if ( From 7064b326bb68e0d9ee328957d240c7c78727088c Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 2 May 2024 12:00:43 +0800 Subject: [PATCH 04/38] chore: update sponsors --- .github/FUNDING.yml | 1 - .github/sponsors/365talents.png | Bin 7226 -> 0 bytes .github/sponsors/StackBlitz.png | Bin 110679 -> 0 bytes .github/sponsors/nuxt.svg | 10 ---------- .github/sponsors/prefect.svg | 18 ------------------ .github/sponsors/volta.svg | 1 - .github/sponsors/vue.png | Bin 3451 -> 0 bytes README.md | 2 +- 8 files changed, 1 insertion(+), 31 deletions(-) delete mode 100644 .github/sponsors/365talents.png delete mode 100644 .github/sponsors/StackBlitz.png delete mode 100644 .github/sponsors/nuxt.svg delete mode 100644 .github/sponsors/prefect.svg delete mode 100644 .github/sponsors/volta.svg delete mode 100644 .github/sponsors/vue.png diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index effb552e4d..c7fb7857f9 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,2 +1 @@ github: johnsoncodehk -open_collective: volarjs diff --git a/.github/sponsors/365talents.png b/.github/sponsors/365talents.png deleted file mode 100644 index 296e2f552ad863af9ca2d01aacc2feb464b2833d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7226 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 diff --git a/.github/sponsors/StackBlitz.png b/.github/sponsors/StackBlitz.png deleted file mode 100644 index aaf720066922b6090d1bb77434039aaaf7d9fd25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110679 zcmbTe2UwI>6E^%HC_xD%Xatp_xQbEfN^f~lVJ)E16%m!irC2CS@34XqBM7osP^vMJ zWC1}D>9DI2LJ+WoqO?^AsIN&DwK3rO_g`@ZWx*A)$T_MAC$X70IX&cM%m%}l;t zymB#yVPBI?xBZA=%i;eQT70z#zVp51U;+FkLN~Q^$1tU}=sy9U-weGlY?0;31BW~g z?b)qEb8%9#v2{6ar{v>AhuIjWXXrz>p`Et#Sbf~i;iR*^d~ZRC{OXgo`tlZA_o(cl z8{3^YY3k=@x8Kj~0L||-P1{!9&|tNmj}9#0WanYC+Q-S!*m-zWfhp!_|lO>|Jf_;%2v6LrF!ErlO*@T2os|Rbz|#R<+Hm)l}3}lvPxf)m0Q# zx9V(F(NWi0Jw4=MH#b{*ogcUDnBEJ%(w9Hs;X&6?R`&MxR`OO?a&dD|R@K(lR#s6{ zR#Q`i8H(<{&K@>Ciq7t9XI9u|=T37wN%uJE;=CHIXmi}f(?ee#B;_B$i9Wlmv-`A~ zKw-*0HgsiGB^7iee4;IFb{^f+%@N<+mZogyXy;_-?BNb`RcGhYPq=uvxSw#DXX)90 z{?7)W+C6(__aKzT$!T^AcaQB}aExh%5YBc#;7hkt{?X3e#nX*ux7`cGT#HUa*D-dp zv+;0oJK*BtICD{ZXGC7D1}9m)!Q!N|t&6w&_j5jAx6Q`GPG26~nxcx9qN?fvRSg{# zH61loMHNjQ6&3!}JubExgg2~w0c-Z`3C)?6=>|NZP zY~a8roopQJl*|E(r(H`Y+q z*3eK?Q&Ppn-LprB?CkDg<4m(7Z_}3tSUpEt;^J zww9u%x~BH=t@i5n$5m}-Rx@`y2@YxFICoVfl`X8OVsB%+)kalKajOc5rbgRhr>K2g zRb5d{TVtz@t)`ldmd#dV_P8bKn4WZpJNBJ+r2TfT)Bopqay4!|IyN-q6#DWsWDRy8 z0sq@43H0&*wDa`my-(P|qW=dg;cw&aV(;N?<7W4R1L*GmYK6-43h(0VW#=|We7cRB z4PcR-o4dZey_<{EY8yJ;@g&U#omJV(*>>8+XK!b9shq+G_8Kx2^(hzJ3w+}d2|?Mgn9hSSN_~C@PC_wk2BK&bkYCLqCI>u8!zmf zVQDvr29q)|0hquazmm88aKI^~)LTRD2yq zz#571+;|W3ux7z8Clw~{RlzXPim-75klS0hnLzHYzbuhbxecKDI8t3O&norbU&mgv zfrWfN7&6)!vhdA-CP{e?+08$9-RCple0PvsM%97qV8<-MJp?-r86i#ib*+-;3|EkI zw4SW|av7@J*$@FNIi>W)U_pR35`N5j!I#szUhst}aGZojL9lyo+Fp@waG7;z*S#uiNc;`cMvm4Qeez z*Z1~JpGV*omnb2H@}|VwUoM3SdmYq=Z<{sw-@YyhuLE>v= zg80$bwu7=#5+Vui@o(G$1umv^?qf#zT9QUwwcjl-Xe6-1f0iPh3BKGBBF8*Z%#-le zT}3eKLn(flS_^g03uS;qh9!JWaOHljg~)lO3uKUQJcuFi4Wr(#kdMiBZvex|$!H>2 z_?phm!nTYrl6~mcqbz!puW$p*DHYFrjx_?qCa(7%hA*=?t0<&e8RV^PUy>h z{odkg7k!xsuCLbcXzQ1IGGrytHA}vtk$kSS1&P-Yi0_AM^cWR_ft_JAmy~zZEWal4 z4uMubM4*EPq<|4#Z)=rxQEh0=CfG9(cgNn$i$aE^72WTaM**VLzaW~)m(In50q)b- z-S_ItGa88}P>_qQ(b~(u$RVG=FK2 zC55K<>|r9a!K31j%V9f9jy}Qt$)fw?wtcrFBne#p4{q^%d(odSUJI7DDPQ@^8Bf?_NH*mA-Wr_qOrP~8?{}~AlE#CGxO_f7ZU>WN+^Q)v<+(jqB;HIOpo6{d zJsu+vvVAco_{Qetgh~7yZ7g>p)M^TTH;eTVKu$pTB|ZScJ~nqyZ{FR4@!do}N{a*?Hp@?W|Ly1U zfPdq2R89a#Tt9IUnF0zspO2?54#=apzrpc3-^*BM!g6xNLV4j=cX%S}Csw=yI$5&l2AuST6Use>&ZZ&-a_c<8O_)e-6;Zz2R*v8dHM+&mj%&Yb zJ`nY}MDX>w*EsM8RI(B0BQ!iIF=TjtPK`K|5|;x0zY0IC(D%82kG zy?#CzHrlC3b0yh0-q$FNI*0%JtN(s|f)FotbpTl!uaN<`(Z8R_1*tyBoZenMV-jLP z?g`iYd^`AB5ZRKEvM918#8z3d1lB7Wg^u?xkkAc}kYy5@ipp*TQkQj@ro2|S=lT>v zWs{M2s#VK#u4V5!)_sTY>W<)7r?tmqnaD9kg(mTuwO`83c#X4N_B-ug5QY;%!MQzX zv&C}m(r|CrQRMq#@TY{XG_TVn-(h)o{RKWp3>uHtBg^D~In~wZdc7rQ}zRrya>dSa|;0BN3Do%m#c+fI#UyQLV3ZP6=U>*c#l-V zJzWv+rz(RJ$Gw;FC$@4eS-$iJCbItr>HD-$mce$_?gzb(A0WbMEhS_KT~9=|&1-cg zh!`*uq|EECkqr*?)@P0V`>Pe9#YBc9)5~};?GG;ta1QMHwO?T=C~T zggG6A&_VaZ$mPA%Mb?w9RdE=~Eoi75h zq0>O|&YSW&hzURn!fft&{cs`cTBUc{4MbdueG-|I){pX>mNqZ#cL#|Tj_{g(c3Viv zOG4op04r?Qk5bXx4Bz=E5{8s$VvlFXtY%e=klA5Bqm}kS?w^tBEy@ONPDJb&Bz!Gn z(nvugBoi#6Yc;~{Xc>syKqxX>8R5wysMJk?*u8yF79#`-tOTLG6e@2dv;_`Ep2@>G z#pgD_Ys8`SnEfh|;y;>IRpuoc+&mmG0wAB2EFfOW3Y|`Ht;G1o93mINf_A~RQjNfI z8_o-r{4=k~jbBB|G(s5z%qt~UgB;G0*maQSh?93@?^<+v-n?QwnlJiwQ=S>I!39LZ zjz&>G3-vy6A_}sMY7{lzejm+EK)F1H2$-hl-0btv-|4nAntL>skZg=d0NyYX`BkD? zCGExLkW?HXLLBZcbkly@NIo5e@Qf9==xiYgbz1h`P7Lv++gc4h!0KDuK?gi2}34=7l#S?)Q_W&rna$cMm zIoN?r$Sm5FcdUt6kFvO+MY&8~ln{E`l}`0QC=$%uwhO4=)k5lVR-U|}Xro+CVbA4=&&c!?d`i99rH zTgWbAKPkkEmkin(i6h6e<2?)sb19#TxVx1>`74UqxQ#UOlsNhn;%>ePcVMN{*W!OA zwwF3YczhN{bALn{AS7eF!$vj7RYgnAAv0$Eo%L77W8>cD9LjI`v{Xj#!(b5M?&y$U_2`8t|=%n#~EglrreTMb6Zdjd}b7fk7L^Jx7V zZqR|M;0Q5#q!l$vuQd;XHjD|qFA#sdc`7W=De@v@+SDYt9Y&0TM58~kql}?sIDQM< z3aV9ZC*B1arCBY=ecqJbGLPIj`1;?WggMTXXV)!JOr1AIbu}QEW*9FOk&P%I;yYLv zQdRu2XzmZhi6Fxm>D%m_DKB|ma=~7MEKcDEk`J9YcaTOeC-jX55Og*q0>a%TqA2W} zXcZF|oD$t>=4i$dBD59>yoLMw&qCr*=pyDrp-7F9S50}Vo0R9_L+mxE(qlp<`D6yM zP*vpfK|cY`&wjSTyslSXLT?)?jT3?df8IWrSBJ7q?sj4g9MD3pn7Ik^wLODk$86_? zx!>ss=Bbj~LWEriVE})HQUQ8y@|rO68X+{HJ_YljYzqnN37RKsz*tDzp<9vl2c$J~ zQi-kYcRXw5u0s__(ydqP3g;)`zkA>T${zyM6=K&tg;bh+UPvy1kb7e_$b~qNxJ!O3 zVz54EzKYRa#N(yTB1Y7&D$glvBSdE-IUJowZa9%f)|7*rc)dmMgGY!MMzS~#(g8o4 z@}Auww7R!TK�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 - - - - - - - - - diff --git a/.github/sponsors/prefect.svg b/.github/sponsors/prefect.svg deleted file mode 100644 index f60f88c40e..0000000000 --- a/.github/sponsors/prefect.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/.github/sponsors/volta.svg b/.github/sponsors/volta.svg deleted file mode 100644 index c3a5182226..0000000000 --- a/.github/sponsors/volta.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/.github/sponsors/vue.png b/.github/sponsors/vue.png deleted file mode 100644 index 60e17006ad07cd313788585e2f5e528fbb7cf821..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3451 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 diff --git a/README.md b/README.md index 12d55b132c..2bcb0b6c9f 100644 --- a/README.md +++ b/README.md @@ -319,7 +319,7 @@ flowchart LR

Boot a fresh environment in milliseconds.

From a7af82493693a6b8cbed7684737cade28c8e29b2 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 4 May 2024 00:21:43 +0000 Subject: [PATCH 05/38] ci(language-service): update html data --- packages/language-service/data/template/ja.json | 2 +- packages/language-service/data/template/ru.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/language-service/data/template/ja.json b/packages/language-service/data/template/ja.json index 403346108f..0eaf1dcb1b 100644 --- a/packages/language-service/data/template/ja.json +++ b/packages/language-service/data/template/ja.json @@ -1156,7 +1156,7 @@ "name": "v-once", "description": { "kind": "markdown", - "value": "\n要素やコンポーネントを一度だけレンダリングし、その後の更新はスキップします。\n\n- **式を受け取りません**\n\n- **詳細**\n\n その後の再レンダリングでは、要素/コンポーネントとそのすべての子要素は静的コンテンツとして扱われ、スキップされます。これは、更新のパフォーマンスを最適化するために使用できます。\n\n ```html\n \n This will never change: {{msg}}\n \n
\n

comment

\n

{{msg}}

\n
\n \n \n \n
    \n
  • {{i}}
  • \n
\n ```\n\n 3.2 以降では、[`v-memo`](#v-memo) を使って、テンプレートの一部を無効化する条件付きでメモ化できます。\n\n- **参照**\n - [データバインディング構文 - 展開](https://ja.vuejs.org/guide/essentials/template-syntax.html#text-interpolation)\n - [v-memo](#v-memo)\n" + "value": "\n要素やコンポーネントを一度だけレンダリングし、その後の更新はスキップします。\n\n- **式を受け取りません**\n\n- **詳細**\n\n その後の再レンダリングでは、要素/コンポーネントとそのすべての子要素は静的コンテンツとして扱われ、スキップされます。これは、更新のパフォーマンスを最適化するために使用できます。\n\n ```html\n \n This will never change: {{msg}}\n \n
\n

Comment

\n

{{msg}}

\n
\n \n \n \n
    \n
  • {{i}}
  • \n
\n ```\n\n 3.2 以降では、[`v-memo`](#v-memo) を使って、テンプレートの一部を無効化する条件付きでメモ化できます。\n\n- **参照**\n - [データバインディング構文 - 展開](https://ja.vuejs.org/guide/essentials/template-syntax.html#text-interpolation)\n - [v-memo](#v-memo)\n" }, "references": [ { diff --git a/packages/language-service/data/template/ru.json b/packages/language-service/data/template/ru.json index 8d3095810b..96fb82f432 100644 --- a/packages/language-service/data/template/ru.json +++ b/packages/language-service/data/template/ru.json @@ -1384,7 +1384,7 @@ "name": "ref", "description": { "kind": "markdown", - "value": "\nОзначает [ссылку на элементы шаблона](https://ru.vuejs.org/guide/essentials/template-refs.html).\n\n- **Ожидает** `string | Function`\n\n- **Подробности**\n\n Атрибут `ref` используется для регистрации ссылки на элемент или дочерний компонент.\n\n В Options API, ссылка будет зарегистрирована в объекте компонента `this.$refs`:\n\n ```html\n \n

hello

\n ```\n\n В Composition API, ссылка будет храниться в ref с соответствующим именем:\n\n ```vue\n \n\n \n ```\n\n При использовании на обычном DOM-элементе ссылка будет указывать на этот элемент; при использовании на дочернем компоненте ссылка будет указывать на экземпляр дочернего компонента.\n\n В качестве альтернативы `ref` может принимать функцию, что даёт полный контроль над тем, где хранить ссылку:\n\n ```html\n child = el\" />\n ```\n\n Важное замечание о времени регистрации ref-ссылок: поскольку эти ссылки создаются render-функцией, нужно подождать, пока компонент будет смонтирован, прежде чем обращаться к ним.\n\n Так же свойство `this.$refs` не реактивно, поэтому не следует использовать его в шаблонах для привязки данных.\n\n- **См. также**\n - [Руководство — Ссылки на элементы шаблона](https://ru.vuejs.org/guide/essentials/template-refs.html)\n - [Guide - Typing Template Refs](https://ru.vuejs.org/guide/typescript/composition-api.html#typing-template-refs) \n - [Guide - Typing Component Template Refs](https://ru.vuejs.org/guide/typescript/composition-api.html#typing-component-template-refs) \n" + "value": "\nОзначает [ссылку на элементы шаблона](https://ru.vuejs.org/guide/essentials/template-refs.html).\n\n- **Ожидает** `string | Function`\n\n- **Подробности**\n\n Атрибут `ref` используется для регистрации ссылки на элемент или дочерний компонент.\n\n В Options API, ссылка будет зарегистрирована в объекте компонента `this.$refs`:\n\n ```html\n \n

hello

\n ```\n\n В Composition API, ссылка будет храниться в ref с соответствующим именем:\n\n ```vue\n \n\n \n ```\n\n При использовании на обычном DOM-элементе ссылка будет указывать на этот элемент; при использовании на дочернем компоненте ссылка будет указывать на экземпляр дочернего компонента.\n\n В качестве альтернативы `ref` может принимать функцию, что даёт полный контроль над тем, где хранить ссылку:\n\n ```html\n child = el\" />\n ```\n\n Важное замечание о времени регистрации ref-ссылок: поскольку эти ссылки создаются render-функцией, нужно подождать, пока компонент будет смонтирован, прежде чем обращаться к ним.\n\n Так же свойство `this.$refs` не реактивно, поэтому не следует использовать его в шаблонах для привязки данных.\n\n- **См. также**\n - [Руководство — Ссылки на элементы шаблона](https://ru.vuejs.org/guide/essentials/template-refs.html)\n - [Руководство - Типизация ссылок на шаблоны](https://ru.vuejs.org/guide/typescript/composition-api.html#typing-template-refs) \n - [Руководство - Типизация ссылок на шаблоны компонентов](https://ru.vuejs.org/guide/typescript/composition-api.html#typing-component-template-refs) \n" }, "references": [ { From 4d8529b45f94dbd4695df58aba5954e3ba5097cb Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Sat, 4 May 2024 12:06:55 +0800 Subject: [PATCH 06/38] fix(language-core): showing false _declared but not used_ errors for functions used in v-on="{}" close #4333 --- .../lib/codegen/template/elementProps.ts | 14 +++++++++----- test-workspace/tsc/vue3/#4333/main.vue | 7 +++++++ 2 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 test-workspace/tsc/vue3/#4333/main.vue diff --git a/packages/language-core/lib/codegen/template/elementProps.ts b/packages/language-core/lib/codegen/template/elementProps.ts index 99382ac6c4..2ed1454590 100644 --- a/packages/language-core/lib/codegen/template/elementProps.ts +++ b/packages/language-core/lib/codegen/template/elementProps.ts @@ -42,12 +42,16 @@ export function* generateElementProps( if ( prop.type === CompilerDOM.NodeTypes.DIRECTIVE && prop.name === 'on' - && prop.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION ) { - yield* generateEventArg(options, ctx, prop.arg, false, true); - yield `: `; - yield* generateEventExpression(options, ctx, prop); - yield `,${newLine}`; + if (prop.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) { + yield* generateEventArg(options, ctx, prop.arg, false, true); + yield `: `; + yield* generateEventExpression(options, ctx, prop); + yield `,${newLine}`; + } + else if (prop.exp?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) { + propsFailedExps?.push(prop.exp); + } } } } diff --git a/test-workspace/tsc/vue3/#4333/main.vue b/test-workspace/tsc/vue3/#4333/main.vue new file mode 100644 index 0000000000..a9b63be066 --- /dev/null +++ b/test-workspace/tsc/vue3/#4333/main.vue @@ -0,0 +1,7 @@ + + + From 7e40bca319731505a96851c6ea33cc0afe5b2a2e Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Sat, 4 May 2024 12:20:56 +0800 Subject: [PATCH 07/38] fix(language-core): fix nameless event expression formatting --- .../lib/plugins/vue-template-inline-ts.ts | 2 +- .../language-service/tests/format/4333.spec.ts | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 packages/language-service/tests/format/4333.spec.ts diff --git a/packages/language-core/lib/plugins/vue-template-inline-ts.ts b/packages/language-core/lib/plugins/vue-template-inline-ts.ts index 0501f8884e..781f4d118f 100644 --- a/packages/language-core/lib/plugins/vue-template-inline-ts.ts +++ b/packages/language-core/lib/plugins/vue-template-inline-ts.ts @@ -92,7 +92,7 @@ const plugin: VueLanguagePlugin = ctx => { prop.exp?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION && prop.exp.constType !== CompilerDOM.ConstantTypes.CAN_STRINGIFY // style='z-index: 2' will compile to {'z-index':'2'} ) { - if (prop.name === 'on') { + if (prop.name === 'on' && prop.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION) { const ast = createTsAst(ctx.modules.typescript, prop.exp, prop.exp.content); addFormatCodes( prop.exp.content, diff --git a/packages/language-service/tests/format/4333.spec.ts b/packages/language-service/tests/format/4333.spec.ts new file mode 100644 index 0000000000..03b8a21eb1 --- /dev/null +++ b/packages/language-service/tests/format/4333.spec.ts @@ -0,0 +1,14 @@ +import { defineFormatTest } from '../utils/format'; + +defineFormatTest({ + title: '#' + __filename.split('.')[0], + languageId: 'vue', + input: ` + + `.trim(), + settings: { + 'typescript.format.semicolons': 'insert', + } +}); From 4dc00e66956b4781850ce9cf205d8504be86a52c Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 5 May 2024 00:24:09 +0000 Subject: [PATCH 08/38] ci(language-service): update html data --- packages/language-service/data/language-blocks/ru.json | 2 +- packages/language-service/data/template/ru.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/language-service/data/language-blocks/ru.json b/packages/language-service/data/language-blocks/ru.json index 48c1e1389a..60751352af 100644 --- a/packages/language-service/data/language-blocks/ru.json +++ b/packages/language-service/data/language-blocks/ru.json @@ -688,7 +688,7 @@ "valueSet": "v", "description": { "kind": "markdown", - "value": "\nСекция `\n```\n\nПолученные классы хэшируются во избежание коллизий, что позволяет добиться того же эффекта, что и при выборе CSS с ограниченной областью действия только для текущего компонента.\n\nОбратитесь к [спецификации CSS модулей](https://github.com/css-modules/css-modules) для получения более подробной информации, такой как [глобальные исключения](https://github.com/css-modules/css-modules#exceptions) и [композиция](https://github.com/css-modules/css-modules#composition).\n\n### Внедрение пользовательского имени \n\nМожно настроить ключ свойства объекта внедряемых классов, указав значение атрибуту `module`:\n\n```vue\n\n\n\n```\n\n### Использование с Composition API \n\nДоступ к внедряемым классам можно получить в `setup()` и ` From dc0afd2cafd5fd1b24d4ffcb912257f8e7e4f59e Mon Sep 17 00:00:00 2001 From: Julien Huang Date: Wed, 8 May 2024 09:23:53 +0200 Subject: [PATCH 14/38] chore: fix typo (#4351) --- extensions/vscode/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/vscode/package.json b/extensions/vscode/package.json index 1f5f100e5c..9593550504 100644 --- a/extensions/vscode/package.json +++ b/extensions/vscode/package.json @@ -426,7 +426,7 @@ }, { "command": "vue.findAllFileReferences", - "title": "Find File References via Vue Langauge Server", + "title": "Find File References via Vue Language Server", "category": "Vue" } ], From 72704dd82360b7aafd5a689285cac34acb7e6150 Mon Sep 17 00:00:00 2001 From: Artfaith Date: Wed, 8 May 2024 09:26:25 +0200 Subject: [PATCH 15/38] docs: removed possibly redundant duplicate reference (#4348) Removed possibly redundant duplicate reference --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 2bcb0b6c9f..d093f0beb5 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,6 @@ - [Vue Language Features](https://github.com/vuejs/language-tools/tree/master/extensions/vscode) \ *Vue, Vitepress, petite-vue language support extension for VSCode* -- [TypeScript Vue Plugin](https://github.com/vuejs/language-tools/tree/master/packages/typescript-plugin) \ -*VSCode extension to support Vue in TS server* - [vue-tsc](https://github.com/vuejs/language-tools/tree/master/packages/tsc) \ *Type-check and dts build command line tool* - [vue-component-meta](https://github.com/vuejs/language-tools/tree/master/packages/component-meta) \ From 964ea64cd3aaea348611ddc2453776305c51fa2a Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Wed, 8 May 2024 16:11:01 +0800 Subject: [PATCH 16/38] fix(language-core): types imported in the ` + + From d0ed952b245977f16d978d40cee500a34d925f57 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Wed, 8 May 2024 20:07:23 +0800 Subject: [PATCH 17/38] feat(language-core): support jsdoc for script setup binding variables close #3409 --- .../lib/codegen/script/internalComponent.ts | 2 +- .../lib/codegen/script/template.ts | 4 +- .../lib/codegen/template/context.ts | 41 +++++++++++++------ .../lib/codegen/template/elementDirectives.ts | 2 +- .../lib/codegen/template/elementProps.ts | 2 +- .../lib/codegen/template/index.ts | 5 ++- .../lib/codegen/template/interpolation.ts | 4 +- packages/language-core/lib/plugins/vue-tsx.ts | 14 +++++++ 8 files changed, 52 insertions(+), 22 deletions(-) diff --git a/packages/language-core/lib/codegen/script/internalComponent.ts b/packages/language-core/lib/codegen/script/internalComponent.ts index c5a0d600e1..b0121d6130 100644 --- a/packages/language-core/lib/codegen/script/internalComponent.ts +++ b/packages/language-core/lib/codegen/script/internalComponent.ts @@ -28,7 +28,7 @@ export function* generateInternalComponent( ]) { for (const expose of bindings) { const varName = content.substring(expose.start, expose.end); - if (!templateUsageVars.has(varName) && !templateCodegenCtx.accessGlobalVariables.has(varName)) { + if (!templateUsageVars.has(varName) && !templateCodegenCtx.accessExternalVariables.has(varName)) { continue; } const templateOffset = options.getGeneratedLength(); diff --git a/packages/language-core/lib/codegen/script/template.ts b/packages/language-core/lib/codegen/script/template.ts index 1acdc6653d..a5fe917c6f 100644 --- a/packages/language-core/lib/codegen/script/template.ts +++ b/packages/language-core/lib/codegen/script/template.ts @@ -17,13 +17,13 @@ export function* generateTemplate( ctx.generatedTemplate = true; if (!options.vueCompilerOptions.skipTemplateCodegen) { - const templateCodegenCtx = createTemplateCodegenContext(); if (isClassComponent) { yield `__VLS_template() {${newLine}`; } else { yield `function __VLS_template() {${newLine}`; } + const templateCodegenCtx = createTemplateCodegenContext(new Set()); yield* generateCtx(options, ctx, isClassComponent); yield* generateTemplateContext(options, templateCodegenCtx); yield* generateExportOptions(options); @@ -255,7 +255,7 @@ export function getTemplateUsageVars(options: ScriptCodegenOptions, ctx: ScriptC usageVars.add(component.split('.')[0]); } } - for (const [varName] of options.templateCodegen.ctx.accessGlobalVariables) { + for (const [varName] of options.templateCodegen.ctx.accessExternalVariables) { usageVars.add(varName); } } diff --git a/packages/language-core/lib/codegen/template/context.ts b/packages/language-core/lib/codegen/template/context.ts index e8673496f2..f607956d2b 100644 --- a/packages/language-core/lib/codegen/template/context.ts +++ b/packages/language-core/lib/codegen/template/context.ts @@ -1,6 +1,7 @@ import type * as CompilerDOM from '@vue/compiler-dom'; import type { Code, VueCodeInformation } from '../../types'; import { endOfLine, newLine, wrapWith } from '../common'; +import type { TemplateCodegenOptions } from './index'; const _codeFeatures = { all: { @@ -43,7 +44,7 @@ const _codeFeatures = { export type TemplateCodegenContext = ReturnType; -export function createTemplateCodegenContext() { +export function createTemplateCodegenContext(scriptSetupBindingNames: TemplateCodegenOptions['scriptSetupBindingNames']) { let ignoredError = false; let expectErrorToken: { errors: number; @@ -80,7 +81,7 @@ export function createTemplateCodegenContext() { }, }); const localVars = new Map(); - const accessGlobalVariables = new Map>(); + const accessExternalVariables = new Map>(); const slots: { name: string; loc?: number; @@ -101,15 +102,15 @@ export function createTemplateCodegenContext() { slots, dynamicSlots, codeFeatures, - accessGlobalVariables, + accessExternalVariables, hasSlotElements, blockConditions, usedComponentCtxVars, scopedClasses, - accessGlobalVariable(name: string, offset?: number) { - let arr = accessGlobalVariables.get(name); + accessExternalVariable(name: string, offset?: number) { + let arr = accessExternalVariables.get(name); if (!arr) { - accessGlobalVariables.set(name, arr = new Set()); + accessExternalVariables.set(name, arr = new Set()); } if (offset !== undefined) { arr.add(offset); @@ -165,7 +166,7 @@ export function createTemplateCodegenContext() { } }, generateAutoImportCompletion: function* (): Generator { - const all = [...accessGlobalVariables.entries()]; + const all = [...accessExternalVariables.entries()]; if (!all.some(([_, offsets]) => offsets.size)) { return; } @@ -173,12 +174,26 @@ export function createTemplateCodegenContext() { yield `[`; for (const [varName, offsets] of all) { for (const offset of offsets) { - yield [ - varName, - 'template', - offset, - codeFeatures.additionalCompletion, - ]; + if (scriptSetupBindingNames.has(varName)) { + // #3409 + yield [ + varName, + 'template', + offset, + { + ...codeFeatures.additionalCompletion, + ...codeFeatures.withoutHighlightAndCompletionAndNavigation, + }, + ]; + } + else { + yield [ + varName, + 'template', + offset, + codeFeatures.additionalCompletion, + ]; + } yield `,`; } offsets.clear(); diff --git a/packages/language-core/lib/codegen/template/elementDirectives.ts b/packages/language-core/lib/codegen/template/elementDirectives.ts index e70dbab994..dc8c93857e 100644 --- a/packages/language-core/lib/codegen/template/elementDirectives.ts +++ b/packages/language-core/lib/codegen/template/elementDirectives.ts @@ -23,7 +23,7 @@ export function* generateElementDirectives( && prop.name !== 'scope' && prop.name !== 'data' ) { - ctx.accessGlobalVariable(camelize('v-' + prop.name), prop.loc.start.offset); + ctx.accessExternalVariable(camelize('v-' + prop.name), prop.loc.start.offset); if (prop.arg?.type === CompilerDOM.NodeTypes.SIMPLE_EXPRESSION && !prop.arg.isStatic) { yield* generateInterpolation( diff --git a/packages/language-core/lib/codegen/template/elementProps.ts b/packages/language-core/lib/codegen/template/elementProps.ts index 2ed1454590..80f5346a43 100644 --- a/packages/language-core/lib/codegen/template/elementProps.ts +++ b/packages/language-core/lib/codegen/template/elementProps.ts @@ -284,7 +284,7 @@ function* genereatePropExp( if (variableNameRegex.test(propVariableName)) { if (!ctx.hasLocalVariable(propVariableName)) { - ctx.accessGlobalVariable(propVariableName, exp.loc.start.offset); + ctx.accessExternalVariable(propVariableName, exp.loc.start.offset); yield `__VLS_ctx.`; } yield* generateCamelized( diff --git a/packages/language-core/lib/codegen/template/index.ts b/packages/language-core/lib/codegen/template/index.ts index 0e655f6c28..90e1509b8b 100644 --- a/packages/language-core/lib/codegen/template/index.ts +++ b/packages/language-core/lib/codegen/template/index.ts @@ -15,14 +15,15 @@ export interface TemplateCodegenOptions { template: NonNullable; shouldGenerateScopedClasses?: boolean; stylesScopedClasses: Set; + scriptSetupBindingNames: Set; scriptSetupImportComponentNames: Set; hasDefineSlots?: boolean; slotsAssignName?: string; propsAssignName?: string; } -export function* generateTemplate(options: TemplateCodegenOptions) { - const ctx = createTemplateCodegenContext(); +export function* generateTemplate(options: TemplateCodegenOptions): Generator { + const ctx = createTemplateCodegenContext(options.scriptSetupBindingNames); let hasSlot = false; diff --git a/packages/language-core/lib/codegen/template/interpolation.ts b/packages/language-core/lib/codegen/template/interpolation.ts index ed17f1f95a..3571c93cca 100644 --- a/packages/language-core/lib/codegen/template/interpolation.ts +++ b/packages/language-core/lib/codegen/template/interpolation.ts @@ -100,10 +100,10 @@ export function* forEachInterpolationSegment( offset: getStartEnd(ts, id, ast).start, }); if (offset !== undefined) { - ctx.accessGlobalVariable(text, offset + getStartEnd(ts, id, ast).start); + ctx.accessExternalVariable(text, offset + getStartEnd(ts, id, ast).start); } else { - ctx.accessGlobalVariable(text); + ctx.accessExternalVariable(text); } } }; diff --git a/packages/language-core/lib/plugins/vue-tsx.ts b/packages/language-core/lib/plugins/vue-tsx.ts index cf367a73d9..91a004f437 100644 --- a/packages/language-core/lib/plugins/vue-tsx.ts +++ b/packages/language-core/lib/plugins/vue-tsx.ts @@ -119,6 +119,7 @@ function createTsx( template: _sfc.template, shouldGenerateScopedClasses: shouldGenerateScopedClasses(), stylesScopedClasses: stylesScopedClasses(), + scriptSetupBindingNames: scriptSetupBindingNames(), scriptSetupImportComponentNames: scriptSetupImportComponentNames(), hasDefineSlots: hasDefineSlots(), slotsAssignName: slotsAssignName(), @@ -139,6 +140,19 @@ function createTsx( }; }); const hasDefineSlots = computed(() => !!scriptSetupRanges()?.slots.define); + const scriptSetupBindingNames = computed>(oldNames => { + const newNames = new Set(); + const bindings = scriptSetupRanges()?.bindings; + if (_sfc.scriptSetup && bindings) { + for (const binding of bindings) { + newNames.add(_sfc.scriptSetup?.content.substring(binding.start, binding.end)); + } + } + if (newNames && oldNames && twoSetsEqual(newNames, oldNames)) { + return oldNames; + } + return newNames; + }); const scriptSetupImportComponentNames = computed>(oldNames => { const newNames = scriptSetupRanges()?.importComponentNames ?? new Set(); if (newNames && oldNames && twoSetsEqual(newNames, oldNames)) { From 05ece9d529c860a7a22cff01e116bf49b918c94c Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 00:22:27 +0000 Subject: [PATCH 18/38] ci(language-service): update html data --- packages/language-service/data/template/zh-cn.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/language-service/data/template/zh-cn.json b/packages/language-service/data/template/zh-cn.json index e0a9e04bdf..eac0a18393 100644 --- a/packages/language-service/data/template/zh-cn.json +++ b/packages/language-service/data/template/zh-cn.json @@ -237,7 +237,7 @@ "name": "Suspense", "description": { "kind": "markdown", - "value": "\n用于协调对组件树中嵌套的异步依赖的处理。\n\n- **Props**\n\n ```ts\n interface SuspenseProps {\n timeout?: string | number\n }\n ```\n\n- **事件**\n\n - `@resolve`\n - `@pending`\n - `@fallback`\n\n- **详细信息**\n\n `` 接受两个插槽:`#default` 和 `#fallback`。它将在内存中渲染默认插槽的同时展示后备插槽内容。\n\n 如果在渲染时遇到异步依赖项 ([异步组件](https://cn.vuejs.org/guide/components/async.html)和具有 [`async setup()`](https://cn.vuejs.org/guide/built-ins/suspense.html#async-setup) 的组件),它将等到所有异步依赖项解析完成时再显示默认插槽。\n\n- **参考**[指南 - Suspense](https://cn.vuejs.org/guide/built-ins/suspense.html)\n" + "value": "\n用于协调对组件树中嵌套的异步依赖的处理。\n\n- **Props**\n\n ```ts\n interface SuspenseProps {\n timeout?: string | number\n suspensible?: boolean\n }\n ```\n\n- **事件**\n\n - `@resolve`\n - `@pending`\n - `@fallback`\n\n- **详细信息**\n\n `` 接受两个插槽:`#default` 和 `#fallback`。它将在内存中渲染默认插槽的同时展示后备插槽内容。\n\n 如果在渲染时遇到异步依赖项 ([异步组件](https://cn.vuejs.org/guide/components/async.html)和具有 [`async setup()`](https://cn.vuejs.org/guide/built-ins/suspense.html#async-setup) 的组件),它将等到所有异步依赖项解析完成时再显示默认插槽。\n\n 通过将 Suspense 设置为 `suspensible`,所有的异步依赖将由父级 Suspense 处理。请参阅[实现细节](https://github.com/vuejs/core/pull/6736)\n\n- **参考**[指南 - Suspense](https://cn.vuejs.org/guide/built-ins/suspense.html)\n" }, "attributes": [], "references": [ @@ -1156,7 +1156,7 @@ "name": "v-once", "description": { "kind": "markdown", - "value": "\n仅渲染元素和组件一次,并跳过之后的更新。\n\n- **无需传入**\n\n- **详细信息**\n\n 在随后的重新渲染,元素/组件及其所有子项将被当作静态内容并跳过渲染。这可以用来优化更新时的性能。\n\n ```html\n \n This will never change: {{msg}}\n \n
\n

comment

\n

{{msg}}

\n
\n \n \n \n
    \n
  • {{i}}
  • \n
\n ```\n\n 从 3.2 起,你也可以搭配 [`v-memo`](#v-memo) 的无效条件来缓存部分模板。\n\n- **参考**\n - [数据绑定语法 - 插值](https://cn.vuejs.org/guide/essentials/template-syntax.html#text-interpolation)\n - [v-memo](#v-memo)\n" + "value": "\n仅渲染元素和组件一次,并跳过之后的更新。\n\n- **无需传入**\n\n- **详细信息**\n\n 在随后的重新渲染,元素/组件及其所有子项将被当作静态内容并跳过渲染。这可以用来优化更新时的性能。\n\n ```html\n \n This will never change: {{msg}}\n \n
\n

Comment

\n

{{msg}}

\n
\n \n \n \n
    \n
  • {{i}}
  • \n
\n ```\n\n 从 3.2 起,你也可以搭配 [`v-memo`](#v-memo) 的无效条件来缓存部分模板。\n\n- **参考**\n - [数据绑定语法 - 插值](https://cn.vuejs.org/guide/essentials/template-syntax.html#text-interpolation)\n - [v-memo](#v-memo)\n" }, "references": [ { From e50c8823abf85777e4af1539fb56043d495abe0e Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 9 May 2024 13:04:03 +0800 Subject: [PATCH 19/38] fix(language-core): renaming classname within `scoped` not working close #4355 --- .../language-core/lib/codegen/script/index.ts | 19 ++++--------------- .../lib/codegen/script/template.ts | 18 ++++++------------ 2 files changed, 10 insertions(+), 27 deletions(-) diff --git a/packages/language-core/lib/codegen/script/index.ts b/packages/language-core/lib/codegen/script/index.ts index 7fe2c4a20f..842682bf14 100644 --- a/packages/language-core/lib/codegen/script/index.ts +++ b/packages/language-core/lib/codegen/script/index.ts @@ -25,14 +25,11 @@ export const codeFeatures = { navigation: { navigation: true, } as VueCodeInformation, - referencesCodeLens: { - navigation: true, - __referencesCodeLens: true, - } as VueCodeInformation, - cssClassNavigation: { + navigationWithoutRename: { navigation: { - resolveRenameNewName: normalizeCssRename, - resolveRenameEditText: applyCssRename, + shouldRename() { + return false; + }, }, } as VueCodeInformation, }; @@ -149,11 +146,3 @@ export function* generateScript(options: ScriptCodegenOptions): Generator ]; } } - -function normalizeCssRename(newName: string) { - return newName.startsWith('.') ? newName.slice(1) : newName; -} - -function applyCssRename(newName: string) { - return '.' + newName; -} diff --git a/packages/language-core/lib/codegen/script/template.ts b/packages/language-core/lib/codegen/script/template.ts index a5fe917c6f..3055b7b102 100644 --- a/packages/language-core/lib/codegen/script/template.ts +++ b/packages/language-core/lib/codegen/script/template.ts @@ -7,7 +7,6 @@ import { forEachInterpolationSegment } from '../template/interpolation'; import type { ScriptCodegenContext } from './context'; import { codeFeatures, type ScriptCodegenOptions } from './index'; import { generateInternalComponent } from './internalComponent'; -import { combineLastMapping } from '../common'; export function* generateTemplate( options: ScriptCodegenOptions, @@ -176,29 +175,24 @@ function* generateCssClassProperty( '', 'style_' + styleIndex, offset, - referencesCodeLens - ? codeFeatures.navigation - : codeFeatures.referencesCodeLens, + { + ...codeFeatures.navigationWithoutRename, + __referencesCodeLens: referencesCodeLens, + }, ]; yield `'`; - yield [ - '', - 'style_' + styleIndex, - offset, - codeFeatures.cssClassNavigation, - ]; yield [ classNameWithDot.substring(1), 'style_' + styleIndex, offset + 1, - combineLastMapping, + codeFeatures.navigation, ]; yield `'`; yield [ '', 'style_' + styleIndex, offset + classNameWithDot.length, - codeFeatures.none, + codeFeatures.navigationWithoutRename, ]; yield `${optional ? '?' : ''}: ${propertyType}`; yield ` }`; From b23e5ba855dc9d02314fe8782bf9b31165dba57d Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 9 May 2024 15:06:08 +0800 Subject: [PATCH 20/38] feat(language-service): re-support scoped class links in template (#4357) --- .../language-core/lib/codegen/script/index.ts | 6 +- .../lib/codegen/script/template.ts | 4 +- .../lib/codegen/template/context.ts | 8 ++ .../lib/codegen/template/element.ts | 4 +- .../lib/codegen/template/index.ts | 42 ++++++----- packages/language-core/lib/plugins/vue-tsx.ts | 35 +-------- packages/language-core/lib/types.ts | 1 - packages/language-service/index.ts | 4 +- .../lib/plugins/vue-document-links.ts | 74 +++++++++++++++++++ 9 files changed, 114 insertions(+), 64 deletions(-) create mode 100644 packages/language-service/lib/plugins/vue-document-links.ts diff --git a/packages/language-core/lib/codegen/script/index.ts b/packages/language-core/lib/codegen/script/index.ts index 842682bf14..40544a19ef 100644 --- a/packages/language-core/lib/codegen/script/index.ts +++ b/packages/language-core/lib/codegen/script/index.ts @@ -43,11 +43,7 @@ export interface ScriptCodegenOptions { lang: string; scriptRanges: ScriptRanges | undefined; scriptSetupRanges: ScriptSetupRanges | undefined; - templateCodegen: { - tsCodes: Code[]; - ctx: TemplateCodegenContext; - hasSlot: boolean; - } | undefined; + templateCodegen: TemplateCodegenContext & { codes: Code[]; } | undefined; globalTypes: boolean; getGeneratedLength: () => number; linkedCodeMappings: Mapping[]; diff --git a/packages/language-core/lib/codegen/script/template.ts b/packages/language-core/lib/codegen/script/template.ts index 3055b7b102..a6cdc34dc1 100644 --- a/packages/language-core/lib/codegen/script/template.ts +++ b/packages/language-core/lib/codegen/script/template.ts @@ -148,7 +148,7 @@ function* generateTemplateContext( yield* generateCssVars(options, templateCodegenCtx); if (options.templateCodegen) { - for (const code of options.templateCodegen.tsCodes) { + for (const code of options.templateCodegen.codes) { yield code; } } @@ -249,7 +249,7 @@ export function getTemplateUsageVars(options: ScriptCodegenOptions, ctx: ScriptC usageVars.add(component.split('.')[0]); } } - for (const [varName] of options.templateCodegen.ctx.accessExternalVariables) { + for (const [varName] of options.templateCodegen.accessExternalVariables) { usageVars.add(varName); } } diff --git a/packages/language-core/lib/codegen/template/context.ts b/packages/language-core/lib/codegen/template/context.ts index f607956d2b..9dff144c0a 100644 --- a/packages/language-core/lib/codegen/template/context.ts +++ b/packages/language-core/lib/codegen/template/context.ts @@ -22,6 +22,13 @@ const _codeFeatures = { navigation: { navigation: true, } as VueCodeInformation, + navigationWithoutRename: { + navigation: { + shouldRename() { + return false; + }, + }, + } as VueCodeInformation, navigationAndCompletion: { navigation: true, } as VueCodeInformation, @@ -107,6 +114,7 @@ export function createTemplateCodegenContext(scriptSetupBindingNames: TemplateCo blockConditions, usedComponentCtxVars, scopedClasses, + hasSlot: false, accessExternalVariable(name: string, offset?: number) { let arr = accessExternalVariables.get(name); if (!arr) { diff --git a/packages/language-core/lib/codegen/template/element.ts b/packages/language-core/lib/codegen/template/element.ts index e516c44d89..0acb3dd8db 100644 --- a/packages/language-core/lib/codegen/template/element.ts +++ b/packages/language-core/lib/codegen/template/element.ts @@ -353,9 +353,7 @@ function* generateVScope( yield* generateElementDirectives(options, ctx, node); yield* generateReferencesForElements(options, ctx, node); // - if (options.shouldGenerateScopedClasses) { - yield* generateReferencesForScopedCssClasses(ctx, node); - } + yield* generateReferencesForScopedCssClasses(ctx, node); if (inScope) { yield `}${newLine}`; diff --git a/packages/language-core/lib/codegen/template/index.ts b/packages/language-core/lib/codegen/template/index.ts index 90e1509b8b..442c1dba0b 100644 --- a/packages/language-core/lib/codegen/template/index.ts +++ b/packages/language-core/lib/codegen/template/index.ts @@ -2,10 +2,9 @@ import * as CompilerDOM from '@vue/compiler-dom'; import type * as ts from 'typescript'; import type { Code, Sfc, VueCompilerOptions } from '../../types'; import { endOfLine, newLine, wrapWith } from '../common'; -import { createTemplateCodegenContext } from './context'; +import { TemplateCodegenContext, createTemplateCodegenContext } from './context'; import { getCanonicalComponentName, getPossibleOriginalComponentNames } from './element'; import { generateObjectProperty } from './objectProperty'; -import { generateStringLiteralKey } from './stringLiteralKey'; import { generateTemplateChild, getVForNode } from './templateChild'; export interface TemplateCodegenOptions { @@ -13,8 +12,6 @@ export interface TemplateCodegenOptions { compilerOptions: ts.CompilerOptions; vueCompilerOptions: VueCompilerOptions; template: NonNullable; - shouldGenerateScopedClasses?: boolean; - stylesScopedClasses: Set; scriptSetupBindingNames: Set; scriptSetupImportComponentNames: Set; hasDefineSlots?: boolean; @@ -22,11 +19,9 @@ export interface TemplateCodegenOptions { propsAssignName?: string; } -export function* generateTemplate(options: TemplateCodegenOptions): Generator { +export function* generateTemplate(options: TemplateCodegenOptions): Generator { const ctx = createTemplateCodegenContext(options.scriptSetupBindingNames); - let hasSlot = false; - if (options.slotsAssignName) { ctx.addLocalVariable(options.slotsAssignName); } @@ -50,19 +45,16 @@ export function* generateTemplate(options: TemplateCodegenOptions): Generator { for (const { expVar, varName } of ctx.dynamicSlots) { - hasSlot = true; + ctx.hasSlot = true; yield `Partial, (_: typeof ${varName}) => any>> &${newLine}`; } yield `{${newLine}`; for (const slot of ctx.slots) { - hasSlot = true; + ctx.hasSlot = true; if (slot.name && slot.loc !== undefined) { yield* generateObjectProperty( options, @@ -96,14 +88,26 @@ export function* generateTemplate(options: TemplateCodegenOptions): Generator { - const option = ctx.vueCompilerOptions.experimentalResolveStyleCssClasses; - return _sfc.styles.some(s => { - return option === 'always' || (option === 'scoped' && s.scoped); - }); - }); - const stylesScopedClasses = computedSet(() => { - - const classes = new Set(); - - if (!shouldGenerateScopedClasses()) { - return classes; - } - - for (const style of _sfc.styles) { - const option = ctx.vueCompilerOptions.experimentalResolveStyleCssClasses; - if (option === 'always' || (option === 'scoped' && style.scoped)) { - for (const className of style.classNames) { - classes.add(className.text.substring(1)); - } - } - } - - return classes; - }); const generatedTemplate = computed(() => { if (!_sfc.template) { @@ -117,8 +92,6 @@ function createTsx( compilerOptions: ctx.compilerOptions, vueCompilerOptions: ctx.vueCompilerOptions, template: _sfc.template, - shouldGenerateScopedClasses: shouldGenerateScopedClasses(), - stylesScopedClasses: stylesScopedClasses(), scriptSetupBindingNames: scriptSetupBindingNames(), scriptSetupImportComponentNames: scriptSetupImportComponentNames(), hasDefineSlots: hasDefineSlots(), @@ -175,11 +148,7 @@ function createTsx( lang: lang(), scriptRanges: scriptRanges(), scriptSetupRanges: scriptSetupRanges(), - templateCodegen: _template ? { - tsCodes: _template.codes, - ctx: _template.ctx, - hasSlot: _template.hasSlot, - } : undefined, + templateCodegen: _template, compilerOptions: ctx.compilerOptions, vueCompilerOptions: ctx.vueCompilerOptions, getGeneratedLength: () => generatedLength, diff --git a/packages/language-core/lib/types.ts b/packages/language-core/lib/types.ts index 7e129e806a..499189e223 100644 --- a/packages/language-core/lib/types.ts +++ b/packages/language-core/lib/types.ts @@ -15,7 +15,6 @@ export type RawVueCompilerOptions = Partial(); + const option = sourceScript.generated.root.vueCompilerOptions.experimentalResolveStyleCssClasses; + + for (let i = 0; i < sourceScript.generated.root.sfc.styles.length; i++) { + const style = sourceScript.generated.root.sfc.styles[i]; + if (option === 'always' || (option === 'scoped' && style.scoped)) { + for (const className of style.classNames) { + if (!styleClasses.has(className.text.substring(1))) { + styleClasses.set(className.text.substring(1), []); + } + styleClasses.get(className.text.substring(1))!.push({ + index: i, + style, + classOffset: className.offset, + }); + } + } + } + + for (const { className, offset } of scopedClasses) { + const styles = styleClasses.get(className); + if (styles) { + for (const style of styles) { + const styleDocumentUri = context.encodeEmbeddedDocumentUri(decoded![0], 'style_' + style.index); + const styleVirtualCode = sourceScript.generated.embeddedCodes.get('style_' + style.index); + if (!styleVirtualCode) { + continue; + } + const styleDocument = context.documents.get(styleDocumentUri, styleVirtualCode.languageId, styleVirtualCode.snapshot); + const start = styleDocument.positionAt(style.classOffset); + const end = styleDocument.positionAt(style.classOffset + className.length + 1); + result.push({ + range: { + start: document.positionAt(offset), + end: document.positionAt(offset + className.length), + }, + target: context.encodeEmbeddedDocumentUri(decoded![0], 'style_' + style.index) + `#L${start.line + 1},${start.character + 1}-L${end.line + 1},${end.character + 1}`, + }); + } + } + } + + return result; + } + }, + }; + }, + }; +} From 555178bc3534022ab92d206e82a8e0c93f6cc0e9 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 9 May 2024 15:52:18 +0800 Subject: [PATCH 21/38] chore: bump volar --- extensions/vscode/package.json | 2 +- package.json | 2 +- packages/component-meta/package.json | 2 +- packages/language-core/package.json | 2 +- packages/language-plugin-pug/package.json | 4 +- packages/language-server/package.json | 4 +- packages/language-service/package.json | 24 +-- packages/tsc/package.json | 2 +- packages/typescript-plugin/package.json | 2 +- pnpm-lock.yaml | 222 +++++++++++----------- 10 files changed, 133 insertions(+), 133 deletions(-) diff --git a/extensions/vscode/package.json b/extensions/vscode/package.json index 9593550504..b0163cbf67 100644 --- a/extensions/vscode/package.json +++ b/extensions/vscode/package.json @@ -515,7 +515,7 @@ "devDependencies": { "@types/semver": "^7.5.3", "@types/vscode": "^1.82.0", - "@volar/vscode": "~2.2.0", + "@volar/vscode": "~2.2.1", "@vue/language-core": "2.0.16", "@vue/language-server": "2.0.16", "@vue/typescript-plugin": "2.0.16", diff --git a/package.json b/package.json index d4fa2a380c..ae82626d68 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "devDependencies": { "@lerna-lite/cli": "latest", "@lerna-lite/publish": "latest", - "@volar/language-service": "~2.2.0", + "@volar/language-service": "~2.2.1", "@volar/tsl-config": "latest", "tsl": "latest", "typescript": "latest", diff --git a/packages/component-meta/package.json b/packages/component-meta/package.json index a21e5483d0..ce32ffd949 100644 --- a/packages/component-meta/package.json +++ b/packages/component-meta/package.json @@ -12,7 +12,7 @@ "directory": "packages/component-meta" }, "dependencies": { - "@volar/typescript": "~2.2.0", + "@volar/typescript": "~2.2.1", "@vue/language-core": "2.0.16", "path-browserify": "^1.0.1", "vue-component-type-helpers": "2.0.16" diff --git a/packages/language-core/package.json b/packages/language-core/package.json index 165857aa57..c8104426c7 100644 --- a/packages/language-core/package.json +++ b/packages/language-core/package.json @@ -12,7 +12,7 @@ "directory": "packages/language-core" }, "dependencies": { - "@volar/language-core": "~2.2.0", + "@volar/language-core": "~2.2.1", "@vue/compiler-dom": "^3.4.0", "@vue/shared": "^3.4.0", "computeds": "^0.0.1", diff --git a/packages/language-plugin-pug/package.json b/packages/language-plugin-pug/package.json index 3df2a50692..69790d747f 100644 --- a/packages/language-plugin-pug/package.json +++ b/packages/language-plugin-pug/package.json @@ -16,7 +16,7 @@ "@vue/language-core": "2.0.16" }, "dependencies": { - "@volar/source-map": "~2.2.0", - "volar-service-pug": "0.0.42" + "@volar/source-map": "~2.2.1", + "volar-service-pug": "0.0.43" } } diff --git a/packages/language-server/package.json b/packages/language-server/package.json index 6a2b8ca501..53b5d67a96 100644 --- a/packages/language-server/package.json +++ b/packages/language-server/package.json @@ -15,8 +15,8 @@ "directory": "packages/language-server" }, "dependencies": { - "@volar/language-core": "~2.2.0", - "@volar/language-server": "~2.2.0", + "@volar/language-core": "~2.2.1", + "@volar/language-server": "~2.2.1", "@vue/language-core": "2.0.16", "@vue/language-service": "2.0.16", "@vue/typescript-plugin": "2.0.16", diff --git a/packages/language-service/package.json b/packages/language-service/package.json index 8591f271c9..b303c33917 100644 --- a/packages/language-service/package.json +++ b/packages/language-service/package.json @@ -16,23 +16,23 @@ "update-html-data": "node ./scripts/update-html-data.js" }, "dependencies": { - "@volar/language-core": "~2.2.0", - "@volar/language-service": "~2.2.0", - "@volar/typescript": "~2.2.0", + "@volar/language-core": "~2.2.1", + "@volar/language-service": "~2.2.1", + "@volar/typescript": "~2.2.1", "@vue/compiler-dom": "^3.4.0", "@vue/language-core": "2.0.16", "@vue/shared": "^3.4.0", "@vue/typescript-plugin": "2.0.16", "computeds": "^0.0.1", "path-browserify": "^1.0.1", - "volar-service-css": "0.0.42", - "volar-service-emmet": "0.0.42", - "volar-service-html": "0.0.42", - "volar-service-json": "0.0.42", - "volar-service-pug": "0.0.42", - "volar-service-pug-beautify": "0.0.42", - "volar-service-typescript": "0.0.42", - "volar-service-typescript-twoslash-queries": "0.0.42", + "volar-service-css": "0.0.43", + "volar-service-emmet": "0.0.43", + "volar-service-html": "0.0.43", + "volar-service-json": "0.0.43", + "volar-service-pug": "0.0.43", + "volar-service-pug-beautify": "0.0.43", + "volar-service-typescript": "0.0.43", + "volar-service-typescript-twoslash-queries": "0.0.43", "vscode-html-languageservice": "npm:@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" @@ -40,7 +40,7 @@ "devDependencies": { "@types/node": "latest", "@types/path-browserify": "latest", - "@volar/kit": "~2.2.0", + "@volar/kit": "~2.2.1", "vscode-languageserver-protocol": "^3.17.5" } } diff --git a/packages/tsc/package.json b/packages/tsc/package.json index f6b70dd4f1..0c71b36fce 100644 --- a/packages/tsc/package.json +++ b/packages/tsc/package.json @@ -16,7 +16,7 @@ "vue-tsc": "./bin/vue-tsc.js" }, "dependencies": { - "@volar/typescript": "~2.2.0", + "@volar/typescript": "~2.2.1", "@vue/language-core": "2.0.16", "semver": "^7.5.4" }, diff --git a/packages/typescript-plugin/package.json b/packages/typescript-plugin/package.json index 802379e039..80eb74fb68 100644 --- a/packages/typescript-plugin/package.json +++ b/packages/typescript-plugin/package.json @@ -12,7 +12,7 @@ "directory": "packages/typescript-plugin" }, "dependencies": { - "@volar/typescript": "~2.2.0", + "@volar/typescript": "~2.2.1", "@vue/language-core": "2.0.16", "@vue/shared": "^3.4.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6d100e0c8d..2b7e226e88 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,8 +15,8 @@ importers: specifier: latest version: 3.3.3(typescript@5.4.5) '@volar/language-service': - specifier: ~2.2.0 - version: 2.2.0 + specifier: ~2.2.1 + version: 2.2.1 '@volar/tsl-config': specifier: latest version: 0.0.0-20240315.2(tsl@0.0.10(typescript@5.4.5)) @@ -42,8 +42,8 @@ importers: specifier: ^1.82.0 version: 1.88.0 '@volar/vscode': - specifier: ~2.2.0 - version: 2.2.0 + specifier: ~2.2.1 + version: 2.2.1 '@vue/language-core': specifier: 2.0.16 version: link:../../packages/language-core @@ -72,8 +72,8 @@ importers: packages/component-meta: dependencies: '@volar/typescript': - specifier: ~2.2.0 - version: 2.2.0 + specifier: ~2.2.1 + version: 2.2.1 '@vue/language-core': specifier: 2.0.16 version: link:../language-core @@ -99,8 +99,8 @@ importers: packages/language-core: dependencies: '@volar/language-core': - specifier: ~2.2.0 - version: 2.2.0 + specifier: ~2.2.1 + version: 2.2.1 '@vue/compiler-dom': specifier: ^3.4.0 version: 3.4.26 @@ -139,11 +139,11 @@ importers: packages/language-plugin-pug: dependencies: '@volar/source-map': - specifier: ~2.2.0 - version: 2.2.0 + specifier: ~2.2.1 + version: 2.2.1 volar-service-pug: - specifier: 0.0.42 - version: 0.0.42 + specifier: 0.0.43 + version: 0.0.43 devDependencies: '@types/node': specifier: latest @@ -155,11 +155,11 @@ importers: packages/language-server: dependencies: '@volar/language-core': - specifier: ~2.2.0 - version: 2.2.0 + specifier: ~2.2.1 + version: 2.2.1 '@volar/language-server': - specifier: ~2.2.0 - version: 2.2.0 + specifier: ~2.2.1 + version: 2.2.1 '@vue/language-core': specifier: 2.0.16 version: link:../language-core @@ -176,14 +176,14 @@ importers: packages/language-service: dependencies: '@volar/language-core': - specifier: ~2.2.0 - version: 2.2.0 + specifier: ~2.2.1 + version: 2.2.1 '@volar/language-service': - specifier: ~2.2.0 - version: 2.2.0 + specifier: ~2.2.1 + version: 2.2.1 '@volar/typescript': - specifier: ~2.2.0 - version: 2.2.0 + specifier: ~2.2.1 + version: 2.2.1 '@vue/compiler-dom': specifier: ^3.4.0 version: 3.4.26 @@ -203,29 +203,29 @@ importers: specifier: ^1.0.1 version: 1.0.1 volar-service-css: - specifier: 0.0.42 - version: 0.0.42(@volar/language-service@2.2.0) + specifier: 0.0.43 + version: 0.0.43(@volar/language-service@2.2.1) volar-service-emmet: - specifier: 0.0.42 - version: 0.0.42(@volar/language-service@2.2.0) + specifier: 0.0.43 + version: 0.0.43(@volar/language-service@2.2.1) volar-service-html: - specifier: 0.0.42 - version: 0.0.42(@volar/language-service@2.2.0) + specifier: 0.0.43 + version: 0.0.43(@volar/language-service@2.2.1) volar-service-json: - specifier: 0.0.42 - version: 0.0.42(@volar/language-service@2.2.0) + specifier: 0.0.43 + version: 0.0.43(@volar/language-service@2.2.1) volar-service-pug: - specifier: 0.0.42 - version: 0.0.42 + specifier: 0.0.43 + version: 0.0.43 volar-service-pug-beautify: - specifier: 0.0.42 - version: 0.0.42(@volar/language-service@2.2.0) + specifier: 0.0.43 + version: 0.0.43(@volar/language-service@2.2.1) volar-service-typescript: - specifier: 0.0.42 - version: 0.0.42(@volar/language-service@2.2.0) + specifier: 0.0.43 + version: 0.0.43(@volar/language-service@2.2.1) volar-service-typescript-twoslash-queries: - specifier: 0.0.42 - version: 0.0.42(@volar/language-service@2.2.0) + specifier: 0.0.43 + version: 0.0.43(@volar/language-service@2.2.1) vscode-html-languageservice: specifier: npm:@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462 version: '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462' @@ -243,8 +243,8 @@ importers: specifier: latest version: 1.0.2 '@volar/kit': - specifier: ~2.2.0 - version: 2.2.0(typescript@5.4.5) + specifier: ~2.2.1 + version: 2.2.1(typescript@5.4.5) vscode-languageserver-protocol: specifier: ^3.17.5 version: 3.17.5 @@ -252,8 +252,8 @@ importers: packages/tsc: dependencies: '@volar/typescript': - specifier: ~2.2.0 - version: 2.2.0 + specifier: ~2.2.1 + version: 2.2.1 '@vue/language-core': specifier: 2.0.16 version: link:../language-core @@ -271,8 +271,8 @@ importers: packages/typescript-plugin: dependencies: '@volar/typescript': - specifier: ~2.2.0 - version: 2.2.0 + specifier: ~2.2.1 + version: 2.2.1 '@vue/language-core': specifier: 2.0.16 version: link:../language-core @@ -970,36 +970,36 @@ packages: '@vitest/utils@1.5.3': resolution: {integrity: sha512-rE9DTN1BRhzkzqNQO+kw8ZgfeEBCLXiHJwetk668shmNBpSagQxneT5eSqEBLP+cqSiAeecvQmbpFfdMyLcIQA==} - '@volar/kit@2.2.0': - resolution: {integrity: sha512-ZI6caoD7f7WSJC9lLOFGgp+idR8gzlK9+GzDV2urWAj4gTx0MzyB21uKZlo3hfZp72LpUmOvQBJ3n303gDE8FQ==} + '@volar/kit@2.2.1': + resolution: {integrity: sha512-Ga1uqGfNATdJd0nlpRxFcJoew6xqJwkATvsPiAMvinmfmmJzkGLdVLZl8aNnaDq2TBId/+5daPbwBMAzdu1Sjw==} peerDependencies: typescript: '*' - '@volar/language-core@2.2.0': - resolution: {integrity: sha512-a8WG9+4OdeNDW4ywABZIM6S6UN7em8uIlM/BZ2pWQUYrVmX+m8sj/X+QadvO+Li/t/LjAqbWJQtVgxdpEWLALQ==} + '@volar/language-core@2.2.1': + resolution: {integrity: sha512-iHJAZKcYldZgyS8gx6DfIZApViVBeqbf6iPhqoZpG5A6F4zsZiFldKfwaKaBA3/wnOTWE2i8VUbXywI1WywCPg==} - '@volar/language-server@2.2.0': - resolution: {integrity: sha512-JqUxv+YoCLWpGJLIsDp45WmEx8kNAWh+RsJ1sswjJZrezVFKcyjOfLPnKy/D0VV0myME5i3CUQTW6K/nnshBzg==} + '@volar/language-server@2.2.1': + resolution: {integrity: sha512-29j2owXGUd9nk9+vuRbasoRp5XcRQSbzHUwBUh9Yhf9zkctTZZJDT+Q1wjBKI+5XohR7UVQCBEvmLp4L+WirwA==} - '@volar/language-service@2.2.0': - resolution: {integrity: sha512-hLtIFpsOcfHJ7kllUDRU2Ap1IBGEnADyE7Ea3kPwvUHM43Qn+7lvpKXxX/UL2zVcQQrvHr0348Tfi9BF1aKD5A==} + '@volar/language-service@2.2.1': + resolution: {integrity: sha512-Zt0xELrxTJ+Aag44qkXSFRRIPh2XrhRTYaxUmZNY6QIIu5wWfroySK4LZaA6g7WhloGTrATstk3OxPS0RSlbRw==} - '@volar/snapshot-document@2.2.0': - resolution: {integrity: sha512-CUOxMlPy3UBqzjmat0eVaCyYJqbhOEDYBZbsm1gbuQLW6kUxQs3+8eD2x6EyfaPHiZMxNuLBjSRvXfLANcYbHQ==} + '@volar/snapshot-document@2.2.1': + resolution: {integrity: sha512-ISq74JwzdPcjw7TjZZ9VdOYdgwPoX/X3Jus3emD4ftG59v0gomIp11yz7Ds65rUi/coss/uTPse+onXR+64rpg==} - '@volar/source-map@2.2.0': - resolution: {integrity: sha512-HQlPRlHOVqCCHK8wI76ZldHkEwKsjp7E6idUc36Ekni+KJDNrqgSqPvyHQixybXPHNU7CI9Uxd9/IkxO7LuNBw==} + '@volar/source-map@2.2.1': + resolution: {integrity: sha512-w1Bgpguhbp7YTr7VUFu6gb4iAZjeEPsOX4zpgiuvlldbzvIWDWy4t0jVifsIsxZ99HAu+c3swiME7wt+GeNqhA==} '@volar/tsl-config@0.0.0-20240315.2': resolution: {integrity: sha512-bv57xhmegLkfjW0/FZL/sberfmUch7yLAkXlRXj5KxHPYCjIU4T1ciPuLWrtVzCa+o0q7ykQ6aR+Q/z7MSMf6w==} peerDependencies: tsl: '*' - '@volar/typescript@2.2.0': - resolution: {integrity: sha512-wC6l4zLiiCLxF+FGaHCbWlQYf4vMsnRxYhcI6WgvaNppOD6r1g+Ef1RKRJUApALWU46Yy/JDU/TbdV6w/X6Liw==} + '@volar/typescript@2.2.1': + resolution: {integrity: sha512-Z/tqluR7Hz5/5dCqQp7wo9C/6tSv/IYl+tTzgzUt2NjTq95bKSsuO4E+V06D0c+3aP9x5S9jggLqw451hpnc6Q==} - '@volar/vscode@2.2.0': - resolution: {integrity: sha512-WQEnvv7tDfYN7NrHRPvtnu3fZ+Uc4IVYYt/i728gaql/0StkITMdh7K1i+43MsDlY/gSwh82XrDstaxAloTJ6Q==} + '@volar/vscode@2.2.1': + resolution: {integrity: sha512-Xqk5ORMNOzYaaIu9xsfurZzSt3ekInBgRt1wyz7DgzkJKqFeX+Sfs2QDWlOATsE+y/A9ZNt4E0e0gXWF/Q9gMQ==} '@vscode/emmet-helper@2.9.3': resolution: {integrity: sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==} @@ -2982,59 +2982,59 @@ packages: jsdom: optional: true - volar-service-css@0.0.42: - resolution: {integrity: sha512-vx3kbSNiIfoyuHaygDFykI1TFkpbkIO2qJWeKNnGHlMZKy1PFLfCRmPAjkfdDvijLPnHqyKmvWwhkUht+Wiq6Q==} + volar-service-css@0.0.43: + resolution: {integrity: sha512-rg2gTXhswq6Wz8euZgCRS68+7EPH+3R7SeTqYfAAtHKoU0rS1bwdxP1CWHezyxnHrLMiXEypCgJJWcMTay3W7g==} peerDependencies: '@volar/language-service': ~2.2.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-emmet@0.0.42: - resolution: {integrity: sha512-agB2XZTS14o6+oUnIQHd7nIU08i2exZ+WYY20DjKj0NFLgbYSWIFB5Uf8mSIouMHzs28JcAMGS7ClT9Amkp6RQ==} + volar-service-emmet@0.0.43: + resolution: {integrity: sha512-ODsSOsSScVTNSD1Z+e4EV21RuN3q38ahGnuyxKYHW9Fg0RwfLatHl6wIRfj21XlVVa8twBMsA/Fp43ObuDEBxQ==} peerDependencies: '@volar/language-service': ~2.2.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-html@0.0.42: - resolution: {integrity: sha512-6KMjwB3VMrpQgqm4gM73tDO91xJcga09vi4oyI9zayILhlUPuQW4KPjAN3NvLK4fOkcDTn20k/4gGm335ETKVw==} + volar-service-html@0.0.43: + resolution: {integrity: sha512-Z/S7SCkHmpoR708WTQLCE3k+hfT16xjMfq9Htv7Y3yJeykah1jZO8oZX3433OPFfbS/ZFbGa2VlAIgDTVRU5Pg==} peerDependencies: '@volar/language-service': ~2.2.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-json@0.0.42: - resolution: {integrity: sha512-+wweRNbzobAG5y2UbMoI4cXRBVG5kf2J/H1Pbp6Ek+A+MOMT3xKbV+H5aKkdEoNGzKv5V2QmwpdVI2ukfOy2EQ==} + volar-service-json@0.0.43: + resolution: {integrity: sha512-jgAdhsHIJnlvGvZPGksRTcNGrfWenQfsQh5aBztr7jc4bQQ7fXkaiiLIpUQxzadDKdUePstEJWzmhxdqtPRHXA==} peerDependencies: '@volar/language-service': ~2.2.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-pug-beautify@0.0.42: - resolution: {integrity: sha512-XxK9Njb2E/+uIyh12wKAZVSfaLegH+piv2pCZKDyVMH5aN/prBFseUzZZofwyHCZ+vaviAxXxgIhoiH83tImsw==} + volar-service-pug-beautify@0.0.43: + resolution: {integrity: sha512-Mb4BDxo06x2HW6wGRJ6AQYjPMo1ks9jZ0kJhztIKO0ZH2coE6zFX2EHo+as1X0q1Y32kCkzLyPF5JuUiwjUDQg==} peerDependencies: '@volar/language-service': ~2.2.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-pug@0.0.42: - resolution: {integrity: sha512-p+ESdsxkyHbRXjEhRitvovOypD7deYAlaiEgfQZo9so68mX1rDlQTHuWVVIkPUq9Umba8d8zTjwkp+L513G5Aw==} + volar-service-pug@0.0.43: + resolution: {integrity: sha512-O7QMvo3f9lHGZ+SjmH7P20g8SX73XjOCakexa7IFZP4rmbX1AyUokL3AmjMfaMNUqKMym86KrVo4PDTgh4210Q==} - volar-service-typescript-twoslash-queries@0.0.42: - resolution: {integrity: sha512-aZpN9Szu3m0y1VieKZoH7UVZsB3OD2PJ+BY6EXQ+KxlshMQhkWIEAFBYxA8ixIh0mCev3Bu4qhVbgdeD2DoXWg==} + volar-service-typescript-twoslash-queries@0.0.43: + resolution: {integrity: sha512-FUqgvK2a6YxNO0P+zmY5syVatD8I7+qEA+mj1lotqQxwtY0Gh3UDCCqTVapX1E4VxF/pvNac7eVOBkCUVVZC5w==} peerDependencies: '@volar/language-service': ~2.2.0 peerDependenciesMeta: '@volar/language-service': optional: true - volar-service-typescript@0.0.42: - resolution: {integrity: sha512-INJHXZvIZjsbctXcEjITpj4DFJ6SCGbgpdUUo3vyJ+WwBeuAfncvUVZ4pvid3o8ZCDZhtpOVjFSO+4HYsZfyrg==} + volar-service-typescript@0.0.43: + resolution: {integrity: sha512-oXYZHuM7QYBmgSiheFkoQPyUzzvm9ddaUzfDqc9cOM+fDuMAkUer2bEqnqZXerGjhsjuXNCu4PGlSOJJMxWe3A==} peerDependencies: '@volar/language-service': ~2.2.0 peerDependenciesMeta: @@ -3857,25 +3857,25 @@ snapshots: loupe: 2.3.7 pretty-format: 29.7.0 - '@volar/kit@2.2.0(typescript@5.4.5)': + '@volar/kit@2.2.1(typescript@5.4.5)': dependencies: - '@volar/language-service': 2.2.0 - '@volar/typescript': 2.2.0 + '@volar/language-service': 2.2.1 + '@volar/typescript': 2.2.1 typesafe-path: 0.2.2 typescript: 5.4.5 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - '@volar/language-core@2.2.0': + '@volar/language-core@2.2.1': dependencies: - '@volar/source-map': 2.2.0 + '@volar/source-map': 2.2.1 - '@volar/language-server@2.2.0': + '@volar/language-server@2.2.1': dependencies: - '@volar/language-core': 2.2.0 - '@volar/language-service': 2.2.0 - '@volar/snapshot-document': 2.2.0 - '@volar/typescript': 2.2.0 + '@volar/language-core': 2.2.1 + '@volar/language-service': 2.2.1 + '@volar/snapshot-document': 2.2.1 + '@volar/typescript': 2.2.1 '@vscode/l10n': 0.0.16 path-browserify: 1.0.1 request-light: 0.7.0 @@ -3884,19 +3884,19 @@ snapshots: vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - '@volar/language-service@2.2.0': + '@volar/language-service@2.2.1': dependencies: - '@volar/language-core': 2.2.0 + '@volar/language-core': 2.2.1 vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 - '@volar/snapshot-document@2.2.0': + '@volar/snapshot-document@2.2.1': dependencies: vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.11 - '@volar/source-map@2.2.0': + '@volar/source-map@2.2.1': dependencies: muggle-string: 0.4.1 @@ -3904,14 +3904,14 @@ snapshots: dependencies: tsl: 0.0.10(typescript@5.4.5) - '@volar/typescript@2.2.0': + '@volar/typescript@2.2.1': dependencies: - '@volar/language-core': 2.2.0 + '@volar/language-core': 2.2.1 path-browserify: 1.0.1 - '@volar/vscode@2.2.0': + '@volar/vscode@2.2.1': dependencies: - '@volar/language-server': 2.2.0 + '@volar/language-server': 2.2.1 path-browserify: 1.0.1 vscode-languageclient: 9.0.1 vscode-nls: 5.2.0 @@ -6039,56 +6039,56 @@ snapshots: - supports-color - terser - volar-service-css@0.0.42(@volar/language-service@2.2.0): + volar-service-css@0.0.43(@volar/language-service@2.2.1): dependencies: vscode-css-languageservice: 6.2.14 vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.2.0 + '@volar/language-service': 2.2.1 - volar-service-emmet@0.0.42(@volar/language-service@2.2.0): + volar-service-emmet@0.0.43(@volar/language-service@2.2.1): dependencies: '@vscode/emmet-helper': 2.9.3 vscode-html-languageservice: '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462' optionalDependencies: - '@volar/language-service': 2.2.0 + '@volar/language-service': 2.2.1 - volar-service-html@0.0.42(@volar/language-service@2.2.0): + volar-service-html@0.0.43(@volar/language-service@2.2.1): dependencies: vscode-html-languageservice: '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462' vscode-languageserver-textdocument: 1.0.11 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.2.0 + '@volar/language-service': 2.2.1 - volar-service-json@0.0.42(@volar/language-service@2.2.0): + volar-service-json@0.0.43(@volar/language-service@2.2.1): dependencies: vscode-json-languageservice: 5.3.11 vscode-uri: 3.0.8 optionalDependencies: - '@volar/language-service': 2.2.0 + '@volar/language-service': 2.2.1 - volar-service-pug-beautify@0.0.42(@volar/language-service@2.2.0): + volar-service-pug-beautify@0.0.43(@volar/language-service@2.2.1): dependencies: '@johnsoncodehk/pug-beautify': 0.2.2 optionalDependencies: - '@volar/language-service': 2.2.0 + '@volar/language-service': 2.2.1 - volar-service-pug@0.0.42: + volar-service-pug@0.0.43: dependencies: - '@volar/language-service': 2.2.0 + '@volar/language-service': 2.2.1 pug-lexer: 5.0.1 pug-parser: 6.0.0 - volar-service-html: 0.0.42(@volar/language-service@2.2.0) + volar-service-html: 0.0.43(@volar/language-service@2.2.1) vscode-html-languageservice: '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462' vscode-languageserver-textdocument: 1.0.11 - volar-service-typescript-twoslash-queries@0.0.42(@volar/language-service@2.2.0): + volar-service-typescript-twoslash-queries@0.0.43(@volar/language-service@2.2.1): optionalDependencies: - '@volar/language-service': 2.2.0 + '@volar/language-service': 2.2.1 - volar-service-typescript@0.0.42(@volar/language-service@2.2.0): + volar-service-typescript@0.0.43(@volar/language-service@2.2.1): dependencies: path-browserify: 1.0.1 semver: 7.6.0 @@ -6096,7 +6096,7 @@ snapshots: vscode-languageserver-textdocument: 1.0.11 vscode-nls: 5.2.0 optionalDependencies: - '@volar/language-service': 2.2.0 + '@volar/language-service': 2.2.1 vsce@2.15.0: dependencies: From f1cf0248941dd648c3802328dbc4efc2b13e9f6d Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 9 May 2024 16:09:44 +0800 Subject: [PATCH 22/38] chore(language-server): implement `reload()` --- packages/language-server/lib/hybridModeProject.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/language-server/lib/hybridModeProject.ts b/packages/language-server/lib/hybridModeProject.ts index 4052c03bcc..4027d53364 100644 --- a/packages/language-server/lib/hybridModeProject.ts +++ b/packages/language-server/lib/hybridModeProject.ts @@ -74,6 +74,16 @@ export function createHybridModeProjectProviderFactory( ...simpleProjects.values(), ]); }, + reload() { + for (const project of [ + ...tsconfigProjects.values(), + ...simpleProjects.values(), + ]) { + project.then(p => p.dispose()); + } + tsconfigProjects.clear(); + simpleProjects.clear(); + }, }; function initialize(server: ServerBase) { From 3be60c650b6bbea52ee6d315e6314b931d84701d Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Thu, 9 May 2024 16:14:17 +0800 Subject: [PATCH 23/38] fix(language-core): `

- +