From 0f78142d1f24531551e680f620c71ce9800c7008 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Tue, 31 Jan 2023 17:27:39 +0100 Subject: [PATCH] Updates inline completions demo --- inline-completions/.vscode/launch.json | 4 +- inline-completions/README.md | 21 +- inline-completions/demo.gif | Bin 394803 -> 124199 bytes inline-completions/package-lock.json | 13 + inline-completions/package.json | 8 +- inline-completions/playground.js | 3 +- inline-completions/src/extension.ts | 89 +- inline-completions/vscode.d.ts | 16839 ---------------- ...e.proposed.inlineCompletionsAdditions.d.ts | 37 + 9 files changed, 119 insertions(+), 16895 deletions(-) delete mode 100644 inline-completions/vscode.d.ts create mode 100644 inline-completions/vscode.proposed.inlineCompletionsAdditions.d.ts diff --git a/inline-completions/.vscode/launch.json b/inline-completions/.vscode/launch.json index a875cead..513c85cd 100644 --- a/inline-completions/.vscode/launch.json +++ b/inline-completions/.vscode/launch.json @@ -10,7 +10,9 @@ "request": "launch", "runtimeExecutable": "${execPath}", "args": [ - "--extensionDevelopmentPath=${workspaceFolder}" + "--extensionDevelopmentPath=${workspaceFolder}", + "${workspaceFolder}/playground.js", + "--disable-extensions" ], "outFiles": [ "${workspaceFolder}/out/**/*.js" diff --git a/inline-completions/README.md b/inline-completions/README.md index 807dca2b..4f3fd873 100644 --- a/inline-completions/README.md +++ b/inline-completions/README.md @@ -1,30 +1,15 @@ # Inline Completions Sample -This sample demonstrates usage of the proposed inline completions API. - -The `postinstall` script uses `vscode-dts dev && vscode-dts main` to download latest version of [`vscode.d.ts`](https://github.com/microsoft/vscode/blob/main/src/vs/vscode.d.ts) and [`vscode.proposed.d.ts`](https://github.com/microsoft/vscode/blob/main/src/vs/vscode.proposed.d.ts) from the master branch of [microsoft/vscode](https://github.com/microsoft/vscode). - -You can read more about `vscode-dts` at: https://github.com/microsoft/vscode-dts. - -- ⚠️ This sample can only be used for extension development in [Insider release](https://code.visualstudio.com/insiders/). You cannot publish extensions using Proposed API. -- You need `"enableProposedApi": true` in `package.json`. +This sample demonstrates usage of the inline completions API. +It also demonstrates some proposed API of the inline completions feature that is not yet finalized. ![Demo Video](./demo.gif) -## VS Code API - -Not documented, as the used API is not finalized. - ## Running the Sample - Run `npm install` in terminal to install dependencies -- A `postinstall` script would download latest version of `vscode.proposed.d.ts` +- A `postinstall` script would download latest version of `vscode.proposed.*.d.ts` - Run the `Run Extension` target in the Debug View. This will: - Start a task `npm: watch` to compile the code - Run the extension in a new VS Code window - -Make sure that `showInlineCompletions` is enabled in your settings! -``` -"editor.inlineSuggest.enabled": true -``` diff --git a/inline-completions/demo.gif b/inline-completions/demo.gif index c5003ed49d4e5d779684a048de5148c8a6987e7e..d30d446637a77204d539b91e425d824b37b4a7c8 100644 GIT binary patch literal 124199 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�D}jE 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 l{^WDRg_aZ<6^&9A$K?{?}c*_+MP>)JFgS literal 394803 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∨Q^ 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

4MTSSxGqwRnv9Zbduz zN<0>Iu}mdV(J9}15LyL@$NVe0wZy+hPF(=vv5H=+-mkIe7gyr3eh=}(M7&EtJXSdv z)_a)B0f@)^D~Hp>k1~}2@mOEwXj$)3E+8Izd$(%5O&k!9U2Xwx6_aCtcnol>Fb0hD zR>iN}Dgf~q;8xKKh{pi8io4Z-k={uo9$=&gxK&^SMtXo-MF3!=M=5dI2^i^x18x

pf46qe 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%0D3HR4s=nkA#Vgc{D9vC|m7Pfb)ii zJ(PRTR(Ac#4V(w6EktS7(!p#qM@r*exZ1l?M%PFl-`D{)58Mi%k5wz%W-3g4hLip^ z%|!N9o5wrVDiWroaEBF{B$PS|uCB}PiwSlvVTv#0zVLk?l@6wx735%Dm%bn<<3Z55 z_ENU(bP*Km6nVJMUqI0~Zkf03vqaWe-SL)Si<4XQ>Va!&L)0&_4wufdN=^1zIW ze;5H772if>K<3|ve`b|mR*iR7okw<~OHP|ZUXM-w$n%2N=7rOyg|jB`H^%TeBl!G} z2QUYiX$qe;htF8Tr)=O8_V6*6q9MQHUPx(sc4c!}O?_QmU44ChLqkJjV`CHGL*Crn z($dn}+6q{a0}?PD9UYx#jP0)O?ry-DytlWvudlDazkgt0U~q5{Fe)D&9v&GP866!R z8yf>m%O@r#UcY_~2**rKO-)Zv&&ibIsT<%?0=7t+m%P@i@xOcYiWv9wt$xARRhv= zU#9F_200eJ(xo6C+A)J*finXU;cSPeq2ge`MMO&T;Ayy=jId#ZBA0_WonN4XVsYO(<0s#7K!M8)|<H&xqAgqbYmJ=zH+cswKFMC6FDR4wb=U72N)QSGI^z$;IL~=- zzh=V$gt&8IPC%9ZT#_E}CON0Y{ZEN;{`U!EY3V;xHMEs7@wsjh&1sc-)doiUqLln) z4XJ$tv3)Dyt4@4}9z2IW9ESmH$6+kT5lqK1495v{$4PX@DKy6!G`D#)?j8)rX(>)K=0ba;?}|K-Yo1{C+$^r+qXo=Ki?!M(;+m;Ga?~4Dh>jH04iE>adGkS@lYuA z55+ihb8}%Z7#t2SDJdy0F9)=@s;jGOYHDh0YySb90et=*%>Y(^gKGe>zefvz-p$Re zEiLV>t(|RcUG42X?d`oC9etgh16^H%U0p-n-6K6cqrJW3eSLo){r%(p{jUcGriVw~ zjE^r&PA<>Ptj^7?FD-4ZynX-f-S*o0hmDP$&CQ*yt&i{D?{07Je)#a|!_M9gFg||% z_;G(1=pg@e`1$kE{{GRIFDFMwfDq5`DNw)t&9C`hz~qy!Ur+wUO2^f9vvHMw6yp?r zp5Axf_4`wdlXc1eD#Tr4Z!d}FUI-bR_O?gy_9GRV@pl~ALS+0N9zEJ zoX}}}m>mqko{xNiz%ws^4Y21FRJH_|!!5UaI1(C=Fr(s@^jj7sMzlek@jYA|Mr8w@ zxX;V=RF$vAPUz)7tDH9IeqN>NivNE`jFZ|JHl6ERrtEDLIGuKrVP&X zZp@^u-G7gswX)MziIlIK%7JZwkn6$H5F4S0UF03EM{gkt+jmw+pA0y@NOl`ISmmP7 zKUzmi3Pr5N_~=D$6t@n5H!}wfkG7ySb0hDopJt0G*L|^^`oMw7E&i-6-|*yPB$L(1 zZlCPx$tIRunDcu+X)Bkfqfwcs`$2Y+BVQI+m>U#VV%;VW>9dMlpKN)pAdg){whxp) zjW#}5_Gbxo`+RhK8;Qo6fJy=q#1c<6C&`tX;3@WiInrU=yjY8eX6>0D@My!(@242& zzb3}n^J6j2y);lrt{jWfaG=g!I(dJtyim_@D0nY}jv!A_L1`osx(Bd-@{}I*j6e_o z`zIt%#aL++3b22K`||+y&uH?|-WmHx&2O5HehDP4>JuSLXnATg^y~Yg!54G#CJJ*ebdXB=%<`}6AuWwQg9gXK##^gPf$kzBU zJzfx60kc1aNkXO{JhN|os(0H6I2flt#6bP#vBQY=95oI_;@j@@*BQ+B>;F znQ=hu6WFf;ISmK|0@4~%QqrH2pU9O;Fe0Tb1Ja!Jgsp0_oB!C|3$v3UR zKa?9hXF#84HmA7M2Os7E`_GH)4}ZgJ_Qd8ls{4i4%udSsP0vIkQsqo$98m5C&TuXo z^g)GRG}HkGYlGq9Zg@1JysX0+iWezw_uN|>$yR%DBSh)`>KIJxu3mr7{gny0zL+b4 zGGuA8)Z|L??OyxL#!71rcu0ah*PBxN55E2RLa>fTtK;->f18Yje1bvcSe3x;x_LJIG2nEO!1{h##%g&#u)uE7S4NcDxVO?*dKtqMGm>C-A} zimVWu3!-adLfT+(+eYkF=v?DP-3#2w42QcH?&Pz$H!QCYW&h$vfO}TN0t4ElPUxek zIRGvIi12-9^RN0a0!dF7E5xJc2wtLOi^}ynG_x zhA1ze7~d~LoR9Cn9N#C1@$mygl#gG8k6-vqx%5oG6c~VzsQ@tee-{!GG71WJRMnp7 z>RK2ZIlr`vaQDpg0)+d6i~WL&{R4{v{PP2Rasxaw1Km=BToZ$w;({EbgI`4kzX%Sp z@(MC_3O0EW{M0I5^oS`~Qp*nQox>OOmm!hgv@xMN z7|9PY()2Jg3@~#|unL~z6u-Do2EJ6`L0{>|Ul$_S93{~Lk!gb}wI$tcP1R}3Flfs* z>w}q%!cATm8%&qzFO=)9RBNsy?rhg7>^4Y!ZW908bmMcg?B}-IpF6cacN=`}G2QEX zvDXjY8}Rrt;2=)hbn3_H%$=Fs4{r)S%olCUSG-$5yq#}anr?YB(KIz& zKR!@9+>03OuIlTk=;^5FY_Du@t7>VhX=<;p?`W=RYpG~%Eop3n13u@7&g|;0%*yVJ z%HH(K{`AVhjOvl}n(@rK>8!?uoaW`+mK9jrTX^T&((cu&!S&kl&F0C?{x@smi|^j7 zyj@vc+E`oIT7UC?W9I$F?EB5Rt<8n4&E>7lw_BU5Tbt{@NRDo8Zv8R`zaQ&dzp`pT7;@;$M&NeJ)2xgE99? z=$jis7#{e*b|x+ba3gqAwNp0UNjV6(5xnYs-H7yh!*%9HVB4C}sN{O)Mvwvvn=h9* zb0c{DJoM35^P3)y`xw-N?G>kGY z4I?SWmkoJrQO0yvupUCjT12V$cXznhD zaIIDoGh6JjGA7cT+A2gRk{iC2OliVhQKBKsTT6cwuT2!K?y3=f-L1nT3t~*xrbv`% zFWSn9CIV%XHbulQN@Y)U4`0=`l^x=CY?EFK{;KAi8y*a} z5!_FgIW(r714ZAWb~A{7D-}w%qL?$e&m+r~uBpuKhMlFOmT)Z@G0gC&nmw4R6ie)B z;o~=yel(4sOx$uC(&?09b|&yvBg)rk&hmN#z9AvU1@+>nF)&BCq`qO$bK>QfVjGfK zkbIcb5(x&U{2HuxyWoQ>^+aL45_>pbefGoMv{MqQojwe~NXsivgL!XqA1_$QlfjXn z6se7ZQTL?W9!d{LBI}yHdF&F2I|i_s>h~mD+H8C&9(9!tL3%7n{AfSmV7z4kYxTU9 zOeY}?Xqy~J4Qe;Xk7i(|i3(0adbiX$4)Z#BKk+4hu)_yp^z?hu&NZZ!?n@D#!0SU3 zA*+Wk;G*A*FR;ny5int(RZ>$M0lFrCDLHqTYvBpbz3LZ0ql+i;GHC?&;wtrX@?Ki6=judA+cb zAd|?tb%JxPqu4`OkvxFhn|@y){1Q`(z8$oSx?#aveWh6*ZLyU+lP6F;IPHGhK^x7I zP@sm10jULGY%TPqcCxw18|la+d#MW}Ibq)C>;JVs1pW7#$Tp=}l&n_4<^munrms+R0Ig~-g7>&YsUbmHr zrzdTD(oijv2fEQQ61_qmVAAB-#;$i;grV5oxx&a6uE=Rihg56jAdDQc7uh9HtG+^y z8`!AKWpJSc$4?f+0oziFjcERWnq|YLr*i!L6|1LNv#i3`YCZ7plcc|`Cd5p8I1v5f zd6SF?rVRG3`dfm#!r9Cv%wn&2@6x?K!Dhre47;g#Q7kknhR0S%)wKiuNEzc&H*)9R zyFL0xaa8QgfsVvFCBt_Poi%BrO9r)$_`^^`@}>MlaRp3bOzTMfV|NyO3PtuJZ=)|r zZh#+TqCyB;b=!r>ThuM-I0;*ZT4{o%H7erEJ&A&}FxWaYv^=xv$i0cN?+f@7Z3hq= z<2>RT*!AtXsruqJCXz!qNHijY@@ic07WyF$$+&)+W`z`DLyiX(o8LnEQbTUx9S+;! znJN26(jo8Q$V^;FyT`@B84Q8x>5C37-e6mT4=*fM*;^Q*V-@(ONmUjD1WxQsJ(&C* z@kefWJX|6)-a)%bJTmDfuIvkLQg}vSKLsJ=^PJfzFzz=1)tUA^UD-$o?#ssJjibji z1j~}C4!00S$>btZyGTRuX1o^muei{$SUHLiW9pE%@@++q*mYCzV%mlGMm(!=iTy!1$zB!4CIz_m_TG1|5Q_S}p(JYS zrltrWFka$c(QL%X^LEM#TDsYxWzP@wru6I?H$^JS39jGojAE92BHf9JMWGw4Pr(5)#LKF4Jj=V!S=E`Ix-#5kmLmb5Eip5lYs7=6Of z&g#u{_M0kSZRtKN`(#Gx^t03@3`;QExw)&b3Sb9?g7M2E8;=LIbWgfpo_>!0YJ+>- z0`*c-u`C&KXh-i0?nGS-d8^E;dI3qTX40esjP4Jw!aI!E%-Qeqms1((r2*ztKV6k=p9Ew_)2P?nQWqzJ9(&Pe5f5%_GmKck;KMZ}GA8%B z=&L(h{v~`<-T0~iit!U}p0s6+YxNYWR}3o3XhvN?v*gt~crXP@^V43(@{3Lf0_+u`>9(r~i;35#QB_L^x62AA|> z`uMq*OHw8Gg4sW(w?vc$d_>&&n z>bUs}xYortUJ!d&(O-C_FYm~M^_a&!r5!sT1`iwr50QtA2#1Vmg-kevOvZ&wSBK0_hRhv=ERcsT35Tv|g|0e;uEm9JREKU& zhHf8(?vRJ=3Wx1!h3z|p9mItlRfnBSh9M8aP$0D`vc^ZU*FGa&wIN215R-U_Sq;Qu3SxN(v8IT%6^VVR9c%9x z>kuCcu8DP?igi7Vb*G5)6p8cJj`MYl^N)`UtceSriVHoA3#W*W6p4@4j)yqL1Lru< zn)t-2_~gU*R0?Ri2sBe0n(YY9jfcW&paoM<_#w2IBB4|yp;h5MJpV(8A*f*6paF{qmku)NbG^U+2;g~cTpEQlENt&HXnmbHd zph#X4NnX)TUUf`fi%;IDN#2@D-abs;p-9;kN!im**>_Aih)+4HNjaHHK^~@{P^O}Z zref%%Vu4d}ps9F>)C<$8gh#0$$}|$uG*X?kYo-L`W@&x?Y1o-*JzZ(Eu;8W3=`F(P zSMh?G!RZZg>Fhm0oYU!ugLIz2AU@HIO05h*r66HwMrn11I9||=qYOBCrc6(uoK7ap zAyY9hPzjNlJ(;PB7pO*=1r^S^rxc(G&I*mo(h2l`IGyErkfq<_XCRtwkCSdh8Ds*@ zE~?J9ILfxB%&`^Cd8w0Q56*Fb=7147&eJ)rM>+14xt^lANN=57UvREJG&c~D8$6vG zdXyVZnHMRV7p;>A0q4a*^Pq^l#Ob``qr6l~Sh^@IQwNp}hUG$GFa)e%8U{at6;tMy zisqN=l<*}{_=*mE6%1d4!Z#4`ExZUq@8|Eql$`goKjM+c-7l)K zDLPQ1Izkkc4i_OeC{d`2^LUFfIEsiIigTY7<84x0m?=*DSPaUiAQ3BpsF#pYQIIE; zgq4&~&ydp|m-rKxGKi61)h+d~DP=vr%wBt1>M~r)6?B=0s_Z#$5x;Vo-bXm0SDE-s z*^T2eDXMZAv2r=xa(Sn6#e{OD+H#eda@FHJS_u_8wG|I%D)f#k z^rfDlLyIt*NSP#j0NFR@pmMIV4npYpa}Rs$7q&+^MQP z#j3q^t9_lSZ8i5hy!(rP=>0ho?!AXT#ewUAy>zvE@p}isv%UzlhbET+N{Ax zMGR>Y1tlP0wTK{&nrtV8pmLG9GKTo&+S2^WBJ)}?r|N8T=7Qteyv>?a4n*cL2-;iI zehi8>ujxJpg^3~hYe9j%)r7y${V~sKKyT2!P{>g-QFDT`EB#Z8JR#}98KtqgWf}QJ zumX5N;aQxYlL9BCz@aC=RQVY{SKwb-0f5@{k#HEy9;h)Y1k*~YUSNw{k_uwFjVBjhy4($6r)u$5EPd7=Eu_3kTJ!1Y zolr?3EX+gO)ylNX5uu!-cTMH9d6GH|O)r{_$H<52wAb7>evtgw#TQdl(?mO6D?};F zQP6ZI%QT_Eg;Ho^HVkyLXf24`#UDi+r&tuORx=LGZB3 zda6F?tNrFt^@o){uU4Z%YSD-5Re1_RH(Z2lmu6y-kKZM~IexLTTn4w({sL2}cr{h| zPSmaB=wNHUw~*-YhTAZ5-T1W|3{&xv3mW28s>=>>93Y#2=157R*%mHEYGktLL!qG+ z;qdZ_P@?^^hkvXceWXyj<9J$ZdcbbL0ZjmRx?cHwlbyHMjT69V(>bYbJ-61*h)l+5K@8Km>FQW`rjW=RW~P~5syaql zaeUKx87XEu4-;cGpr&~V$&~D{jJX=Xkun=h$&p(Yh@ikB zqMXHvcnRkD-ITSQCH;K)u+lM6-NN!(gPHuw#%%x1iXm0=_tmqso6k$$-UuqFUiYlE ztXyn4-md&OB4$-}*G1W~{s5V4ReL;VZrQN5D^}cyiC?f?GfY{>(@emz#nrkcD$d(> zNtv3beb?5asPmNUu&ABt>1;{&l?>`qO+vISzHV-FYW^{D*&)lfAH=8%w1s4 zUkHE_d(Mgl-T>#USb!1>@L>TaEWm*U-UEw^iz_QDzkXWsr-Vur?=}9^ju_7NuuC9Zzu9l?$p?<>kGG2XEC4t^XG-FDGWiU?A z?Z)0M(ww0L`5>(O?4L{qGSy<`pZAbvk0xQ3n$hIhnRmmrYdkN_#1y=a(#MY@IJUEx zDYY8RR;kr|{;<;I&8koB1NcqEtM~iuVh^mIH29r@F~qg34O-j?6y(LVZR9(`Xdd|1 zY1tb0q+F|NtJ8jAG7u|~gH^AyCpVIFyGmX{$8IoBGrzR1NB4{3Jd;NXX>#O&(rj%= zquh<%lryhl*~ciU2)p&kJl&$uM@MLrWzUeWjU?ti%kI22ZLF+Mc6R#2Kiv4hE!oB8 z%a=vJ=#&&!=i{%7ms4G}P!FQ-;b^o!w8kfVt#3m_8>??g%q8^1_R>W3;`7VMN_sUs z`>s@f!bqI7021F^1|L?PY6jnHX5@^1++blwf6fWv^iZZ_S)BGP4&a;VS)yA#II$9kWl8OMKS2)rR#};*)rpm zrrEMmbST-gh51C;bF$398`%Z$4Kr9&atj`;Abmt>L+#2EI0LRc9mrnv=x7>NT!d!M zUeZOGZ&s@Ke%hj_r-Sl+!RUm}`@%sir}sruw6*Vx=gDT?moD--(UmVNC2&=2>dbIe zzB4=Ks`>~PJ=o5NH*Jw@!JBuG3FeJ&1^aedaYplt%ZRbXc@dX3 zol5E`j%Q|CXvC;@e?wyZj?#uNoXuVQ?EIrW;<5uX%R_T(A`0pw3L7Bs`m|z1NqJ>i zc?A#v)e%5xARRmBl>>i7KjZ&}6#yCte(*K_Oyu zJFi2cM~z4|wRiU|ttg)=^#dwjDVp3To>#cY4ZIj{tStr*LxkxAFTotrf+$L>>4Ryq zSsDF>0^=A1#Goe2Vb}Jn8N&JT4$~ueNdht=MftijqHbW}z75yV)Lw~JFo@5LQMR4R zjJ@MY@ixXl=viRwpDw^gFe)J&8FHxpjY)4 z6&?lVTen=eO#Pv`S9FWJ?X8kCcl!sOIx8z2^Sa_re9Uu^QJk|1%Xfq}1AE(eg}KM) z2IV5c;muJ+%?YJVc@_0#RfwwUn(7(^qP7;`nga>Wd4~_Mzx^5iFRuWAlt1|TfATIc z?Joq7Py_M3y9_9@0B8*~l>zzn+qZAO7g^37A^v z`oZ52TJ0x7|HmTqH@ft9gf@KXX5kuS9~AGER2Z697g^L2Q`QM7?}Aoz=2W-V)HT$e zHEy1DZUPB3kWQVqUIMAi&-l3lzzP6OxIb8jKY16J_7?&`Xdu4#{{qdwKuH{+R|BOG zpaKFEJ^-i&iXDGg>G+;Q*Znnw2LB;K|IDF(=FtB_4*gq%HgWW^_Kt9g$qLM=i7M-i zuI!Di>P<&E4HMN}eX97o*t*t;6`W&8tlHkwyxdQ)e1%Qn9pWOm}|0nMP)BZvL z2o1z{g$AGu0wmTz)fy;+05xhLr3Rq-7xw$f$@#hEc`cgwZ?))-zlPAEe~8dnzpru- z{LfT59{(+e*7})4|7YjWq-b6!i>Sb9Av=$Nh>W71wTm+(H@vh9QZp2X7*4Jm%4!%W zY3i+S?QA_$IOzbY9Kf~|_zM7blt1I=3VdGyAZPu4{SOyExCPAo@!elf0A~J$01z4o z;B*ndX&|cxP8Wg18aP)3juU~z`kZL;Hy#P~*=ZrbBl(Ax!=PV!iR3W}Wdf;h*=BY| z{i>G;{?Hws-Jc+A)$@ymx) zr|Lx{f@p7pnb*p*?&j;!@P1OCD1O>YyLPm>HB)`_HDOY1l~q@*`d3=j6D#Ya_9%`V zC+F?mcSD_mMHKaj&-tT=dh-Jkru*9qt;kO&KrfMF%*tT?<1k(cpqGdS5q78XM)TqR zr`FD*#;=Y@Bqk26I~th@jRzKUHMJ+6pfI%;p}ap8z$3w-@*y+QqV%P-pQP}k_0^*A zXMjwS2QX)Akq5F@PF@b;>gbv^?dmpRG~k)b&3K8mx3;V&hGm)K^10Q^Z}(JSHP$%J8=keS_C;W1m3Q$6{{s8LdK%Lrt$HScBhXLv1E- zNueqYrtgx)7T2?qov}6|Qw;IUSe3ldz-#F=OiC;n;kMV`8AfPQj%Px(VQe=;H4y7L zAUh~qZYI0$x_MSMG#ro=+1PMF=1lKz6cqG`=I2-J+H=55HW22p8oVzYdCe2ToF(;m zPFvaSqE(!^{Tg35%eyJX3bTgIUKM6fS@v2~41lRjtClpCENjA(gSOK*;N~W^+gNy3 zbxs4yR!RGF_{I%K@NTQdXGnaWI1$3Sr_EUN{?;vgTz$nsgpvgYZ6pbbHth_0!6kl_ zRs~NwX?1aIyGTM+O1+p<3iNx}sk&@?(Hbt4x$zAaJnk2q@q00__rC9wtAOuuS;!5d z`Z+ZD&KfBc6`>@7=G$VYqdCAnjS_d^e#I^RRpCV2hP7*fWCluQ(Se!X|AHzRct7Kra{bU zsvRjdUqeLX{IMhda@~jS*s8kiez7p;y(Nh|^?UWQZZ5ATtRxrq=B!@394vX=akX1c z32Qjqkc@Rb-Yz3@v;8o5r}1Q8(%%i)Fh2Oz3VHn43XQc1_kEFj89g1^v%BS(M_C?( z!520daGG#6tli1#Qc;z2nhCH9y~tPSa46!MiS=^5nI95h+|7ktDh=o4a!%7SV3qAl zE%rs!&=X2#w$fPo`XX<%sS>xFjsquofs(vxS(&TJ|M$dR}@IU}wZ zQ)Q!pk@#Y7BaW;*C9~uaXl9!cYsLC4OUsdjI1FQ^cD7r#H%1bJ<%}7|O%?44N0QvV zjjz1TQvlBmC%;6t8B>2=mv@B^r;CPLpF4KC_@;-l;9@2Y-GbwCa0V!-hDF}Na#=&owq6WGnh0~Zz!9z%@o6K zLn@hTCpB;b~V`LEGA zKDSXylnM?Obj#*{91|6xds~F}YElLB$ zVX~adq(QAITO@+%vyE zq1s<@$7}rgh@rW_G+}?GWb3uTmkIoH(|uL^=v;l?Gki<1zG@a(uI^|mzEyBv4V4#H zN2V_ChEgAbsFka=Jb`DMvac2$ox7=RhI@CTx9*D!cl{U@_dcSxe$$g1v7*a$6xiD^ z*Ycrq&*>UcwYPB)ZKo8&nG=nux2aKP2TtnDfi=n=*CKHH8sjV}c4JRVwI`1can>RM zM`i)860Q+1t_8eWqjgP00>8ItI=ZfU*?u_WT(?SKv>s0I(o3+~4oQFaFQ$!u|fX3wQsy3;&PZg@04@_>Ryl z+yd-?WQK&CsQhjDySjG`EzP|mT@wmJirOKyqtNE5gqE4amYI~+>GZa#y!O{+onwtX z!=1eYfYc~3&I6$A0Dukb(a)(lz+UHP{9J)QTmb+ke=z6AcYz1LPXI3dLI6iy=LpSc zc#hCytA7ol2mTPDFZ>>%DgMm}9eK_MtK#`PXBUC_le7DO31^o8M11iw1;rJHD@<&R z>|9LO_}F-bI0QrlByWl<+`gr4@Yv4lWmuYTPF+MrKeTx|vGq-I`+Q2r0x;4$=kvPW zAo^Z+4vY;9jSLPAp9w>M3!tzHoCO2Ls&l40aPs>zey+feR{&_2`@w`C-vu80J^{G+ zlW~sH+|K7HO||vcP7_qJ=}W&yX^ww0O52{J^oP{Hqcj-%Crba{gVO(? zVTyx`M?_3QN=`{mLq~I!g`Vx&RZdR3$aUPn$PoFF3p0P z_PtA46!#}e|Hq;<_HTONeylWofq;;Nl#Gm$hVolUgyCCBgoRfSNVD0mi}BvLDRfiy zmag$rry%EqqQJton7WCS?zd@uYZ(I@nS+1>!)DIVM)AnImhq*b$+^kt*{SK7GefLz z0o1Vp@(#eQ{AVIC|GK8|&nN!(ufW%@Uw`l=e|#5s@cRVd;vA(F3eHiQrSGqyH1rQq z`pWN7TJqnF(!Xd)NJ{@5rH_81^nb3F1ko8vqXOu>ht7qXg?_6J<%ficNKb{#k(IA>eKZl&(icN5;lRCnf+Hm+`5| ziJ9rwvolk3Z)WD_-Ym=m9O3!J#kr-WndPPNm8GGTWnc`itcgI0)Aaefp7r*(}kM9Cg|H}#g zP<8|O z9l$0II4A*XAm>}TbCkY`^9LN>&M-PzfW!OEHss6?U}Om%%kw+ycd7pvL$rbZ3_oA8 zS}*)7s&&HK3V0-2M_;&G@s@`&06&07rD&_Y@j~y^>ubM!Sja+3f}>y5O)|bNF*i=8 zuLC%|%LzWzufY6SxIXSO5he)Ky`e4DWVBHMUNAMgSA$rjE#+gt%;BQaEHW; z(DSAzDhu5>8ahFf`vfBywY#UY&+XJEB39^4R1}Hw2@e#336qQv8t+S~D9G{hr(v1_ z!WW6L8LDaR6&_hlzKR!p$hMaZeU&9NWYDq3aAZ`e>>bAZG|ez& z(Xqu@?z$6Ht1Sho?^T<_WhcN9*9_YPh*N zjb(AG(=}D!O4Ef@30!B7s*`TUhoeKGm*CZYTrqjU#P(p6D*aR84P~syF?ug#D#0s~ z%vW>+|NbK&YLdfaeZt21RJ}r6SAtMzoch=0l)se&~WWUj3UC{hZR9domo?+dCA*m^g zmkkL_^*WQrL=Pd&>bm#a#)$5^V5mG|sS!}IcznVXLJ;j9JqUQ`x9<4hHmKGh8H-~V%7;fdo>z*hK zZE`XwlQ*jO*2JL=%;*`B4k++iaa+`*h^hQ9TmqnlH4GGoVwR9dJoY9SyJs|t{i>u? z3_dgF)@2MnHA%`sC1%(BE7%~d3?-T!CKBg>uPBrJ1QWSl|6g@?{?CNtz;S$=m8+yo zuBo|?Ij|Mq@8SpgwZ)1}s+SODmzdO9=8(y>B@nqirGP;R=Pe9$c?j%6-5 zn^4i!>pzwy3F8vcqG_kf#;85J%MN58nPO#{A{N}}2l&=@0-QLO4O`>MYg+eIr|pf0 zI}#?(_&>@BeJ|5AC^%&WE9R@c2UX)dgvQ(Ld-FoT`(*$#>FJ1v_y@q7CH?@KA6&^? z2x^6gq4Pq3Kx zQU2i?r~h+s@y+Y64eFP^+_0p)u{JA}lE;5c&0d9pbu*nDnwsxfe4guI8u9IIKlyBl z|Eh-I%J|NYeSH;A1Ef0Y3>+Mz)4zrRYBm~-QaW_2ag`y65m&mVHlLik`nR*JtC{+9 zbey}?;J#x4N=P+Dz@Ca4zDcrS*2;C_+XO=}uI#zoR;~fuznrr0uva>1{6t7zwkqc| zBKor4{f`GzKg`NB>&_d7{07d~b<{k6CzISC-;O`xMz8C%UH9~#oy-`H4jkSTK6*)<5r3CPqmGZ|tW2y}1-_g3L!FwVl^`~d`QSQQ z)sxr?mo1Op-`e8x^=g|P3$iB?`Fu9Vw{AOwcZw9{I4<5MuuccL;+VSX$D`^07L`{m zHg%ITrwpvvljjZ^Hto!t<)U4lK=hO`zXcYyo?7Q!CaC5!t;a{LylVE%orby)yuWKcu|pIM%l4f_!@cHSfJwUP~=bAOx+sgy%hgjyOv-^yk|LkAvWzHx;!T| zZvpjp)t?NO3G+Ali`K_{g;-PBi_84c8Y@VBpzP)nRjW^-gW7_iwdSV zGJ6xm>c7t$Pza!gO_L6_)(CVO*D4hWkO;VvKHtP~+mGt`G@PN2a$R>W2VY4fUCUfH zE+>6%TB&v`Kwj<$`k0ii1mHL z4GtO2dFgf$GZ6pPR^i#Y&|Oxs`0H%5KkH;r_?6$~wwUg}UTK|E$Wcg3Pvp-NBPdK4s7xH*d@9`L%2v_Y5*3tWk&hK^zG#+Rm&*Nwp&lE zE%jtD8%{XKgK+e@IgmF?ATuOxAn6iw+dz{O-+Qde$YJIQVqIAvYX7(~l4=a*Yb+dJnq8y67 z?ce`m=PMQHWS0LWD%)4b;>y)}_jK#>3|sd!)xUk;Xk#mv(hwH8#jj3*#+=?Kc-bwZ zl_J#6aPgPk-u04E7Ltr-o`J@{9eB;juX>ge*<-|`ok@BJyc*`wyba3h)9LKfUva;= z7XX4Oo^W#1)0#AqMqgmn9G`Onja=5d-dmu#SislTE`r!8c$`@e0|Li@Ff^#a@_|m* z83*#6`==qndXlM#>C!4vyZRs=EVhdz!{?mTUM1+Lh1}Qb^F9#kEcFMjK*gzWCFs*h zA3?$`#vjG|ZAu0+@oqCdu<#PshZ2(~!j+Of7U5iaIhPaRZO_Pcs*ODA=X7$(@GQjT zjlUr>Ao&CZpqKiagD~%nP2?eKyzN^TTizwJX(z>(25$n?KGp|&PT&JC`H?)|b8KM1tS2xmjrYkP!x~ zW5^p9>tBOkm**za;;v+h9rKbbE-sLwAJ-@Djvo!Y;4cL_j5I%)H>17AP+s_ zxTW%Wrb=fbtSO@!1C)}_NNJ0x2JAr64+TH*u1*CSF>F-6Dc3xXvt1==s>P=4lXw8p zH5(SroYSPnG-J5}O+JYPQzvU9$o1Z!V;dT}m1JWkS%LwW?vTyZYb6+fWl*hEa;*dd zKrm}jv$YZoz(JkjgrG<;0Jmhy=}L+O1Mr-sc z#5*k#3;=|rf-%&+II0YRD#xNqFaU*Js-nhI2?hYcJUxtiD!~BMSrQE3sRRRnX-F^t zngj#T$I%Q4G-DRcWKK*o-K9w|066lQCFYqG?wJkY8G`jc@Br=+=s7HU-W)xDmtLU3 zC_*wyFpM%Bqk_PwWHE?yjH+EmjRup9WKu9pi2=~~Uk~7~Ip&jHCRKw)L$aP@STAra zI)NqW$+72H9lNY94R#Nb-G^Zh;MiOOdyvH*o@4WO*<%{*6Ug={O#3S_uKhKkeU{ZO zm}_6yZC}*rSVDHZ!*s0RI)sFdRaVE^T*s%~jtz~@O=Ra5rgIzD`JK?Y!|D{xb&7X8 z0njcGstb(m+Kca!A$G~JyY>mX6hvK$(C$O1ZV0yfFuq%r*sad)h6=imh`M3W9&J>Q zF1AM>-(yJZF=qFe2zpFKJ?79}II7nY+iQjIwITK**u5x0uf3?(0ovz;>T|*Nx#9ax z6Z_7v`#c4GUZOrUwBHBS?}zO_kM9p4_6M>1v4Z|fqW%!*z-81xICdZsKM+M6h-MF5 z7YxLR24bO{coZiA%Sps@l8BsSHU}@@+!k@fsZee@ihCE!&BAl<5xF^RZk~XfFX9$J zc||B*36@ue=T#7Sm24hSz^fARYM_H;)F1^rSdSlUBo01e5B?<>d?Fg8LWgLmq3774 z7x*DMafrztVhe^kL_=NB;U3g*A9i>EKg=Z#53+}c1;c#N@ECMt0yQ#)9eITxc}*Od zWse91BMYLDMJRs>#eaw8ui*JYB7c?5UlZ^@iTE4P(M{Co7It(SKl+_Gy2Bn72}Whv z2LS7%)$(Jzu(7JMV|(WrV(OUe2t$7T!2Wi|0nPDB { - vscode.window.showInformationMessage('Show settings'); - } - ); - - context.subscriptions.push(disposable); - let someTrackingIdCounter = 0; + console.log('inline-completions demo started'); + vscode.commands.registerCommand('demo-ext.command1', async (...args) => { + vscode.window.showInformationMessage('command1: ' + JSON.stringify(args)); + }); const provider: vscode.InlineCompletionItemProvider = { - provideInlineCompletionItems: async (document, position, context, token) => { + async provideInlineCompletionItems(document, position, context, token) { console.log('provideInlineCompletionItems triggered'); - - const regexp = /\/\/ \[(.+),(.+)\):(.*)/; + const regexp = /\/\/ \[(.+?),(.+?)\)(.*?):(.*)/; if (position.line <= 0) { return; } - const lineBefore = document.lineAt(position.line - 1).text; - const matches = lineBefore.match(regexp); - if (matches) { + const result: vscode.InlineCompletionList = { + items: [], + commands: [], + }; + + let offset = 1; + while (offset > 0) { + const lineBefore = document.lineAt(position.line - offset).text; + const matches = lineBefore.match(regexp); + if (!matches || position.line - offset < 0) { + break; + } + offset++; + const start = matches[1]; const startInt = parseInt(start, 10); const end = matches[2]; const endInt = - end === '*' ? document.lineAt(position.line).text.length : parseInt(end, 10); - const insertText = matches[3].replace(/\\n/g, '\n'); + end === '*' + ? document.lineAt(position.line).text.length + : parseInt(end, 10); + const flags = matches[3]; + const completeBracketPairs = flags.includes('b'); + const isSnippet = flags.includes('s'); + const text = matches[4].replace(/\\n/g, '\n'); - return [ - { - insertText, - range: new vscode.Range(position.line, startInt, position.line, endInt), - someTrackingId: someTrackingIdCounter++, - }, - ] as MyInlineCompletionItem[]; + result.items.push({ + insertText: isSnippet ? new vscode.SnippetString(text) : text, + range: new Range(position.line, startInt, position.line, endInt), + completeBracketPairs, + }); } + + if (result.items.length > 0) { + result.commands!.push({ + command: 'demo-ext.command1', + title: 'My Inline Completion Demo Command', + arguments: [1, 2], + }); + } + return result; + }, + + handleDidShowCompletionItem(completionItem: vscode.InlineCompletionItem): void { + console.log('handleDidShowCompletionItem'); + }, + + /** + * Is called when an inline completion item was accepted partially. + * @param acceptedLength The length of the substring of the inline completion that was accepted already. + */ + handleDidPartiallyAcceptCompletionItem( + completionItem: vscode.InlineCompletionItem, + acceptedLength: number + ): void { + console.log('handleDidPartiallyAcceptCompletionItem'); }, }; - vscode.languages.registerInlineCompletionItemProvider({ pattern: '**' }, provider); - -} - -interface MyInlineCompletionItem extends vscode.InlineCompletionItem { - someTrackingId: number; } diff --git a/inline-completions/vscode.d.ts b/inline-completions/vscode.d.ts deleted file mode 100644 index 18a37bfd..00000000 --- a/inline-completions/vscode.d.ts +++ /dev/null @@ -1,16839 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -declare module 'vscode' { - - /** - * The version of the editor. - */ - export const version: string; - - /** - * Represents a reference to a command. Provides a title which - * will be used to represent a command in the UI and, optionally, - * an array of arguments which will be passed to the command handler - * function when invoked. - */ - export interface Command { - /** - * Title of the command, like `save`. - */ - title: string; - - /** - * The identifier of the actual command handler. - * @see {@link commands.registerCommand} - */ - command: string; - - /** - * A tooltip for the command, when represented in the UI. - */ - tooltip?: string; - - /** - * Arguments that the command handler should be - * invoked with. - */ - arguments?: any[]; - } - - /** - * Represents a line of text, such as a line of source code. - * - * TextLine objects are __immutable__. When a {@link TextDocument document} changes, - * previously retrieved lines will not represent the latest state. - */ - export interface TextLine { - - /** - * The zero-based line number. - */ - readonly lineNumber: number; - - /** - * The text of this line without the line separator characters. - */ - readonly text: string; - - /** - * The range this line covers without the line separator characters. - */ - readonly range: Range; - - /** - * The range this line covers with the line separator characters. - */ - readonly rangeIncludingLineBreak: Range; - - /** - * The offset of the first character which is not a whitespace character as defined - * by `/\s/`. **Note** that if a line is all whitespace the length of the line is returned. - */ - readonly firstNonWhitespaceCharacterIndex: number; - - /** - * Whether this line is whitespace only, shorthand - * for {@link TextLine.firstNonWhitespaceCharacterIndex} === {@link TextLine.text TextLine.text.length}. - */ - readonly isEmptyOrWhitespace: boolean; - } - - /** - * Represents a text document, such as a source file. Text documents have - * {@link TextLine lines} and knowledge about an underlying resource like a file. - */ - export interface TextDocument { - - /** - * The associated uri for this document. - * - * *Note* that most documents use the `file`-scheme, which means they are files on disk. However, **not** all documents are - * saved on disk and therefore the `scheme` must be checked before trying to access the underlying file or siblings on disk. - * - * @see {@link FileSystemProvider} - * @see {@link TextDocumentContentProvider} - */ - readonly uri: Uri; - - /** - * The file system path of the associated resource. Shorthand - * notation for {@link TextDocument.uri TextDocument.uri.fsPath}. Independent of the uri scheme. - */ - readonly fileName: string; - - /** - * Is this document representing an untitled file which has never been saved yet. *Note* that - * this does not mean the document will be saved to disk, use {@linkcode Uri.scheme} - * to figure out where a document will be {@link FileSystemProvider saved}, e.g. `file`, `ftp` etc. - */ - readonly isUntitled: boolean; - - /** - * The identifier of the language associated with this document. - */ - readonly languageId: string; - - /** - * The version number of this document (it will strictly increase after each - * change, including undo/redo). - */ - readonly version: number; - - /** - * `true` if there are unpersisted changes. - */ - readonly isDirty: boolean; - - /** - * `true` if the document has been closed. A closed document isn't synchronized anymore - * and won't be re-used when the same resource is opened again. - */ - readonly isClosed: boolean; - - /** - * Save the underlying file. - * - * @return A promise that will resolve to `true` when the file - * has been saved. If the save failed, will return `false`. - */ - save(): Thenable; - - /** - * The {@link EndOfLine end of line} sequence that is predominately - * used in this document. - */ - readonly eol: EndOfLine; - - /** - * The number of lines in this document. - */ - readonly lineCount: number; - - /** - * Returns a text line denoted by the line number. Note - * that the returned object is *not* live and changes to the - * document are not reflected. - * - * @param line A line number in [0, lineCount). - * @return A {@link TextLine line}. - */ - lineAt(line: number): TextLine; - - /** - * Returns a text line denoted by the position. Note - * that the returned object is *not* live and changes to the - * document are not reflected. - * - * The position will be {@link TextDocument.validatePosition adjusted}. - * - * @see {@link TextDocument.lineAt} - * - * @param position A position. - * @return A {@link TextLine line}. - */ - lineAt(position: Position): TextLine; - - /** - * Converts the position to a zero-based offset. - * - * The position will be {@link TextDocument.validatePosition adjusted}. - * - * @param position A position. - * @return A valid zero-based offset. - */ - offsetAt(position: Position): number; - - /** - * Converts a zero-based offset to a position. - * - * @param offset A zero-based offset. - * @return A valid {@link Position}. - */ - positionAt(offset: number): Position; - - /** - * Get the text of this document. A substring can be retrieved by providing - * a range. The range will be {@link TextDocument.validateRange adjusted}. - * - * @param range Include only the text included by the range. - * @return The text inside the provided range or the entire text. - */ - getText(range?: Range): string; - - /** - * Get a word-range at the given position. By default words are defined by - * common separators, like space, -, _, etc. In addition, per language custom - * [word definitions] can be defined. It - * is also possible to provide a custom regular expression. - * - * * *Note 1:* A custom regular expression must not match the empty string and - * if it does, it will be ignored. - * * *Note 2:* A custom regular expression will fail to match multiline strings - * and in the name of speed regular expressions should not match words with - * spaces. Use {@linkcode TextLine.text} for more complex, non-wordy, scenarios. - * - * The position will be {@link TextDocument.validatePosition adjusted}. - * - * @param position A position. - * @param regex Optional regular expression that describes what a word is. - * @return A range spanning a word, or `undefined`. - */ - getWordRangeAtPosition(position: Position, regex?: RegExp): Range | undefined; - - /** - * Ensure a range is completely contained in this document. - * - * @param range A range. - * @return The given range or a new, adjusted range. - */ - validateRange(range: Range): Range; - - /** - * Ensure a position is contained in the range of this document. - * - * @param position A position. - * @return The given position or a new, adjusted position. - */ - validatePosition(position: Position): Position; - } - - /** - * Represents a line and character position, such as - * the position of the cursor. - * - * Position objects are __immutable__. Use the {@link Position.with with} or - * {@link Position.translate translate} methods to derive new positions - * from an existing position. - */ - export class Position { - - /** - * The zero-based line value. - */ - readonly line: number; - - /** - * The zero-based character value. - */ - readonly character: number; - - /** - * @param line A zero-based line value. - * @param character A zero-based character value. - */ - constructor(line: number, character: number); - - /** - * Check if this position is before `other`. - * - * @param other A position. - * @return `true` if position is on a smaller line - * or on the same line on a smaller character. - */ - isBefore(other: Position): boolean; - - /** - * Check if this position is before or equal to `other`. - * - * @param other A position. - * @return `true` if position is on a smaller line - * or on the same line on a smaller or equal character. - */ - isBeforeOrEqual(other: Position): boolean; - - /** - * Check if this position is after `other`. - * - * @param other A position. - * @return `true` if position is on a greater line - * or on the same line on a greater character. - */ - isAfter(other: Position): boolean; - - /** - * Check if this position is after or equal to `other`. - * - * @param other A position. - * @return `true` if position is on a greater line - * or on the same line on a greater or equal character. - */ - isAfterOrEqual(other: Position): boolean; - - /** - * Check if this position is equal to `other`. - * - * @param other A position. - * @return `true` if the line and character of the given position are equal to - * the line and character of this position. - */ - isEqual(other: Position): boolean; - - /** - * Compare this to `other`. - * - * @param other A position. - * @return A number smaller than zero if this position is before the given position, - * a number greater than zero if this position is after the given position, or zero when - * this and the given position are equal. - */ - compareTo(other: Position): number; - - /** - * Create a new position relative to this position. - * - * @param lineDelta Delta value for the line value, default is `0`. - * @param characterDelta Delta value for the character value, default is `0`. - * @return A position which line and character is the sum of the current line and - * character and the corresponding deltas. - */ - translate(lineDelta?: number, characterDelta?: number): Position; - - /** - * Derived a new position relative to this position. - * - * @param change An object that describes a delta to this position. - * @return A position that reflects the given delta. Will return `this` position if the change - * is not changing anything. - */ - translate(change: { lineDelta?: number; characterDelta?: number }): Position; - - /** - * Create a new position derived from this position. - * - * @param line Value that should be used as line value, default is the {@link Position.line existing value} - * @param character Value that should be used as character value, default is the {@link Position.character existing value} - * @return A position where line and character are replaced by the given values. - */ - with(line?: number, character?: number): Position; - - /** - * Derived a new position from this position. - * - * @param change An object that describes a change to this position. - * @return A position that reflects the given change. Will return `this` position if the change - * is not changing anything. - */ - with(change: { line?: number; character?: number }): Position; - } - - /** - * A range represents an ordered pair of two positions. - * It is guaranteed that {@link Range.start start}.isBeforeOrEqual({@link Range.end end}) - * - * Range objects are __immutable__. Use the {@link Range.with with}, - * {@link Range.intersection intersection}, or {@link Range.union union} methods - * to derive new ranges from an existing range. - */ - export class Range { - - /** - * The start position. It is before or equal to {@link Range.end end}. - */ - readonly start: Position; - - /** - * The end position. It is after or equal to {@link Range.start start}. - */ - readonly end: Position; - - /** - * Create a new range from two positions. If `start` is not - * before or equal to `end`, the values will be swapped. - * - * @param start A position. - * @param end A position. - */ - constructor(start: Position, end: Position); - - /** - * Create a new range from number coordinates. It is a shorter equivalent of - * using `new Range(new Position(startLine, startCharacter), new Position(endLine, endCharacter))` - * - * @param startLine A zero-based line value. - * @param startCharacter A zero-based character value. - * @param endLine A zero-based line value. - * @param endCharacter A zero-based character value. - */ - constructor(startLine: number, startCharacter: number, endLine: number, endCharacter: number); - - /** - * `true` if `start` and `end` are equal. - */ - isEmpty: boolean; - - /** - * `true` if `start.line` and `end.line` are equal. - */ - isSingleLine: boolean; - - /** - * Check if a position or a range is contained in this range. - * - * @param positionOrRange A position or a range. - * @return `true` if the position or range is inside or equal - * to this range. - */ - contains(positionOrRange: Position | Range): boolean; - - /** - * Check if `other` equals this range. - * - * @param other A range. - * @return `true` when start and end are {@link Position.isEqual equal} to - * start and end of this range. - */ - isEqual(other: Range): boolean; - - /** - * Intersect `range` with this range and returns a new range or `undefined` - * if the ranges have no overlap. - * - * @param range A range. - * @return A range of the greater start and smaller end positions. Will - * return undefined when there is no overlap. - */ - intersection(range: Range): Range | undefined; - - /** - * Compute the union of `other` with this range. - * - * @param other A range. - * @return A range of smaller start position and the greater end position. - */ - union(other: Range): Range; - - /** - * Derived a new range from this range. - * - * @param start A position that should be used as start. The default value is the {@link Range.start current start}. - * @param end A position that should be used as end. The default value is the {@link Range.end current end}. - * @return A range derived from this range with the given start and end position. - * If start and end are not different `this` range will be returned. - */ - with(start?: Position, end?: Position): Range; - - /** - * Derived a new range from this range. - * - * @param change An object that describes a change to this range. - * @return A range that reflects the given change. Will return `this` range if the change - * is not changing anything. - */ - with(change: { start?: Position; end?: Position }): Range; - } - - /** - * Represents a text selection in an editor. - */ - export class Selection extends Range { - - /** - * The position at which the selection starts. - * This position might be before or after {@link Selection.active active}. - */ - anchor: Position; - - /** - * The position of the cursor. - * This position might be before or after {@link Selection.anchor anchor}. - */ - active: Position; - - /** - * Create a selection from two positions. - * - * @param anchor A position. - * @param active A position. - */ - constructor(anchor: Position, active: Position); - - /** - * Create a selection from four coordinates. - * - * @param anchorLine A zero-based line value. - * @param anchorCharacter A zero-based character value. - * @param activeLine A zero-based line value. - * @param activeCharacter A zero-based character value. - */ - constructor(anchorLine: number, anchorCharacter: number, activeLine: number, activeCharacter: number); - - /** - * A selection is reversed if its {@link Selection.anchor anchor} is the {@link Selection.end end} position. - */ - isReversed: boolean; - } - - /** - * Represents sources that can cause {@link window.onDidChangeTextEditorSelection selection change events}. - */ - export enum TextEditorSelectionChangeKind { - /** - * Selection changed due to typing in the editor. - */ - Keyboard = 1, - /** - * Selection change due to clicking in the editor. - */ - Mouse = 2, - /** - * Selection changed because a command ran. - */ - Command = 3 - } - - /** - * Represents an event describing the change in a {@link TextEditor.selections text editor's selections}. - */ - export interface TextEditorSelectionChangeEvent { - /** - * The {@link TextEditor text editor} for which the selections have changed. - */ - readonly textEditor: TextEditor; - /** - * The new value for the {@link TextEditor.selections text editor's selections}. - */ - readonly selections: readonly Selection[]; - /** - * The {@link TextEditorSelectionChangeKind change kind} which has triggered this - * event. Can be `undefined`. - */ - readonly kind: TextEditorSelectionChangeKind | undefined; - } - - /** - * Represents an event describing the change in a {@link TextEditor.visibleRanges text editor's visible ranges}. - */ - export interface TextEditorVisibleRangesChangeEvent { - /** - * The {@link TextEditor text editor} for which the visible ranges have changed. - */ - readonly textEditor: TextEditor; - /** - * The new value for the {@link TextEditor.visibleRanges text editor's visible ranges}. - */ - readonly visibleRanges: readonly Range[]; - } - - /** - * Represents an event describing the change in a {@link TextEditor.options text editor's options}. - */ - export interface TextEditorOptionsChangeEvent { - /** - * The {@link TextEditor text editor} for which the options have changed. - */ - readonly textEditor: TextEditor; - /** - * The new value for the {@link TextEditor.options text editor's options}. - */ - readonly options: TextEditorOptions; - } - - /** - * Represents an event describing the change of a {@link TextEditor.viewColumn text editor's view column}. - */ - export interface TextEditorViewColumnChangeEvent { - /** - * The {@link TextEditor text editor} for which the view column has changed. - */ - readonly textEditor: TextEditor; - /** - * The new value for the {@link TextEditor.viewColumn text editor's view column}. - */ - readonly viewColumn: ViewColumn; - } - - /** - * Rendering style of the cursor. - */ - export enum TextEditorCursorStyle { - /** - * Render the cursor as a vertical thick line. - */ - Line = 1, - /** - * Render the cursor as a block filled. - */ - Block = 2, - /** - * Render the cursor as a thick horizontal line. - */ - Underline = 3, - /** - * Render the cursor as a vertical thin line. - */ - LineThin = 4, - /** - * Render the cursor as a block outlined. - */ - BlockOutline = 5, - /** - * Render the cursor as a thin horizontal line. - */ - UnderlineThin = 6 - } - - /** - * Rendering style of the line numbers. - */ - export enum TextEditorLineNumbersStyle { - /** - * Do not render the line numbers. - */ - Off = 0, - /** - * Render the line numbers. - */ - On = 1, - /** - * Render the line numbers with values relative to the primary cursor location. - */ - Relative = 2 - } - - /** - * Represents a {@link TextEditor text editor}'s {@link TextEditor.options options}. - */ - export interface TextEditorOptions { - - /** - * The size in spaces a tab takes. This is used for two purposes: - * - the rendering width of a tab character; - * - the number of spaces to insert when {@link TextEditorOptions.insertSpaces insertSpaces} is true. - * - * When getting a text editor's options, this property will always be a number (resolved). - * When setting a text editor's options, this property is optional and it can be a number or `"auto"`. - */ - tabSize?: number | string; - - /** - * When pressing Tab insert {@link TextEditorOptions.tabSize n} spaces. - * When getting a text editor's options, this property will always be a boolean (resolved). - * When setting a text editor's options, this property is optional and it can be a boolean or `"auto"`. - */ - insertSpaces?: boolean | string; - - /** - * The rendering style of the cursor in this editor. - * When getting a text editor's options, this property will always be present. - * When setting a text editor's options, this property is optional. - */ - cursorStyle?: TextEditorCursorStyle; - - /** - * Render relative line numbers w.r.t. the current line number. - * When getting a text editor's options, this property will always be present. - * When setting a text editor's options, this property is optional. - */ - lineNumbers?: TextEditorLineNumbersStyle; - } - - /** - * Represents a handle to a set of decorations - * sharing the same {@link DecorationRenderOptions styling options} in a {@link TextEditor text editor}. - * - * To get an instance of a `TextEditorDecorationType` use - * {@link window.createTextEditorDecorationType createTextEditorDecorationType}. - */ - export interface TextEditorDecorationType { - - /** - * Internal representation of the handle. - */ - readonly key: string; - - /** - * Remove this decoration type and all decorations on all text editors using it. - */ - dispose(): void; - } - - /** - * Represents different {@link TextEditor.revealRange reveal} strategies in a text editor. - */ - export enum TextEditorRevealType { - /** - * The range will be revealed with as little scrolling as possible. - */ - Default = 0, - /** - * The range will always be revealed in the center of the viewport. - */ - InCenter = 1, - /** - * If the range is outside the viewport, it will be revealed in the center of the viewport. - * Otherwise, it will be revealed with as little scrolling as possible. - */ - InCenterIfOutsideViewport = 2, - /** - * The range will always be revealed at the top of the viewport. - */ - AtTop = 3 - } - - /** - * Represents different positions for rendering a decoration in an {@link DecorationRenderOptions.overviewRulerLane overview ruler}. - * The overview ruler supports three lanes. - */ - export enum OverviewRulerLane { - Left = 1, - Center = 2, - Right = 4, - Full = 7 - } - - /** - * Describes the behavior of decorations when typing/editing at their edges. - */ - export enum DecorationRangeBehavior { - /** - * The decoration's range will widen when edits occur at the start or end. - */ - OpenOpen = 0, - /** - * The decoration's range will not widen when edits occur at the start of end. - */ - ClosedClosed = 1, - /** - * The decoration's range will widen when edits occur at the start, but not at the end. - */ - OpenClosed = 2, - /** - * The decoration's range will widen when edits occur at the end, but not at the start. - */ - ClosedOpen = 3 - } - - /** - * Represents options to configure the behavior of showing a {@link TextDocument document} in an {@link TextEditor editor}. - */ - export interface TextDocumentShowOptions { - /** - * An optional view column in which the {@link TextEditor editor} should be shown. - * The default is the {@link ViewColumn.Active active}. Columns that do not exist - * will be created as needed up to the maximum of {@linkcode ViewColumn.Nine}. - * Use {@linkcode ViewColumn.Beside} to open the editor to the side of the currently - * active one. - */ - viewColumn?: ViewColumn; - - /** - * An optional flag that when `true` will stop the {@link TextEditor editor} from taking focus. - */ - preserveFocus?: boolean; - - /** - * An optional flag that controls if an {@link TextEditor editor}-tab shows as preview. Preview tabs will - * be replaced and reused until set to stay - either explicitly or through editing. - * - * *Note* that the flag is ignored if a user has disabled preview editors in settings. - */ - preview?: boolean; - - /** - * An optional selection to apply for the document in the {@link TextEditor editor}. - */ - selection?: Range; - } - - /** - * Represents an event describing the change in a {@link NotebookEditor.selections notebook editor's selections}. - */ - export interface NotebookEditorSelectionChangeEvent { - /** - * The {@link NotebookEditor notebook editor} for which the selections have changed. - */ - readonly notebookEditor: NotebookEditor; - - /** - * The new value for the {@link NotebookEditor.selections notebook editor's selections}. - */ - readonly selections: readonly NotebookRange[]; - } - - /** - * Represents an event describing the change in a {@link NotebookEditor.visibleRanges notebook editor's visibleRanges}. - */ - export interface NotebookEditorVisibleRangesChangeEvent { - /** - * The {@link NotebookEditor notebook editor} for which the visible ranges have changed. - */ - readonly notebookEditor: NotebookEditor; - - /** - * The new value for the {@link NotebookEditor.visibleRanges notebook editor's visibleRanges}. - */ - readonly visibleRanges: readonly NotebookRange[]; - } - - /** - * Represents options to configure the behavior of showing a {@link NotebookDocument notebook document} in an {@link NotebookEditor notebook editor}. - */ - export interface NotebookDocumentShowOptions { - /** - * An optional view column in which the {@link NotebookEditor notebook editor} should be shown. - * The default is the {@link ViewColumn.Active active}. Columns that do not exist - * will be created as needed up to the maximum of {@linkcode ViewColumn.Nine}. - * Use {@linkcode ViewColumn.Beside} to open the editor to the side of the currently - * active one. - */ - readonly viewColumn?: ViewColumn; - - /** - * An optional flag that when `true` will stop the {@link NotebookEditor notebook editor} from taking focus. - */ - readonly preserveFocus?: boolean; - - /** - * An optional flag that controls if an {@link NotebookEditor notebook editor}-tab shows as preview. Preview tabs will - * be replaced and reused until set to stay - either explicitly or through editing. The default behaviour depends - * on the `workbench.editor.enablePreview`-setting. - */ - readonly preview?: boolean; - - /** - * An optional selection to apply for the document in the {@link NotebookEditor notebook editor}. - */ - readonly selections?: readonly NotebookRange[]; - } - - /** - * A reference to one of the workbench colors as defined in https://code.visualstudio.com/docs/getstarted/theme-color-reference. - * Using a theme color is preferred over a custom color as it gives theme authors and users the possibility to change the color. - */ - export class ThemeColor { - - /** - * Creates a reference to a theme color. - * @param id of the color. The available colors are listed in https://code.visualstudio.com/docs/getstarted/theme-color-reference. - */ - constructor(id: string); - } - - /** - * A reference to a named icon. Currently, {@link ThemeIcon.File File}, {@link ThemeIcon.Folder Folder}, - * and [ThemeIcon ids](https://code.visualstudio.com/api/references/icons-in-labels#icon-listing) are supported. - * Using a theme icon is preferred over a custom icon as it gives product theme authors the possibility to change the icons. - * - * *Note* that theme icons can also be rendered inside labels and descriptions. Places that support theme icons spell this out - * and they use the `$()`-syntax, for instance `quickPick.label = "Hello World $(globe)"`. - */ - export class ThemeIcon { - /** - * Reference to an icon representing a file. The icon is taken from the current file icon theme or a placeholder icon is used. - */ - static readonly File: ThemeIcon; - - /** - * Reference to an icon representing a folder. The icon is taken from the current file icon theme or a placeholder icon is used. - */ - static readonly Folder: ThemeIcon; - - /** - * The id of the icon. The available icons are listed in https://code.visualstudio.com/api/references/icons-in-labels#icon-listing. - */ - readonly id: string; - - /** - * The optional ThemeColor of the icon. The color is currently only used in {@link TreeItem}. - */ - readonly color?: ThemeColor | undefined; - - /** - * Creates a reference to a theme icon. - * @param id id of the icon. The available icons are listed in https://code.visualstudio.com/api/references/icons-in-labels#icon-listing. - * @param color optional `ThemeColor` for the icon. The color is currently only used in {@link TreeItem}. - */ - constructor(id: string, color?: ThemeColor); - } - - /** - * Represents theme specific rendering styles for a {@link TextEditorDecorationType text editor decoration}. - */ - export interface ThemableDecorationRenderOptions { - /** - * Background color of the decoration. Use rgba() and define transparent background colors to play well with other decorations. - * Alternatively a color from the color registry can be {@link ThemeColor referenced}. - */ - backgroundColor?: string | ThemeColor; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - outline?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - * Better use 'outline' for setting one or more of the individual outline properties. - */ - outlineColor?: string | ThemeColor; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - * Better use 'outline' for setting one or more of the individual outline properties. - */ - outlineStyle?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - * Better use 'outline' for setting one or more of the individual outline properties. - */ - outlineWidth?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - border?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - * Better use 'border' for setting one or more of the individual border properties. - */ - borderColor?: string | ThemeColor; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - * Better use 'border' for setting one or more of the individual border properties. - */ - borderRadius?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - * Better use 'border' for setting one or more of the individual border properties. - */ - borderSpacing?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - * Better use 'border' for setting one or more of the individual border properties. - */ - borderStyle?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - * Better use 'border' for setting one or more of the individual border properties. - */ - borderWidth?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - fontStyle?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - fontWeight?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - textDecoration?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - cursor?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - color?: string | ThemeColor; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - opacity?: string; - - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - letterSpacing?: string; - - /** - * An **absolute path** or an URI to an image to be rendered in the gutter. - */ - gutterIconPath?: string | Uri; - - /** - * Specifies the size of the gutter icon. - * Available values are 'auto', 'contain', 'cover' and any percentage value. - * For further information: https://msdn.microsoft.com/en-us/library/jj127316(v=vs.85).aspx - */ - gutterIconSize?: string; - - /** - * The color of the decoration in the overview ruler. Use rgba() and define transparent colors to play well with other decorations. - */ - overviewRulerColor?: string | ThemeColor; - - /** - * Defines the rendering options of the attachment that is inserted before the decorated text. - */ - before?: ThemableDecorationAttachmentRenderOptions; - - /** - * Defines the rendering options of the attachment that is inserted after the decorated text. - */ - after?: ThemableDecorationAttachmentRenderOptions; - } - - export interface ThemableDecorationAttachmentRenderOptions { - /** - * Defines a text content that is shown in the attachment. Either an icon or a text can be shown, but not both. - */ - contentText?: string; - /** - * An **absolute path** or an URI to an image to be rendered in the attachment. Either an icon - * or a text can be shown, but not both. - */ - contentIconPath?: string | Uri; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - border?: string; - /** - * CSS styling property that will be applied to text enclosed by a decoration. - */ - borderColor?: string | ThemeColor; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - fontStyle?: string; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - fontWeight?: string; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - textDecoration?: string; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - color?: string | ThemeColor; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - backgroundColor?: string | ThemeColor; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - margin?: string; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - width?: string; - /** - * CSS styling property that will be applied to the decoration attachment. - */ - height?: string; - } - - /** - * Represents rendering styles for a {@link TextEditorDecorationType text editor decoration}. - */ - export interface DecorationRenderOptions extends ThemableDecorationRenderOptions { - /** - * Should the decoration be rendered also on the whitespace after the line text. - * Defaults to `false`. - */ - isWholeLine?: boolean; - - /** - * Customize the growing behavior of the decoration when edits occur at the edges of the decoration's range. - * Defaults to `DecorationRangeBehavior.OpenOpen`. - */ - rangeBehavior?: DecorationRangeBehavior; - - /** - * The position in the overview ruler where the decoration should be rendered. - */ - overviewRulerLane?: OverviewRulerLane; - - /** - * Overwrite options for light themes. - */ - light?: ThemableDecorationRenderOptions; - - /** - * Overwrite options for dark themes. - */ - dark?: ThemableDecorationRenderOptions; - } - - /** - * Represents options for a specific decoration in a {@link TextEditorDecorationType decoration set}. - */ - export interface DecorationOptions { - - /** - * Range to which this decoration is applied. The range must not be empty. - */ - range: Range; - - /** - * A message that should be rendered when hovering over the decoration. - */ - hoverMessage?: MarkdownString | MarkedString | Array; - - /** - * Render options applied to the current decoration. For performance reasons, keep the - * number of decoration specific options small, and use decoration types wherever possible. - */ - renderOptions?: DecorationInstanceRenderOptions; - } - - export interface ThemableDecorationInstanceRenderOptions { - /** - * Defines the rendering options of the attachment that is inserted before the decorated text. - */ - before?: ThemableDecorationAttachmentRenderOptions; - - /** - * Defines the rendering options of the attachment that is inserted after the decorated text. - */ - after?: ThemableDecorationAttachmentRenderOptions; - } - - export interface DecorationInstanceRenderOptions extends ThemableDecorationInstanceRenderOptions { - /** - * Overwrite options for light themes. - */ - light?: ThemableDecorationInstanceRenderOptions; - - /** - * Overwrite options for dark themes. - */ - dark?: ThemableDecorationInstanceRenderOptions; - } - - /** - * Represents an editor that is attached to a {@link TextDocument document}. - */ - export interface TextEditor { - - /** - * The document associated with this text editor. The document will be the same for the entire lifetime of this text editor. - */ - readonly document: TextDocument; - - /** - * The primary selection on this text editor. Shorthand for `TextEditor.selections[0]`. - */ - selection: Selection; - - /** - * The selections in this text editor. The primary selection is always at index 0. - */ - selections: readonly Selection[]; - - /** - * The current visible ranges in the editor (vertically). - * This accounts only for vertical scrolling, and not for horizontal scrolling. - */ - readonly visibleRanges: readonly Range[]; - - /** - * Text editor options. - */ - options: TextEditorOptions; - - /** - * The column in which this editor shows. Will be `undefined` in case this - * isn't one of the main editors, e.g. an embedded editor, or when the editor - * column is larger than three. - */ - readonly viewColumn: ViewColumn | undefined; - - /** - * Perform an edit on the document associated with this text editor. - * - * The given callback-function is invoked with an {@link TextEditorEdit edit-builder} which must - * be used to make edits. Note that the edit-builder is only valid while the - * callback executes. - * - * @param callback A function which can create edits using an {@link TextEditorEdit edit-builder}. - * @param options The undo/redo behavior around this edit. By default, undo stops will be created before and after this edit. - * @return A promise that resolves with a value indicating if the edits could be applied. - */ - edit(callback: (editBuilder: TextEditorEdit) => void, options?: { readonly undoStopBefore: boolean; readonly undoStopAfter: boolean }): Thenable; - - /** - * Insert a {@link SnippetString snippet} and put the editor into snippet mode. "Snippet mode" - * means the editor adds placeholders and additional cursors so that the user can complete - * or accept the snippet. - * - * @param snippet The snippet to insert in this edit. - * @param location Position or range at which to insert the snippet, defaults to the current editor selection or selections. - * @param options The undo/redo behavior around this edit. By default, undo stops will be created before and after this edit. - * @return A promise that resolves with a value indicating if the snippet could be inserted. Note that the promise does not signal - * that the snippet is completely filled-in or accepted. - */ - insertSnippet(snippet: SnippetString, location?: Position | Range | readonly Position[] | readonly Range[], options?: { readonly undoStopBefore: boolean; readonly undoStopAfter: boolean }): Thenable; - - /** - * Adds a set of decorations to the text editor. If a set of decorations already exists with - * the given {@link TextEditorDecorationType decoration type}, they will be replaced. If - * `rangesOrOptions` is empty, the existing decorations with the given {@link TextEditorDecorationType decoration type} - * will be removed. - * - * @see {@link window.createTextEditorDecorationType createTextEditorDecorationType}. - * - * @param decorationType A decoration type. - * @param rangesOrOptions Either {@link Range ranges} or more detailed {@link DecorationOptions options}. - */ - setDecorations(decorationType: TextEditorDecorationType, rangesOrOptions: readonly Range[] | readonly DecorationOptions[]): void; - - /** - * Scroll as indicated by `revealType` in order to reveal the given range. - * - * @param range A range. - * @param revealType The scrolling strategy for revealing `range`. - */ - revealRange(range: Range, revealType?: TextEditorRevealType): void; - - /** - * Show the text editor. - * - * @deprecated Use {@link window.showTextDocument} instead. - * - * @param column The {@link ViewColumn column} in which to show this editor. - * This method shows unexpected behavior and will be removed in the next major update. - */ - show(column?: ViewColumn): void; - - /** - * Hide the text editor. - * - * @deprecated Use the command `workbench.action.closeActiveEditor` instead. - * This method shows unexpected behavior and will be removed in the next major update. - */ - hide(): void; - } - - /** - * Represents an end of line character sequence in a {@link TextDocument document}. - */ - export enum EndOfLine { - /** - * The line feed `\n` character. - */ - LF = 1, - /** - * The carriage return line feed `\r\n` sequence. - */ - CRLF = 2 - } - - /** - * A complex edit that will be applied in one transaction on a TextEditor. - * This holds a description of the edits and if the edits are valid (i.e. no overlapping regions, document was not changed in the meantime, etc.) - * they can be applied on a {@link TextDocument document} associated with a {@link TextEditor text editor}. - */ - export interface TextEditorEdit { - /** - * Replace a certain text region with a new value. - * You can use \r\n or \n in `value` and they will be normalized to the current {@link TextDocument document}. - * - * @param location The range this operation should remove. - * @param value The new text this operation should insert after removing `location`. - */ - replace(location: Position | Range | Selection, value: string): void; - - /** - * Insert text at a location. - * You can use \r\n or \n in `value` and they will be normalized to the current {@link TextDocument document}. - * Although the equivalent text edit can be made with {@link TextEditorEdit.replace replace}, `insert` will produce a different resulting selection (it will get moved). - * - * @param location The position where the new text should be inserted. - * @param value The new text this operation should insert. - */ - insert(location: Position, value: string): void; - - /** - * Delete a certain text region. - * - * @param location The range this operation should remove. - */ - delete(location: Range | Selection): void; - - /** - * Set the end of line sequence. - * - * @param endOfLine The new end of line for the {@link TextDocument document}. - */ - setEndOfLine(endOfLine: EndOfLine): void; - } - - /** - * A universal resource identifier representing either a file on disk - * or another resource, like untitled resources. - */ - export class Uri { - - /** - * Create an URI from a string, e.g. `http://www.example.com/some/path`, - * `file:///usr/home`, or `scheme:with/path`. - * - * *Note* that for a while uris without a `scheme` were accepted. That is not correct - * as all uris should have a scheme. To avoid breakage of existing code the optional - * `strict`-argument has been added. We *strongly* advise to use it, e.g. `Uri.parse('my:uri', true)` - * - * @see {@link Uri.toString} - * @param value The string value of an Uri. - * @param strict Throw an error when `value` is empty or when no `scheme` can be parsed. - * @return A new Uri instance. - */ - static parse(value: string, strict?: boolean): Uri; - - /** - * Create an URI from a file system path. The {@link Uri.scheme scheme} - * will be `file`. - * - * The *difference* between {@link Uri.parse} and {@link Uri.file} is that the latter treats the argument - * as path, not as stringified-uri. E.g. `Uri.file(path)` is *not* the same as - * `Uri.parse('file://' + path)` because the path might contain characters that are - * interpreted (# and ?). See the following sample: - * ```ts - * const good = URI.file('/coding/c#/project1'); - * good.scheme === 'file'; - * good.path === '/coding/c#/project1'; - * good.fragment === ''; - * - * const bad = URI.parse('file://' + '/coding/c#/project1'); - * bad.scheme === 'file'; - * bad.path === '/coding/c'; // path is now broken - * bad.fragment === '/project1'; - * ``` - * - * @param path A file system or UNC path. - * @return A new Uri instance. - */ - static file(path: string): Uri; - - /** - * Create a new uri which path is the result of joining - * the path of the base uri with the provided path segments. - * - * - Note 1: `joinPath` only affects the path component - * and all other components (scheme, authority, query, and fragment) are - * left as they are. - * - Note 2: The base uri must have a path; an error is thrown otherwise. - * - * The path segments are normalized in the following ways: - * - sequences of path separators (`/` or `\`) are replaced with a single separator - * - for `file`-uris on windows, the backslash-character (`\`) is considered a path-separator - * - the `..`-segment denotes the parent segment, the `.` denotes the current segment - * - paths have a root which always remains, for instance on windows drive-letters are roots - * so that is true: `joinPath(Uri.file('file:///c:/root'), '../../other').fsPath === 'c:/other'` - * - * @param base An uri. Must have a path. - * @param pathSegments One more more path fragments - * @returns A new uri which path is joined with the given fragments - */ - static joinPath(base: Uri, ...pathSegments: string[]): Uri; - - /** - * Create an URI from its component parts - * - * @see {@link Uri.toString} - * @param components The component parts of an Uri. - * @return A new Uri instance. - */ - static from(components: { readonly scheme: string; readonly authority?: string; readonly path?: string; readonly query?: string; readonly fragment?: string }): Uri; - - /** - * Use the `file` and `parse` factory functions to create new `Uri` objects. - */ - private constructor(scheme: string, authority: string, path: string, query: string, fragment: string); - - /** - * Scheme is the `http` part of `http://www.example.com/some/path?query#fragment`. - * The part before the first colon. - */ - readonly scheme: string; - - /** - * Authority is the `www.example.com` part of `http://www.example.com/some/path?query#fragment`. - * The part between the first double slashes and the next slash. - */ - readonly authority: string; - - /** - * Path is the `/some/path` part of `http://www.example.com/some/path?query#fragment`. - */ - readonly path: string; - - /** - * Query is the `query` part of `http://www.example.com/some/path?query#fragment`. - */ - readonly query: string; - - /** - * Fragment is the `fragment` part of `http://www.example.com/some/path?query#fragment`. - */ - readonly fragment: string; - - /** - * The string representing the corresponding file system path of this Uri. - * - * Will handle UNC paths and normalize windows drive letters to lower-case. Also - * uses the platform specific path separator. - * - * * Will *not* validate the path for invalid characters and semantics. - * * Will *not* look at the scheme of this Uri. - * * The resulting string shall *not* be used for display purposes but - * for disk operations, like `readFile` et al. - * - * The *difference* to the {@linkcode Uri.path path}-property is the use of the platform specific - * path separator and the handling of UNC paths. The sample below outlines the difference: - * ```ts - * const u = URI.parse('file://server/c$/folder/file.txt') - * u.authority === 'server' - * u.path === '/shares/c$/file.txt' - * u.fsPath === '\\server\c$\folder\file.txt' - * ``` - */ - readonly fsPath: string; - - /** - * Derive a new Uri from this Uri. - * - * ```ts - * let file = Uri.parse('before:some/file/path'); - * let other = file.with({ scheme: 'after' }); - * assert.ok(other.toString() === 'after:some/file/path'); - * ``` - * - * @param change An object that describes a change to this Uri. To unset components use `null` or - * the empty string. - * @return A new Uri that reflects the given change. Will return `this` Uri if the change - * is not changing anything. - */ - with(change: { scheme?: string; authority?: string; path?: string; query?: string; fragment?: string }): Uri; - - /** - * Returns a string representation of this Uri. The representation and normalization - * of a URI depends on the scheme. - * - * * The resulting string can be safely used with {@link Uri.parse}. - * * The resulting string shall *not* be used for display purposes. - * - * *Note* that the implementation will encode _aggressive_ which often leads to unexpected, - * but not incorrect, results. For instance, colons are encoded to `%3A` which might be unexpected - * in file-uri. Also `&` and `=` will be encoded which might be unexpected for http-uris. For stability - * reasons this cannot be changed anymore. If you suffer from too aggressive encoding you should use - * the `skipEncoding`-argument: `uri.toString(true)`. - * - * @param skipEncoding Do not percentage-encode the result, defaults to `false`. Note that - * the `#` and `?` characters occurring in the path will always be encoded. - * @returns A string representation of this Uri. - */ - toString(skipEncoding?: boolean): string; - - /** - * Returns a JSON representation of this Uri. - * - * @return An object. - */ - toJSON(): any; - } - - /** - * A cancellation token is passed to an asynchronous or long running - * operation to request cancellation, like cancelling a request - * for completion items because the user continued to type. - * - * To get an instance of a `CancellationToken` use a - * {@link CancellationTokenSource}. - */ - export interface CancellationToken { - - /** - * Is `true` when the token has been cancelled, `false` otherwise. - */ - isCancellationRequested: boolean; - - /** - * An {@link Event} which fires upon cancellation. - */ - onCancellationRequested: Event; - } - - /** - * A cancellation source creates and controls a {@link CancellationToken cancellation token}. - */ - export class CancellationTokenSource { - - /** - * The cancellation token of this source. - */ - token: CancellationToken; - - /** - * Signal cancellation on the token. - */ - cancel(): void; - - /** - * Dispose object and free resources. - */ - dispose(): void; - } - - /** - * An error type that should be used to signal cancellation of an operation. - * - * This type can be used in response to a {@link CancellationToken cancellation token} - * being cancelled or when an operation is being cancelled by the - * executor of that operation. - */ - export class CancellationError extends Error { - - /** - * Creates a new cancellation error. - */ - constructor(); - } - - /** - * Represents a type which can release resources, such - * as event listening or a timer. - */ - export class Disposable { - - /** - * Combine many disposable-likes into one. You can use this method when having objects with - * a dispose function which aren't instances of `Disposable`. - * - * @param disposableLikes Objects that have at least a `dispose`-function member. Note that asynchronous - * dispose-functions aren't awaited. - * @return Returns a new disposable which, upon dispose, will - * dispose all provided disposables. - */ - static from(...disposableLikes: { dispose: () => any }[]): Disposable; - - /** - * Creates a new disposable that calls the provided function - * on dispose. - * - * *Note* that an asynchronous function is not awaited. - * - * @param callOnDispose Function that disposes something. - */ - constructor(callOnDispose: () => any); - - /** - * Dispose this object. - */ - dispose(): any; - } - - /** - * Represents a typed event. - * - * A function that represents an event to which you subscribe by calling it with - * a listener function as argument. - * - * @example - * item.onDidChange(function(event) { console.log("Event happened: " + event); }); - */ - export interface Event { - - /** - * A function that represents an event to which you subscribe by calling it with - * a listener function as argument. - * - * @param listener The listener function will be called when the event happens. - * @param thisArgs The `this`-argument which will be used when calling the event listener. - * @param disposables An array to which a {@link Disposable} will be added. - * @return A disposable which unsubscribes the event listener. - */ - (listener: (e: T) => any, thisArgs?: any, disposables?: Disposable[]): Disposable; - } - - /** - * An event emitter can be used to create and manage an {@link Event} for others - * to subscribe to. One emitter always owns one event. - * - * Use this class if you want to provide event from within your extension, for instance - * inside a {@link TextDocumentContentProvider} or when providing - * API to other extensions. - */ - export class EventEmitter { - - /** - * The event listeners can subscribe to. - */ - event: Event; - - /** - * Notify all subscribers of the {@link EventEmitter.event event}. Failure - * of one or more listener will not fail this function call. - * - * @param data The event object. - */ - fire(data: T): void; - - /** - * Dispose this object and free resources. - */ - dispose(): void; - } - - /** - * A file system watcher notifies about changes to files and folders - * on disk or from other {@link FileSystemProvider FileSystemProviders}. - * - * To get an instance of a `FileSystemWatcher` use - * {@link workspace.createFileSystemWatcher createFileSystemWatcher}. - */ - export interface FileSystemWatcher extends Disposable { - - /** - * true if this file system watcher has been created such that - * it ignores creation file system events. - */ - readonly ignoreCreateEvents: boolean; - - /** - * true if this file system watcher has been created such that - * it ignores change file system events. - */ - readonly ignoreChangeEvents: boolean; - - /** - * true if this file system watcher has been created such that - * it ignores delete file system events. - */ - readonly ignoreDeleteEvents: boolean; - - /** - * An event which fires on file/folder creation. - */ - readonly onDidCreate: Event; - - /** - * An event which fires on file/folder change. - */ - readonly onDidChange: Event; - - /** - * An event which fires on file/folder deletion. - */ - readonly onDidDelete: Event; - } - - /** - * A text document content provider allows to add readonly documents - * to the editor, such as source from a dll or generated html from md. - * - * Content providers are {@link workspace.registerTextDocumentContentProvider registered} - * for a {@link Uri.scheme uri-scheme}. When a uri with that scheme is to - * be {@link workspace.openTextDocument loaded} the content provider is - * asked. - */ - export interface TextDocumentContentProvider { - - /** - * An event to signal a resource has changed. - */ - onDidChange?: Event; - - /** - * Provide textual content for a given uri. - * - * The editor will use the returned string-content to create a readonly - * {@link TextDocument document}. Resources allocated should be released when - * the corresponding document has been {@link workspace.onDidCloseTextDocument closed}. - * - * **Note**: The contents of the created {@link TextDocument document} might not be - * identical to the provided text due to end-of-line-sequence normalization. - * - * @param uri An uri which scheme matches the scheme this provider was {@link workspace.registerTextDocumentContentProvider registered} for. - * @param token A cancellation token. - * @return A string or a thenable that resolves to such. - */ - provideTextDocumentContent(uri: Uri, token: CancellationToken): ProviderResult; - } - - /** - * The kind of {@link QuickPickItem quick pick item}. - */ - export enum QuickPickItemKind { - /** - * When a {@link QuickPickItem} has a kind of {@link Separator}, the item is just a visual separator and does not represent a real item. - * The only property that applies is {@link QuickPickItem.label label }. All other properties on {@link QuickPickItem} will be ignored and have no effect. - */ - Separator = -1, - /** - * The default {@link QuickPickItem.kind} is an item that can be selected in the quick pick. - */ - Default = 0, - } - - /** - * Represents an item that can be selected from - * a list of items. - */ - export interface QuickPickItem { - - /** - * A human-readable string which is rendered prominent. Supports rendering of {@link ThemeIcon theme icons} via - * the `$()`-syntax. - */ - label: string; - - /** - * The kind of QuickPickItem that will determine how this item is rendered in the quick pick. When not specified, - * the default is {@link QuickPickItemKind.Default}. - */ - kind?: QuickPickItemKind; - - /** - * A human-readable string which is rendered less prominent in the same line. Supports rendering of - * {@link ThemeIcon theme icons} via the `$()`-syntax. - * - * Note: this property is ignored when {@link QuickPickItem.kind kind} is set to {@link QuickPickItemKind.Separator} - */ - description?: string; - - /** - * A human-readable string which is rendered less prominent in a separate line. Supports rendering of - * {@link ThemeIcon theme icons} via the `$()`-syntax. - * - * Note: this property is ignored when {@link QuickPickItem.kind kind} is set to {@link QuickPickItemKind.Separator} - */ - detail?: string; - - /** - * Optional flag indicating if this item is picked initially. This is only honored when using - * the {@link window.showQuickPick showQuickPick()} API. To do the same thing with - * the {@link window.createQuickPick createQuickPick()} API, simply set the {@link QuickPick.selectedItems} - * to the items you want picked initially. - * (*Note:* This is only honored when the picker allows multiple selections.) - * - * @see {@link QuickPickOptions.canPickMany} - * - * Note: this property is ignored when {@link QuickPickItem.kind kind} is set to {@link QuickPickItemKind.Separator} - */ - picked?: boolean; - - /** - * Always show this item. - * - * Note: this property is ignored when {@link QuickPickItem.kind kind} is set to {@link QuickPickItemKind.Separator} - */ - alwaysShow?: boolean; - - /** - * Optional buttons that will be rendered on this particular item. These buttons will trigger - * an {@link QuickPickItemButtonEvent} when clicked. Buttons are only rendered when using a quickpick - * created by the {@link window.createQuickPick createQuickPick()} API. Buttons are not rendered when using - * the {@link window.showQuickPick showQuickPick()} API. - * - * Note: this property is ignored when {@link QuickPickItem.kind kind} is set to {@link QuickPickItemKind.Separator} - */ - buttons?: readonly QuickInputButton[]; - } - - /** - * Options to configure the behavior of the quick pick UI. - */ - export interface QuickPickOptions { - - /** - * An optional string that represents the title of the quick pick. - */ - title?: string; - - /** - * An optional flag to include the description when filtering the picks. - */ - matchOnDescription?: boolean; - - /** - * An optional flag to include the detail when filtering the picks. - */ - matchOnDetail?: boolean; - - /** - * An optional string to show as placeholder in the input box to guide the user what to pick on. - */ - placeHolder?: string; - - /** - * Set to `true` to keep the picker open when focus moves to another part of the editor or to another window. - * This setting is ignored on iPad and is always false. - */ - ignoreFocusOut?: boolean; - - /** - * An optional flag to make the picker accept multiple selections, if true the result is an array of picks. - */ - canPickMany?: boolean; - - /** - * An optional function that is invoked whenever an item is selected. - */ - onDidSelectItem?(item: QuickPickItem | string): any; - } - - /** - * Options to configure the behaviour of the {@link WorkspaceFolder workspace folder} pick UI. - */ - export interface WorkspaceFolderPickOptions { - - /** - * An optional string to show as placeholder in the input box to guide the user what to pick on. - */ - placeHolder?: string; - - /** - * Set to `true` to keep the picker open when focus moves to another part of the editor or to another window. - * This setting is ignored on iPad and is always false. - */ - ignoreFocusOut?: boolean; - } - - /** - * Options to configure the behaviour of a file open dialog. - * - * * Note 1: On Windows and Linux, a file dialog cannot be both a file selector and a folder selector, so if you - * set both `canSelectFiles` and `canSelectFolders` to `true` on these platforms, a folder selector will be shown. - * * Note 2: Explicitly setting `canSelectFiles` and `canSelectFolders` to `false` is futile - * and the editor then silently adjusts the options to select files. - */ - export interface OpenDialogOptions { - /** - * The resource the dialog shows when opened. - */ - defaultUri?: Uri; - - /** - * A human-readable string for the open button. - */ - openLabel?: string; - - /** - * Allow to select files, defaults to `true`. - */ - canSelectFiles?: boolean; - - /** - * Allow to select folders, defaults to `false`. - */ - canSelectFolders?: boolean; - - /** - * Allow to select many files or folders. - */ - canSelectMany?: boolean; - - /** - * A set of file filters that are used by the dialog. Each entry is a human-readable label, - * like "TypeScript", and an array of extensions, e.g. - * ```ts - * { - * 'Images': ['png', 'jpg'] - * 'TypeScript': ['ts', 'tsx'] - * } - * ``` - */ - filters?: { [name: string]: string[] }; - - /** - * Dialog title. - * - * This parameter might be ignored, as not all operating systems display a title on open dialogs - * (for example, macOS). - */ - title?: string; - } - - /** - * Options to configure the behaviour of a file save dialog. - */ - export interface SaveDialogOptions { - /** - * The resource the dialog shows when opened. - */ - defaultUri?: Uri; - - /** - * A human-readable string for the save button. - */ - saveLabel?: string; - - /** - * A set of file filters that are used by the dialog. Each entry is a human-readable label, - * like "TypeScript", and an array of extensions, e.g. - * ```ts - * { - * 'Images': ['png', 'jpg'] - * 'TypeScript': ['ts', 'tsx'] - * } - * ``` - */ - filters?: { [name: string]: string[] }; - - /** - * Dialog title. - * - * This parameter might be ignored, as not all operating systems display a title on save dialogs - * (for example, macOS). - */ - title?: string; - } - - /** - * Represents an action that is shown with an information, warning, or - * error message. - * - * @see {@link window.showInformationMessage showInformationMessage} - * @see {@link window.showWarningMessage showWarningMessage} - * @see {@link window.showErrorMessage showErrorMessage} - */ - export interface MessageItem { - - /** - * A short title like 'Retry', 'Open Log' etc. - */ - title: string; - - /** - * A hint for modal dialogs that the item should be triggered - * when the user cancels the dialog (e.g. by pressing the ESC - * key). - * - * Note: this option is ignored for non-modal messages. - */ - isCloseAffordance?: boolean; - } - - /** - * Options to configure the behavior of the message. - * - * @see {@link window.showInformationMessage showInformationMessage} - * @see {@link window.showWarningMessage showWarningMessage} - * @see {@link window.showErrorMessage showErrorMessage} - */ - export interface MessageOptions { - - /** - * Indicates that this message should be modal. - */ - modal?: boolean; - - /** - * Human-readable detail message that is rendered less prominent. _Note_ that detail - * is only shown for {@link MessageOptions.modal modal} messages. - */ - detail?: string; - } - - /** - * Impacts the behavior and appearance of the validation message. - */ - export enum InputBoxValidationSeverity { - Info = 1, - Warning = 2, - Error = 3 - } - - /** - * Object to configure the behavior of the validation message. - */ - export interface InputBoxValidationMessage { - /** - * The validation message to display. - */ - readonly message: string; - - /** - * The severity of the validation message. - * NOTE: When using `InputBoxValidationSeverity.Error`, the user will not be allowed to accept (hit ENTER) the input. - * `Info` and `Warning` will still allow the InputBox to accept the input. - */ - readonly severity: InputBoxValidationSeverity; - } - - /** - * Options to configure the behavior of the input box UI. - */ - export interface InputBoxOptions { - - /** - * An optional string that represents the title of the input box. - */ - title?: string; - - /** - * The value to pre-fill in the input box. - */ - value?: string; - - /** - * Selection of the pre-filled {@linkcode InputBoxOptions.value value}. Defined as tuple of two number where the - * first is the inclusive start index and the second the exclusive end index. When `undefined` the whole - * pre-filled value will be selected, when empty (start equals end) only the cursor will be set, - * otherwise the defined range will be selected. - */ - valueSelection?: [number, number]; - - /** - * The text to display underneath the input box. - */ - prompt?: string; - - /** - * An optional string to show as placeholder in the input box to guide the user what to type. - */ - placeHolder?: string; - - /** - * Controls if a password input is shown. Password input hides the typed text. - */ - password?: boolean; - - /** - * Set to `true` to keep the input box open when focus moves to another part of the editor or to another window. - * This setting is ignored on iPad and is always false. - */ - ignoreFocusOut?: boolean; - - /** - * An optional function that will be called to validate input and to give a hint - * to the user. - * - * @param value The current value of the input box. - * @return Either a human-readable string which is presented as an error message or an {@link InputBoxValidationMessage} - * which can provide a specific message severity. Return `undefined`, `null`, or the empty string when 'value' is valid. - */ - validateInput?(value: string): string | InputBoxValidationMessage | undefined | null | - Thenable; - } - - /** - * A relative pattern is a helper to construct glob patterns that are matched - * relatively to a base file path. The base path can either be an absolute file - * path as string or uri or a {@link WorkspaceFolder workspace folder}, which is the - * preferred way of creating the relative pattern. - */ - export class RelativePattern { - - /** - * A base file path to which this pattern will be matched against relatively. The - * file path must be absolute, should not have any trailing path separators and - * not include any relative segments (`.` or `..`). - */ - baseUri: Uri; - - /** - * A base file path to which this pattern will be matched against relatively. - * - * This matches the `fsPath` value of {@link RelativePattern.baseUri}. - * - * *Note:* updating this value will update {@link RelativePattern.baseUri} to - * be a uri with `file` scheme. - * - * @deprecated This property is deprecated, please use {@link RelativePattern.baseUri} instead. - */ - base: string; - - /** - * A file glob pattern like `*.{ts,js}` that will be matched on file paths - * relative to the base path. - * - * Example: Given a base of `/home/work/folder` and a file path of `/home/work/folder/index.js`, - * the file glob pattern will match on `index.js`. - */ - pattern: string; - - /** - * Creates a new relative pattern object with a base file path and pattern to match. This pattern - * will be matched on file paths relative to the base. - * - * Example: - * ```ts - * const folder = vscode.workspace.workspaceFolders?.[0]; - * if (folder) { - * - * // Match any TypeScript file in the root of this workspace folder - * const pattern1 = new vscode.RelativePattern(folder, '*.ts'); - * - * // Match any TypeScript file in `someFolder` inside this workspace folder - * const pattern2 = new vscode.RelativePattern(folder, 'someFolder/*.ts'); - * } - * ``` - * - * @param base A base to which this pattern will be matched against relatively. It is recommended - * to pass in a {@link WorkspaceFolder workspace folder} if the pattern should match inside the workspace. - * Otherwise, a uri or string should only be used if the pattern is for a file path outside the workspace. - * @param pattern A file glob pattern like `*.{ts,js}` that will be matched on paths relative to the base. - */ - constructor(base: WorkspaceFolder | Uri | string, pattern: string); - } - - /** - * A file glob pattern to match file paths against. This can either be a glob pattern string - * (like `**​/*.{ts,js}` or `*.{ts,js}`) or a {@link RelativePattern relative pattern}. - * - * Glob patterns can have the following syntax: - * * `*` to match zero or more characters in a path segment - * * `?` to match on one character in a path segment - * * `**` to match any number of path segments, including none - * * `{}` to group conditions (e.g. `**​/*.{ts,js}` matches all TypeScript and JavaScript files) - * * `[]` to declare a range of characters to match in a path segment (e.g., `example.[0-9]` to match on `example.0`, `example.1`, …) - * * `[!...]` to negate a range of characters to match in a path segment (e.g., `example.[!0-9]` to match on `example.a`, `example.b`, but not `example.0`) - * - * Note: a backslash (`\`) is not valid within a glob pattern. If you have an existing file - * path to match against, consider to use the {@link RelativePattern relative pattern} support - * that takes care of converting any backslash into slash. Otherwise, make sure to convert - * any backslash to slash when creating the glob pattern. - */ - export type GlobPattern = string | RelativePattern; - - /** - * A document filter denotes a document by different properties like - * the {@link TextDocument.languageId language}, the {@link Uri.scheme scheme} of - * its resource, or a glob-pattern that is applied to the {@link TextDocument.fileName path}. - * - * @example A language filter that applies to typescript files on disk - * { language: 'typescript', scheme: 'file' } - * - * @example A language filter that applies to all package.json paths - * { language: 'json', pattern: '**​/package.json' } - */ - export interface DocumentFilter { - - /** - * A language id, like `typescript`. - */ - readonly language?: string; - - /** - * The {@link NotebookDocument.notebookType type} of a notebook, like `jupyter-notebook`. This allows - * to narrow down on the type of a notebook that a {@link NotebookCell.document cell document} belongs to. - * - * *Note* that setting the `notebookType`-property changes how `scheme` and `pattern` are interpreted. When set - * they are evaluated against the {@link NotebookDocument.uri notebook uri}, not the document uri. - * - * @example Match python document inside jupyter notebook that aren't stored yet (`untitled`) - * { language: 'python', notebookType: 'jupyter-notebook', scheme: 'untitled' } - */ - readonly notebookType?: string; - - /** - * A Uri {@link Uri.scheme scheme}, like `file` or `untitled`. - */ - readonly scheme?: string; - - /** - * A {@link GlobPattern glob pattern} that is matched on the absolute path of the document. Use a {@link RelativePattern relative pattern} - * to filter documents to a {@link WorkspaceFolder workspace folder}. - */ - readonly pattern?: GlobPattern; - } - - /** - * A language selector is the combination of one or many language identifiers - * and {@link DocumentFilter language filters}. - * - * *Note* that a document selector that is just a language identifier selects *all* - * documents, even those that are not saved on disk. Only use such selectors when - * a feature works without further context, e.g. without the need to resolve related - * 'files'. - * - * @example - * let sel:DocumentSelector = { scheme: 'file', language: 'typescript' }; - */ - export type DocumentSelector = DocumentFilter | string | ReadonlyArray; - - /** - * A provider result represents the values a provider, like the {@linkcode HoverProvider}, - * may return. For once this is the actual result type `T`, like `Hover`, or a thenable that resolves - * to that type `T`. In addition, `null` and `undefined` can be returned - either directly or from a - * thenable. - * - * The snippets below are all valid implementations of the {@linkcode HoverProvider}: - * - * ```ts - * let a: HoverProvider = { - * provideHover(doc, pos, token): ProviderResult { - * return new Hover('Hello World'); - * } - * } - * - * let b: HoverProvider = { - * provideHover(doc, pos, token): ProviderResult { - * return new Promise(resolve => { - * resolve(new Hover('Hello World')); - * }); - * } - * } - * - * let c: HoverProvider = { - * provideHover(doc, pos, token): ProviderResult { - * return; // undefined - * } - * } - * ``` - */ - export type ProviderResult = T | undefined | null | Thenable; - - /** - * Kind of a code action. - * - * Kinds are a hierarchical list of identifiers separated by `.`, e.g. `"refactor.extract.function"`. - * - * Code action kinds are used by the editor for UI elements such as the refactoring context menu. Users - * can also trigger code actions with a specific kind with the `editor.action.codeAction` command. - */ - export class CodeActionKind { - /** - * Empty kind. - */ - static readonly Empty: CodeActionKind; - - /** - * Base kind for quickfix actions: `quickfix`. - * - * Quick fix actions address a problem in the code and are shown in the normal code action context menu. - */ - static readonly QuickFix: CodeActionKind; - - /** - * Base kind for refactoring actions: `refactor` - * - * Refactoring actions are shown in the refactoring context menu. - */ - static readonly Refactor: CodeActionKind; - - /** - * Base kind for refactoring extraction actions: `refactor.extract` - * - * Example extract actions: - * - * - Extract method - * - Extract function - * - Extract variable - * - Extract interface from class - * - ... - */ - static readonly RefactorExtract: CodeActionKind; - - /** - * Base kind for refactoring inline actions: `refactor.inline` - * - * Example inline actions: - * - * - Inline function - * - Inline variable - * - Inline constant - * - ... - */ - static readonly RefactorInline: CodeActionKind; - - /** - * Base kind for refactoring move actions: `refactor.move` - * - * Example move actions: - * - * - Move a function to a new file - * - Move a property between classes - * - Move method to base class - * - ... - */ - static readonly RefactorMove: CodeActionKind; - - /** - * Base kind for refactoring rewrite actions: `refactor.rewrite` - * - * Example rewrite actions: - * - * - Convert JavaScript function to class - * - Add or remove parameter - * - Encapsulate field - * - Make method static - * - ... - */ - static readonly RefactorRewrite: CodeActionKind; - - /** - * Base kind for source actions: `source` - * - * Source code actions apply to the entire file. They must be explicitly requested and will not show in the - * normal [lightbulb](https://code.visualstudio.com/docs/editor/editingevolved#_code-action) menu. Source actions - * can be run on save using `editor.codeActionsOnSave` and are also shown in the `source` context menu. - */ - static readonly Source: CodeActionKind; - - /** - * Base kind for an organize imports source action: `source.organizeImports`. - */ - static readonly SourceOrganizeImports: CodeActionKind; - - /** - * Base kind for auto-fix source actions: `source.fixAll`. - * - * Fix all actions automatically fix errors that have a clear fix that do not require user input. - * They should not suppress errors or perform unsafe fixes such as generating new types or classes. - */ - static readonly SourceFixAll: CodeActionKind; - - private constructor(value: string); - - /** - * String value of the kind, e.g. `"refactor.extract.function"`. - */ - readonly value: string; - - /** - * Create a new kind by appending a more specific selector to the current kind. - * - * Does not modify the current kind. - */ - append(parts: string): CodeActionKind; - - /** - * Checks if this code action kind intersects `other`. - * - * The kind `"refactor.extract"` for example intersects `refactor`, `"refactor.extract"` and ``"refactor.extract.function"`, - * but not `"unicorn.refactor.extract"`, or `"refactor.extractAll"`. - * - * @param other Kind to check. - */ - intersects(other: CodeActionKind): boolean; - - /** - * Checks if `other` is a sub-kind of this `CodeActionKind`. - * - * The kind `"refactor.extract"` for example contains `"refactor.extract"` and ``"refactor.extract.function"`, - * but not `"unicorn.refactor.extract"`, or `"refactor.extractAll"` or `refactor`. - * - * @param other Kind to check. - */ - contains(other: CodeActionKind): boolean; - } - - /** - * The reason why code actions were requested. - */ - export enum CodeActionTriggerKind { - /** - * Code actions were explicitly requested by the user or by an extension. - */ - Invoke = 1, - - /** - * Code actions were requested automatically. - * - * This typically happens when current selection in a file changes, but can - * also be triggered when file content changes. - */ - Automatic = 2, - } - - /** - * Contains additional diagnostic information about the context in which - * a {@link CodeActionProvider.provideCodeActions code action} is run. - */ - export interface CodeActionContext { - /** - * The reason why code actions were requested. - */ - readonly triggerKind: CodeActionTriggerKind; - - /** - * An array of diagnostics. - */ - readonly diagnostics: readonly Diagnostic[]; - - /** - * Requested kind of actions to return. - * - * Actions not of this kind are filtered out before being shown by the [lightbulb](https://code.visualstudio.com/docs/editor/editingevolved#_code-action). - */ - readonly only: CodeActionKind | undefined; - } - - /** - * A code action represents a change that can be performed in code, e.g. to fix a problem or - * to refactor code. - * - * A CodeAction must set either {@linkcode CodeAction.edit edit} and/or a {@linkcode CodeAction.command command}. If both are supplied, the `edit` is applied first, then the command is executed. - */ - export class CodeAction { - - /** - * A short, human-readable, title for this code action. - */ - title: string; - - /** - * A {@link WorkspaceEdit workspace edit} this code action performs. - */ - edit?: WorkspaceEdit; - - /** - * {@link Diagnostic Diagnostics} that this code action resolves. - */ - diagnostics?: Diagnostic[]; - - /** - * A {@link Command} this code action executes. - * - * If this command throws an exception, the editor displays the exception message to users in the editor at the - * current cursor position. - */ - command?: Command; - - /** - * {@link CodeActionKind Kind} of the code action. - * - * Used to filter code actions. - */ - kind?: CodeActionKind; - - /** - * Marks this as a preferred action. Preferred actions are used by the `auto fix` command and can be targeted - * by keybindings. - * - * A quick fix should be marked preferred if it properly addresses the underlying error. - * A refactoring should be marked preferred if it is the most reasonable choice of actions to take. - */ - isPreferred?: boolean; - - /** - * Marks that the code action cannot currently be applied. - * - * - Disabled code actions are not shown in automatic [lightbulb](https://code.visualstudio.com/docs/editor/editingevolved#_code-action) - * code action menu. - * - * - Disabled actions are shown as faded out in the code action menu when the user request a more specific type - * of code action, such as refactorings. - * - * - If the user has a [keybinding](https://code.visualstudio.com/docs/editor/refactoring#_keybindings-for-code-actions) - * that auto applies a code action and only a disabled code actions are returned, the editor will show the user an - * error message with `reason` in the editor. - */ - disabled?: { - /** - * Human readable description of why the code action is currently disabled. - * - * This is displayed in the code actions UI. - */ - readonly reason: string; - }; - - /** - * Creates a new code action. - * - * A code action must have at least a {@link CodeAction.title title} and {@link CodeAction.edit edits} - * and/or a {@link CodeAction.command command}. - * - * @param title The title of the code action. - * @param kind The kind of the code action. - */ - constructor(title: string, kind?: CodeActionKind); - } - - /** - * The code action interface defines the contract between extensions and - * the [lightbulb](https://code.visualstudio.com/docs/editor/editingevolved#_code-action) feature. - * - * A code action can be any command that is {@link commands.getCommands known} to the system. - */ - export interface CodeActionProvider { - /** - * Provide commands for the given document and range. - * - * @param document The document in which the command was invoked. - * @param range The selector or range for which the command was invoked. This will always be a selection if - * there is a currently active editor. - * @param context Context carrying additional information. - * @param token A cancellation token. - * - * @return An array of code actions, such as quick fixes or refactorings. The lack of a result can be signaled - * by returning `undefined`, `null`, or an empty array. - * - * We also support returning `Command` for legacy reasons, however all new extensions should return - * `CodeAction` object instead. - */ - provideCodeActions(document: TextDocument, range: Range | Selection, context: CodeActionContext, token: CancellationToken): ProviderResult<(Command | T)[]>; - - /** - * Given a code action fill in its {@linkcode CodeAction.edit edit}-property. Changes to - * all other properties, like title, are ignored. A code action that has an edit - * will not be resolved. - * - * *Note* that a code action provider that returns commands, not code actions, cannot successfully - * implement this function. Returning commands is deprecated and instead code actions should be - * returned. - * - * @param codeAction A code action. - * @param token A cancellation token. - * @return The resolved code action or a thenable that resolves to such. It is OK to return the given - * `item`. When no result is returned, the given `item` will be used. - */ - resolveCodeAction?(codeAction: T, token: CancellationToken): ProviderResult; - } - - /** - * Metadata about the type of code actions that a {@link CodeActionProvider} provides. - */ - export interface CodeActionProviderMetadata { - /** - * List of {@link CodeActionKind CodeActionKinds} that a {@link CodeActionProvider} may return. - * - * This list is used to determine if a given `CodeActionProvider` should be invoked or not. - * To avoid unnecessary computation, every `CodeActionProvider` should list use `providedCodeActionKinds`. The - * list of kinds may either be generic, such as `[CodeActionKind.Refactor]`, or list out every kind provided, - * such as `[CodeActionKind.Refactor.Extract.append('function'), CodeActionKind.Refactor.Extract.append('constant'), ...]`. - */ - readonly providedCodeActionKinds?: readonly CodeActionKind[]; - - /** - * Static documentation for a class of code actions. - * - * Documentation from the provider is shown in the code actions menu if either: - * - * - Code actions of `kind` are requested by the editor. In this case, the editor will show the documentation that - * most closely matches the requested code action kind. For example, if a provider has documentation for - * both `Refactor` and `RefactorExtract`, when the user requests code actions for `RefactorExtract`, - * the editor will use the documentation for `RefactorExtract` instead of the documentation for `Refactor`. - * - * - Any code actions of `kind` are returned by the provider. - * - * At most one documentation entry will be shown per provider. - */ - readonly documentation?: ReadonlyArray<{ - /** - * The kind of the code action being documented. - * - * If the kind is generic, such as `CodeActionKind.Refactor`, the documentation will be shown whenever any - * refactorings are returned. If the kind if more specific, such as `CodeActionKind.RefactorExtract`, the - * documentation will only be shown when extract refactoring code actions are returned. - */ - readonly kind: CodeActionKind; - - /** - * Command that displays the documentation to the user. - * - * This can display the documentation directly in the editor or open a website using {@linkcode env.openExternal}; - * - * The title of this documentation code action is taken from {@linkcode Command.title} - */ - readonly command: Command; - }>; - } - - /** - * A code lens represents a {@link Command} that should be shown along with - * source text, like the number of references, a way to run tests, etc. - * - * A code lens is _unresolved_ when no command is associated to it. For performance - * reasons the creation of a code lens and resolving should be done to two stages. - * - * @see {@link CodeLensProvider.provideCodeLenses} - * @see {@link CodeLensProvider.resolveCodeLens} - */ - export class CodeLens { - - /** - * The range in which this code lens is valid. Should only span a single line. - */ - range: Range; - - /** - * The command this code lens represents. - */ - command?: Command; - - /** - * `true` when there is a command associated. - */ - readonly isResolved: boolean; - - /** - * Creates a new code lens object. - * - * @param range The range to which this code lens applies. - * @param command The command associated to this code lens. - */ - constructor(range: Range, command?: Command); - } - - /** - * A code lens provider adds {@link Command commands} to source text. The commands will be shown - * as dedicated horizontal lines in between the source text. - */ - export interface CodeLensProvider { - - /** - * An optional event to signal that the code lenses from this provider have changed. - */ - onDidChangeCodeLenses?: Event; - - /** - * Compute a list of {@link CodeLens lenses}. This call should return as fast as possible and if - * computing the commands is expensive implementors should only return code lens objects with the - * range set and implement {@link CodeLensProvider.resolveCodeLens resolve}. - * - * @param document The document in which the command was invoked. - * @param token A cancellation token. - * @return An array of code lenses or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - provideCodeLenses(document: TextDocument, token: CancellationToken): ProviderResult; - - /** - * This function will be called for each visible code lens, usually when scrolling and after - * calls to {@link CodeLensProvider.provideCodeLenses compute}-lenses. - * - * @param codeLens Code lens that must be resolved. - * @param token A cancellation token. - * @return The given, resolved code lens or thenable that resolves to such. - */ - resolveCodeLens?(codeLens: T, token: CancellationToken): ProviderResult; - } - - /** - * Information about where a symbol is defined. - * - * Provides additional metadata over normal {@link Location} definitions, including the range of - * the defining symbol - */ - export type DefinitionLink = LocationLink; - - /** - * The definition of a symbol represented as one or many {@link Location locations}. - * For most programming languages there is only one location at which a symbol is - * defined. - */ - export type Definition = Location | Location[]; - - /** - * The definition provider interface defines the contract between extensions and - * the [go to definition](https://code.visualstudio.com/docs/editor/editingevolved#_go-to-definition) - * and peek definition features. - */ - export interface DefinitionProvider { - - /** - * Provide the definition of the symbol at the given position and document. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * @return A definition or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideDefinition(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - } - - /** - * The implementation provider interface defines the contract between extensions and - * the go to implementation feature. - */ - export interface ImplementationProvider { - - /** - * Provide the implementations of the symbol at the given position and document. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * @return A definition or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideImplementation(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - } - - /** - * The type definition provider defines the contract between extensions and - * the go to type definition feature. - */ - export interface TypeDefinitionProvider { - - /** - * Provide the type definition of the symbol at the given position and document. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * @return A definition or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideTypeDefinition(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - } - - /** - * The declaration of a symbol representation as one or many {@link Location locations} - * or {@link LocationLink location links}. - */ - export type Declaration = Location | Location[] | LocationLink[]; - - /** - * The declaration provider interface defines the contract between extensions and - * the go to declaration feature. - */ - export interface DeclarationProvider { - - /** - * Provide the declaration of the symbol at the given position and document. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * @return A declaration or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideDeclaration(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - } - - /** - * Human-readable text that supports formatting via the [markdown syntax](https://commonmark.org). - * - * Rendering of {@link ThemeIcon theme icons} via the `$()`-syntax is supported - * when the {@linkcode supportThemeIcons} is set to `true`. - * - * Rendering of embedded html is supported when {@linkcode supportHtml} is set to `true`. - */ - export class MarkdownString { - - /** - * The markdown string. - */ - value: string; - - /** - * Indicates that this markdown string is from a trusted source. Only *trusted* - * markdown supports links that execute commands, e.g. `[Run it](command:myCommandId)`. - * - * Defaults to `false` (commands are disabled). - * - * If this is an object, only the set of commands listed in `enabledCommands` are allowed. - */ - isTrusted?: boolean | { readonly enabledCommands: readonly string[] }; - - /** - * Indicates that this markdown string can contain {@link ThemeIcon ThemeIcons}, e.g. `$(zap)`. - */ - supportThemeIcons?: boolean; - - /** - * Indicates that this markdown string can contain raw html tags. Defaults to `false`. - * - * When `supportHtml` is false, the markdown renderer will strip out any raw html tags - * that appear in the markdown text. This means you can only use markdown syntax for rendering. - * - * When `supportHtml` is true, the markdown render will also allow a safe subset of html tags - * and attributes to be rendered. See https://github.com/microsoft/vscode/blob/6d2920473c6f13759c978dd89104c4270a83422d/src/vs/base/browser/markdownRenderer.ts#L296 - * for a list of all supported tags and attributes. - */ - supportHtml?: boolean; - - /** - * Uri that relative paths are resolved relative to. - * - * If the `baseUri` ends with `/`, it is considered a directory and relative paths in the markdown are resolved relative to that directory: - * - * ```ts - * const md = new vscode.MarkdownString(`[link](./file.js)`); - * md.baseUri = vscode.Uri.file('/path/to/dir/'); - * // Here 'link' in the rendered markdown resolves to '/path/to/dir/file.js' - * ``` - * - * If the `baseUri` is a file, relative paths in the markdown are resolved relative to the parent dir of that file: - * - * ```ts - * const md = new vscode.MarkdownString(`[link](./file.js)`); - * md.baseUri = vscode.Uri.file('/path/to/otherFile.js'); - * // Here 'link' in the rendered markdown resolves to '/path/to/file.js' - * ``` - */ - baseUri?: Uri; - - /** - * Creates a new markdown string with the given value. - * - * @param value Optional, initial value. - * @param supportThemeIcons Optional, Specifies whether {@link ThemeIcon ThemeIcons} are supported within the {@linkcode MarkdownString}. - */ - constructor(value?: string, supportThemeIcons?: boolean); - - /** - * Appends and escapes the given string to this markdown string. - * @param value Plain text. - */ - appendText(value: string): MarkdownString; - - /** - * Appends the given string 'as is' to this markdown string. When {@linkcode MarkdownString.supportThemeIcons supportThemeIcons} is `true`, {@link ThemeIcon ThemeIcons} in the `value` will be iconified. - * @param value Markdown string. - */ - appendMarkdown(value: string): MarkdownString; - - /** - * Appends the given string as codeblock using the provided language. - * @param value A code snippet. - * @param language An optional {@link languages.getLanguages language identifier}. - */ - appendCodeblock(value: string, language?: string): MarkdownString; - } - - /** - * MarkedString can be used to render human-readable text. It is either a markdown string - * or a code-block that provides a language and a code snippet. Note that - * markdown strings will be sanitized - that means html will be escaped. - * - * @deprecated This type is deprecated, please use {@linkcode MarkdownString} instead. - */ - export type MarkedString = string | { language: string; value: string }; - - /** - * A hover represents additional information for a symbol or word. Hovers are - * rendered in a tooltip-like widget. - */ - export class Hover { - - /** - * The contents of this hover. - */ - contents: Array; - - /** - * The range to which this hover applies. When missing, the - * editor will use the range at the current position or the - * current position itself. - */ - range?: Range; - - /** - * Creates a new hover object. - * - * @param contents The contents of the hover. - * @param range The range to which the hover applies. - */ - constructor(contents: MarkdownString | MarkedString | Array, range?: Range); - } - - /** - * The hover provider interface defines the contract between extensions and - * the [hover](https://code.visualstudio.com/docs/editor/intellisense)-feature. - */ - export interface HoverProvider { - - /** - * Provide a hover for the given position and document. Multiple hovers at the same - * position will be merged by the editor. A hover can have a range which defaults - * to the word range at the position when omitted. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * @return A hover or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideHover(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - } - - /** - * An EvaluatableExpression represents an expression in a document that can be evaluated by an active debugger or runtime. - * The result of this evaluation is shown in a tooltip-like widget. - * If only a range is specified, the expression will be extracted from the underlying document. - * An optional expression can be used to override the extracted expression. - * In this case the range is still used to highlight the range in the document. - */ - export class EvaluatableExpression { - - /* - * The range is used to extract the evaluatable expression from the underlying document and to highlight it. - */ - readonly range: Range; - - /* - * If specified the expression overrides the extracted expression. - */ - readonly expression?: string | undefined; - - /** - * Creates a new evaluatable expression object. - * - * @param range The range in the underlying document from which the evaluatable expression is extracted. - * @param expression If specified overrides the extracted expression. - */ - constructor(range: Range, expression?: string); - } - - /** - * The evaluatable expression provider interface defines the contract between extensions and - * the debug hover. In this contract the provider returns an evaluatable expression for a given position - * in a document and the editor evaluates this expression in the active debug session and shows the result in a debug hover. - */ - export interface EvaluatableExpressionProvider { - - /** - * Provide an evaluatable expression for the given document and position. - * The editor will evaluate this expression in the active debug session and will show the result in the debug hover. - * The expression can be implicitly specified by the range in the underlying document or by explicitly returning an expression. - * - * @param document The document for which the debug hover is about to appear. - * @param position The line and character position in the document where the debug hover is about to appear. - * @param token A cancellation token. - * @return An EvaluatableExpression or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideEvaluatableExpression(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - } - - /** - * Provide inline value as text. - */ - export class InlineValueText { - /** - * The document range for which the inline value applies. - */ - readonly range: Range; - /** - * The text of the inline value. - */ - readonly text: string; - /** - * Creates a new InlineValueText object. - * - * @param range The document line where to show the inline value. - * @param text The value to be shown for the line. - */ - constructor(range: Range, text: string); - } - - /** - * Provide inline value through a variable lookup. - * If only a range is specified, the variable name will be extracted from the underlying document. - * An optional variable name can be used to override the extracted name. - */ - export class InlineValueVariableLookup { - /** - * The document range for which the inline value applies. - * The range is used to extract the variable name from the underlying document. - */ - readonly range: Range; - /** - * If specified the name of the variable to look up. - */ - readonly variableName?: string | undefined; - /** - * How to perform the lookup. - */ - readonly caseSensitiveLookup: boolean; - /** - * Creates a new InlineValueVariableLookup object. - * - * @param range The document line where to show the inline value. - * @param variableName The name of the variable to look up. - * @param caseSensitiveLookup How to perform the lookup. If missing lookup is case sensitive. - */ - constructor(range: Range, variableName?: string, caseSensitiveLookup?: boolean); - } - - /** - * Provide an inline value through an expression evaluation. - * If only a range is specified, the expression will be extracted from the underlying document. - * An optional expression can be used to override the extracted expression. - */ - export class InlineValueEvaluatableExpression { - /** - * The document range for which the inline value applies. - * The range is used to extract the evaluatable expression from the underlying document. - */ - readonly range: Range; - /** - * If specified the expression overrides the extracted expression. - */ - readonly expression?: string | undefined; - /** - * Creates a new InlineValueEvaluatableExpression object. - * - * @param range The range in the underlying document from which the evaluatable expression is extracted. - * @param expression If specified overrides the extracted expression. - */ - constructor(range: Range, expression?: string); - } - - /** - * Inline value information can be provided by different means: - * - directly as a text value (class InlineValueText). - * - as a name to use for a variable lookup (class InlineValueVariableLookup) - * - as an evaluatable expression (class InlineValueEvaluatableExpression) - * The InlineValue types combines all inline value types into one type. - */ - export type InlineValue = InlineValueText | InlineValueVariableLookup | InlineValueEvaluatableExpression; - - /** - * A value-object that contains contextual information when requesting inline values from a InlineValuesProvider. - */ - export interface InlineValueContext { - - /** - * The stack frame (as a DAP Id) where the execution has stopped. - */ - readonly frameId: number; - - /** - * The document range where execution has stopped. - * Typically the end position of the range denotes the line where the inline values are shown. - */ - readonly stoppedLocation: Range; - } - - /** - * The inline values provider interface defines the contract between extensions and the editor's debugger inline values feature. - * In this contract the provider returns inline value information for a given document range - * and the editor shows this information in the editor at the end of lines. - */ - export interface InlineValuesProvider { - - /** - * An optional event to signal that inline values have changed. - * @see {@link EventEmitter} - */ - onDidChangeInlineValues?: Event | undefined; - - /** - * Provide "inline value" information for a given document and range. - * The editor calls this method whenever debugging stops in the given document. - * The returned inline values information is rendered in the editor at the end of lines. - * - * @param document The document for which the inline values information is needed. - * @param viewPort The visible document range for which inline values should be computed. - * @param context A bag containing contextual information like the current location. - * @param token A cancellation token. - * @return An array of InlineValueDescriptors or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideInlineValues(document: TextDocument, viewPort: Range, context: InlineValueContext, token: CancellationToken): ProviderResult; - } - - /** - * A document highlight kind. - */ - export enum DocumentHighlightKind { - - /** - * A textual occurrence. - */ - Text = 0, - - /** - * Read-access of a symbol, like reading a variable. - */ - Read = 1, - - /** - * Write-access of a symbol, like writing to a variable. - */ - Write = 2 - } - - /** - * A document highlight is a range inside a text document which deserves - * special attention. Usually a document highlight is visualized by changing - * the background color of its range. - */ - export class DocumentHighlight { - - /** - * The range this highlight applies to. - */ - range: Range; - - /** - * The highlight kind, default is {@link DocumentHighlightKind.Text text}. - */ - kind?: DocumentHighlightKind; - - /** - * Creates a new document highlight object. - * - * @param range The range the highlight applies to. - * @param kind The highlight kind, default is {@link DocumentHighlightKind.Text text}. - */ - constructor(range: Range, kind?: DocumentHighlightKind); - } - - /** - * The document highlight provider interface defines the contract between extensions and - * the word-highlight-feature. - */ - export interface DocumentHighlightProvider { - - /** - * Provide a set of document highlights, like all occurrences of a variable or - * all exit-points of a function. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * @return An array of document highlights or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - provideDocumentHighlights(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - } - - /** - * A symbol kind. - */ - export enum SymbolKind { - File = 0, - Module = 1, - Namespace = 2, - Package = 3, - Class = 4, - Method = 5, - Property = 6, - Field = 7, - Constructor = 8, - Enum = 9, - Interface = 10, - Function = 11, - Variable = 12, - Constant = 13, - String = 14, - Number = 15, - Boolean = 16, - Array = 17, - Object = 18, - Key = 19, - Null = 20, - EnumMember = 21, - Struct = 22, - Event = 23, - Operator = 24, - TypeParameter = 25 - } - - /** - * Symbol tags are extra annotations that tweak the rendering of a symbol. - */ - export enum SymbolTag { - - /** - * Render a symbol as obsolete, usually using a strike-out. - */ - Deprecated = 1 - } - - /** - * Represents information about programming constructs like variables, classes, - * interfaces etc. - */ - export class SymbolInformation { - - /** - * The name of this symbol. - */ - name: string; - - /** - * The name of the symbol containing this symbol. - */ - containerName: string; - - /** - * The kind of this symbol. - */ - kind: SymbolKind; - - /** - * Tags for this symbol. - */ - tags?: readonly SymbolTag[]; - - /** - * The location of this symbol. - */ - location: Location; - - /** - * Creates a new symbol information object. - * - * @param name The name of the symbol. - * @param kind The kind of the symbol. - * @param containerName The name of the symbol containing the symbol. - * @param location The location of the symbol. - */ - constructor(name: string, kind: SymbolKind, containerName: string, location: Location); - - /** - * Creates a new symbol information object. - * - * @deprecated Please use the constructor taking a {@link Location} object. - * - * @param name The name of the symbol. - * @param kind The kind of the symbol. - * @param range The range of the location of the symbol. - * @param uri The resource of the location of symbol, defaults to the current document. - * @param containerName The name of the symbol containing the symbol. - */ - constructor(name: string, kind: SymbolKind, range: Range, uri?: Uri, containerName?: string); - } - - /** - * Represents programming constructs like variables, classes, interfaces etc. that appear in a document. Document - * symbols can be hierarchical and they have two ranges: one that encloses its definition and one that points to - * its most interesting range, e.g. the range of an identifier. - */ - export class DocumentSymbol { - - /** - * The name of this symbol. - */ - name: string; - - /** - * More detail for this symbol, e.g. the signature of a function. - */ - detail: string; - - /** - * The kind of this symbol. - */ - kind: SymbolKind; - - /** - * Tags for this symbol. - */ - tags?: readonly SymbolTag[]; - - /** - * The range enclosing this symbol not including leading/trailing whitespace but everything else, e.g. comments and code. - */ - range: Range; - - /** - * The range that should be selected and reveal when this symbol is being picked, e.g. the name of a function. - * Must be contained by the {@linkcode DocumentSymbol.range range}. - */ - selectionRange: Range; - - /** - * Children of this symbol, e.g. properties of a class. - */ - children: DocumentSymbol[]; - - /** - * Creates a new document symbol. - * - * @param name The name of the symbol. - * @param detail Details for the symbol. - * @param kind The kind of the symbol. - * @param range The full range of the symbol. - * @param selectionRange The range that should be reveal. - */ - constructor(name: string, detail: string, kind: SymbolKind, range: Range, selectionRange: Range); - } - - /** - * The document symbol provider interface defines the contract between extensions and - * the [go to symbol](https://code.visualstudio.com/docs/editor/editingevolved#_go-to-symbol)-feature. - */ - export interface DocumentSymbolProvider { - - /** - * Provide symbol information for the given document. - * - * @param document The document in which the command was invoked. - * @param token A cancellation token. - * @return An array of document highlights or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - provideDocumentSymbols(document: TextDocument, token: CancellationToken): ProviderResult; - } - - /** - * Metadata about a document symbol provider. - */ - export interface DocumentSymbolProviderMetadata { - /** - * A human-readable string that is shown when multiple outlines trees show for one document. - */ - label?: string; - } - - /** - * The workspace symbol provider interface defines the contract between extensions and - * the [symbol search](https://code.visualstudio.com/docs/editor/editingevolved#_open-symbol-by-name)-feature. - */ - export interface WorkspaceSymbolProvider { - - /** - * Project-wide search for a symbol matching the given query string. - * - * The `query`-parameter should be interpreted in a *relaxed way* as the editor will apply its own highlighting - * and scoring on the results. A good rule of thumb is to match case-insensitive and to simply check that the - * characters of *query* appear in their order in a candidate symbol. Don't use prefix, substring, or similar - * strict matching. - * - * To improve performance implementors can implement `resolveWorkspaceSymbol` and then provide symbols with partial - * {@link SymbolInformation.location location}-objects, without a `range` defined. The editor will then call - * `resolveWorkspaceSymbol` for selected symbols only, e.g. when opening a workspace symbol. - * - * @param query A query string, can be the empty string in which case all symbols should be returned. - * @param token A cancellation token. - * @return An array of document highlights or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - provideWorkspaceSymbols(query: string, token: CancellationToken): ProviderResult; - - /** - * Given a symbol fill in its {@link SymbolInformation.location location}. This method is called whenever a symbol - * is selected in the UI. Providers can implement this method and return incomplete symbols from - * {@linkcode WorkspaceSymbolProvider.provideWorkspaceSymbols provideWorkspaceSymbols} which often helps to improve - * performance. - * - * @param symbol The symbol that is to be resolved. Guaranteed to be an instance of an object returned from an - * earlier call to `provideWorkspaceSymbols`. - * @param token A cancellation token. - * @return The resolved symbol or a thenable that resolves to that. When no result is returned, - * the given `symbol` is used. - */ - resolveWorkspaceSymbol?(symbol: T, token: CancellationToken): ProviderResult; - } - - /** - * Value-object that contains additional information when - * requesting references. - */ - export interface ReferenceContext { - - /** - * Include the declaration of the current symbol. - */ - readonly includeDeclaration: boolean; - } - - /** - * The reference provider interface defines the contract between extensions and - * the [find references](https://code.visualstudio.com/docs/editor/editingevolved#_peek)-feature. - */ - export interface ReferenceProvider { - - /** - * Provide a set of project-wide references for the given position and document. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * - * @return An array of locations or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - provideReferences(document: TextDocument, position: Position, context: ReferenceContext, token: CancellationToken): ProviderResult; - } - - /** - * A text edit represents edits that should be applied - * to a document. - */ - export class TextEdit { - - /** - * Utility to create a replace edit. - * - * @param range A range. - * @param newText A string. - * @return A new text edit object. - */ - static replace(range: Range, newText: string): TextEdit; - - /** - * Utility to create an insert edit. - * - * @param position A position, will become an empty range. - * @param newText A string. - * @return A new text edit object. - */ - static insert(position: Position, newText: string): TextEdit; - - /** - * Utility to create a delete edit. - * - * @param range A range. - * @return A new text edit object. - */ - static delete(range: Range): TextEdit; - - /** - * Utility to create an eol-edit. - * - * @param eol An eol-sequence - * @return A new text edit object. - */ - static setEndOfLine(eol: EndOfLine): TextEdit; - - /** - * The range this edit applies to. - */ - range: Range; - - /** - * The string this edit will insert. - */ - newText: string; - - /** - * The eol-sequence used in the document. - * - * *Note* that the eol-sequence will be applied to the - * whole document. - */ - newEol?: EndOfLine; - - /** - * Create a new TextEdit. - * - * @param range A range. - * @param newText A string. - */ - constructor(range: Range, newText: string); - } - - /** - * A snippet edit represents an interactive edit that is performed by - * the editor. - * - * *Note* that a snippet edit can always be performed as a normal {@link TextEdit text edit}. - * This will happen when no matching editor is open or when a {@link WorkspaceEdit workspace edit} - * contains snippet edits for multiple files. In that case only those that match the active editor - * will be performed as snippet edits and the others as normal text edits. - */ - export class SnippetTextEdit { - - /** - * Utility to create a replace snippet edit. - * - * @param range A range. - * @param snippet A snippet string. - * @return A new snippet edit object. - */ - static replace(range: Range, snippet: SnippetString): SnippetTextEdit; - - /** - * Utility to create an insert snippet edit. - * - * @param position A position, will become an empty range. - * @param snippet A snippet string. - * @return A new snippet edit object. - */ - static insert(position: Position, snippet: SnippetString): SnippetTextEdit; - - /** - * The range this edit applies to. - */ - range: Range; - - /** - * The {@link SnippetString snippet} this edit will perform. - */ - snippet: SnippetString; - - /** - * Create a new snippet edit. - * - * @param range A range. - * @param snippet A snippet string. - */ - constructor(range: Range, snippet: SnippetString); - } - - /** - * A notebook edit represents edits that should be applied to the contents of a notebook. - */ - export class NotebookEdit { - - /** - * Utility to create a edit that replaces cells in a notebook. - * - * @param range The range of cells to replace - * @param newCells The new notebook cells. - */ - static replaceCells(range: NotebookRange, newCells: NotebookCellData[]): NotebookEdit; - - /** - * Utility to create an edit that replaces cells in a notebook. - * - * @param index The index to insert cells at. - * @param newCells The new notebook cells. - */ - static insertCells(index: number, newCells: NotebookCellData[]): NotebookEdit; - - /** - * Utility to create an edit that deletes cells in a notebook. - * - * @param range The range of cells to delete. - */ - static deleteCells(range: NotebookRange): NotebookEdit; - - /** - * Utility to create an edit that update a cell's metadata. - * - * @param index The index of the cell to update. - * @param newCellMetadata The new metadata for the cell. - */ - static updateCellMetadata(index: number, newCellMetadata: { [key: string]: any }): NotebookEdit; - - /** - * Utility to create an edit that updates the notebook's metadata. - * - * @param newNotebookMetadata The new metadata for the notebook. - */ - static updateNotebookMetadata(newNotebookMetadata: { [key: string]: any }): NotebookEdit; - - /** - * Range of the cells being edited. May be empty. - */ - range: NotebookRange; - - /** - * New cells being inserted. May be empty. - */ - newCells: NotebookCellData[]; - - /** - * Optional new metadata for the cells. - */ - newCellMetadata?: { [key: string]: any }; - - /** - * Optional new metadata for the notebook. - */ - newNotebookMetadata?: { [key: string]: any }; - - constructor(range: NotebookRange, newCells: NotebookCellData[]); - } - - /** - * Additional data for entries of a workspace edit. Supports to label entries and marks entries - * as needing confirmation by the user. The editor groups edits with equal labels into tree nodes, - * for instance all edits labelled with "Changes in Strings" would be a tree node. - */ - export interface WorkspaceEditEntryMetadata { - - /** - * A flag which indicates that user confirmation is needed. - */ - needsConfirmation: boolean; - - /** - * A human-readable string which is rendered prominent. - */ - label: string; - - /** - * A human-readable string which is rendered less prominent on the same line. - */ - description?: string; - - /** - * The icon path or {@link ThemeIcon} for the edit. - */ - iconPath?: Uri | { light: Uri; dark: Uri } | ThemeIcon; - } - - /** - * Additional data about a workspace edit. - */ - export interface WorkspaceEditMetadata { - /** - * Signal to the editor that this edit is a refactoring. - */ - isRefactoring?: boolean; - } - - /** - * A workspace edit is a collection of textual and files changes for - * multiple resources and documents. - * - * Use the {@link workspace.applyEdit applyEdit}-function to apply a workspace edit. - */ - export class WorkspaceEdit { - - /** - * The number of affected resources of textual or resource changes. - */ - readonly size: number; - - /** - * Replace the given range with given text for the given resource. - * - * @param uri A resource identifier. - * @param range A range. - * @param newText A string. - * @param metadata Optional metadata for the entry. - */ - replace(uri: Uri, range: Range, newText: string, metadata?: WorkspaceEditEntryMetadata): void; - - /** - * Insert the given text at the given position. - * - * @param uri A resource identifier. - * @param position A position. - * @param newText A string. - * @param metadata Optional metadata for the entry. - */ - insert(uri: Uri, position: Position, newText: string, metadata?: WorkspaceEditEntryMetadata): void; - - /** - * Delete the text at the given range. - * - * @param uri A resource identifier. - * @param range A range. - * @param metadata Optional metadata for the entry. - */ - delete(uri: Uri, range: Range, metadata?: WorkspaceEditEntryMetadata): void; - - /** - * Check if a text edit for a resource exists. - * - * @param uri A resource identifier. - * @return `true` if the given resource will be touched by this edit. - */ - has(uri: Uri): boolean; - - /** - * Set (and replace) text edits or snippet edits for a resource. - * - * @param uri A resource identifier. - * @param edits An array of edits. - */ - set(uri: Uri, edits: ReadonlyArray): void; - - /** - * Set (and replace) text edits or snippet edits with metadata for a resource. - * - * @param uri A resource identifier. - * @param edits An array of edits. - */ - set(uri: Uri, edits: ReadonlyArray<[TextEdit | SnippetTextEdit, WorkspaceEditEntryMetadata]>): void; - - /** - * Set (and replace) notebook edits for a resource. - * - * @param uri A resource identifier. - * @param edits An array of edits. - */ - set(uri: Uri, edits: readonly NotebookEdit[]): void; - - /** - * Set (and replace) notebook edits with metadata for a resource. - * - * @param uri A resource identifier. - * @param edits An array of edits. - */ - set(uri: Uri, edits: ReadonlyArray<[NotebookEdit, WorkspaceEditEntryMetadata]>): void; - - /** - * Get the text edits for a resource. - * - * @param uri A resource identifier. - * @return An array of text edits. - */ - get(uri: Uri): TextEdit[]; - - /** - * Create a regular file. - * - * @param uri Uri of the new file. - * @param options Defines if an existing file should be overwritten or be - * ignored. When `overwrite` and `ignoreIfExists` are both set `overwrite` wins. - * When both are unset and when the file already exists then the edit cannot - * be applied successfully. The `content`-property allows to set the initial contents - * the file is being created with. - * @param metadata Optional metadata for the entry. - */ - createFile(uri: Uri, options?: { readonly overwrite?: boolean; readonly ignoreIfExists?: boolean; readonly contents?: Uint8Array }, metadata?: WorkspaceEditEntryMetadata): void; - - /** - * Delete a file or folder. - * - * @param uri The uri of the file that is to be deleted. - * @param metadata Optional metadata for the entry. - */ - deleteFile(uri: Uri, options?: { readonly recursive?: boolean; readonly ignoreIfNotExists?: boolean }, metadata?: WorkspaceEditEntryMetadata): void; - - /** - * Rename a file or folder. - * - * @param oldUri The existing file. - * @param newUri The new location. - * @param options Defines if existing files should be overwritten or be - * ignored. When overwrite and ignoreIfExists are both set overwrite wins. - * @param metadata Optional metadata for the entry. - */ - renameFile(oldUri: Uri, newUri: Uri, options?: { readonly overwrite?: boolean; readonly ignoreIfExists?: boolean }, metadata?: WorkspaceEditEntryMetadata): void; - - /** - * Get all text edits grouped by resource. - * - * @return A shallow copy of `[Uri, TextEdit[]]`-tuples. - */ - entries(): [Uri, TextEdit[]][]; - } - - /** - * A snippet string is a template which allows to insert text - * and to control the editor cursor when insertion happens. - * - * A snippet can define tab stops and placeholders with `$1`, `$2` - * and `${3:foo}`. `$0` defines the final tab stop, it defaults to - * the end of the snippet. Variables are defined with `$name` and - * `${name:default value}`. Also see - * [the full snippet syntax](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_creating-your-own-snippets). - */ - export class SnippetString { - - /** - * The snippet string. - */ - value: string; - - constructor(value?: string); - - /** - * Builder-function that appends the given string to - * the {@linkcode SnippetString.value value} of this snippet string. - * - * @param string A value to append 'as given'. The string will be escaped. - * @return This snippet string. - */ - appendText(string: string): SnippetString; - - /** - * Builder-function that appends a tabstop (`$1`, `$2` etc) to - * the {@linkcode SnippetString.value value} of this snippet string. - * - * @param number The number of this tabstop, defaults to an auto-increment - * value starting at 1. - * @return This snippet string. - */ - appendTabstop(number?: number): SnippetString; - - /** - * Builder-function that appends a placeholder (`${1:value}`) to - * the {@linkcode SnippetString.value value} of this snippet string. - * - * @param value The value of this placeholder - either a string or a function - * with which a nested snippet can be created. - * @param number The number of this tabstop, defaults to an auto-increment - * value starting at 1. - * @return This snippet string. - */ - appendPlaceholder(value: string | ((snippet: SnippetString) => any), number?: number): SnippetString; - - /** - * Builder-function that appends a choice (`${1|a,b,c|}`) to - * the {@linkcode SnippetString.value value} of this snippet string. - * - * @param values The values for choices - the array of strings - * @param number The number of this tabstop, defaults to an auto-increment - * value starting at 1. - * @return This snippet string. - */ - appendChoice(values: readonly string[], number?: number): SnippetString; - - /** - * Builder-function that appends a variable (`${VAR}`) to - * the {@linkcode SnippetString.value value} of this snippet string. - * - * @param name The name of the variable - excluding the `$`. - * @param defaultValue The default value which is used when the variable name cannot - * be resolved - either a string or a function with which a nested snippet can be created. - * @return This snippet string. - */ - appendVariable(name: string, defaultValue: string | ((snippet: SnippetString) => any)): SnippetString; - } - - /** - * The rename provider interface defines the contract between extensions and - * the [rename](https://code.visualstudio.com/docs/editor/editingevolved#_rename-symbol)-feature. - */ - export interface RenameProvider { - - /** - * Provide an edit that describes changes that have to be made to one - * or many resources to rename a symbol to a different name. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param newName The new name of the symbol. If the given name is not valid, the provider must return a rejected promise. - * @param token A cancellation token. - * @return A workspace edit or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideRenameEdits(document: TextDocument, position: Position, newName: string, token: CancellationToken): ProviderResult; - - /** - * Optional function for resolving and validating a position *before* running rename. The result can - * be a range or a range and a placeholder text. The placeholder text should be the identifier of the symbol - * which is being renamed - when omitted the text in the returned range is used. - * - * *Note:* This function should throw an error or return a rejected thenable when the provided location - * doesn't allow for a rename. - * - * @param document The document in which rename will be invoked. - * @param position The position at which rename will be invoked. - * @param token A cancellation token. - * @return The range or range and placeholder text of the identifier that is to be renamed. The lack of a result can signaled by returning `undefined` or `null`. - */ - prepareRename?(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - } - - /** - * A semantic tokens legend contains the needed information to decipher - * the integer encoded representation of semantic tokens. - */ - export class SemanticTokensLegend { - /** - * The possible token types. - */ - readonly tokenTypes: string[]; - /** - * The possible token modifiers. - */ - readonly tokenModifiers: string[]; - - constructor(tokenTypes: string[], tokenModifiers?: string[]); - } - - /** - * A semantic tokens builder can help with creating a `SemanticTokens` instance - * which contains delta encoded semantic tokens. - */ - export class SemanticTokensBuilder { - - constructor(legend?: SemanticTokensLegend); - - /** - * Add another token. - * - * @param line The token start line number (absolute value). - * @param char The token start character (absolute value). - * @param length The token length in characters. - * @param tokenType The encoded token type. - * @param tokenModifiers The encoded token modifiers. - */ - push(line: number, char: number, length: number, tokenType: number, tokenModifiers?: number): void; - - /** - * Add another token. Use only when providing a legend. - * - * @param range The range of the token. Must be single-line. - * @param tokenType The token type. - * @param tokenModifiers The token modifiers. - */ - push(range: Range, tokenType: string, tokenModifiers?: readonly string[]): void; - - /** - * Finish and create a `SemanticTokens` instance. - */ - build(resultId?: string): SemanticTokens; - } - - /** - * Represents semantic tokens, either in a range or in an entire document. - * @see {@link DocumentSemanticTokensProvider.provideDocumentSemanticTokens provideDocumentSemanticTokens} for an explanation of the format. - * @see {@link SemanticTokensBuilder} for a helper to create an instance. - */ - export class SemanticTokens { - /** - * The result id of the tokens. - * - * This is the id that will be passed to `DocumentSemanticTokensProvider.provideDocumentSemanticTokensEdits` (if implemented). - */ - readonly resultId: string | undefined; - /** - * The actual tokens data. - * @see {@link DocumentSemanticTokensProvider.provideDocumentSemanticTokens provideDocumentSemanticTokens} for an explanation of the format. - */ - readonly data: Uint32Array; - - constructor(data: Uint32Array, resultId?: string); - } - - /** - * Represents edits to semantic tokens. - * @see {@link DocumentSemanticTokensProvider.provideDocumentSemanticTokensEdits provideDocumentSemanticTokensEdits} for an explanation of the format. - */ - export class SemanticTokensEdits { - /** - * The result id of the tokens. - * - * This is the id that will be passed to `DocumentSemanticTokensProvider.provideDocumentSemanticTokensEdits` (if implemented). - */ - readonly resultId: string | undefined; - /** - * The edits to the tokens data. - * All edits refer to the initial data state. - */ - readonly edits: SemanticTokensEdit[]; - - constructor(edits: SemanticTokensEdit[], resultId?: string); - } - - /** - * Represents an edit to semantic tokens. - * @see {@link DocumentSemanticTokensProvider.provideDocumentSemanticTokensEdits provideDocumentSemanticTokensEdits} for an explanation of the format. - */ - export class SemanticTokensEdit { - /** - * The start offset of the edit. - */ - readonly start: number; - /** - * The count of elements to remove. - */ - readonly deleteCount: number; - /** - * The elements to insert. - */ - readonly data: Uint32Array | undefined; - - constructor(start: number, deleteCount: number, data?: Uint32Array); - } - - /** - * The document semantic tokens provider interface defines the contract between extensions and - * semantic tokens. - */ - export interface DocumentSemanticTokensProvider { - /** - * An optional event to signal that the semantic tokens from this provider have changed. - */ - onDidChangeSemanticTokens?: Event; - - /** - * Tokens in a file are represented as an array of integers. The position of each token is expressed relative to - * the token before it, because most tokens remain stable relative to each other when edits are made in a file. - * - * --- - * In short, each token takes 5 integers to represent, so a specific token `i` in the file consists of the following array indices: - * - at index `5*i` - `deltaLine`: token line number, relative to the previous token - * - at index `5*i+1` - `deltaStart`: token start character, relative to the previous token (relative to 0 or the previous token's start if they are on the same line) - * - at index `5*i+2` - `length`: the length of the token. A token cannot be multiline. - * - at index `5*i+3` - `tokenType`: will be looked up in `SemanticTokensLegend.tokenTypes`. We currently ask that `tokenType` < 65536. - * - at index `5*i+4` - `tokenModifiers`: each set bit will be looked up in `SemanticTokensLegend.tokenModifiers` - * - * --- - * ### How to encode tokens - * - * Here is an example for encoding a file with 3 tokens in a uint32 array: - * ``` - * { line: 2, startChar: 5, length: 3, tokenType: "property", tokenModifiers: ["private", "static"] }, - * { line: 2, startChar: 10, length: 4, tokenType: "type", tokenModifiers: [] }, - * { line: 5, startChar: 2, length: 7, tokenType: "class", tokenModifiers: [] } - * ``` - * - * 1. First of all, a legend must be devised. This legend must be provided up-front and capture all possible token types. - * For this example, we will choose the following legend which must be passed in when registering the provider: - * ``` - * tokenTypes: ['property', 'type', 'class'], - * tokenModifiers: ['private', 'static'] - * ``` - * - * 2. The first transformation step is to encode `tokenType` and `tokenModifiers` as integers using the legend. Token types are looked - * up by index, so a `tokenType` value of `1` means `tokenTypes[1]`. Multiple token modifiers can be set by using bit flags, - * so a `tokenModifier` value of `3` is first viewed as binary `0b00000011`, which means `[tokenModifiers[0], tokenModifiers[1]]` because - * bits 0 and 1 are set. Using this legend, the tokens now are: - * ``` - * { line: 2, startChar: 5, length: 3, tokenType: 0, tokenModifiers: 3 }, - * { line: 2, startChar: 10, length: 4, tokenType: 1, tokenModifiers: 0 }, - * { line: 5, startChar: 2, length: 7, tokenType: 2, tokenModifiers: 0 } - * ``` - * - * 3. The next step is to represent each token relative to the previous token in the file. In this case, the second token - * is on the same line as the first token, so the `startChar` of the second token is made relative to the `startChar` - * of the first token, so it will be `10 - 5`. The third token is on a different line than the second token, so the - * `startChar` of the third token will not be altered: - * ``` - * { deltaLine: 2, deltaStartChar: 5, length: 3, tokenType: 0, tokenModifiers: 3 }, - * { deltaLine: 0, deltaStartChar: 5, length: 4, tokenType: 1, tokenModifiers: 0 }, - * { deltaLine: 3, deltaStartChar: 2, length: 7, tokenType: 2, tokenModifiers: 0 } - * ``` - * - * 4. Finally, the last step is to inline each of the 5 fields for a token in a single array, which is a memory friendly representation: - * ``` - * // 1st token, 2nd token, 3rd token - * [ 2,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ] - * ``` - * - * @see {@link SemanticTokensBuilder} for a helper to encode tokens as integers. - * *NOTE*: When doing edits, it is possible that multiple edits occur until the editor decides to invoke the semantic tokens provider. - * *NOTE*: If the provider cannot temporarily compute semantic tokens, it can indicate this by throwing an error with the message 'Busy'. - */ - provideDocumentSemanticTokens(document: TextDocument, token: CancellationToken): ProviderResult; - - /** - * Instead of always returning all the tokens in a file, it is possible for a `DocumentSemanticTokensProvider` to implement - * this method (`provideDocumentSemanticTokensEdits`) and then return incremental updates to the previously provided semantic tokens. - * - * --- - * ### How tokens change when the document changes - * - * Suppose that `provideDocumentSemanticTokens` has previously returned the following semantic tokens: - * ``` - * // 1st token, 2nd token, 3rd token - * [ 2,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ] - * ``` - * - * Also suppose that after some edits, the new semantic tokens in a file are: - * ``` - * // 1st token, 2nd token, 3rd token - * [ 3,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ] - * ``` - * It is possible to express these new tokens in terms of an edit applied to the previous tokens: - * ``` - * [ 2,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ] // old tokens - * [ 3,5,3,0,3, 0,5,4,1,0, 3,2,7,2,0 ] // new tokens - * - * edit: { start: 0, deleteCount: 1, data: [3] } // replace integer at offset 0 with 3 - * ``` - * - * *NOTE*: If the provider cannot compute `SemanticTokensEdits`, it can "give up" and return all the tokens in the document again. - * *NOTE*: All edits in `SemanticTokensEdits` contain indices in the old integers array, so they all refer to the previous result state. - */ - provideDocumentSemanticTokensEdits?(document: TextDocument, previousResultId: string, token: CancellationToken): ProviderResult; - } - - /** - * The document range semantic tokens provider interface defines the contract between extensions and - * semantic tokens. - */ - export interface DocumentRangeSemanticTokensProvider { - /** - * @see {@link DocumentSemanticTokensProvider.provideDocumentSemanticTokens provideDocumentSemanticTokens}. - */ - provideDocumentRangeSemanticTokens(document: TextDocument, range: Range, token: CancellationToken): ProviderResult; - } - - /** - * Value-object describing what options formatting should use. - */ - export interface FormattingOptions { - - /** - * Size of a tab in spaces. - */ - tabSize: number; - - /** - * Prefer spaces over tabs. - */ - insertSpaces: boolean; - - /** - * Signature for further properties. - */ - [key: string]: boolean | number | string; - } - - /** - * The document formatting provider interface defines the contract between extensions and - * the formatting-feature. - */ - export interface DocumentFormattingEditProvider { - - /** - * Provide formatting edits for a whole document. - * - * @param document The document in which the command was invoked. - * @param options Options controlling formatting. - * @param token A cancellation token. - * @return A set of text edits or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - provideDocumentFormattingEdits(document: TextDocument, options: FormattingOptions, token: CancellationToken): ProviderResult; - } - - /** - * The document formatting provider interface defines the contract between extensions and - * the formatting-feature. - */ - export interface DocumentRangeFormattingEditProvider { - - /** - * Provide formatting edits for a range in a document. - * - * The given range is a hint and providers can decide to format a smaller - * or larger range. Often this is done by adjusting the start and end - * of the range to full syntax nodes. - * - * @param document The document in which the command was invoked. - * @param range The range which should be formatted. - * @param options Options controlling formatting. - * @param token A cancellation token. - * @return A set of text edits or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - provideDocumentRangeFormattingEdits(document: TextDocument, range: Range, options: FormattingOptions, token: CancellationToken): ProviderResult; - } - - /** - * The document formatting provider interface defines the contract between extensions and - * the formatting-feature. - */ - export interface OnTypeFormattingEditProvider { - - /** - * Provide formatting edits after a character has been typed. - * - * The given position and character should hint to the provider - * what range the position to expand to, like find the matching `{` - * when `}` has been entered. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param ch The character that has been typed. - * @param options Options controlling formatting. - * @param token A cancellation token. - * @return A set of text edits or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - provideOnTypeFormattingEdits(document: TextDocument, position: Position, ch: string, options: FormattingOptions, token: CancellationToken): ProviderResult; - } - - /** - * Represents a parameter of a callable-signature. A parameter can - * have a label and a doc-comment. - */ - export class ParameterInformation { - - /** - * The label of this signature. - * - * Either a string or inclusive start and exclusive end offsets within its containing - * {@link SignatureInformation.label signature label}. *Note*: A label of type string must be - * a substring of its containing signature information's {@link SignatureInformation.label label}. - */ - label: string | [number, number]; - - /** - * The human-readable doc-comment of this signature. Will be shown - * in the UI but can be omitted. - */ - documentation?: string | MarkdownString; - - /** - * Creates a new parameter information object. - * - * @param label A label string or inclusive start and exclusive end offsets within its containing signature label. - * @param documentation A doc string. - */ - constructor(label: string | [number, number], documentation?: string | MarkdownString); - } - - /** - * Represents the signature of something callable. A signature - * can have a label, like a function-name, a doc-comment, and - * a set of parameters. - */ - export class SignatureInformation { - - /** - * The label of this signature. Will be shown in - * the UI. - */ - label: string; - - /** - * The human-readable doc-comment of this signature. Will be shown - * in the UI but can be omitted. - */ - documentation?: string | MarkdownString; - - /** - * The parameters of this signature. - */ - parameters: ParameterInformation[]; - - /** - * The index of the active parameter. - * - * If provided, this is used in place of {@linkcode SignatureHelp.activeParameter}. - */ - activeParameter?: number; - - /** - * Creates a new signature information object. - * - * @param label A label string. - * @param documentation A doc string. - */ - constructor(label: string, documentation?: string | MarkdownString); - } - - /** - * Signature help represents the signature of something - * callable. There can be multiple signatures but only one - * active and only one active parameter. - */ - export class SignatureHelp { - - /** - * One or more signatures. - */ - signatures: SignatureInformation[]; - - /** - * The active signature. - */ - activeSignature: number; - - /** - * The active parameter of the active signature. - */ - activeParameter: number; - } - - /** - * How a {@linkcode SignatureHelpProvider} was triggered. - */ - export enum SignatureHelpTriggerKind { - /** - * Signature help was invoked manually by the user or by a command. - */ - Invoke = 1, - - /** - * Signature help was triggered by a trigger character. - */ - TriggerCharacter = 2, - - /** - * Signature help was triggered by the cursor moving or by the document content changing. - */ - ContentChange = 3, - } - - /** - * Additional information about the context in which a - * {@linkcode SignatureHelpProvider.provideSignatureHelp SignatureHelpProvider} was triggered. - */ - export interface SignatureHelpContext { - /** - * Action that caused signature help to be triggered. - */ - readonly triggerKind: SignatureHelpTriggerKind; - - /** - * Character that caused signature help to be triggered. - * - * This is `undefined` when signature help is not triggered by typing, such as when manually invoking - * signature help or when moving the cursor. - */ - readonly triggerCharacter: string | undefined; - - /** - * `true` if signature help was already showing when it was triggered. - * - * Retriggers occur when the signature help is already active and can be caused by actions such as - * typing a trigger character, a cursor move, or document content changes. - */ - readonly isRetrigger: boolean; - - /** - * The currently active {@linkcode SignatureHelp}. - * - * The `activeSignatureHelp` has its [`SignatureHelp.activeSignature`] field updated based on - * the user arrowing through available signatures. - */ - readonly activeSignatureHelp: SignatureHelp | undefined; - } - - /** - * The signature help provider interface defines the contract between extensions and - * the [parameter hints](https://code.visualstudio.com/docs/editor/intellisense)-feature. - */ - export interface SignatureHelpProvider { - - /** - * Provide help for the signature at the given position and document. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * @param context Information about how signature help was triggered. - * - * @return Signature help or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideSignatureHelp(document: TextDocument, position: Position, token: CancellationToken, context: SignatureHelpContext): ProviderResult; - } - - /** - * Metadata about a registered {@linkcode SignatureHelpProvider}. - */ - export interface SignatureHelpProviderMetadata { - /** - * List of characters that trigger signature help. - */ - readonly triggerCharacters: readonly string[]; - - /** - * List of characters that re-trigger signature help. - * - * These trigger characters are only active when signature help is already showing. All trigger characters - * are also counted as re-trigger characters. - */ - readonly retriggerCharacters: readonly string[]; - } - - /** - * A structured label for a {@link CompletionItem completion item}. - */ - export interface CompletionItemLabel { - - /** - * The label of this completion item. - * - * By default this is also the text that is inserted when this completion is selected. - */ - label: string; - - /** - * An optional string which is rendered less prominently directly after {@link CompletionItemLabel.label label}, - * without any spacing. Should be used for function signatures or type annotations. - */ - detail?: string; - - /** - * An optional string which is rendered less prominently after {@link CompletionItemLabel.detail}. Should be used - * for fully qualified names or file path. - */ - description?: string; - } - - /** - * Completion item kinds. - */ - export enum CompletionItemKind { - Text = 0, - Method = 1, - Function = 2, - Constructor = 3, - Field = 4, - Variable = 5, - Class = 6, - Interface = 7, - Module = 8, - Property = 9, - Unit = 10, - Value = 11, - Enum = 12, - Keyword = 13, - Snippet = 14, - Color = 15, - Reference = 17, - File = 16, - Folder = 18, - EnumMember = 19, - Constant = 20, - Struct = 21, - Event = 22, - Operator = 23, - TypeParameter = 24, - User = 25, - Issue = 26, - } - - /** - * Completion item tags are extra annotations that tweak the rendering of a completion - * item. - */ - export enum CompletionItemTag { - /** - * Render a completion as obsolete, usually using a strike-out. - */ - Deprecated = 1 - } - - /** - * A completion item represents a text snippet that is proposed to complete text that is being typed. - * - * It is sufficient to create a completion item from just a {@link CompletionItem.label label}. In that - * case the completion item will replace the {@link TextDocument.getWordRangeAtPosition word} - * until the cursor with the given label or {@link CompletionItem.insertText insertText}. Otherwise the - * given {@link CompletionItem.textEdit edit} is used. - * - * When selecting a completion item in the editor its defined or synthesized text edit will be applied - * to *all* cursors/selections whereas {@link CompletionItem.additionalTextEdits additionalTextEdits} will be - * applied as provided. - * - * @see {@link CompletionItemProvider.provideCompletionItems} - * @see {@link CompletionItemProvider.resolveCompletionItem} - */ - export class CompletionItem { - - /** - * The label of this completion item. By default - * this is also the text that is inserted when selecting - * this completion. - */ - label: string | CompletionItemLabel; - - /** - * The kind of this completion item. Based on the kind - * an icon is chosen by the editor. - */ - kind?: CompletionItemKind; - - /** - * Tags for this completion item. - */ - tags?: readonly CompletionItemTag[]; - - /** - * A human-readable string with additional information - * about this item, like type or symbol information. - */ - detail?: string; - - /** - * A human-readable string that represents a doc-comment. - */ - documentation?: string | MarkdownString; - - /** - * A string that should be used when comparing this item - * with other items. When `falsy` the {@link CompletionItem.label label} - * is used. - * - * Note that `sortText` is only used for the initial ordering of completion - * items. When having a leading word (prefix) ordering is based on how - * well completions match that prefix and the initial ordering is only used - * when completions match equally well. The prefix is defined by the - * {@linkcode CompletionItem.range range}-property and can therefore be different - * for each completion. - */ - sortText?: string; - - /** - * A string that should be used when filtering a set of - * completion items. When `falsy` the {@link CompletionItem.label label} - * is used. - * - * Note that the filter text is matched against the leading word (prefix) which is defined - * by the {@linkcode CompletionItem.range range}-property. - */ - filterText?: string; - - /** - * Select this item when showing. *Note* that only one completion item can be selected and - * that the editor decides which item that is. The rule is that the *first* item of those - * that match best is selected. - */ - preselect?: boolean; - - /** - * A string or snippet that should be inserted in a document when selecting - * this completion. When `falsy` the {@link CompletionItem.label label} - * is used. - */ - insertText?: string | SnippetString; - - /** - * A range or a insert and replace range selecting the text that should be replaced by this completion item. - * - * When omitted, the range of the {@link TextDocument.getWordRangeAtPosition current word} is used as replace-range - * and as insert-range the start of the {@link TextDocument.getWordRangeAtPosition current word} to the - * current position is used. - * - * *Note 1:* A range must be a {@link Range.isSingleLine single line} and it must - * {@link Range.contains contain} the position at which completion has been {@link CompletionItemProvider.provideCompletionItems requested}. - * *Note 2:* A insert range must be a prefix of a replace range, that means it must be contained and starting at the same position. - */ - range?: Range | { inserting: Range; replacing: Range }; - - /** - * An optional set of characters that when pressed while this completion is active will accept it first and - * then type that character. *Note* that all commit characters should have `length=1` and that superfluous - * characters will be ignored. - */ - commitCharacters?: string[]; - - /** - * Keep whitespace of the {@link CompletionItem.insertText insertText} as is. By default, the editor adjusts leading - * whitespace of new lines so that they match the indentation of the line for which the item is accepted - setting - * this to `true` will prevent that. - */ - keepWhitespace?: boolean; - - /** - * @deprecated Use `CompletionItem.insertText` and `CompletionItem.range` instead. - * - * An {@link TextEdit edit} which is applied to a document when selecting - * this completion. When an edit is provided the value of - * {@link CompletionItem.insertText insertText} is ignored. - * - * The {@link Range} of the edit must be single-line and on the same - * line completions were {@link CompletionItemProvider.provideCompletionItems requested} at. - */ - textEdit?: TextEdit; - - /** - * An optional array of additional {@link TextEdit text edits} that are applied when - * selecting this completion. Edits must not overlap with the main {@link CompletionItem.textEdit edit} - * nor with themselves. - */ - additionalTextEdits?: TextEdit[]; - - /** - * An optional {@link Command} that is executed *after* inserting this completion. *Note* that - * additional modifications to the current document should be described with the - * {@link CompletionItem.additionalTextEdits additionalTextEdits}-property. - */ - command?: Command; - - /** - * Creates a new completion item. - * - * Completion items must have at least a {@link CompletionItem.label label} which then - * will be used as insert text as well as for sorting and filtering. - * - * @param label The label of the completion. - * @param kind The {@link CompletionItemKind kind} of the completion. - */ - constructor(label: string | CompletionItemLabel, kind?: CompletionItemKind); - } - - /** - * Represents a collection of {@link CompletionItem completion items} to be presented - * in the editor. - */ - export class CompletionList { - - /** - * This list is not complete. Further typing should result in recomputing - * this list. - */ - isIncomplete?: boolean; - - /** - * The completion items. - */ - items: T[]; - - /** - * Creates a new completion list. - * - * @param items The completion items. - * @param isIncomplete The list is not complete. - */ - constructor(items?: T[], isIncomplete?: boolean); - } - - /** - * How a {@link CompletionItemProvider completion provider} was triggered - */ - export enum CompletionTriggerKind { - /** - * Completion was triggered normally. - */ - Invoke = 0, - /** - * Completion was triggered by a trigger character. - */ - TriggerCharacter = 1, - /** - * Completion was re-triggered as current completion list is incomplete - */ - TriggerForIncompleteCompletions = 2 - } - - /** - * Contains additional information about the context in which - * {@link CompletionItemProvider.provideCompletionItems completion provider} is triggered. - */ - export interface CompletionContext { - /** - * How the completion was triggered. - */ - readonly triggerKind: CompletionTriggerKind; - - /** - * Character that triggered the completion item provider. - * - * `undefined` if the provider was not triggered by a character. - * - * The trigger character is already in the document when the completion provider is triggered. - */ - readonly triggerCharacter: string | undefined; - } - - /** - * The completion item provider interface defines the contract between extensions and - * [IntelliSense](https://code.visualstudio.com/docs/editor/intellisense). - * - * Providers can delay the computation of the {@linkcode CompletionItem.detail detail} - * and {@linkcode CompletionItem.documentation documentation} properties by implementing the - * {@linkcode CompletionItemProvider.resolveCompletionItem resolveCompletionItem}-function. However, properties that - * are needed for the initial sorting and filtering, like `sortText`, `filterText`, `insertText`, and `range`, must - * not be changed during resolve. - * - * Providers are asked for completions either explicitly by a user gesture or -depending on the configuration- - * implicitly when typing words or trigger characters. - */ - export interface CompletionItemProvider { - - /** - * Provide completion items for the given position and document. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * @param context How the completion was triggered. - * - * @return An array of completions, a {@link CompletionList completion list}, or a thenable that resolves to either. - * The lack of a result can be signaled by returning `undefined`, `null`, or an empty array. - */ - provideCompletionItems(document: TextDocument, position: Position, token: CancellationToken, context: CompletionContext): ProviderResult>; - - /** - * Given a completion item fill in more data, like {@link CompletionItem.documentation doc-comment} - * or {@link CompletionItem.detail details}. - * - * The editor will only resolve a completion item once. - * - * *Note* that this function is called when completion items are already showing in the UI or when an item has been - * selected for insertion. Because of that, no property that changes the presentation (label, sorting, filtering etc) - * or the (primary) insert behaviour ({@link CompletionItem.insertText insertText}) can be changed. - * - * This function may fill in {@link CompletionItem.additionalTextEdits additionalTextEdits}. However, that means an item might be - * inserted *before* resolving is done and in that case the editor will do a best effort to still apply those additional - * text edits. - * - * @param item A completion item currently active in the UI. - * @param token A cancellation token. - * @return The resolved completion item or a thenable that resolves to of such. It is OK to return the given - * `item`. When no result is returned, the given `item` will be used. - */ - resolveCompletionItem?(item: T, token: CancellationToken): ProviderResult; - } - - - /** - * The inline completion item provider interface defines the contract between extensions and - * the inline completion feature. - * - * Providers are asked for completions either explicitly by a user gesture or implicitly when typing. - */ - export interface InlineCompletionItemProvider { - - /** - * Provides inline completion items for the given position and document. - * If inline completions are enabled, this method will be called whenever the user stopped typing. - * It will also be called when the user explicitly triggers inline completions or explicitly asks for the next or previous inline completion. - * In that case, all available inline completions should be returned. - * `context.triggerKind` can be used to distinguish between these scenarios. - * - * @param document The document inline completions are requested for. - * @param position The position inline completions are requested for. - * @param context A context object with additional information. - * @param token A cancellation token. - * @return An array of completion items or a thenable that resolves to an array of completion items. - */ - provideInlineCompletionItems(document: TextDocument, position: Position, context: InlineCompletionContext, token: CancellationToken): ProviderResult; - } - - /** - * Represents a collection of {@link InlineCompletionItem inline completion items} to be presented - * in the editor. - */ - export class InlineCompletionList { - /** - * The inline completion items. - */ - items: InlineCompletionItem[]; - - /** - * Creates a new list of inline completion items. - */ - constructor(items: InlineCompletionItem[]); - } - - /** - * Provides information about the context in which an inline completion was requested. - */ - export interface InlineCompletionContext { - /** - * Describes how the inline completion was triggered. - */ - readonly triggerKind: InlineCompletionTriggerKind; - - /** - * Provides information about the currently selected item in the autocomplete widget if it is visible. - * - * If set, provided inline completions must extend the text of the selected item - * and use the same range, otherwise they are not shown as preview. - * As an example, if the document text is `console.` and the selected item is `.log` replacing the `.` in the document, - * the inline completion must also replace `.` and start with `.log`, for example `.log()`. - * - * Inline completion providers are requested again whenever the selected item changes. - */ - readonly selectedCompletionInfo: SelectedCompletionInfo | undefined; - } - - /** - * Describes the currently selected completion item. - */ - export interface SelectedCompletionInfo { - /** - * The range that will be replaced if this completion item is accepted. - */ - readonly range: Range; - - /** - * The text the range will be replaced with if this completion is accepted. - */ - readonly text: string; - } - - /** - * Describes how an {@link InlineCompletionItemProvider inline completion provider} was triggered. - */ - export enum InlineCompletionTriggerKind { - /** - * Completion was triggered explicitly by a user gesture. - * Return multiple completion items to enable cycling through them. - */ - Invoke = 0, - - /** - * Completion was triggered automatically while editing. - * It is sufficient to return a single completion item in this case. - */ - Automatic = 1, - } - - /** - * An inline completion item represents a text snippet that is proposed inline to complete text that is being typed. - * - * @see {@link InlineCompletionItemProvider.provideInlineCompletionItems} - */ - export class InlineCompletionItem { - /** - * The text to replace the range with. Must be set. - * Is used both for the preview and the accept operation. - */ - insertText: string | SnippetString; - - /** - * A text that is used to decide if this inline completion should be shown. When `falsy` - * the {@link InlineCompletionItem.insertText} is used. - * - * An inline completion is shown if the text to replace is a prefix of the filter text. - */ - filterText?: string; - - /** - * The range to replace. - * Must begin and end on the same line. - * - * Prefer replacements over insertions to provide a better experience when the user deletes typed text. - */ - range?: Range; - - /** - * An optional {@link Command} that is executed *after* inserting this completion. - */ - command?: Command; - - /** - * Creates a new inline completion item. - * - * @param insertText The text to replace the range with. - * @param range The range to replace. If not set, the word at the requested position will be used. - * @param command An optional {@link Command} that is executed *after* inserting this completion. - */ - constructor(insertText: string | SnippetString, range?: Range, command?: Command); - } - - /** - * A document link is a range in a text document that links to an internal or external resource, like another - * text document or a web site. - */ - export class DocumentLink { - - /** - * The range this link applies to. - */ - range: Range; - - /** - * The uri this link points to. - */ - target?: Uri; - - /** - * The tooltip text when you hover over this link. - * - * If a tooltip is provided, is will be displayed in a string that includes instructions on how to - * trigger the link, such as `{0} (ctrl + click)`. The specific instructions vary depending on OS, - * user settings, and localization. - */ - tooltip?: string; - - /** - * Creates a new document link. - * - * @param range The range the document link applies to. Must not be empty. - * @param target The uri the document link points to. - */ - constructor(range: Range, target?: Uri); - } - - /** - * The document link provider defines the contract between extensions and feature of showing - * links in the editor. - */ - export interface DocumentLinkProvider { - - /** - * Provide links for the given document. Note that the editor ships with a default provider that detects - * `http(s)` and `file` links. - * - * @param document The document in which the command was invoked. - * @param token A cancellation token. - * @return An array of {@link DocumentLink document links} or a thenable that resolves to such. The lack of a result - * can be signaled by returning `undefined`, `null`, or an empty array. - */ - provideDocumentLinks(document: TextDocument, token: CancellationToken): ProviderResult; - - /** - * Given a link fill in its {@link DocumentLink.target target}. This method is called when an incomplete - * link is selected in the UI. Providers can implement this method and return incomplete links - * (without target) from the {@linkcode DocumentLinkProvider.provideDocumentLinks provideDocumentLinks} method which - * often helps to improve performance. - * - * @param link The link that is to be resolved. - * @param token A cancellation token. - */ - resolveDocumentLink?(link: T, token: CancellationToken): ProviderResult; - } - - /** - * Represents a color in RGBA space. - */ - export class Color { - - /** - * The red component of this color in the range [0-1]. - */ - readonly red: number; - - /** - * The green component of this color in the range [0-1]. - */ - readonly green: number; - - /** - * The blue component of this color in the range [0-1]. - */ - readonly blue: number; - - /** - * The alpha component of this color in the range [0-1]. - */ - readonly alpha: number; - - /** - * Creates a new color instance. - * - * @param red The red component. - * @param green The green component. - * @param blue The blue component. - * @param alpha The alpha component. - */ - constructor(red: number, green: number, blue: number, alpha: number); - } - - /** - * Represents a color range from a document. - */ - export class ColorInformation { - - /** - * The range in the document where this color appears. - */ - range: Range; - - /** - * The actual color value for this color range. - */ - color: Color; - - /** - * Creates a new color range. - * - * @param range The range the color appears in. Must not be empty. - * @param color The value of the color. - */ - constructor(range: Range, color: Color); - } - - /** - * A color presentation object describes how a {@linkcode Color} should be represented as text and what - * edits are required to refer to it from source code. - * - * For some languages one color can have multiple presentations, e.g. css can represent the color red with - * the constant `Red`, the hex-value `#ff0000`, or in rgba and hsla forms. In csharp other representations - * apply, e.g. `System.Drawing.Color.Red`. - */ - export class ColorPresentation { - - /** - * The label of this color presentation. It will be shown on the color - * picker header. By default this is also the text that is inserted when selecting - * this color presentation. - */ - label: string; - - /** - * An {@link TextEdit edit} which is applied to a document when selecting - * this presentation for the color. When `falsy` the {@link ColorPresentation.label label} - * is used. - */ - textEdit?: TextEdit; - - /** - * An optional array of additional {@link TextEdit text edits} that are applied when - * selecting this color presentation. Edits must not overlap with the main {@link ColorPresentation.textEdit edit} nor with themselves. - */ - additionalTextEdits?: TextEdit[]; - - /** - * Creates a new color presentation. - * - * @param label The label of this color presentation. - */ - constructor(label: string); - } - - /** - * The document color provider defines the contract between extensions and feature of - * picking and modifying colors in the editor. - */ - export interface DocumentColorProvider { - - /** - * Provide colors for the given document. - * - * @param document The document in which the command was invoked. - * @param token A cancellation token. - * @return An array of {@link ColorInformation color information} or a thenable that resolves to such. The lack of a result - * can be signaled by returning `undefined`, `null`, or an empty array. - */ - provideDocumentColors(document: TextDocument, token: CancellationToken): ProviderResult; - - /** - * Provide {@link ColorPresentation representations} for a color. - * - * @param color The color to show and insert. - * @param context A context object with additional information - * @param token A cancellation token. - * @return An array of color presentations or a thenable that resolves to such. The lack of a result - * can be signaled by returning `undefined`, `null`, or an empty array. - */ - provideColorPresentations(color: Color, context: { readonly document: TextDocument; readonly range: Range }, token: CancellationToken): ProviderResult; - } - - /** - * Inlay hint kinds. - * - * The kind of an inline hint defines its appearance, e.g the corresponding foreground and background colors are being - * used. - */ - export enum InlayHintKind { - /** - * An inlay hint that for a type annotation. - */ - Type = 1, - /** - * An inlay hint that is for a parameter. - */ - Parameter = 2, - } - - /** - * An inlay hint label part allows for interactive and composite labels of inlay hints. - */ - export class InlayHintLabelPart { - - /** - * The value of this label part. - */ - value: string; - - /** - * The tooltip text when you hover over this label part. - * - * *Note* that this property can be set late during - * {@link InlayHintsProvider.resolveInlayHint resolving} of inlay hints. - */ - tooltip?: string | MarkdownString | undefined; - - /** - * An optional {@link Location source code location} that represents this label - * part. - * - * The editor will use this location for the hover and for code navigation features: This - * part will become a clickable link that resolves to the definition of the symbol at the - * given location (not necessarily the location itself), it shows the hover that shows at - * the given location, and it shows a context menu with further code navigation commands. - * - * *Note* that this property can be set late during - * {@link InlayHintsProvider.resolveInlayHint resolving} of inlay hints. - */ - location?: Location | undefined; - - /** - * An optional command for this label part. - * - * The editor renders parts with commands as clickable links. The command is added to the context menu - * when a label part defines {@link InlayHintLabelPart.location location} and {@link InlayHintLabelPart.command command} . - * - * *Note* that this property can be set late during - * {@link InlayHintsProvider.resolveInlayHint resolving} of inlay hints. - */ - command?: Command | undefined; - - /** - * Creates a new inlay hint label part. - * - * @param value The value of the part. - */ - constructor(value: string); - } - - /** - * Inlay hint information. - */ - export class InlayHint { - - /** - * The position of this hint. - */ - position: Position; - - /** - * The label of this hint. A human readable string or an array of {@link InlayHintLabelPart label parts}. - * - * *Note* that neither the string nor the label part can be empty. - */ - label: string | InlayHintLabelPart[]; - - /** - * The tooltip text when you hover over this item. - * - * *Note* that this property can be set late during - * {@link InlayHintsProvider.resolveInlayHint resolving} of inlay hints. - */ - tooltip?: string | MarkdownString | undefined; - - /** - * The kind of this hint. The inlay hint kind defines the appearance of this inlay hint. - */ - kind?: InlayHintKind; - - /** - * Optional {@link TextEdit text edits} that are performed when accepting this inlay hint. The default - * gesture for accepting an inlay hint is the double click. - * - * *Note* that edits are expected to change the document so that the inlay hint (or its nearest variant) is - * now part of the document and the inlay hint itself is now obsolete. - * - * *Note* that this property can be set late during - * {@link InlayHintsProvider.resolveInlayHint resolving} of inlay hints. - */ - textEdits?: TextEdit[]; - - /** - * Render padding before the hint. Padding will use the editor's background color, - * not the background color of the hint itself. That means padding can be used to visually - * align/separate an inlay hint. - */ - paddingLeft?: boolean; - - /** - * Render padding after the hint. Padding will use the editor's background color, - * not the background color of the hint itself. That means padding can be used to visually - * align/separate an inlay hint. - */ - paddingRight?: boolean; - - /** - * Creates a new inlay hint. - * - * @param position The position of the hint. - * @param label The label of the hint. - * @param kind The {@link InlayHintKind kind} of the hint. - */ - constructor(position: Position, label: string | InlayHintLabelPart[], kind?: InlayHintKind); - } - - /** - * The inlay hints provider interface defines the contract between extensions and - * the inlay hints feature. - */ - export interface InlayHintsProvider { - - /** - * An optional event to signal that inlay hints from this provider have changed. - */ - onDidChangeInlayHints?: Event; - - /** - * Provide inlay hints for the given range and document. - * - * *Note* that inlay hints that are not {@link Range.contains contained} by the given range are ignored. - * - * @param document The document in which the command was invoked. - * @param range The range for which inlay hints should be computed. - * @param token A cancellation token. - * @return An array of inlay hints or a thenable that resolves to such. - */ - provideInlayHints(document: TextDocument, range: Range, token: CancellationToken): ProviderResult; - - /** - * Given an inlay hint fill in {@link InlayHint.tooltip tooltip}, {@link InlayHint.textEdits text edits}, - * or complete label {@link InlayHintLabelPart parts}. - * - * *Note* that the editor will resolve an inlay hint at most once. - * - * @param hint An inlay hint. - * @param token A cancellation token. - * @return The resolved inlay hint or a thenable that resolves to such. It is OK to return the given `item`. When no result is returned, the given `item` will be used. - */ - resolveInlayHint?(hint: T, token: CancellationToken): ProviderResult; - } - - /** - * A line based folding range. To be valid, start and end line must be bigger than zero and smaller than the number of lines in the document. - * Invalid ranges will be ignored. - */ - export class FoldingRange { - - /** - * The zero-based start line of the range to fold. The folded area starts after the line's last character. - * To be valid, the end must be zero or larger and smaller than the number of lines in the document. - */ - start: number; - - /** - * The zero-based end line of the range to fold. The folded area ends with the line's last character. - * To be valid, the end must be zero or larger and smaller than the number of lines in the document. - */ - end: number; - - /** - * Describes the {@link FoldingRangeKind Kind} of the folding range such as {@link FoldingRangeKind.Comment Comment} or - * {@link FoldingRangeKind.Region Region}. The kind is used to categorize folding ranges and used by commands - * like 'Fold all comments'. See - * {@link FoldingRangeKind} for an enumeration of all kinds. - * If not set, the range is originated from a syntax element. - */ - kind?: FoldingRangeKind; - - /** - * Creates a new folding range. - * - * @param start The start line of the folded range. - * @param end The end line of the folded range. - * @param kind The kind of the folding range. - */ - constructor(start: number, end: number, kind?: FoldingRangeKind); - } - - /** - * An enumeration of specific folding range kinds. The kind is an optional field of a {@link FoldingRange} - * and is used to distinguish specific folding ranges such as ranges originated from comments. The kind is used by commands like - * `Fold all comments` or `Fold all regions`. - * If the kind is not set on the range, the range originated from a syntax element other than comments, imports or region markers. - */ - export enum FoldingRangeKind { - /** - * Kind for folding range representing a comment. - */ - Comment = 1, - /** - * Kind for folding range representing a import. - */ - Imports = 2, - /** - * Kind for folding range representing regions originating from folding markers like `#region` and `#endregion`. - */ - Region = 3 - } - - /** - * Folding context (for future use) - */ - export interface FoldingContext { - } - - /** - * The folding range provider interface defines the contract between extensions and - * [Folding](https://code.visualstudio.com/docs/editor/codebasics#_folding) in the editor. - */ - export interface FoldingRangeProvider { - - /** - * An optional event to signal that the folding ranges from this provider have changed. - */ - onDidChangeFoldingRanges?: Event; - - /** - * Returns a list of folding ranges or null and undefined if the provider - * does not want to participate or was cancelled. - * @param document The document in which the command was invoked. - * @param context Additional context information (for future use) - * @param token A cancellation token. - */ - provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken): ProviderResult; - } - - /** - * A selection range represents a part of a selection hierarchy. A selection range - * may have a parent selection range that contains it. - */ - export class SelectionRange { - - /** - * The {@link Range} of this selection range. - */ - range: Range; - - /** - * The parent selection range containing this range. - */ - parent?: SelectionRange; - - /** - * Creates a new selection range. - * - * @param range The range of the selection range. - * @param parent The parent of the selection range. - */ - constructor(range: Range, parent?: SelectionRange); - } - - export interface SelectionRangeProvider { - /** - * Provide selection ranges for the given positions. - * - * Selection ranges should be computed individually and independent for each position. The editor will merge - * and deduplicate ranges but providers must return hierarchies of selection ranges so that a range - * is {@link Range.contains contained} by its parent. - * - * @param document The document in which the command was invoked. - * @param positions The positions at which the command was invoked. - * @param token A cancellation token. - * @return Selection ranges or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideSelectionRanges(document: TextDocument, positions: readonly Position[], token: CancellationToken): ProviderResult; - } - - /** - * Represents programming constructs like functions or constructors in the context - * of call hierarchy. - */ - export class CallHierarchyItem { - /** - * The name of this item. - */ - name: string; - - /** - * The kind of this item. - */ - kind: SymbolKind; - - /** - * Tags for this item. - */ - tags?: readonly SymbolTag[]; - - /** - * More detail for this item, e.g. the signature of a function. - */ - detail?: string; - - /** - * The resource identifier of this item. - */ - uri: Uri; - - /** - * The range enclosing this symbol not including leading/trailing whitespace but everything else, e.g. comments and code. - */ - range: Range; - - /** - * The range that should be selected and revealed when this symbol is being picked, e.g. the name of a function. - * Must be contained by the {@linkcode CallHierarchyItem.range range}. - */ - selectionRange: Range; - - /** - * Creates a new call hierarchy item. - */ - constructor(kind: SymbolKind, name: string, detail: string, uri: Uri, range: Range, selectionRange: Range); - } - - /** - * Represents an incoming call, e.g. a caller of a method or constructor. - */ - export class CallHierarchyIncomingCall { - - /** - * The item that makes the call. - */ - from: CallHierarchyItem; - - /** - * The range at which at which the calls appears. This is relative to the caller - * denoted by {@linkcode CallHierarchyIncomingCall.from this.from}. - */ - fromRanges: Range[]; - - /** - * Create a new call object. - * - * @param item The item making the call. - * @param fromRanges The ranges at which the calls appear. - */ - constructor(item: CallHierarchyItem, fromRanges: Range[]); - } - - /** - * Represents an outgoing call, e.g. calling a getter from a method or a method from a constructor etc. - */ - export class CallHierarchyOutgoingCall { - - /** - * The item that is called. - */ - to: CallHierarchyItem; - - /** - * The range at which this item is called. This is the range relative to the caller, e.g the item - * passed to {@linkcode CallHierarchyProvider.provideCallHierarchyOutgoingCalls provideCallHierarchyOutgoingCalls} - * and not {@linkcode CallHierarchyOutgoingCall.to this.to}. - */ - fromRanges: Range[]; - - /** - * Create a new call object. - * - * @param item The item being called - * @param fromRanges The ranges at which the calls appear. - */ - constructor(item: CallHierarchyItem, fromRanges: Range[]); - } - - /** - * The call hierarchy provider interface describes the contract between extensions - * and the call hierarchy feature which allows to browse calls and caller of function, - * methods, constructor etc. - */ - export interface CallHierarchyProvider { - - /** - * Bootstraps call hierarchy by returning the item that is denoted by the given document - * and position. This item will be used as entry into the call graph. Providers should - * return `undefined` or `null` when there is no item at the given location. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * @returns One or multiple call hierarchy items or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - prepareCallHierarchy(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - - /** - * Provide all incoming calls for an item, e.g all callers for a method. In graph terms this describes directed - * and annotated edges inside the call graph, e.g the given item is the starting node and the result is the nodes - * that can be reached. - * - * @param item The hierarchy item for which incoming calls should be computed. - * @param token A cancellation token. - * @returns A set of incoming calls or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideCallHierarchyIncomingCalls(item: CallHierarchyItem, token: CancellationToken): ProviderResult; - - /** - * Provide all outgoing calls for an item, e.g call calls to functions, methods, or constructors from the given item. In - * graph terms this describes directed and annotated edges inside the call graph, e.g the given item is the starting - * node and the result is the nodes that can be reached. - * - * @param item The hierarchy item for which outgoing calls should be computed. - * @param token A cancellation token. - * @returns A set of outgoing calls or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideCallHierarchyOutgoingCalls(item: CallHierarchyItem, token: CancellationToken): ProviderResult; - } - - /** - * Represents an item of a type hierarchy, like a class or an interface. - */ - export class TypeHierarchyItem { - /** - * The name of this item. - */ - name: string; - - /** - * The kind of this item. - */ - kind: SymbolKind; - - /** - * Tags for this item. - */ - tags?: ReadonlyArray; - - /** - * More detail for this item, e.g. the signature of a function. - */ - detail?: string; - - /** - * The resource identifier of this item. - */ - uri: Uri; - - /** - * The range enclosing this symbol not including leading/trailing whitespace - * but everything else, e.g. comments and code. - */ - range: Range; - - /** - * The range that should be selected and revealed when this symbol is being - * picked, e.g. the name of a class. Must be contained by the {@link TypeHierarchyItem.range range}-property. - */ - selectionRange: Range; - - /** - * Creates a new type hierarchy item. - * - * @param kind The kind of the item. - * @param name The name of the item. - * @param detail The details of the item. - * @param uri The Uri of the item. - * @param range The whole range of the item. - * @param selectionRange The selection range of the item. - */ - constructor(kind: SymbolKind, name: string, detail: string, uri: Uri, range: Range, selectionRange: Range); - } - - /** - * The type hierarchy provider interface describes the contract between extensions - * and the type hierarchy feature. - */ - export interface TypeHierarchyProvider { - - /** - * Bootstraps type hierarchy by returning the item that is denoted by the given document - * and position. This item will be used as entry into the type graph. Providers should - * return `undefined` or `null` when there is no item at the given location. - * - * @param document The document in which the command was invoked. - * @param position The position at which the command was invoked. - * @param token A cancellation token. - * @returns One or multiple type hierarchy items or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined`, `null`, or an empty array. - */ - prepareTypeHierarchy(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - - /** - * Provide all supertypes for an item, e.g all types from which a type is derived/inherited. In graph terms this describes directed - * and annotated edges inside the type graph, e.g the given item is the starting node and the result is the nodes - * that can be reached. - * - * @param item The hierarchy item for which super types should be computed. - * @param token A cancellation token. - * @returns A set of direct supertypes or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideTypeHierarchySupertypes(item: TypeHierarchyItem, token: CancellationToken): ProviderResult; - - /** - * Provide all subtypes for an item, e.g all types which are derived/inherited from the given item. In - * graph terms this describes directed and annotated edges inside the type graph, e.g the given item is the starting - * node and the result is the nodes that can be reached. - * - * @param item The hierarchy item for which subtypes should be computed. - * @param token A cancellation token. - * @returns A set of direct subtypes or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideTypeHierarchySubtypes(item: TypeHierarchyItem, token: CancellationToken): ProviderResult; - } - - /** - * Represents a list of ranges that can be edited together along with a word pattern to describe valid range contents. - */ - export class LinkedEditingRanges { - /** - * Create a new linked editing ranges object. - * - * @param ranges A list of ranges that can be edited together - * @param wordPattern An optional word pattern that describes valid contents for the given ranges - */ - constructor(ranges: Range[], wordPattern?: RegExp); - - /** - * A list of ranges that can be edited together. The ranges must have - * identical length and text content. The ranges cannot overlap. - */ - readonly ranges: Range[]; - - /** - * An optional word pattern that describes valid contents for the given ranges. - * If no pattern is provided, the language configuration's word pattern will be used. - */ - readonly wordPattern: RegExp | undefined; - } - - /** - * The linked editing range provider interface defines the contract between extensions and - * the linked editing feature. - */ - export interface LinkedEditingRangeProvider { - /** - * For a given position in a document, returns the range of the symbol at the position and all ranges - * that have the same content. A change to one of the ranges can be applied to all other ranges if the new content - * is valid. An optional word pattern can be returned with the result to describe valid contents. - * If no result-specific word pattern is provided, the word pattern from the language configuration is used. - * - * @param document The document in which the provider was invoked. - * @param position The position at which the provider was invoked. - * @param token A cancellation token. - * @return A list of ranges that can be edited together - */ - provideLinkedEditingRanges(document: TextDocument, position: Position, token: CancellationToken): ProviderResult; - } - - /** - * An edit operation applied {@link DocumentDropEditProvider on drop}. - */ - export class DocumentDropEdit { - /** - * The text or snippet to insert at the drop location. - */ - insertText: string | SnippetString; - - /** - * An optional additional edit to apply on drop. - */ - additionalEdit?: WorkspaceEdit; - - /** - * @param insertText The text or snippet to insert at the drop location. - */ - constructor(insertText: string | SnippetString); - } - - /** - * Provider which handles dropping of resources into a text editor. - * - * This allows users to drag and drop resources (including resources from external apps) into the editor. While dragging - * and dropping files, users can hold down `shift` to drop the file into the editor instead of opening it. - * Requires `editor.dropIntoEditor.enabled` to be on. - */ - export interface DocumentDropEditProvider { - /** - * Provide edits which inserts the content being dragged and dropped into the document. - * - * @param document The document in which the drop occurred. - * @param position The position in the document where the drop occurred. - * @param dataTransfer A {@link DataTransfer} object that holds data about what is being dragged and dropped. - * @param token A cancellation token. - * - * @return A {@link DocumentDropEdit} or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideDocumentDropEdits(document: TextDocument, position: Position, dataTransfer: DataTransfer, token: CancellationToken): ProviderResult; - } - - /** - * A tuple of two characters, like a pair of - * opening and closing brackets. - */ - export type CharacterPair = [string, string]; - - /** - * Describes how comments for a language work. - */ - export interface CommentRule { - - /** - * The line comment token, like `// this is a comment` - */ - lineComment?: string; - - /** - * The block comment character pair, like `/* block comment */` - */ - blockComment?: CharacterPair; - } - - /** - * Describes indentation rules for a language. - */ - export interface IndentationRule { - /** - * If a line matches this pattern, then all the lines after it should be unindented once (until another rule matches). - */ - decreaseIndentPattern: RegExp; - /** - * If a line matches this pattern, then all the lines after it should be indented once (until another rule matches). - */ - increaseIndentPattern: RegExp; - /** - * If a line matches this pattern, then **only the next line** after it should be indented once. - */ - indentNextLinePattern?: RegExp; - /** - * If a line matches this pattern, then its indentation should not be changed and it should not be evaluated against the other rules. - */ - unIndentedLinePattern?: RegExp; - } - - /** - * Describes what to do with the indentation when pressing Enter. - */ - export enum IndentAction { - /** - * Insert new line and copy the previous line's indentation. - */ - None = 0, - /** - * Insert new line and indent once (relative to the previous line's indentation). - */ - Indent = 1, - /** - * Insert two new lines: - * - the first one indented which will hold the cursor - * - the second one at the same indentation level - */ - IndentOutdent = 2, - /** - * Insert new line and outdent once (relative to the previous line's indentation). - */ - Outdent = 3 - } - - /** - * Describes what to do when pressing Enter. - */ - export interface EnterAction { - /** - * Describe what to do with the indentation. - */ - indentAction: IndentAction; - /** - * Describes text to be appended after the new line and after the indentation. - */ - appendText?: string; - /** - * Describes the number of characters to remove from the new line's indentation. - */ - removeText?: number; - } - - /** - * Describes a rule to be evaluated when pressing Enter. - */ - export interface OnEnterRule { - /** - * This rule will only execute if the text before the cursor matches this regular expression. - */ - beforeText: RegExp; - /** - * This rule will only execute if the text after the cursor matches this regular expression. - */ - afterText?: RegExp; - /** - * This rule will only execute if the text above the current line matches this regular expression. - */ - previousLineText?: RegExp; - /** - * The action to execute. - */ - action: EnterAction; - } - - /** - * The language configuration interfaces defines the contract between extensions - * and various editor features, like automatic bracket insertion, automatic indentation etc. - */ - export interface LanguageConfiguration { - /** - * The language's comment settings. - */ - comments?: CommentRule; - /** - * The language's brackets. - * This configuration implicitly affects pressing Enter around these brackets. - */ - brackets?: CharacterPair[]; - /** - * The language's word definition. - * If the language supports Unicode identifiers (e.g. JavaScript), it is preferable - * to provide a word definition that uses exclusion of known separators. - * e.g.: A regex that matches anything except known separators (and dot is allowed to occur in a floating point number): - * /(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g - */ - wordPattern?: RegExp; - /** - * The language's indentation settings. - */ - indentationRules?: IndentationRule; - /** - * The language's rules to be evaluated when pressing Enter. - */ - onEnterRules?: OnEnterRule[]; - - /** - * **Deprecated** Do not use. - * - * @deprecated Will be replaced by a better API soon. - */ - __electricCharacterSupport?: { - /** - * This property is deprecated and will be **ignored** from - * the editor. - * @deprecated - */ - brackets?: any; - /** - * This property is deprecated and not fully supported anymore by - * the editor (scope and lineStart are ignored). - * Use the autoClosingPairs property in the language configuration file instead. - * @deprecated - */ - docComment?: { - scope: string; - open: string; - lineStart: string; - close?: string; - }; - }; - - /** - * **Deprecated** Do not use. - * - * @deprecated * Use the autoClosingPairs property in the language configuration file instead. - */ - __characterPairSupport?: { - autoClosingPairs: { - open: string; - close: string; - notIn?: string[]; - }[]; - }; - } - - /** - * The configuration target - */ - export enum ConfigurationTarget { - /** - * Global configuration - */ - Global = 1, - - /** - * Workspace configuration - */ - Workspace = 2, - - /** - * Workspace folder configuration - */ - WorkspaceFolder = 3 - } - - /** - * Represents the configuration. It is a merged view of - * - * - *Default Settings* - * - *Global (User) Settings* - * - *Workspace settings* - * - *Workspace Folder settings* - From one of the {@link workspace.workspaceFolders Workspace Folders} under which requested resource belongs to. - * - *Language settings* - Settings defined under requested language. - * - * The *effective* value (returned by {@linkcode WorkspaceConfiguration.get get}) is computed by overriding or merging the values in the following order: - * - * 1. `defaultValue` (if defined in `package.json` otherwise derived from the value's type) - * 1. `globalValue` (if defined) - * 1. `workspaceValue` (if defined) - * 1. `workspaceFolderValue` (if defined) - * 1. `defaultLanguageValue` (if defined) - * 1. `globalLanguageValue` (if defined) - * 1. `workspaceLanguageValue` (if defined) - * 1. `workspaceFolderLanguageValue` (if defined) - * - * **Note:** Only `object` value types are merged and all other value types are overridden. - * - * Example 1: Overriding - * - * ```ts - * defaultValue = 'on'; - * globalValue = 'relative' - * workspaceFolderValue = 'off' - * value = 'off' - * ``` - * - * Example 2: Language Values - * - * ```ts - * defaultValue = 'on'; - * globalValue = 'relative' - * workspaceFolderValue = 'off' - * globalLanguageValue = 'on' - * value = 'on' - * ``` - * - * Example 3: Object Values - * - * ```ts - * defaultValue = { "a": 1, "b": 2 }; - * globalValue = { "b": 3, "c": 4 }; - * value = { "a": 1, "b": 3, "c": 4 }; - * ``` - * - * *Note:* Workspace and Workspace Folder configurations contains `launch` and `tasks` settings. Their basename will be - * part of the section identifier. The following snippets shows how to retrieve all configurations - * from `launch.json`: - * - * ```ts - * // launch.json configuration - * const config = workspace.getConfiguration('launch', vscode.workspace.workspaceFolders[0].uri); - * - * // retrieve values - * const values = config.get('configurations'); - * ``` - * - * Refer to [Settings](https://code.visualstudio.com/docs/getstarted/settings) for more information. - */ - export interface WorkspaceConfiguration { - - /** - * Return a value from this configuration. - * - * @param section Configuration name, supports _dotted_ names. - * @return The value `section` denotes or `undefined`. - */ - get(section: string): T | undefined; - - /** - * Return a value from this configuration. - * - * @param section Configuration name, supports _dotted_ names. - * @param defaultValue A value should be returned when no value could be found, is `undefined`. - * @return The value `section` denotes or the default. - */ - get(section: string, defaultValue: T): T; - - /** - * Check if this configuration has a certain value. - * - * @param section Configuration name, supports _dotted_ names. - * @return `true` if the section doesn't resolve to `undefined`. - */ - has(section: string): boolean; - - /** - * Retrieve all information about a configuration setting. A configuration value - * often consists of a *default* value, a global or installation-wide value, - * a workspace-specific value, folder-specific value - * and language-specific values (if {@link WorkspaceConfiguration} is scoped to a language). - * - * Also provides all language ids under which the given configuration setting is defined. - * - * *Note:* The configuration name must denote a leaf in the configuration tree - * (`editor.fontSize` vs `editor`) otherwise no result is returned. - * - * @param section Configuration name, supports _dotted_ names. - * @return Information about a configuration setting or `undefined`. - */ - inspect(section: string): { - key: string; - - defaultValue?: T; - globalValue?: T; - workspaceValue?: T; - workspaceFolderValue?: T; - - defaultLanguageValue?: T; - globalLanguageValue?: T; - workspaceLanguageValue?: T; - workspaceFolderLanguageValue?: T; - - languageIds?: string[]; - - } | undefined; - - /** - * Update a configuration value. The updated configuration values are persisted. - * - * A value can be changed in - * - * - {@link ConfigurationTarget.Global Global settings}: Changes the value for all instances of the editor. - * - {@link ConfigurationTarget.Workspace Workspace settings}: Changes the value for current workspace, if available. - * - {@link ConfigurationTarget.WorkspaceFolder Workspace folder settings}: Changes the value for settings from one of the {@link workspace.workspaceFolders Workspace Folders} under which the requested resource belongs to. - * - Language settings: Changes the value for the requested languageId. - * - * *Note:* To remove a configuration value use `undefined`, like so: `config.update('somekey', undefined)` - * - * @param section Configuration name, supports _dotted_ names. - * @param value The new value. - * @param configurationTarget The {@link ConfigurationTarget configuration target} or a boolean value. - * - If `true` updates {@link ConfigurationTarget.Global Global settings}. - * - If `false` updates {@link ConfigurationTarget.Workspace Workspace settings}. - * - If `undefined` or `null` updates to {@link ConfigurationTarget.WorkspaceFolder Workspace folder settings} if configuration is resource specific, - * otherwise to {@link ConfigurationTarget.Workspace Workspace settings}. - * @param overrideInLanguage Whether to update the value in the scope of requested languageId or not. - * - If `true` updates the value under the requested languageId. - * - If `undefined` updates the value under the requested languageId only if the configuration is defined for the language. - * @throws error while updating - * - configuration which is not registered. - * - window configuration to workspace folder - * - configuration to workspace or workspace folder when no workspace is opened. - * - configuration to workspace folder when there is no workspace folder settings. - * - configuration to workspace folder when {@link WorkspaceConfiguration} is not scoped to a resource. - */ - update(section: string, value: any, configurationTarget?: ConfigurationTarget | boolean | null, overrideInLanguage?: boolean): Thenable; - - /** - * Readable dictionary that backs this configuration. - */ - readonly [key: string]: any; - } - - /** - * Represents a location inside a resource, such as a line - * inside a text file. - */ - export class Location { - - /** - * The resource identifier of this location. - */ - uri: Uri; - - /** - * The document range of this location. - */ - range: Range; - - /** - * Creates a new location object. - * - * @param uri The resource identifier. - * @param rangeOrPosition The range or position. Positions will be converted to an empty range. - */ - constructor(uri: Uri, rangeOrPosition: Range | Position); - } - - /** - * Represents the connection of two locations. Provides additional metadata over normal {@link Location locations}, - * including an origin range. - */ - export interface LocationLink { - /** - * Span of the origin of this link. - * - * Used as the underlined span for mouse definition hover. Defaults to the word range at - * the definition position. - */ - originSelectionRange?: Range; - - /** - * The target resource identifier of this link. - */ - targetUri: Uri; - - /** - * The full target range of this link. - */ - targetRange: Range; - - /** - * The span of this link. - */ - targetSelectionRange?: Range; - } - - /** - * The event that is fired when diagnostics change. - */ - export interface DiagnosticChangeEvent { - - /** - * An array of resources for which diagnostics have changed. - */ - readonly uris: readonly Uri[]; - } - - /** - * Represents the severity of diagnostics. - */ - export enum DiagnosticSeverity { - - /** - * Something not allowed by the rules of a language or other means. - */ - Error = 0, - - /** - * Something suspicious but allowed. - */ - Warning = 1, - - /** - * Something to inform about but not a problem. - */ - Information = 2, - - /** - * Something to hint to a better way of doing it, like proposing - * a refactoring. - */ - Hint = 3 - } - - /** - * Represents a related message and source code location for a diagnostic. This should be - * used to point to code locations that cause or related to a diagnostics, e.g. when duplicating - * a symbol in a scope. - */ - export class DiagnosticRelatedInformation { - - /** - * The location of this related diagnostic information. - */ - location: Location; - - /** - * The message of this related diagnostic information. - */ - message: string; - - /** - * Creates a new related diagnostic information object. - * - * @param location The location. - * @param message The message. - */ - constructor(location: Location, message: string); - } - - /** - * Additional metadata about the type of a diagnostic. - */ - export enum DiagnosticTag { - /** - * Unused or unnecessary code. - * - * Diagnostics with this tag are rendered faded out. The amount of fading - * is controlled by the `"editorUnnecessaryCode.opacity"` theme color. For - * example, `"editorUnnecessaryCode.opacity": "#000000c0"` will render the - * code with 75% opacity. For high contrast themes, use the - * `"editorUnnecessaryCode.border"` theme color to underline unnecessary code - * instead of fading it out. - */ - Unnecessary = 1, - - /** - * Deprecated or obsolete code. - * - * Diagnostics with this tag are rendered with a strike through. - */ - Deprecated = 2, - } - - /** - * Represents a diagnostic, such as a compiler error or warning. Diagnostic objects - * are only valid in the scope of a file. - */ - export class Diagnostic { - - /** - * The range to which this diagnostic applies. - */ - range: Range; - - /** - * The human-readable message. - */ - message: string; - - /** - * The severity, default is {@link DiagnosticSeverity.Error error}. - */ - severity: DiagnosticSeverity; - - /** - * A human-readable string describing the source of this - * diagnostic, e.g. 'typescript' or 'super lint'. - */ - source?: string; - - /** - * A code or identifier for this diagnostic. - * Should be used for later processing, e.g. when providing {@link CodeActionContext code actions}. - */ - code?: string | number | { - /** - * A code or identifier for this diagnostic. - * Should be used for later processing, e.g. when providing {@link CodeActionContext code actions}. - */ - value: string | number; - - /** - * A target URI to open with more information about the diagnostic error. - */ - target: Uri; - }; - - /** - * An array of related diagnostic information, e.g. when symbol-names within - * a scope collide all definitions can be marked via this property. - */ - relatedInformation?: DiagnosticRelatedInformation[]; - - /** - * Additional metadata about the diagnostic. - */ - tags?: DiagnosticTag[]; - - /** - * Creates a new diagnostic object. - * - * @param range The range to which this diagnostic applies. - * @param message The human-readable message. - * @param severity The severity, default is {@link DiagnosticSeverity.Error error}. - */ - constructor(range: Range, message: string, severity?: DiagnosticSeverity); - } - - /** - * A diagnostics collection is a container that manages a set of - * {@link Diagnostic diagnostics}. Diagnostics are always scopes to a - * diagnostics collection and a resource. - * - * To get an instance of a `DiagnosticCollection` use - * {@link languages.createDiagnosticCollection createDiagnosticCollection}. - */ - export interface DiagnosticCollection extends Iterable<[uri: Uri, diagnostics: readonly Diagnostic[]]> { - - /** - * The name of this diagnostic collection, for instance `typescript`. Every diagnostic - * from this collection will be associated with this name. Also, the task framework uses this - * name when defining [problem matchers](https://code.visualstudio.com/docs/editor/tasks#_defining-a-problem-matcher). - */ - readonly name: string; - - /** - * Assign diagnostics for given resource. Will replace - * existing diagnostics for that resource. - * - * @param uri A resource identifier. - * @param diagnostics Array of diagnostics or `undefined` - */ - set(uri: Uri, diagnostics: readonly Diagnostic[] | undefined): void; - - /** - * Replace diagnostics for multiple resources in this collection. - * - * _Note_ that multiple tuples of the same uri will be merged, e.g - * `[[file1, [d1]], [file1, [d2]]]` is equivalent to `[[file1, [d1, d2]]]`. - * If a diagnostics item is `undefined` as in `[file1, undefined]` - * all previous but not subsequent diagnostics are removed. - * - * @param entries An array of tuples, like `[[file1, [d1, d2]], [file2, [d3, d4, d5]]]`, or `undefined`. - */ - set(entries: ReadonlyArray<[Uri, readonly Diagnostic[] | undefined]>): void; - - /** - * Remove all diagnostics from this collection that belong - * to the provided `uri`. The same as `#set(uri, undefined)`. - * - * @param uri A resource identifier. - */ - delete(uri: Uri): void; - - /** - * Remove all diagnostics from this collection. The same - * as calling `#set(undefined)`; - */ - clear(): void; - - /** - * Iterate over each entry in this collection. - * - * @param callback Function to execute for each entry. - * @param thisArg The `this` context used when invoking the handler function. - */ - forEach(callback: (uri: Uri, diagnostics: readonly Diagnostic[], collection: DiagnosticCollection) => any, thisArg?: any): void; - - /** - * Get the diagnostics for a given resource. *Note* that you cannot - * modify the diagnostics-array returned from this call. - * - * @param uri A resource identifier. - * @returns An immutable array of {@link Diagnostic diagnostics} or `undefined`. - */ - get(uri: Uri): readonly Diagnostic[] | undefined; - - /** - * Check if this collection contains diagnostics for a - * given resource. - * - * @param uri A resource identifier. - * @returns `true` if this collection has diagnostic for the given resource. - */ - has(uri: Uri): boolean; - - /** - * Dispose and free associated resources. Calls - * {@link DiagnosticCollection.clear clear}. - */ - dispose(): void; - } - - /** - * Represents the severity of a language status item. - */ - export enum LanguageStatusSeverity { - Information = 0, - Warning = 1, - Error = 2 - } - - /** - * A language status item is the preferred way to present language status reports for the active text editors, - * such as selected linter or notifying about a configuration problem. - */ - export interface LanguageStatusItem { - - /** - * The identifier of this item. - */ - readonly id: string; - - /** - * The short name of this item, like 'Java Language Status', etc. - */ - name: string | undefined; - - /** - * A {@link DocumentSelector selector} that defines for what editors - * this item shows. - */ - selector: DocumentSelector; - - /** - * The severity of this item. - * - * Defaults to {@link LanguageStatusSeverity.Information information}. You can use this property to - * signal to users that there is a problem that needs attention, like a missing executable or an - * invalid configuration. - */ - severity: LanguageStatusSeverity; - - /** - * The text to show for the entry. You can embed icons in the text by leveraging the syntax: - * - * `My text $(icon-name) contains icons like $(icon-name) this one.` - * - * Where the icon-name is taken from the ThemeIcon [icon set](https://code.visualstudio.com/api/references/icons-in-labels#icon-listing), e.g. - * `light-bulb`, `thumbsup`, `zap` etc. - */ - text: string; - - /** - * Optional, human-readable details for this item. - */ - detail?: string; - - /** - * Controls whether the item is shown as "busy". Defaults to `false`. - */ - busy: boolean; - - /** - * A {@linkcode Command command} for this item. - */ - command: Command | undefined; - - /** - * Accessibility information used when a screen reader interacts with this item - */ - accessibilityInformation?: AccessibilityInformation; - - /** - * Dispose and free associated resources. - */ - dispose(): void; - } - - /** - * Denotes a location of an editor in the window. Editors can be arranged in a grid - * and each column represents one editor location in that grid by counting the editors - * in order of their appearance. - */ - export enum ViewColumn { - /** - * A *symbolic* editor column representing the currently active column. This value - * can be used when opening editors, but the *resolved* {@link TextEditor.viewColumn viewColumn}-value - * of editors will always be `One`, `Two`, `Three`,... or `undefined` but never `Active`. - */ - Active = -1, - /** - * A *symbolic* editor column representing the column to the side of the active one. This value - * can be used when opening editors, but the *resolved* {@link TextEditor.viewColumn viewColumn}-value - * of editors will always be `One`, `Two`, `Three`,... or `undefined` but never `Beside`. - */ - Beside = -2, - /** - * The first editor column. - */ - One = 1, - /** - * The second editor column. - */ - Two = 2, - /** - * The third editor column. - */ - Three = 3, - /** - * The fourth editor column. - */ - Four = 4, - /** - * The fifth editor column. - */ - Five = 5, - /** - * The sixth editor column. - */ - Six = 6, - /** - * The seventh editor column. - */ - Seven = 7, - /** - * The eighth editor column. - */ - Eight = 8, - /** - * The ninth editor column. - */ - Nine = 9 - } - - /** - * An output channel is a container for readonly textual information. - * - * To get an instance of an `OutputChannel` use - * {@link window.createOutputChannel createOutputChannel}. - */ - export interface OutputChannel { - - /** - * The human-readable name of this output channel. - */ - readonly name: string; - - /** - * Append the given value to the channel. - * - * @param value A string, falsy values will not be printed. - */ - append(value: string): void; - - /** - * Append the given value and a line feed character - * to the channel. - * - * @param value A string, falsy values will be printed. - */ - appendLine(value: string): void; - - /** - * Replaces all output from the channel with the given value. - * - * @param value A string, falsy values will not be printed. - */ - replace(value: string): void; - - /** - * Removes all output from the channel. - */ - clear(): void; - - /** - * Reveal this channel in the UI. - * - * @param preserveFocus When `true` the channel will not take focus. - */ - show(preserveFocus?: boolean): void; - - /** - * Reveal this channel in the UI. - * - * @deprecated Use the overload with just one parameter (`show(preserveFocus?: boolean): void`). - * - * @param column This argument is **deprecated** and will be ignored. - * @param preserveFocus When `true` the channel will not take focus. - */ - show(column?: ViewColumn, preserveFocus?: boolean): void; - - /** - * Hide this channel from the UI. - */ - hide(): void; - - /** - * Dispose and free associated resources. - */ - dispose(): void; - } - - /** - * A channel for containing log output. - * - * To get an instance of a `LogOutputChannel` use - * {@link window.createOutputChannel createOutputChannel}. - */ - export interface LogOutputChannel extends OutputChannel { - - /** - * The current log level of the channel. Defaults to {@link env.logLevel editor log level}. - */ - readonly logLevel: LogLevel; - - /** - * An {@link Event} which fires when the log level of the channel changes. - */ - readonly onDidChangeLogLevel: Event; - - /** - * Outputs the given trace message to the channel. Use this method to log verbose information. - * - * The message is only loggeed if the channel is configured to display {@link LogLevel.Trace trace} log level. - * - * @param message trace message to log - */ - trace(message: string, ...args: any[]): void; - - /** - * Outputs the given debug message to the channel. - * - * The message is only loggeed if the channel is configured to display {@link LogLevel.Debug debug} log level or lower. - * - * @param message debug message to log - */ - debug(message: string, ...args: any[]): void; - - /** - * Outputs the given information message to the channel. - * - * The message is only loggeed if the channel is configured to display {@link LogLevel.Info info} log level or lower. - * - * @param message info message to log - */ - info(message: string, ...args: any[]): void; - - /** - * Outputs the given warning message to the channel. - * - * The message is only loggeed if the channel is configured to display {@link LogLevel.Warning warning} log level or lower. - * - * @param message warning message to log - */ - warn(message: string, ...args: any[]): void; - - /** - * Outputs the given error or error message to the channel. - * - * The message is only loggeed if the channel is configured to display {@link LogLevel.Error error} log level or lower. - * - * @param error Error or error message to log - */ - error(error: string | Error, ...args: any[]): void; - } - - /** - * Accessibility information which controls screen reader behavior. - */ - export interface AccessibilityInformation { - /** - * Label to be read out by a screen reader once the item has focus. - */ - readonly label: string; - - /** - * Role of the widget which defines how a screen reader interacts with it. - * The role should be set in special cases when for example a tree-like element behaves like a checkbox. - * If role is not specified the editor will pick the appropriate role automatically. - * More about aria roles can be found here https://w3c.github.io/aria/#widget_roles - */ - readonly role?: string; - } - - /** - * Represents the alignment of status bar items. - */ - export enum StatusBarAlignment { - - /** - * Aligned to the left side. - */ - Left = 1, - - /** - * Aligned to the right side. - */ - Right = 2 - } - - /** - * A status bar item is a status bar contribution that can - * show text and icons and run a command on click. - */ - export interface StatusBarItem { - - /** - * The identifier of this item. - * - * *Note*: if no identifier was provided by the {@linkcode window.createStatusBarItem} - * method, the identifier will match the {@link Extension.id extension identifier}. - */ - readonly id: string; - - /** - * The alignment of this item. - */ - readonly alignment: StatusBarAlignment; - - /** - * The priority of this item. Higher value means the item should - * be shown more to the left. - */ - readonly priority: number | undefined; - - /** - * The name of the entry, like 'Python Language Indicator', 'Git Status' etc. - * Try to keep the length of the name short, yet descriptive enough that - * users can understand what the status bar item is about. - */ - name: string | undefined; - - /** - * The text to show for the entry. You can embed icons in the text by leveraging the syntax: - * - * `My text $(icon-name) contains icons like $(icon-name) this one.` - * - * Where the icon-name is taken from the ThemeIcon [icon set](https://code.visualstudio.com/api/references/icons-in-labels#icon-listing), e.g. - * `light-bulb`, `thumbsup`, `zap` etc. - */ - text: string; - - /** - * The tooltip text when you hover over this entry. - */ - tooltip: string | MarkdownString | undefined; - - /** - * The foreground color for this entry. - */ - color: string | ThemeColor | undefined; - - /** - * The background color for this entry. - * - * *Note*: only the following colors are supported: - * * `new ThemeColor('statusBarItem.errorBackground')` - * * `new ThemeColor('statusBarItem.warningBackground')` - * - * More background colors may be supported in the future. - * - * *Note*: when a background color is set, the statusbar may override - * the `color` choice to ensure the entry is readable in all themes. - */ - backgroundColor: ThemeColor | undefined; - - /** - * {@linkcode Command} or identifier of a command to run on click. - * - * The command must be {@link commands.getCommands known}. - * - * Note that if this is a {@linkcode Command} object, only the {@linkcode Command.command command} and {@linkcode Command.arguments arguments} - * are used by the editor. - */ - command: string | Command | undefined; - - /** - * Accessibility information used when a screen reader interacts with this StatusBar item - */ - accessibilityInformation: AccessibilityInformation | undefined; - - /** - * Shows the entry in the status bar. - */ - show(): void; - - /** - * Hide the entry in the status bar. - */ - hide(): void; - - /** - * Dispose and free associated resources. Call - * {@link StatusBarItem.hide hide}. - */ - dispose(): void; - } - - /** - * Defines a generalized way of reporting progress updates. - */ - export interface Progress { - - /** - * Report a progress update. - * @param value A progress item, like a message and/or an - * report on how much work finished - */ - report(value: T): void; - } - - /** - * An individual terminal instance within the integrated terminal. - */ - export interface Terminal { - - /** - * The name of the terminal. - */ - readonly name: string; - - /** - * The process ID of the shell process. - */ - readonly processId: Thenable; - - /** - * The object used to initialize the terminal, this is useful for example to detecting the - * shell type of when the terminal was not launched by this extension or for detecting what - * folder the shell was launched in. - */ - readonly creationOptions: Readonly; - - /** - * The exit status of the terminal, this will be undefined while the terminal is active. - * - * **Example:** Show a notification with the exit code when the terminal exits with a - * non-zero exit code. - * ```typescript - * window.onDidCloseTerminal(t => { - * if (t.exitStatus && t.exitStatus.code) { - * vscode.window.showInformationMessage(`Exit code: ${t.exitStatus.code}`); - * } - * }); - * ``` - */ - readonly exitStatus: TerminalExitStatus | undefined; - - /** - * The current state of the {@link Terminal}. - */ - readonly state: TerminalState; - - /** - * Send text to the terminal. The text is written to the stdin of the underlying pty process - * (shell) of the terminal. - * - * @param text The text to send. - * @param addNewLine Whether to add a new line to the text being sent, this is normally - * required to run a command in the terminal. The character(s) added are \n or \r\n - * depending on the platform. This defaults to `true`. - */ - sendText(text: string, addNewLine?: boolean): void; - - /** - * Show the terminal panel and reveal this terminal in the UI. - * - * @param preserveFocus When `true` the terminal will not take focus. - */ - show(preserveFocus?: boolean): void; - - /** - * Hide the terminal panel if this terminal is currently showing. - */ - hide(): void; - - /** - * Dispose and free associated resources. - */ - dispose(): void; - } - - /** - * The location of the terminal. - */ - export enum TerminalLocation { - /** - * In the terminal view - */ - Panel = 1, - /** - * In the editor area - */ - Editor = 2, - } - - /** - * Assumes a {@link TerminalLocation} of editor and allows specifying a {@link ViewColumn} and - * {@link TerminalEditorLocationOptions.preserveFocus preserveFocus } property - */ - export interface TerminalEditorLocationOptions { - /** - * A view column in which the {@link Terminal terminal} should be shown in the editor area. - * The default is the {@link ViewColumn.Active active}. Columns that do not exist - * will be created as needed up to the maximum of {@linkcode ViewColumn.Nine}. - * Use {@linkcode ViewColumn.Beside} to open the editor to the side of the currently - * active one. - */ - viewColumn: ViewColumn; - /** - * An optional flag that when `true` will stop the {@link Terminal} from taking focus. - */ - preserveFocus?: boolean; - } - - /** - * Uses the parent {@link Terminal}'s location for the terminal - */ - export interface TerminalSplitLocationOptions { - /** - * The parent terminal to split this terminal beside. This works whether the parent terminal - * is in the panel or the editor area. - */ - parentTerminal: Terminal; - } - - /** - * Represents the state of a {@link Terminal}. - */ - export interface TerminalState { - /** - * Whether the {@link Terminal} has been interacted with. Interaction means that the - * terminal has sent data to the process which depending on the terminal's _mode_. By - * default input is sent when a key is pressed or when a command or extension sends text, - * but based on the terminal's mode it can also happen on: - * - * - a pointer click event - * - a pointer scroll event - * - a pointer move event - * - terminal focus in/out - * - * For more information on events that can send data see "DEC Private Mode Set (DECSET)" on - * https://invisible-island.net/xterm/ctlseqs/ctlseqs.html - */ - readonly isInteractedWith: boolean; - } - - /** - * Provides information on a line in a terminal in order to provide links for it. - */ - export interface TerminalLinkContext { - /** - * This is the text from the unwrapped line in the terminal. - */ - line: string; - - /** - * The terminal the link belongs to. - */ - terminal: Terminal; - } - - /** - * A provider that enables detection and handling of links within terminals. - */ - export interface TerminalLinkProvider { - /** - * Provide terminal links for the given context. Note that this can be called multiple times - * even before previous calls resolve, make sure to not share global objects (eg. `RegExp`) - * that could have problems when asynchronous usage may overlap. - * @param context Information about what links are being provided for. - * @param token A cancellation token. - * @return A list of terminal links for the given line. - */ - provideTerminalLinks(context: TerminalLinkContext, token: CancellationToken): ProviderResult; - - /** - * Handle an activated terminal link. - * @param link The link to handle. - */ - handleTerminalLink(link: T): ProviderResult; - } - - /** - * A link on a terminal line. - */ - export class TerminalLink { - /** - * The start index of the link on {@link TerminalLinkContext.line}. - */ - startIndex: number; - - /** - * The length of the link on {@link TerminalLinkContext.line}. - */ - length: number; - - /** - * The tooltip text when you hover over this link. - * - * If a tooltip is provided, is will be displayed in a string that includes instructions on - * how to trigger the link, such as `{0} (ctrl + click)`. The specific instructions vary - * depending on OS, user settings, and localization. - */ - tooltip?: string; - - /** - * Creates a new terminal link. - * @param startIndex The start index of the link on {@link TerminalLinkContext.line}. - * @param length The length of the link on {@link TerminalLinkContext.line}. - * @param tooltip The tooltip text when you hover over this link. - * - * If a tooltip is provided, is will be displayed in a string that includes instructions on - * how to trigger the link, such as `{0} (ctrl + click)`. The specific instructions vary - * depending on OS, user settings, and localization. - */ - constructor(startIndex: number, length: number, tooltip?: string); - } - - /** - * Provides a terminal profile for the contributed terminal profile when launched via the UI or - * command. - */ - export interface TerminalProfileProvider { - /** - * Provide the terminal profile. - * @param token A cancellation token that indicates the result is no longer needed. - * @returns The terminal profile. - */ - provideTerminalProfile(token: CancellationToken): ProviderResult; - } - - /** - * A terminal profile defines how a terminal will be launched. - */ - export class TerminalProfile { - /** - * The options that the terminal will launch with. - */ - options: TerminalOptions | ExtensionTerminalOptions; - - /** - * Creates a new terminal profile. - * @param options The options that the terminal will launch with. - */ - constructor(options: TerminalOptions | ExtensionTerminalOptions); - } - - /** - * A file decoration represents metadata that can be rendered with a file. - */ - export class FileDecoration { - - /** - * A very short string that represents this decoration. - */ - badge?: string; - - /** - * A human-readable tooltip for this decoration. - */ - tooltip?: string; - - /** - * The color of this decoration. - */ - color?: ThemeColor; - - /** - * A flag expressing that this decoration should be - * propagated to its parents. - */ - propagate?: boolean; - - /** - * Creates a new decoration. - * - * @param badge A letter that represents the decoration. - * @param tooltip The tooltip of the decoration. - * @param color The color of the decoration. - */ - constructor(badge?: string, tooltip?: string, color?: ThemeColor); - } - - /** - * The decoration provider interfaces defines the contract between extensions and - * file decorations. - */ - export interface FileDecorationProvider { - - /** - * An optional event to signal that decorations for one or many files have changed. - * - * *Note* that this event should be used to propagate information about children. - * - * @see {@link EventEmitter} - */ - onDidChangeFileDecorations?: Event; - - /** - * Provide decorations for a given uri. - * - * *Note* that this function is only called when a file gets rendered in the UI. - * This means a decoration from a descendent that propagates upwards must be signaled - * to the editor via the {@link FileDecorationProvider.onDidChangeFileDecorations onDidChangeFileDecorations}-event. - * - * @param uri The uri of the file to provide a decoration for. - * @param token A cancellation token. - * @returns A decoration or a thenable that resolves to such. - */ - provideFileDecoration(uri: Uri, token: CancellationToken): ProviderResult; - } - - - /** - * In a remote window the extension kind describes if an extension - * runs where the UI (window) runs or if an extension runs remotely. - */ - export enum ExtensionKind { - - /** - * Extension runs where the UI runs. - */ - UI = 1, - - /** - * Extension runs where the remote extension host runs. - */ - Workspace = 2 - } - - /** - * Represents an extension. - * - * To get an instance of an `Extension` use {@link extensions.getExtension getExtension}. - */ - export interface Extension { - - /** - * The canonical extension identifier in the form of: `publisher.name`. - */ - readonly id: string; - - /** - * The uri of the directory containing the extension. - */ - readonly extensionUri: Uri; - - /** - * The absolute file path of the directory containing this extension. Shorthand - * notation for {@link Extension.extensionUri Extension.extensionUri.fsPath} (independent of the uri scheme). - */ - readonly extensionPath: string; - - /** - * `true` if the extension has been activated. - */ - readonly isActive: boolean; - - /** - * The parsed contents of the extension's package.json. - */ - readonly packageJSON: any; - - /** - * The extension kind describes if an extension runs where the UI runs - * or if an extension runs where the remote extension host runs. The extension kind - * is defined in the `package.json`-file of extensions but can also be refined - * via the `remote.extensionKind`-setting. When no remote extension host exists, - * the value is {@linkcode ExtensionKind.UI}. - */ - extensionKind: ExtensionKind; - - /** - * The public API exported by this extension (return value of `activate`). - * It is an invalid action to access this field before this extension has been activated. - */ - readonly exports: T; - - /** - * Activates this extension and returns its public API. - * - * @return A promise that will resolve when this extension has been activated. - */ - activate(): Thenable; - } - - /** - * The ExtensionMode is provided on the `ExtensionContext` and indicates the - * mode the specific extension is running in. - */ - export enum ExtensionMode { - /** - * The extension is installed normally (for example, from the marketplace - * or VSIX) in the editor. - */ - Production = 1, - - /** - * The extension is running from an `--extensionDevelopmentPath` provided - * when launching the editor. - */ - Development = 2, - - /** - * The extension is running from an `--extensionTestsPath` and - * the extension host is running unit tests. - */ - Test = 3, - } - - /** - * An extension context is a collection of utilities private to an - * extension. - * - * An instance of an `ExtensionContext` is provided as the first - * parameter to the `activate`-call of an extension. - */ - export interface ExtensionContext { - - /** - * An array to which disposables can be added. When this - * extension is deactivated the disposables will be disposed. - * - * *Note* that asynchronous dispose-functions aren't awaited. - */ - readonly subscriptions: { dispose(): any }[]; - - /** - * A memento object that stores state in the context - * of the currently opened {@link workspace.workspaceFolders workspace}. - */ - readonly workspaceState: Memento; - - /** - * A memento object that stores state independent - * of the current opened {@link workspace.workspaceFolders workspace}. - */ - readonly globalState: Memento & { - /** - * Set the keys whose values should be synchronized across devices when synchronizing user-data - * like configuration, extensions, and mementos. - * - * Note that this function defines the whole set of keys whose values are synchronized: - * - calling it with an empty array stops synchronization for this memento - * - calling it with a non-empty array replaces all keys whose values are synchronized - * - * For any given set of keys this function needs to be called only once but there is no harm in - * repeatedly calling it. - * - * @param keys The set of keys whose values are synced. - */ - setKeysForSync(keys: readonly string[]): void; - }; - - /** - * A storage utility for secrets. Secrets are persisted across reloads and are independent of the - * current opened {@link workspace.workspaceFolders workspace}. - */ - readonly secrets: SecretStorage; - - /** - * The uri of the directory containing the extension. - */ - readonly extensionUri: Uri; - - /** - * The absolute file path of the directory containing the extension. Shorthand - * notation for {@link TextDocument.uri ExtensionContext.extensionUri.fsPath} (independent of the uri scheme). - */ - readonly extensionPath: string; - - /** - * Gets the extension's environment variable collection for this workspace, enabling changes - * to be applied to terminal environment variables. - */ - readonly environmentVariableCollection: EnvironmentVariableCollection; - - /** - * Get the absolute path of a resource contained in the extension. - * - * *Note* that an absolute uri can be constructed via {@linkcode Uri.joinPath} and - * {@linkcode ExtensionContext.extensionUri extensionUri}, e.g. `vscode.Uri.joinPath(context.extensionUri, relativePath);` - * - * @param relativePath A relative path to a resource contained in the extension. - * @return The absolute path of the resource. - */ - asAbsolutePath(relativePath: string): string; - - /** - * The uri of a workspace specific directory in which the extension - * can store private state. The directory might not exist and creation is - * up to the extension. However, the parent directory is guaranteed to be existent. - * The value is `undefined` when no workspace nor folder has been opened. - * - * Use {@linkcode ExtensionContext.workspaceState workspaceState} or - * {@linkcode ExtensionContext.globalState globalState} to store key value data. - * - * @see {@linkcode FileSystem workspace.fs} for how to read and write files and folders from - * an uri. - */ - readonly storageUri: Uri | undefined; - - /** - * An absolute file path of a workspace specific directory in which the extension - * can store private state. The directory might not exist on disk and creation is - * up to the extension. However, the parent directory is guaranteed to be existent. - * - * Use {@linkcode ExtensionContext.workspaceState workspaceState} or - * {@linkcode ExtensionContext.globalState globalState} to store key value data. - * - * @deprecated Use {@link ExtensionContext.storageUri storageUri} instead. - */ - readonly storagePath: string | undefined; - - /** - * The uri of a directory in which the extension can store global state. - * The directory might not exist on disk and creation is - * up to the extension. However, the parent directory is guaranteed to be existent. - * - * Use {@linkcode ExtensionContext.globalState globalState} to store key value data. - * - * @see {@linkcode FileSystem workspace.fs} for how to read and write files and folders from - * an uri. - */ - readonly globalStorageUri: Uri; - - /** - * An absolute file path in which the extension can store global state. - * The directory might not exist on disk and creation is - * up to the extension. However, the parent directory is guaranteed to be existent. - * - * Use {@linkcode ExtensionContext.globalState globalState} to store key value data. - * - * @deprecated Use {@link ExtensionContext.globalStorageUri globalStorageUri} instead. - */ - readonly globalStoragePath: string; - - /** - * The uri of a directory in which the extension can create log files. - * The directory might not exist on disk and creation is up to the extension. However, - * the parent directory is guaranteed to be existent. - * - * @see {@linkcode FileSystem workspace.fs} for how to read and write files and folders from - * an uri. - */ - readonly logUri: Uri; - - /** - * An absolute file path of a directory in which the extension can create log files. - * The directory might not exist on disk and creation is up to the extension. However, - * the parent directory is guaranteed to be existent. - * - * @deprecated Use {@link ExtensionContext.logUri logUri} instead. - */ - readonly logPath: string; - - /** - * The mode the extension is running in. This is specific to the current - * extension. One extension may be in `ExtensionMode.Development` while - * other extensions in the host run in `ExtensionMode.Release`. - */ - readonly extensionMode: ExtensionMode; - - /** - * The current `Extension` instance. - */ - readonly extension: Extension; - } - - /** - * A memento represents a storage utility. It can store and retrieve - * values. - */ - export interface Memento { - - /** - * Returns the stored keys. - * - * @return The stored keys. - */ - keys(): readonly string[]; - - /** - * Return a value. - * - * @param key A string. - * @return The stored value or `undefined`. - */ - get(key: string): T | undefined; - - /** - * Return a value. - * - * @param key A string. - * @param defaultValue A value that should be returned when there is no - * value (`undefined`) with the given key. - * @return The stored value or the defaultValue. - */ - get(key: string, defaultValue: T): T; - - /** - * Store a value. The value must be JSON-stringifyable. - * - * *Note* that using `undefined` as value removes the key from the underlying - * storage. - * - * @param key A string. - * @param value A value. MUST not contain cyclic references. - */ - update(key: string, value: any): Thenable; - } - - /** - * The event data that is fired when a secret is added or removed. - */ - export interface SecretStorageChangeEvent { - /** - * The key of the secret that has changed. - */ - readonly key: string; - } - - /** - * Represents a storage utility for secrets, information that is - * sensitive. - */ - export interface SecretStorage { - /** - * Retrieve a secret that was stored with key. Returns undefined if there - * is no password matching that key. - * @param key The key the secret was stored under. - * @returns The stored value or `undefined`. - */ - get(key: string): Thenable; - - /** - * Store a secret under a given key. - * @param key The key to store the secret under. - * @param value The secret. - */ - store(key: string, value: string): Thenable; - - /** - * Remove a secret from storage. - * @param key The key the secret was stored under. - */ - delete(key: string): Thenable; - - /** - * Fires when a secret is stored or deleted. - */ - onDidChange: Event; - } - - /** - * Represents a color theme kind. - */ - export enum ColorThemeKind { - Light = 1, - Dark = 2, - HighContrast = 3, - HighContrastLight = 4 - } - - /** - * Represents a color theme. - */ - export interface ColorTheme { - - /** - * The kind of this color theme: light, dark, high contrast dark and high contrast light. - */ - readonly kind: ColorThemeKind; - } - - /** - * Controls the behaviour of the terminal's visibility. - */ - export enum TaskRevealKind { - /** - * Always brings the terminal to front if the task is executed. - */ - Always = 1, - - /** - * Only brings the terminal to front if a problem is detected executing the task - * (e.g. the task couldn't be started because). - */ - Silent = 2, - - /** - * The terminal never comes to front when the task is executed. - */ - Never = 3 - } - - /** - * Controls how the task channel is used between tasks - */ - export enum TaskPanelKind { - - /** - * Shares a panel with other tasks. This is the default. - */ - Shared = 1, - - /** - * Uses a dedicated panel for this tasks. The panel is not - * shared with other tasks. - */ - Dedicated = 2, - - /** - * Creates a new panel whenever this task is executed. - */ - New = 3 - } - - /** - * Controls how the task is presented in the UI. - */ - export interface TaskPresentationOptions { - /** - * Controls whether the task output is reveal in the user interface. - * Defaults to `RevealKind.Always`. - */ - reveal?: TaskRevealKind; - - /** - * Controls whether the command associated with the task is echoed - * in the user interface. - */ - echo?: boolean; - - /** - * Controls whether the panel showing the task output is taking focus. - */ - focus?: boolean; - - /** - * Controls if the task panel is used for this task only (dedicated), - * shared between tasks (shared) or if a new panel is created on - * every task execution (new). Defaults to `TaskInstanceKind.Shared` - */ - panel?: TaskPanelKind; - - /** - * Controls whether to show the "Terminal will be reused by tasks, press any key to close it" message. - */ - showReuseMessage?: boolean; - - /** - * Controls whether the terminal is cleared before executing the task. - */ - clear?: boolean; - } - - /** - * A grouping for tasks. The editor by default supports the - * 'Clean', 'Build', 'RebuildAll' and 'Test' group. - */ - export class TaskGroup { - - /** - * The clean task group; - */ - static Clean: TaskGroup; - - /** - * The build task group; - */ - static Build: TaskGroup; - - /** - * The rebuild all task group; - */ - static Rebuild: TaskGroup; - - /** - * The test all task group; - */ - static Test: TaskGroup; - - /** - * Whether the task that is part of this group is the default for the group. - * This property cannot be set through API, and is controlled by a user's task configurations. - */ - readonly isDefault: boolean | undefined; - - /** - * The ID of the task group. Is one of TaskGroup.Clean.id, TaskGroup.Build.id, TaskGroup.Rebuild.id, or TaskGroup.Test.id. - */ - readonly id: string; - - private constructor(id: string, label: string); - } - - /** - * A structure that defines a task kind in the system. - * The value must be JSON-stringifyable. - */ - export interface TaskDefinition { - /** - * The task definition describing the task provided by an extension. - * Usually a task provider defines more properties to identify - * a task. They need to be defined in the package.json of the - * extension under the 'taskDefinitions' extension point. The npm - * task definition for example looks like this - * ```typescript - * interface NpmTaskDefinition extends TaskDefinition { - * script: string; - * } - * ``` - * - * Note that type identifier starting with a '$' are reserved for internal - * usages and shouldn't be used by extensions. - */ - readonly type: string; - - /** - * Additional attributes of a concrete task definition. - */ - [name: string]: any; - } - - /** - * Options for a process execution - */ - export interface ProcessExecutionOptions { - /** - * The current working directory of the executed program or shell. - * If omitted the tools current workspace root is used. - */ - cwd?: string; - - /** - * The additional environment of the executed program or shell. If omitted - * the parent process' environment is used. If provided it is merged with - * the parent process' environment. - */ - env?: { [key: string]: string }; - } - - /** - * The execution of a task happens as an external process - * without shell interaction. - */ - export class ProcessExecution { - - /** - * Creates a process execution. - * - * @param process The process to start. - * @param options Optional options for the started process. - */ - constructor(process: string, options?: ProcessExecutionOptions); - - /** - * Creates a process execution. - * - * @param process The process to start. - * @param args Arguments to be passed to the process. - * @param options Optional options for the started process. - */ - constructor(process: string, args: string[], options?: ProcessExecutionOptions); - - /** - * The process to be executed. - */ - process: string; - - /** - * The arguments passed to the process. Defaults to an empty array. - */ - args: string[]; - - /** - * The process options used when the process is executed. - * Defaults to undefined. - */ - options?: ProcessExecutionOptions; - } - - /** - * The shell quoting options. - */ - export interface ShellQuotingOptions { - - /** - * The character used to do character escaping. If a string is provided only spaces - * are escaped. If a `{ escapeChar, charsToEscape }` literal is provide all characters - * in `charsToEscape` are escaped using the `escapeChar`. - */ - escape?: string | { - /** - * The escape character. - */ - escapeChar: string; - /** - * The characters to escape. - */ - charsToEscape: string; - }; - - /** - * The character used for strong quoting. The string's length must be 1. - */ - strong?: string; - - /** - * The character used for weak quoting. The string's length must be 1. - */ - weak?: string; - } - - /** - * Options for a shell execution - */ - export interface ShellExecutionOptions { - /** - * The shell executable. - */ - executable?: string; - - /** - * The arguments to be passed to the shell executable used to run the task. Most shells - * require special arguments to execute a command. For example `bash` requires the `-c` - * argument to execute a command, `PowerShell` requires `-Command` and `cmd` requires both - * `/d` and `/c`. - */ - shellArgs?: string[]; - - /** - * The shell quotes supported by this shell. - */ - shellQuoting?: ShellQuotingOptions; - - /** - * The current working directory of the executed shell. - * If omitted the tools current workspace root is used. - */ - cwd?: string; - - /** - * The additional environment of the executed shell. If omitted - * the parent process' environment is used. If provided it is merged with - * the parent process' environment. - */ - env?: { [key: string]: string }; - } - - /** - * Defines how an argument should be quoted if it contains - * spaces or unsupported characters. - */ - export enum ShellQuoting { - - /** - * Character escaping should be used. This for example - * uses \ on bash and ` on PowerShell. - */ - Escape = 1, - - /** - * Strong string quoting should be used. This for example - * uses " for Windows cmd and ' for bash and PowerShell. - * Strong quoting treats arguments as literal strings. - * Under PowerShell echo 'The value is $(2 * 3)' will - * print `The value is $(2 * 3)` - */ - Strong = 2, - - /** - * Weak string quoting should be used. This for example - * uses " for Windows cmd, bash and PowerShell. Weak quoting - * still performs some kind of evaluation inside the quoted - * string. Under PowerShell echo "The value is $(2 * 3)" - * will print `The value is 6` - */ - Weak = 3 - } - - /** - * A string that will be quoted depending on the used shell. - */ - export interface ShellQuotedString { - /** - * The actual string value. - */ - value: string; - - /** - * The quoting style to use. - */ - quoting: ShellQuoting; - } - - export class ShellExecution { - /** - * Creates a shell execution with a full command line. - * - * @param commandLine The command line to execute. - * @param options Optional options for the started the shell. - */ - constructor(commandLine: string, options?: ShellExecutionOptions); - - /** - * Creates a shell execution with a command and arguments. For the real execution the editor will - * construct a command line from the command and the arguments. This is subject to interpretation - * especially when it comes to quoting. If full control over the command line is needed please - * use the constructor that creates a `ShellExecution` with the full command line. - * - * @param command The command to execute. - * @param args The command arguments. - * @param options Optional options for the started the shell. - */ - constructor(command: string | ShellQuotedString, args: (string | ShellQuotedString)[], options?: ShellExecutionOptions); - - /** - * The shell command line. Is `undefined` if created with a command and arguments. - */ - commandLine: string | undefined; - - /** - * The shell command. Is `undefined` if created with a full command line. - */ - command: string | ShellQuotedString; - - /** - * The shell args. Is `undefined` if created with a full command line. - */ - args: (string | ShellQuotedString)[]; - - /** - * The shell options used when the command line is executed in a shell. - * Defaults to undefined. - */ - options?: ShellExecutionOptions; - } - - /** - * Class used to execute an extension callback as a task. - */ - export class CustomExecution { - /** - * Constructs a CustomExecution task object. The callback will be executed when the task is run, at which point the - * extension should return the Pseudoterminal it will "run in". The task should wait to do further execution until - * {@link Pseudoterminal.open} is called. Task cancellation should be handled using - * {@link Pseudoterminal.close}. When the task is complete fire - * {@link Pseudoterminal.onDidClose}. - * @param callback The callback that will be called when the task is started by a user. Any ${} style variables that - * were in the task definition will be resolved and passed into the callback as `resolvedDefinition`. - */ - constructor(callback: (resolvedDefinition: TaskDefinition) => Thenable); - } - - /** - * The scope of a task. - */ - export enum TaskScope { - /** - * The task is a global task. Global tasks are currently not supported. - */ - Global = 1, - - /** - * The task is a workspace task - */ - Workspace = 2 - } - - /** - * Run options for a task. - */ - export interface RunOptions { - /** - * Controls whether task variables are re-evaluated on rerun. - */ - reevaluateOnRerun?: boolean; - } - - /** - * A task to execute - */ - export class Task { - - /** - * Creates a new task. - * - * @param taskDefinition The task definition as defined in the taskDefinitions extension point. - * @param scope Specifies the task's scope. It is either a global or a workspace task or a task for a specific workspace folder. Global tasks are currently not supported. - * @param name The task's name. Is presented in the user interface. - * @param source The task's source (e.g. 'gulp', 'npm', ...). Is presented in the user interface. - * @param execution The process or shell execution. - * @param problemMatchers the names of problem matchers to use, like '$tsc' - * or '$eslint'. Problem matchers can be contributed by an extension using - * the `problemMatchers` extension point. - */ - constructor(taskDefinition: TaskDefinition, scope: WorkspaceFolder | TaskScope.Global | TaskScope.Workspace, name: string, source: string, execution?: ProcessExecution | ShellExecution | CustomExecution, problemMatchers?: string | string[]); - - /** - * Creates a new task. - * - * @deprecated Use the new constructors that allow specifying a scope for the task. - * - * @param taskDefinition The task definition as defined in the taskDefinitions extension point. - * @param name The task's name. Is presented in the user interface. - * @param source The task's source (e.g. 'gulp', 'npm', ...). Is presented in the user interface. - * @param execution The process or shell execution. - * @param problemMatchers the names of problem matchers to use, like '$tsc' - * or '$eslint'. Problem matchers can be contributed by an extension using - * the `problemMatchers` extension point. - */ - constructor(taskDefinition: TaskDefinition, name: string, source: string, execution?: ProcessExecution | ShellExecution, problemMatchers?: string | string[]); - - /** - * The task's definition. - */ - definition: TaskDefinition; - - /** - * The task's scope. - */ - readonly scope: TaskScope.Global | TaskScope.Workspace | WorkspaceFolder | undefined; - - /** - * The task's name - */ - name: string; - - /** - * A human-readable string which is rendered less prominently on a separate line in places - * where the task's name is displayed. Supports rendering of {@link ThemeIcon theme icons} - * via the `$()`-syntax. - */ - detail?: string; - - /** - * The task's execution engine - */ - execution?: ProcessExecution | ShellExecution | CustomExecution; - - /** - * Whether the task is a background task or not. - */ - isBackground: boolean; - - /** - * A human-readable string describing the source of this shell task, e.g. 'gulp' - * or 'npm'. Supports rendering of {@link ThemeIcon theme icons} via the `$()`-syntax. - */ - source: string; - - /** - * The task group this tasks belongs to. See TaskGroup - * for a predefined set of available groups. - * Defaults to undefined meaning that the task doesn't - * belong to any special group. - */ - group?: TaskGroup; - - /** - * The presentation options. Defaults to an empty literal. - */ - presentationOptions: TaskPresentationOptions; - - /** - * The problem matchers attached to the task. Defaults to an empty - * array. - */ - problemMatchers: string[]; - - /** - * Run options for the task - */ - runOptions: RunOptions; - } - - /** - * A task provider allows to add tasks to the task service. - * A task provider is registered via {@link tasks.registerTaskProvider}. - */ - export interface TaskProvider { - /** - * Provides tasks. - * @param token A cancellation token. - * @return an array of tasks - */ - provideTasks(token: CancellationToken): ProviderResult; - - /** - * Resolves a task that has no {@linkcode Task.execution execution} set. Tasks are - * often created from information found in the `tasks.json`-file. Such tasks miss - * the information on how to execute them and a task provider must fill in - * the missing information in the `resolveTask`-method. This method will not be - * called for tasks returned from the above `provideTasks` method since those - * tasks are always fully resolved. A valid default implementation for the - * `resolveTask` method is to return `undefined`. - * - * Note that when filling in the properties of `task`, you _must_ be sure to - * use the exact same `TaskDefinition` and not create a new one. Other properties - * may be changed. - * - * @param task The task to resolve. - * @param token A cancellation token. - * @return The resolved task - */ - resolveTask(task: T, token: CancellationToken): ProviderResult; - } - - /** - * An object representing an executed Task. It can be used - * to terminate a task. - * - * This interface is not intended to be implemented. - */ - export interface TaskExecution { - /** - * The task that got started. - */ - task: Task; - - /** - * Terminates the task execution. - */ - terminate(): void; - } - - /** - * An event signaling the start of a task execution. - * - * This interface is not intended to be implemented. - */ - interface TaskStartEvent { - /** - * The task item representing the task that got started. - */ - readonly execution: TaskExecution; - } - - /** - * An event signaling the end of an executed task. - * - * This interface is not intended to be implemented. - */ - interface TaskEndEvent { - /** - * The task item representing the task that finished. - */ - readonly execution: TaskExecution; - } - - /** - * An event signaling the start of a process execution - * triggered through a task - */ - export interface TaskProcessStartEvent { - - /** - * The task execution for which the process got started. - */ - readonly execution: TaskExecution; - - /** - * The underlying process id. - */ - readonly processId: number; - } - - /** - * An event signaling the end of a process execution - * triggered through a task - */ - export interface TaskProcessEndEvent { - - /** - * The task execution for which the process got started. - */ - readonly execution: TaskExecution; - - /** - * The process's exit code. Will be `undefined` when the task is terminated. - */ - readonly exitCode: number | undefined; - } - - export interface TaskFilter { - /** - * The task version as used in the tasks.json file. - * The string support the package.json semver notation. - */ - version?: string; - - /** - * The task type to return; - */ - type?: string; - } - - /** - * Namespace for tasks functionality. - */ - export namespace tasks { - - /** - * Register a task provider. - * - * @param type The task kind type this provider is registered for. - * @param provider A task provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerTaskProvider(type: string, provider: TaskProvider): Disposable; - - /** - * Fetches all tasks available in the systems. This includes tasks - * from `tasks.json` files as well as tasks from task providers - * contributed through extensions. - * - * @param filter Optional filter to select tasks of a certain type or version. - */ - export function fetchTasks(filter?: TaskFilter): Thenable; - - /** - * Executes a task that is managed by the editor. The returned - * task execution can be used to terminate the task. - * - * @throws When running a ShellExecution or a ProcessExecution - * task in an environment where a new process cannot be started. - * In such an environment, only CustomExecution tasks can be run. - * - * @param task the task to execute - */ - export function executeTask(task: Task): Thenable; - - /** - * The currently active task executions or an empty array. - */ - export const taskExecutions: readonly TaskExecution[]; - - /** - * Fires when a task starts. - */ - export const onDidStartTask: Event; - - /** - * Fires when a task ends. - */ - export const onDidEndTask: Event; - - /** - * Fires when the underlying process has been started. - * This event will not fire for tasks that don't - * execute an underlying process. - */ - export const onDidStartTaskProcess: Event; - - /** - * Fires when the underlying process has ended. - * This event will not fire for tasks that don't - * execute an underlying process. - */ - export const onDidEndTaskProcess: Event; - } - - /** - * Enumeration of file types. The types `File` and `Directory` can also be - * a symbolic links, in that case use `FileType.File | FileType.SymbolicLink` and - * `FileType.Directory | FileType.SymbolicLink`. - */ - export enum FileType { - /** - * The file type is unknown. - */ - Unknown = 0, - /** - * A regular file. - */ - File = 1, - /** - * A directory. - */ - Directory = 2, - /** - * A symbolic link to a file. - */ - SymbolicLink = 64 - } - - export enum FilePermission { - /** - * The file is readonly. - * - * *Note:* All `FileStat` from a `FileSystemProvider` that is registered with - * the option `isReadonly: true` will be implicitly handled as if `FilePermission.Readonly` - * is set. As a consequence, it is not possible to have a readonly file system provider - * registered where some `FileStat` are not readonly. - */ - Readonly = 1 - } - - /** - * The `FileStat`-type represents metadata about a file - */ - export interface FileStat { - /** - * The type of the file, e.g. is a regular file, a directory, or symbolic link - * to a file. - * - * *Note:* This value might be a bitmask, e.g. `FileType.File | FileType.SymbolicLink`. - */ - type: FileType; - /** - * The creation timestamp in milliseconds elapsed since January 1, 1970 00:00:00 UTC. - */ - ctime: number; - /** - * The modification timestamp in milliseconds elapsed since January 1, 1970 00:00:00 UTC. - * - * *Note:* If the file changed, it is important to provide an updated `mtime` that advanced - * from the previous value. Otherwise there may be optimizations in place that will not show - * the updated file contents in an editor for example. - */ - mtime: number; - /** - * The size in bytes. - * - * *Note:* If the file changed, it is important to provide an updated `size`. Otherwise there - * may be optimizations in place that will not show the updated file contents in an editor for - * example. - */ - size: number; - /** - * The permissions of the file, e.g. whether the file is readonly. - * - * *Note:* This value might be a bitmask, e.g. `FilePermission.Readonly | FilePermission.Other`. - */ - permissions?: FilePermission; - } - - /** - * A type that filesystem providers should use to signal errors. - * - * This class has factory methods for common error-cases, like `FileNotFound` when - * a file or folder doesn't exist, use them like so: `throw vscode.FileSystemError.FileNotFound(someUri);` - */ - export class FileSystemError extends Error { - - /** - * Create an error to signal that a file or folder wasn't found. - * @param messageOrUri Message or uri. - */ - static FileNotFound(messageOrUri?: string | Uri): FileSystemError; - - /** - * Create an error to signal that a file or folder already exists, e.g. when - * creating but not overwriting a file. - * @param messageOrUri Message or uri. - */ - static FileExists(messageOrUri?: string | Uri): FileSystemError; - - /** - * Create an error to signal that a file is not a folder. - * @param messageOrUri Message or uri. - */ - static FileNotADirectory(messageOrUri?: string | Uri): FileSystemError; - - /** - * Create an error to signal that a file is a folder. - * @param messageOrUri Message or uri. - */ - static FileIsADirectory(messageOrUri?: string | Uri): FileSystemError; - - /** - * Create an error to signal that an operation lacks required permissions. - * @param messageOrUri Message or uri. - */ - static NoPermissions(messageOrUri?: string | Uri): FileSystemError; - - /** - * Create an error to signal that the file system is unavailable or too busy to - * complete a request. - * @param messageOrUri Message or uri. - */ - static Unavailable(messageOrUri?: string | Uri): FileSystemError; - - /** - * Creates a new filesystem error. - * - * @param messageOrUri Message or uri. - */ - constructor(messageOrUri?: string | Uri); - - /** - * A code that identifies this error. - * - * Possible values are names of errors, like {@linkcode FileSystemError.FileNotFound FileNotFound}, - * or `Unknown` for unspecified errors. - */ - readonly code: string; - } - - /** - * Enumeration of file change types. - */ - export enum FileChangeType { - - /** - * The contents or metadata of a file have changed. - */ - Changed = 1, - - /** - * A file has been created. - */ - Created = 2, - - /** - * A file has been deleted. - */ - Deleted = 3, - } - - /** - * The event filesystem providers must use to signal a file change. - */ - export interface FileChangeEvent { - - /** - * The type of change. - */ - readonly type: FileChangeType; - - /** - * The uri of the file that has changed. - */ - readonly uri: Uri; - } - - /** - * The filesystem provider defines what the editor needs to read, write, discover, - * and to manage files and folders. It allows extensions to serve files from remote places, - * like ftp-servers, and to seamlessly integrate those into the editor. - * - * * *Note 1:* The filesystem provider API works with {@link Uri uris} and assumes hierarchical - * paths, e.g. `foo:/my/path` is a child of `foo:/my/` and a parent of `foo:/my/path/deeper`. - * * *Note 2:* There is an activation event `onFileSystem:` that fires when a file - * or folder is being accessed. - * * *Note 3:* The word 'file' is often used to denote all {@link FileType kinds} of files, e.g. - * folders, symbolic links, and regular files. - */ - export interface FileSystemProvider { - - /** - * An event to signal that a resource has been created, changed, or deleted. This - * event should fire for resources that are being {@link FileSystemProvider.watch watched} - * by clients of this provider. - * - * *Note:* It is important that the metadata of the file that changed provides an - * updated `mtime` that advanced from the previous value in the {@link FileStat stat} and a - * correct `size` value. Otherwise there may be optimizations in place that will not show - * the change in an editor for example. - */ - readonly onDidChangeFile: Event; - - /** - * Subscribes to file change events in the file or folder denoted by `uri`. For folders, - * the option `recursive` indicates whether subfolders, sub-subfolders, etc. should - * be watched for file changes as well. With `recursive: false`, only changes to the - * files that are direct children of the folder should trigger an event. - * - * The `excludes` array is used to indicate paths that should be excluded from file - * watching. It is typically derived from the `files.watcherExclude` setting that - * is configurable by the user. Each entry can be be: - * - the absolute path to exclude - * - a relative path to exclude (for example `build/output`) - * - a simple glob pattern (for example `**​/build`, `output/**`) - * - * It is the file system provider's job to call {@linkcode FileSystemProvider.onDidChangeFile onDidChangeFile} - * for every change given these rules. No event should be emitted for files that match any of the provided - * excludes. - * - * @param uri The uri of the file or folder to be watched. - * @param options Configures the watch. - * @returns A disposable that tells the provider to stop watching the `uri`. - */ - watch(uri: Uri, options: { readonly recursive: boolean; readonly excludes: readonly string[] }): Disposable; - - /** - * Retrieve metadata about a file. - * - * Note that the metadata for symbolic links should be the metadata of the file they refer to. - * Still, the {@link FileType.SymbolicLink SymbolicLink}-type must be used in addition to the actual type, e.g. - * `FileType.SymbolicLink | FileType.Directory`. - * - * @param uri The uri of the file to retrieve metadata about. - * @return The file metadata about the file. - * @throws {@linkcode FileSystemError.FileNotFound FileNotFound} when `uri` doesn't exist. - */ - stat(uri: Uri): FileStat | Thenable; - - /** - * Retrieve all entries of a {@link FileType.Directory directory}. - * - * @param uri The uri of the folder. - * @return An array of name/type-tuples or a thenable that resolves to such. - * @throws {@linkcode FileSystemError.FileNotFound FileNotFound} when `uri` doesn't exist. - */ - readDirectory(uri: Uri): [string, FileType][] | Thenable<[string, FileType][]>; - - /** - * Create a new directory (Note, that new files are created via `write`-calls). - * - * @param uri The uri of the new folder. - * @throws {@linkcode FileSystemError.FileNotFound FileNotFound} when the parent of `uri` doesn't exist, e.g. no mkdirp-logic required. - * @throws {@linkcode FileSystemError.FileExists FileExists} when `uri` already exists. - * @throws {@linkcode FileSystemError.NoPermissions NoPermissions} when permissions aren't sufficient. - */ - createDirectory(uri: Uri): void | Thenable; - - /** - * Read the entire contents of a file. - * - * @param uri The uri of the file. - * @return An array of bytes or a thenable that resolves to such. - * @throws {@linkcode FileSystemError.FileNotFound FileNotFound} when `uri` doesn't exist. - */ - readFile(uri: Uri): Uint8Array | Thenable; - - /** - * Write data to a file, replacing its entire contents. - * - * @param uri The uri of the file. - * @param content The new content of the file. - * @param options Defines if missing files should or must be created. - * @throws {@linkcode FileSystemError.FileNotFound FileNotFound} when `uri` doesn't exist and `create` is not set. - * @throws {@linkcode FileSystemError.FileNotFound FileNotFound} when the parent of `uri` doesn't exist and `create` is set, e.g. no mkdirp-logic required. - * @throws {@linkcode FileSystemError.FileExists FileExists} when `uri` already exists, `create` is set but `overwrite` is not set. - * @throws {@linkcode FileSystemError.NoPermissions NoPermissions} when permissions aren't sufficient. - */ - writeFile(uri: Uri, content: Uint8Array, options: { readonly create: boolean; readonly overwrite: boolean }): void | Thenable; - - /** - * Delete a file. - * - * @param uri The resource that is to be deleted. - * @param options Defines if deletion of folders is recursive. - * @throws {@linkcode FileSystemError.FileNotFound FileNotFound} when `uri` doesn't exist. - * @throws {@linkcode FileSystemError.NoPermissions NoPermissions} when permissions aren't sufficient. - */ - delete(uri: Uri, options: { readonly recursive: boolean }): void | Thenable; - - /** - * Rename a file or folder. - * - * @param oldUri The existing file. - * @param newUri The new location. - * @param options Defines if existing files should be overwritten. - * @throws {@linkcode FileSystemError.FileNotFound FileNotFound} when `oldUri` doesn't exist. - * @throws {@linkcode FileSystemError.FileNotFound FileNotFound} when parent of `newUri` doesn't exist, e.g. no mkdirp-logic required. - * @throws {@linkcode FileSystemError.FileExists FileExists} when `newUri` exists and when the `overwrite` option is not `true`. - * @throws {@linkcode FileSystemError.NoPermissions NoPermissions} when permissions aren't sufficient. - */ - rename(oldUri: Uri, newUri: Uri, options: { readonly overwrite: boolean }): void | Thenable; - - /** - * Copy files or folders. Implementing this function is optional but it will speedup - * the copy operation. - * - * @param source The existing file. - * @param destination The destination location. - * @param options Defines if existing files should be overwritten. - * @throws {@linkcode FileSystemError.FileNotFound FileNotFound} when `source` doesn't exist. - * @throws {@linkcode FileSystemError.FileNotFound FileNotFound} when parent of `destination` doesn't exist, e.g. no mkdirp-logic required. - * @throws {@linkcode FileSystemError.FileExists FileExists} when `destination` exists and when the `overwrite` option is not `true`. - * @throws {@linkcode FileSystemError.NoPermissions NoPermissions} when permissions aren't sufficient. - */ - copy?(source: Uri, destination: Uri, options: { readonly overwrite: boolean }): void | Thenable; - } - - /** - * The file system interface exposes the editor's built-in and contributed - * {@link FileSystemProvider file system providers}. It allows extensions to work - * with files from the local disk as well as files from remote places, like the - * remote extension host or ftp-servers. - * - * *Note* that an instance of this interface is available as {@linkcode workspace.fs}. - */ - export interface FileSystem { - - /** - * Retrieve metadata about a file. - * - * @param uri The uri of the file to retrieve metadata about. - * @return The file metadata about the file. - */ - stat(uri: Uri): Thenable; - - /** - * Retrieve all entries of a {@link FileType.Directory directory}. - * - * @param uri The uri of the folder. - * @return An array of name/type-tuples or a thenable that resolves to such. - */ - readDirectory(uri: Uri): Thenable<[string, FileType][]>; - - /** - * Create a new directory (Note, that new files are created via `write`-calls). - * - * *Note* that missing directories are created automatically, e.g this call has - * `mkdirp` semantics. - * - * @param uri The uri of the new folder. - */ - createDirectory(uri: Uri): Thenable; - - /** - * Read the entire contents of a file. - * - * @param uri The uri of the file. - * @return An array of bytes or a thenable that resolves to such. - */ - readFile(uri: Uri): Thenable; - - /** - * Write data to a file, replacing its entire contents. - * - * @param uri The uri of the file. - * @param content The new content of the file. - */ - writeFile(uri: Uri, content: Uint8Array): Thenable; - - /** - * Delete a file. - * - * @param uri The resource that is to be deleted. - * @param options Defines if trash can should be used and if deletion of folders is recursive - */ - delete(uri: Uri, options?: { recursive?: boolean; useTrash?: boolean }): Thenable; - - /** - * Rename a file or folder. - * - * @param source The existing file. - * @param target The new location. - * @param options Defines if existing files should be overwritten. - */ - rename(source: Uri, target: Uri, options?: { overwrite?: boolean }): Thenable; - - /** - * Copy files or folders. - * - * @param source The existing file. - * @param target The destination location. - * @param options Defines if existing files should be overwritten. - */ - copy(source: Uri, target: Uri, options?: { overwrite?: boolean }): Thenable; - - /** - * Check if a given file system supports writing files. - * - * Keep in mind that just because a file system supports writing, that does - * not mean that writes will always succeed. There may be permissions issues - * or other errors that prevent writing a file. - * - * @param scheme The scheme of the filesystem, for example `file` or `git`. - * - * @return `true` if the file system supports writing, `false` if it does not - * support writing (i.e. it is readonly), and `undefined` if the editor does not - * know about the filesystem. - */ - isWritableFileSystem(scheme: string): boolean | undefined; - } - - /** - * Defines a port mapping used for localhost inside the webview. - */ - export interface WebviewPortMapping { - /** - * Localhost port to remap inside the webview. - */ - readonly webviewPort: number; - - /** - * Destination port. The `webviewPort` is resolved to this port. - */ - readonly extensionHostPort: number; - } - - /** - * Content settings for a webview. - */ - export interface WebviewOptions { - /** - * Controls whether scripts are enabled in the webview content or not. - * - * Defaults to false (scripts-disabled). - */ - readonly enableScripts?: boolean; - - /** - * Controls whether forms are enabled in the webview content or not. - * - * Defaults to true if {@link WebviewOptions.enableScripts scripts are enabled}. Otherwise defaults to false. - * Explicitly setting this property to either true or false overrides the default. - */ - readonly enableForms?: boolean; - - /** - * Controls whether command uris are enabled in webview content or not. - * - * Defaults to `false` (command uris are disabled). - * - * If you pass in an array, only the commands in the array are allowed. - */ - readonly enableCommandUris?: boolean | readonly string[]; - - /** - * Root paths from which the webview can load local (filesystem) resources using uris from `asWebviewUri` - * - * Default to the root folders of the current workspace plus the extension's install directory. - * - * Pass in an empty array to disallow access to any local resources. - */ - readonly localResourceRoots?: readonly Uri[]; - - /** - * Mappings of localhost ports used inside the webview. - * - * Port mapping allow webviews to transparently define how localhost ports are resolved. This can be used - * to allow using a static localhost port inside the webview that is resolved to random port that a service is - * running on. - * - * If a webview accesses localhost content, we recommend that you specify port mappings even if - * the `webviewPort` and `extensionHostPort` ports are the same. - * - * *Note* that port mappings only work for `http` or `https` urls. Websocket urls (e.g. `ws://localhost:3000`) - * cannot be mapped to another port. - */ - readonly portMapping?: readonly WebviewPortMapping[]; - } - - /** - * Displays html content, similarly to an iframe. - */ - export interface Webview { - /** - * Content settings for the webview. - */ - options: WebviewOptions; - - /** - * HTML contents of the webview. - * - * This should be a complete, valid html document. Changing this property causes the webview to be reloaded. - * - * Webviews are sandboxed from normal extension process, so all communication with the webview must use - * message passing. To send a message from the extension to the webview, use {@linkcode Webview.postMessage postMessage}. - * To send message from the webview back to an extension, use the `acquireVsCodeApi` function inside the webview - * to get a handle to the editor's api and then call `.postMessage()`: - * - * ```html - * - * ``` - * - * To load a resources from the workspace inside a webview, use the {@linkcode Webview.asWebviewUri asWebviewUri} method - * and ensure the resource's directory is listed in {@linkcode WebviewOptions.localResourceRoots}. - * - * Keep in mind that even though webviews are sandboxed, they still allow running scripts and loading arbitrary content, - * so extensions must follow all standard web security best practices when working with webviews. This includes - * properly sanitizing all untrusted input (including content from the workspace) and - * setting a [content security policy](https://aka.ms/vscode-api-webview-csp). - */ - html: string; - - /** - * Fired when the webview content posts a message. - * - * Webview content can post strings or json serializable objects back to an extension. They cannot - * post `Blob`, `File`, `ImageData` and other DOM specific objects since the extension that receives the - * message does not run in a browser environment. - */ - readonly onDidReceiveMessage: Event; - - /** - * Post a message to the webview content. - * - * Messages are only delivered if the webview is live (either visible or in the - * background with `retainContextWhenHidden`). - * - * @param message Body of the message. This must be a string or other json serializable object. - * - * For older versions of vscode, if an `ArrayBuffer` is included in `message`, - * it will not be serialized properly and will not be received by the webview. - * Similarly any TypedArrays, such as a `Uint8Array`, will be very inefficiently - * serialized and will also not be recreated as a typed array inside the webview. - * - * However if your extension targets vscode 1.57+ in the `engines` field of its - * `package.json`, any `ArrayBuffer` values that appear in `message` will be more - * efficiently transferred to the webview and will also be correctly recreated inside - * of the webview. - * - * @return A promise that resolves when the message is posted to a webview or when it is - * dropped because the message was not deliverable. - * - * Returns `true` if the message was posted to the webview. Messages can only be posted to - * live webviews (i.e. either visible webviews or hidden webviews that set `retainContextWhenHidden`). - * - * A response of `true` does not mean that the message was actually received by the webview. - * For example, no message listeners may be have been hooked up inside the webview or the webview may - * have been destroyed after the message was posted but before it was received. - * - * If you want confirm that a message as actually received, you can try having your webview posting a - * confirmation message back to your extension. - */ - postMessage(message: any): Thenable; - - /** - * Convert a uri for the local file system to one that can be used inside webviews. - * - * Webviews cannot directly load resources from the workspace or local file system using `file:` uris. The - * `asWebviewUri` function takes a local `file:` uri and converts it into a uri that can be used inside of - * a webview to load the same resource: - * - * ```ts - * webview.html = `` - * ``` - */ - asWebviewUri(localResource: Uri): Uri; - - /** - * Content security policy source for webview resources. - * - * This is the origin that should be used in a content security policy rule: - * - * ```ts - * `img-src https: ${webview.cspSource} ...;` - * ``` - */ - readonly cspSource: string; - } - - /** - * Content settings for a webview panel. - */ - export interface WebviewPanelOptions { - /** - * Controls if the find widget is enabled in the panel. - * - * Defaults to `false`. - */ - readonly enableFindWidget?: boolean; - - /** - * Controls if the webview panel's content (iframe) is kept around even when the panel - * is no longer visible. - * - * Normally the webview panel's html context is created when the panel becomes visible - * and destroyed when it is hidden. Extensions that have complex state - * or UI can set the `retainContextWhenHidden` to make the editor keep the webview - * context around, even when the webview moves to a background tab. When a webview using - * `retainContextWhenHidden` becomes hidden, its scripts and other dynamic content are suspended. - * When the panel becomes visible again, the context is automatically restored - * in the exact same state it was in originally. You cannot send messages to a - * hidden webview, even with `retainContextWhenHidden` enabled. - * - * `retainContextWhenHidden` has a high memory overhead and should only be used if - * your panel's context cannot be quickly saved and restored. - */ - readonly retainContextWhenHidden?: boolean; - } - - /** - * A panel that contains a webview. - */ - interface WebviewPanel { - /** - * Identifies the type of the webview panel, such as `'markdown.preview'`. - */ - readonly viewType: string; - - /** - * Title of the panel shown in UI. - */ - title: string; - - /** - * Icon for the panel shown in UI. - */ - iconPath?: Uri | { readonly light: Uri; readonly dark: Uri }; - - /** - * {@linkcode Webview} belonging to the panel. - */ - readonly webview: Webview; - - /** - * Content settings for the webview panel. - */ - readonly options: WebviewPanelOptions; - - /** - * Editor position of the panel. This property is only set if the webview is in - * one of the editor view columns. - */ - readonly viewColumn: ViewColumn | undefined; - - /** - * Whether the panel is active (focused by the user). - */ - readonly active: boolean; - - /** - * Whether the panel is visible. - */ - readonly visible: boolean; - - /** - * Fired when the panel's view state changes. - */ - readonly onDidChangeViewState: Event; - - /** - * Fired when the panel is disposed. - * - * This may be because the user closed the panel or because `.dispose()` was - * called on it. - * - * Trying to use the panel after it has been disposed throws an exception. - */ - readonly onDidDispose: Event; - - /** - * Show the webview panel in a given column. - * - * A webview panel may only show in a single column at a time. If it is already showing, this - * method moves it to a new column. - * - * @param viewColumn View column to show the panel in. Shows in the current `viewColumn` if undefined. - * @param preserveFocus When `true`, the webview will not take focus. - */ - reveal(viewColumn?: ViewColumn, preserveFocus?: boolean): void; - - /** - * Dispose of the webview panel. - * - * This closes the panel if it showing and disposes of the resources owned by the webview. - * Webview panels are also disposed when the user closes the webview panel. Both cases - * fire the `onDispose` event. - */ - dispose(): any; - } - - /** - * Event fired when a webview panel's view state changes. - */ - export interface WebviewPanelOnDidChangeViewStateEvent { - /** - * Webview panel whose view state changed. - */ - readonly webviewPanel: WebviewPanel; - } - - /** - * Restore webview panels that have been persisted when vscode shuts down. - * - * There are two types of webview persistence: - * - * - Persistence within a session. - * - Persistence across sessions (across restarts of the editor). - * - * A `WebviewPanelSerializer` is only required for the second case: persisting a webview across sessions. - * - * Persistence within a session allows a webview to save its state when it becomes hidden - * and restore its content from this state when it becomes visible again. It is powered entirely - * by the webview content itself. To save off a persisted state, call `acquireVsCodeApi().setState()` with - * any json serializable object. To restore the state again, call `getState()` - * - * ```js - * // Within the webview - * const vscode = acquireVsCodeApi(); - * - * // Get existing state - * const oldState = vscode.getState() || { value: 0 }; - * - * // Update state - * setState({ value: oldState.value + 1 }) - * ``` - * - * A `WebviewPanelSerializer` extends this persistence across restarts of the editor. When the editor is shutdown, - * it will save off the state from `setState` of all webviews that have a serializer. When the - * webview first becomes visible after the restart, this state is passed to `deserializeWebviewPanel`. - * The extension can then restore the old `WebviewPanel` from this state. - * - * @param T Type of the webview's state. - */ - interface WebviewPanelSerializer { - /** - * Restore a webview panel from its serialized `state`. - * - * Called when a serialized webview first becomes visible. - * - * @param webviewPanel Webview panel to restore. The serializer should take ownership of this panel. The - * serializer must restore the webview's `.html` and hook up all webview events. - * @param state Persisted state from the webview content. - * - * @return Thenable indicating that the webview has been fully restored. - */ - deserializeWebviewPanel(webviewPanel: WebviewPanel, state: T): Thenable; - } - - /** - * A webview based view. - */ - export interface WebviewView { - /** - * Identifies the type of the webview view, such as `'hexEditor.dataView'`. - */ - readonly viewType: string; - - /** - * The underlying webview for the view. - */ - readonly webview: Webview; - - /** - * View title displayed in the UI. - * - * The view title is initially taken from the extension `package.json` contribution. - */ - title?: string; - - /** - * Human-readable string which is rendered less prominently in the title. - */ - description?: string; - - /** - * The badge to display for this webview view. - * To remove the badge, set to undefined. - */ - badge?: ViewBadge | undefined; - - /** - * Event fired when the view is disposed. - * - * Views are disposed when they are explicitly hidden by a user (this happens when a user - * right clicks in a view and unchecks the webview view). - * - * Trying to use the view after it has been disposed throws an exception. - */ - readonly onDidDispose: Event; - - /** - * Tracks if the webview is currently visible. - * - * Views are visible when they are on the screen and expanded. - */ - readonly visible: boolean; - - /** - * Event fired when the visibility of the view changes. - * - * Actions that trigger a visibility change: - * - * - The view is collapsed or expanded. - * - The user switches to a different view group in the sidebar or panel. - * - * Note that hiding a view using the context menu instead disposes of the view and fires `onDidDispose`. - */ - readonly onDidChangeVisibility: Event; - - /** - * Reveal the view in the UI. - * - * If the view is collapsed, this will expand it. - * - * @param preserveFocus When `true` the view will not take focus. - */ - show(preserveFocus?: boolean): void; - } - - /** - * Additional information the webview view being resolved. - * - * @param T Type of the webview's state. - */ - interface WebviewViewResolveContext { - /** - * Persisted state from the webview content. - * - * To save resources, the editor normally deallocates webview documents (the iframe content) that are not visible. - * For example, when the user collapse a view or switches to another top level activity in the sidebar, the - * `WebviewView` itself is kept alive but the webview's underlying document is deallocated. It is recreated when - * the view becomes visible again. - * - * You can prevent this behavior by setting `retainContextWhenHidden` in the `WebviewOptions`. However this - * increases resource usage and should be avoided wherever possible. Instead, you can use persisted state to - * save off a webview's state so that it can be quickly recreated as needed. - * - * To save off a persisted state, inside the webview call `acquireVsCodeApi().setState()` with - * any json serializable object. To restore the state again, call `getState()`. For example: - * - * ```js - * // Within the webview - * const vscode = acquireVsCodeApi(); - * - * // Get existing state - * const oldState = vscode.getState() || { value: 0 }; - * - * // Update state - * setState({ value: oldState.value + 1 }) - * ``` - * - * The editor ensures that the persisted state is saved correctly when a webview is hidden and across - * editor restarts. - */ - readonly state: T | undefined; - } - - /** - * Provider for creating `WebviewView` elements. - */ - export interface WebviewViewProvider { - /** - * Revolves a webview view. - * - * `resolveWebviewView` is called when a view first becomes visible. This may happen when the view is - * first loaded or when the user hides and then shows a view again. - * - * @param webviewView Webview view to restore. The provider should take ownership of this view. The - * provider must set the webview's `.html` and hook up all webview events it is interested in. - * @param context Additional metadata about the view being resolved. - * @param token Cancellation token indicating that the view being provided is no longer needed. - * - * @return Optional thenable indicating that the view has been fully resolved. - */ - resolveWebviewView(webviewView: WebviewView, context: WebviewViewResolveContext, token: CancellationToken): Thenable | void; - } - - /** - * Provider for text based custom editors. - * - * Text based custom editors use a {@linkcode TextDocument} as their data model. This considerably simplifies - * implementing a custom editor as it allows the editor to handle many common operations such as - * undo and backup. The provider is responsible for synchronizing text changes between the webview and the `TextDocument`. - */ - export interface CustomTextEditorProvider { - - /** - * Resolve a custom editor for a given text resource. - * - * This is called when a user first opens a resource for a `CustomTextEditorProvider`, or if they reopen an - * existing editor using this `CustomTextEditorProvider`. - * - * - * @param document Document for the resource to resolve. - * - * @param webviewPanel The webview panel used to display the editor UI for this resource. - * - * During resolve, the provider must fill in the initial html for the content webview panel and hook up all - * the event listeners on it that it is interested in. The provider can also hold onto the `WebviewPanel` to - * use later for example in a command. See {@linkcode WebviewPanel} for additional details. - * - * @param token A cancellation token that indicates the result is no longer needed. - * - * @return Thenable indicating that the custom editor has been resolved. - */ - resolveCustomTextEditor(document: TextDocument, webviewPanel: WebviewPanel, token: CancellationToken): Thenable | void; - } - - /** - * Represents a custom document used by a {@linkcode CustomEditorProvider}. - * - * Custom documents are only used within a given `CustomEditorProvider`. The lifecycle of a `CustomDocument` is - * managed by the editor. When no more references remain to a `CustomDocument`, it is disposed of. - */ - interface CustomDocument { - /** - * The associated uri for this document. - */ - readonly uri: Uri; - - /** - * Dispose of the custom document. - * - * This is invoked by the editor when there are no more references to a given `CustomDocument` (for example when - * all editors associated with the document have been closed.) - */ - dispose(): void; - } - - /** - * Event triggered by extensions to signal to the editor that an edit has occurred on an {@linkcode CustomDocument}. - * - * @see {@linkcode CustomEditorProvider.onDidChangeCustomDocument}. - */ - interface CustomDocumentEditEvent { - - /** - * The document that the edit is for. - */ - readonly document: T; - - /** - * Undo the edit operation. - * - * This is invoked by the editor when the user undoes this edit. To implement `undo`, your - * extension should restore the document and editor to the state they were in just before this - * edit was added to the editor's internal edit stack by `onDidChangeCustomDocument`. - */ - undo(): Thenable | void; - - /** - * Redo the edit operation. - * - * This is invoked by the editor when the user redoes this edit. To implement `redo`, your - * extension should restore the document and editor to the state they were in just after this - * edit was added to the editor's internal edit stack by `onDidChangeCustomDocument`. - */ - redo(): Thenable | void; - - /** - * Display name describing the edit. - * - * This will be shown to users in the UI for undo/redo operations. - */ - readonly label?: string; - } - - /** - * Event triggered by extensions to signal to the editor that the content of a {@linkcode CustomDocument} - * has changed. - * - * @see {@linkcode CustomEditorProvider.onDidChangeCustomDocument}. - */ - interface CustomDocumentContentChangeEvent { - /** - * The document that the change is for. - */ - readonly document: T; - } - - /** - * A backup for an {@linkcode CustomDocument}. - */ - interface CustomDocumentBackup { - /** - * Unique identifier for the backup. - * - * This id is passed back to your extension in `openCustomDocument` when opening a custom editor from a backup. - */ - readonly id: string; - - /** - * Delete the current backup. - * - * This is called by the editor when it is clear the current backup is no longer needed, such as when a new backup - * is made or when the file is saved. - */ - delete(): void; - } - - /** - * Additional information used to implement {@linkcode CustomDocumentBackup}. - */ - interface CustomDocumentBackupContext { - /** - * Suggested file location to write the new backup. - * - * Note that your extension is free to ignore this and use its own strategy for backup. - * - * If the editor is for a resource from the current workspace, `destination` will point to a file inside - * `ExtensionContext.storagePath`. The parent folder of `destination` may not exist, so make sure to created it - * before writing the backup to this location. - */ - readonly destination: Uri; - } - - /** - * Additional information about the opening custom document. - */ - interface CustomDocumentOpenContext { - /** - * The id of the backup to restore the document from or `undefined` if there is no backup. - * - * If this is provided, your extension should restore the editor from the backup instead of reading the file - * from the user's workspace. - */ - readonly backupId: string | undefined; - - /** - * If the URI is an untitled file, this will be populated with the byte data of that file - * - * If this is provided, your extension should utilize this byte data rather than executing fs APIs on the URI passed in - */ - readonly untitledDocumentData: Uint8Array | undefined; - } - - /** - * Provider for readonly custom editors that use a custom document model. - * - * Custom editors use {@linkcode CustomDocument} as their document model instead of a {@linkcode TextDocument}. - * - * You should use this type of custom editor when dealing with binary files or more complex scenarios. For simple - * text based documents, use {@linkcode CustomTextEditorProvider} instead. - * - * @param T Type of the custom document returned by this provider. - */ - export interface CustomReadonlyEditorProvider { - - /** - * Create a new document for a given resource. - * - * `openCustomDocument` is called when the first time an editor for a given resource is opened. The opened - * document is then passed to `resolveCustomEditor` so that the editor can be shown to the user. - * - * Already opened `CustomDocument` are re-used if the user opened additional editors. When all editors for a - * given resource are closed, the `CustomDocument` is disposed of. Opening an editor at this point will - * trigger another call to `openCustomDocument`. - * - * @param uri Uri of the document to open. - * @param openContext Additional information about the opening custom document. - * @param token A cancellation token that indicates the result is no longer needed. - * - * @return The custom document. - */ - openCustomDocument(uri: Uri, openContext: CustomDocumentOpenContext, token: CancellationToken): Thenable | T; - - /** - * Resolve a custom editor for a given resource. - * - * This is called whenever the user opens a new editor for this `CustomEditorProvider`. - * - * @param document Document for the resource being resolved. - * - * @param webviewPanel The webview panel used to display the editor UI for this resource. - * - * During resolve, the provider must fill in the initial html for the content webview panel and hook up all - * the event listeners on it that it is interested in. The provider can also hold onto the `WebviewPanel` to - * use later for example in a command. See {@linkcode WebviewPanel} for additional details. - * - * @param token A cancellation token that indicates the result is no longer needed. - * - * @return Optional thenable indicating that the custom editor has been resolved. - */ - resolveCustomEditor(document: T, webviewPanel: WebviewPanel, token: CancellationToken): Thenable | void; - } - - /** - * Provider for editable custom editors that use a custom document model. - * - * Custom editors use {@linkcode CustomDocument} as their document model instead of a {@linkcode TextDocument}. - * This gives extensions full control over actions such as edit, save, and backup. - * - * You should use this type of custom editor when dealing with binary files or more complex scenarios. For simple - * text based documents, use {@linkcode CustomTextEditorProvider} instead. - * - * @param T Type of the custom document returned by this provider. - */ - export interface CustomEditorProvider extends CustomReadonlyEditorProvider { - /** - * Signal that an edit has occurred inside a custom editor. - * - * This event must be fired by your extension whenever an edit happens in a custom editor. An edit can be - * anything from changing some text, to cropping an image, to reordering a list. Your extension is free to - * define what an edit is and what data is stored on each edit. - * - * Firing `onDidChange` causes the editors to be marked as being dirty. This is cleared when the user either - * saves or reverts the file. - * - * Editors that support undo/redo must fire a `CustomDocumentEditEvent` whenever an edit happens. This allows - * users to undo and redo the edit using the editor's standard keyboard shortcuts. The editor will also mark - * the editor as no longer being dirty if the user undoes all edits to the last saved state. - * - * Editors that support editing but cannot use the editor's standard undo/redo mechanism must fire a `CustomDocumentContentChangeEvent`. - * The only way for a user to clear the dirty state of an editor that does not support undo/redo is to either - * `save` or `revert` the file. - * - * An editor should only ever fire `CustomDocumentEditEvent` events, or only ever fire `CustomDocumentContentChangeEvent` events. - */ - readonly onDidChangeCustomDocument: Event> | Event>; - - /** - * Save a custom document. - * - * This method is invoked by the editor when the user saves a custom editor. This can happen when the user - * triggers save while the custom editor is active, by commands such as `save all`, or by auto save if enabled. - * - * To implement `save`, the implementer must persist the custom editor. This usually means writing the - * file data for the custom document to disk. After `save` completes, any associated editor instances will - * no longer be marked as dirty. - * - * @param document Document to save. - * @param cancellation Token that signals the save is no longer required (for example, if another save was triggered). - * - * @return Thenable signaling that saving has completed. - */ - saveCustomDocument(document: T, cancellation: CancellationToken): Thenable; - - /** - * Save a custom document to a different location. - * - * This method is invoked by the editor when the user triggers 'save as' on a custom editor. The implementer must - * persist the custom editor to `destination`. - * - * When the user accepts save as, the current editor is be replaced by an non-dirty editor for the newly saved file. - * - * @param document Document to save. - * @param destination Location to save to. - * @param cancellation Token that signals the save is no longer required. - * - * @return Thenable signaling that saving has completed. - */ - saveCustomDocumentAs(document: T, destination: Uri, cancellation: CancellationToken): Thenable; - - /** - * Revert a custom document to its last saved state. - * - * This method is invoked by the editor when the user triggers `File: Revert File` in a custom editor. (Note that - * this is only used using the editor's `File: Revert File` command and not on a `git revert` of the file). - * - * To implement `revert`, the implementer must make sure all editor instances (webviews) for `document` - * are displaying the document in the same state is saved in. This usually means reloading the file from the - * workspace. - * - * @param document Document to revert. - * @param cancellation Token that signals the revert is no longer required. - * - * @return Thenable signaling that the change has completed. - */ - revertCustomDocument(document: T, cancellation: CancellationToken): Thenable; - - /** - * Back up a dirty custom document. - * - * Backups are used for hot exit and to prevent data loss. Your `backup` method should persist the resource in - * its current state, i.e. with the edits applied. Most commonly this means saving the resource to disk in - * the `ExtensionContext.storagePath`. When the editor reloads and your custom editor is opened for a resource, - * your extension should first check to see if any backups exist for the resource. If there is a backup, your - * extension should load the file contents from there instead of from the resource in the workspace. - * - * `backup` is triggered approximately one second after the user stops editing the document. If the user - * rapidly edits the document, `backup` will not be invoked until the editing stops. - * - * `backup` is not invoked when `auto save` is enabled (since auto save already persists the resource). - * - * @param document Document to backup. - * @param context Information that can be used to backup the document. - * @param cancellation Token that signals the current backup since a new backup is coming in. It is up to your - * extension to decided how to respond to cancellation. If for example your extension is backing up a large file - * in an operation that takes time to complete, your extension may decide to finish the ongoing backup rather - * than cancelling it to ensure that the editor has some valid backup. - */ - backupCustomDocument(document: T, context: CustomDocumentBackupContext, cancellation: CancellationToken): Thenable; - } - - /** - * The clipboard provides read and write access to the system's clipboard. - */ - export interface Clipboard { - - /** - * Read the current clipboard contents as text. - * @returns A thenable that resolves to a string. - */ - readText(): Thenable; - - /** - * Writes text into the clipboard. - * @returns A thenable that resolves when writing happened. - */ - writeText(value: string): Thenable; - } - - /** - * Possible kinds of UI that can use extensions. - */ - export enum UIKind { - - /** - * Extensions are accessed from a desktop application. - */ - Desktop = 1, - - /** - * Extensions are accessed from a web browser. - */ - Web = 2 - } - - /** - * Log levels - */ - export enum LogLevel { - - /** - * No messages are logged with this level. - */ - Off = 0, - - /** - * All messages are logged with this level. - */ - Trace = 1, - - /** - * Messages with debug and higher log level are logged with this level. - */ - Debug = 2, - - /** - * Messages with info and higher log level are logged with this level. - */ - Info = 3, - - /** - * Messages with warning and higher log level are logged with this level. - */ - Warning = 4, - - /** - * Only error messages are logged with this level. - */ - Error = 5 - } - - /** - * Namespace describing the environment the editor runs in. - */ - export namespace env { - - /** - * The application name of the editor, like 'VS Code'. - */ - export const appName: string; - - /** - * The application root folder from which the editor is running. - * - * *Note* that the value is the empty string when running in an - * environment that has no representation of an application root folder. - */ - export const appRoot: string; - - /** - * The hosted location of the application - * On desktop this is 'desktop' - * In the web this is the specified embedder i.e. 'github.dev', 'codespaces', or 'web' if the embedder - * does not provide that information - */ - export const appHost: string; - - /** - * The custom uri scheme the editor registers to in the operating system. - */ - export const uriScheme: string; - - /** - * Represents the preferred user-language, like `de-CH`, `fr`, or `en-US`. - */ - export const language: string; - - /** - * The system clipboard. - */ - export const clipboard: Clipboard; - - /** - * A unique identifier for the computer. - */ - export const machineId: string; - - /** - * A unique identifier for the current session. - * Changes each time the editor is started. - */ - export const sessionId: string; - - /** - * Indicates that this is a fresh install of the application. - * `true` if within the first day of installation otherwise `false`. - */ - export const isNewAppInstall: boolean; - - /** - * Indicates whether the users has telemetry enabled. - * Can be observed to determine if the extension should send telemetry. - */ - export const isTelemetryEnabled: boolean; - - /** - * An {@link Event} which fires when the user enabled or disables telemetry. - * `true` if the user has enabled telemetry or `false` if the user has disabled telemetry. - */ - export const onDidChangeTelemetryEnabled: Event; - - /** - * Creates a new {@link TelemetryLogger telemetry logger}. - * - * @param sender The telemetry sender that is used by the telemetry logger. - * @param options Options for the telemetry logger. - * @returns A new telemetry logger - */ - export function createTelemetryLogger(sender: TelemetrySender, options?: TelemetryLoggerOptions): TelemetryLogger; - - /** - * The name of a remote. Defined by extensions, popular samples are `wsl` for the Windows - * Subsystem for Linux or `ssh-remote` for remotes using a secure shell. - * - * *Note* that the value is `undefined` when there is no remote extension host but that the - * value is defined in all extension hosts (local and remote) in case a remote extension host - * exists. Use {@link Extension.extensionKind} to know if - * a specific extension runs remote or not. - */ - export const remoteName: string | undefined; - - /** - * The detected default shell for the extension host, this is overridden by the - * `terminal.integrated.defaultProfile` setting for the extension host's platform. Note that in - * environments that do not support a shell the value is the empty string. - */ - export const shell: string; - - /** - * The UI kind property indicates from which UI extensions - * are accessed from. For example, extensions could be accessed - * from a desktop application or a web browser. - */ - export const uiKind: UIKind; - - /** - * Opens a link externally using the default application. Depending on the - * used scheme this can be: - * * a browser (`http:`, `https:`) - * * a mail client (`mailto:`) - * * VSCode itself (`vscode:` from `vscode.env.uriScheme`) - * - * *Note* that {@linkcode window.showTextDocument showTextDocument} is the right - * way to open a text document inside the editor, not this function. - * - * @param target The uri that should be opened. - * @returns A promise indicating if open was successful. - */ - export function openExternal(target: Uri): Thenable; - - /** - * Resolves a uri to a form that is accessible externally. - * - * #### `http:` or `https:` scheme - * - * Resolves an *external* uri, such as a `http:` or `https:` link, from where the extension is running to a - * uri to the same resource on the client machine. - * - * This is a no-op if the extension is running on the client machine. - * - * If the extension is running remotely, this function automatically establishes a port forwarding tunnel - * from the local machine to `target` on the remote and returns a local uri to the tunnel. The lifetime of - * the port forwarding tunnel is managed by the editor and the tunnel can be closed by the user. - * - * *Note* that uris passed through `openExternal` are automatically resolved and you should not call `asExternalUri` on them. - * - * #### `vscode.env.uriScheme` - * - * Creates a uri that - if opened in a browser (e.g. via `openExternal`) - will result in a registered {@link UriHandler} - * to trigger. - * - * Extensions should not make any assumptions about the resulting uri and should not alter it in any way. - * Rather, extensions can e.g. use this uri in an authentication flow, by adding the uri as callback query - * argument to the server to authenticate to. - * - * *Note* that if the server decides to add additional query parameters to the uri (e.g. a token or secret), it - * will appear in the uri that is passed to the {@link UriHandler}. - * - * **Example** of an authentication flow: - * ```typescript - * vscode.window.registerUriHandler({ - * handleUri(uri: vscode.Uri): vscode.ProviderResult { - * if (uri.path === '/did-authenticate') { - * console.log(uri.toString()); - * } - * } - * }); - * - * const callableUri = await vscode.env.asExternalUri(vscode.Uri.parse(vscode.env.uriScheme + '://my.extension/did-authenticate')); - * await vscode.env.openExternal(callableUri); - * ``` - * - * *Note* that extensions should not cache the result of `asExternalUri` as the resolved uri may become invalid due to - * a system or user action — for example, in remote cases, a user may close a port forwarding tunnel that was opened by - * `asExternalUri`. - * - * #### Any other scheme - * - * Any other scheme will be handled as if the provided URI is a workspace URI. In that case, the method will return - * a URI which, when handled, will make the editor open the workspace. - * - * @return A uri that can be used on the client machine. - */ - export function asExternalUri(target: Uri): Thenable; - - /** - * The current log level of the editor. - */ - export const logLevel: LogLevel; - - /** - * An {@link Event} which fires when the log level of the editor changes. - */ - export const onDidChangeLogLevel: Event; - } - - /** - * Namespace for dealing with commands. In short, a command is a function with a - * unique identifier. The function is sometimes also called _command handler_. - * - * Commands can be added to the editor using the {@link commands.registerCommand registerCommand} - * and {@link commands.registerTextEditorCommand registerTextEditorCommand} functions. Commands - * can be executed {@link commands.executeCommand manually} or from a UI gesture. Those are: - * - * * palette - Use the `commands`-section in `package.json` to make a command show in - * the [command palette](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette). - * * keybinding - Use the `keybindings`-section in `package.json` to enable - * [keybindings](https://code.visualstudio.com/docs/getstarted/keybindings#_customizing-shortcuts) - * for your extension. - * - * Commands from other extensions and from the editor itself are accessible to an extension. However, - * when invoking an editor command not all argument types are supported. - * - * This is a sample that registers a command handler and adds an entry for that command to the palette. First - * register a command handler with the identifier `extension.sayHello`. - * ```javascript - * commands.registerCommand('extension.sayHello', () => { - * window.showInformationMessage('Hello World!'); - * }); - * ``` - * Second, bind the command identifier to a title under which it will show in the palette (`package.json`). - * ```json - * { - * "contributes": { - * "commands": [{ - * "command": "extension.sayHello", - * "title": "Hello World" - * }] - * } - * } - * ``` - */ - export namespace commands { - - /** - * Registers a command that can be invoked via a keyboard shortcut, - * a menu item, an action, or directly. - * - * Registering a command with an existing command identifier twice - * will cause an error. - * - * @param command A unique identifier for the command. - * @param callback A command handler function. - * @param thisArg The `this` context used when invoking the handler function. - * @return Disposable which unregisters this command on disposal. - */ - export function registerCommand(command: string, callback: (...args: any[]) => any, thisArg?: any): Disposable; - - /** - * Registers a text editor command that can be invoked via a keyboard shortcut, - * a menu item, an action, or directly. - * - * Text editor commands are different from ordinary {@link commands.registerCommand commands} as - * they only execute when there is an active editor when the command is called. Also, the - * command handler of an editor command has access to the active editor and to an - * {@link TextEditorEdit edit}-builder. Note that the edit-builder is only valid while the - * callback executes. - * - * @param command A unique identifier for the command. - * @param callback A command handler function with access to an {@link TextEditor editor} and an {@link TextEditorEdit edit}. - * @param thisArg The `this` context used when invoking the handler function. - * @return Disposable which unregisters this command on disposal. - */ - export function registerTextEditorCommand(command: string, callback: (textEditor: TextEditor, edit: TextEditorEdit, ...args: any[]) => void, thisArg?: any): Disposable; - - /** - * Executes the command denoted by the given command identifier. - * - * * *Note 1:* When executing an editor command not all types are allowed to - * be passed as arguments. Allowed are the primitive types `string`, `boolean`, - * `number`, `undefined`, and `null`, as well as {@linkcode Position}, {@linkcode Range}, {@linkcode Uri} and {@linkcode Location}. - * * *Note 2:* There are no restrictions when executing commands that have been contributed - * by extensions. - * - * @param command Identifier of the command to execute. - * @param rest Parameters passed to the command function. - * @return A thenable that resolves to the returned value of the given command. Returns `undefined` when - * the command handler function doesn't return anything. - */ - export function executeCommand(command: string, ...rest: any[]): Thenable; - - /** - * Retrieve the list of all available commands. Commands starting with an underscore are - * treated as internal commands. - * - * @param filterInternal Set `true` to not see internal commands (starting with an underscore) - * @return Thenable that resolves to a list of command ids. - */ - export function getCommands(filterInternal?: boolean): Thenable; - } - - /** - * Represents the state of a window. - */ - export interface WindowState { - - /** - * Whether the current window is focused. - */ - readonly focused: boolean; - } - - /** - * A uri handler is responsible for handling system-wide {@link Uri uris}. - * - * @see {@link window.registerUriHandler}. - */ - export interface UriHandler { - - /** - * Handle the provided system-wide {@link Uri}. - * - * @see {@link window.registerUriHandler}. - */ - handleUri(uri: Uri): ProviderResult; - } - - /** - * Namespace for dealing with the current window of the editor. That is visible - * and active editors, as well as, UI elements to show messages, selections, and - * asking for user input. - */ - export namespace window { - - /** - * Represents the grid widget within the main editor area - */ - export const tabGroups: TabGroups; - - /** - * The currently active editor or `undefined`. The active editor is the one - * that currently has focus or, when none has focus, the one that has changed - * input most recently. - */ - export let activeTextEditor: TextEditor | undefined; - - /** - * The currently visible editors or an empty array. - */ - export let visibleTextEditors: readonly TextEditor[]; - - /** - * An {@link Event} which fires when the {@link window.activeTextEditor active editor} - * has changed. *Note* that the event also fires when the active editor changes - * to `undefined`. - */ - export const onDidChangeActiveTextEditor: Event; - - /** - * An {@link Event} which fires when the array of {@link window.visibleTextEditors visible editors} - * has changed. - */ - export const onDidChangeVisibleTextEditors: Event; - - /** - * An {@link Event} which fires when the selection in an editor has changed. - */ - export const onDidChangeTextEditorSelection: Event; - - /** - * An {@link Event} which fires when the visible ranges of an editor has changed. - */ - export const onDidChangeTextEditorVisibleRanges: Event; - - /** - * An {@link Event} which fires when the options of an editor have changed. - */ - export const onDidChangeTextEditorOptions: Event; - - /** - * An {@link Event} which fires when the view column of an editor has changed. - */ - export const onDidChangeTextEditorViewColumn: Event; - - /** - * The currently visible {@link NotebookEditor notebook editors} or an empty array. - */ - export const visibleNotebookEditors: readonly NotebookEditor[]; - - /** - * An {@link Event} which fires when the {@link window.visibleNotebookEditors visible notebook editors} - * has changed. - */ - export const onDidChangeVisibleNotebookEditors: Event; - - /** - * The currently active {@link NotebookEditor notebook editor} or `undefined`. The active editor is the one - * that currently has focus or, when none has focus, the one that has changed - * input most recently. - */ - export const activeNotebookEditor: NotebookEditor | undefined; - - /** - * An {@link Event} which fires when the {@link window.activeNotebookEditor active notebook editor} - * has changed. *Note* that the event also fires when the active editor changes - * to `undefined`. - */ - export const onDidChangeActiveNotebookEditor: Event; - - /** - * An {@link Event} which fires when the {@link NotebookEditor.selections notebook editor selections} - * have changed. - */ - export const onDidChangeNotebookEditorSelection: Event; - - /** - * An {@link Event} which fires when the {@link NotebookEditor.visibleRanges notebook editor visible ranges} - * have changed. - */ - export const onDidChangeNotebookEditorVisibleRanges: Event; - - /** - * The currently opened terminals or an empty array. - */ - export const terminals: readonly Terminal[]; - - /** - * The currently active terminal or `undefined`. The active terminal is the one that - * currently has focus or most recently had focus. - */ - export const activeTerminal: Terminal | undefined; - - /** - * An {@link Event} which fires when the {@link window.activeTerminal active terminal} - * has changed. *Note* that the event also fires when the active terminal changes - * to `undefined`. - */ - export const onDidChangeActiveTerminal: Event; - - /** - * An {@link Event} which fires when a terminal has been created, either through the - * {@link window.createTerminal createTerminal} API or commands. - */ - export const onDidOpenTerminal: Event; - - /** - * An {@link Event} which fires when a terminal is disposed. - */ - export const onDidCloseTerminal: Event; - - /** - * An {@link Event} which fires when a {@link Terminal.state terminal's state} has changed. - */ - export const onDidChangeTerminalState: Event; - - /** - * Represents the current window's state. - */ - export const state: WindowState; - - /** - * An {@link Event} which fires when the focus state of the current window - * changes. The value of the event represents whether the window is focused. - */ - export const onDidChangeWindowState: Event; - - /** - * Show the given document in a text editor. A {@link ViewColumn column} can be provided - * to control where the editor is being shown. Might change the {@link window.activeTextEditor active editor}. - * - * @param document A text document to be shown. - * @param column A view column in which the {@link TextEditor editor} should be shown. The default is the {@link ViewColumn.Active active}. - * Columns that do not exist will be created as needed up to the maximum of {@linkcode ViewColumn.Nine}. Use {@linkcode ViewColumn.Beside} - * to open the editor to the side of the currently active one. - * @param preserveFocus When `true` the editor will not take focus. - * @return A promise that resolves to an {@link TextEditor editor}. - */ - export function showTextDocument(document: TextDocument, column?: ViewColumn, preserveFocus?: boolean): Thenable; - - /** - * Show the given document in a text editor. {@link TextDocumentShowOptions Options} can be provided - * to control options of the editor is being shown. Might change the {@link window.activeTextEditor active editor}. - * - * @param document A text document to be shown. - * @param options {@link TextDocumentShowOptions Editor options} to configure the behavior of showing the {@link TextEditor editor}. - * @return A promise that resolves to an {@link TextEditor editor}. - */ - export function showTextDocument(document: TextDocument, options?: TextDocumentShowOptions): Thenable; - - /** - * A short-hand for `openTextDocument(uri).then(document => showTextDocument(document, options))`. - * - * @see {@link workspace.openTextDocument} - * - * @param uri A resource identifier. - * @param options {@link TextDocumentShowOptions Editor options} to configure the behavior of showing the {@link TextEditor editor}. - * @return A promise that resolves to an {@link TextEditor editor}. - */ - export function showTextDocument(uri: Uri, options?: TextDocumentShowOptions): Thenable; - - /** - * Show the given {@link NotebookDocument} in a {@link NotebookEditor notebook editor}. - * - * @param document A text document to be shown. - * @param options {@link NotebookDocumentShowOptions Editor options} to configure the behavior of showing the {@link NotebookEditor notebook editor}. - * - * @return A promise that resolves to an {@link NotebookEditor notebook editor}. - */ - export function showNotebookDocument(document: NotebookDocument, options?: NotebookDocumentShowOptions): Thenable; - - /** - * Create a TextEditorDecorationType that can be used to add decorations to text editors. - * - * @param options Rendering options for the decoration type. - * @return A new decoration type instance. - */ - export function createTextEditorDecorationType(options: DecorationRenderOptions): TextEditorDecorationType; - - /** - * Show an information message to users. Optionally provide an array of items which will be presented as - * clickable buttons. - * - * @param message The message to show. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - export function showInformationMessage(message: string, ...items: T[]): Thenable; - - /** - * Show an information message to users. Optionally provide an array of items which will be presented as - * clickable buttons. - * - * @param message The message to show. - * @param options Configures the behaviour of the message. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - export function showInformationMessage(message: string, options: MessageOptions, ...items: T[]): Thenable; - - /** - * Show an information message. - * - * @see {@link window.showInformationMessage showInformationMessage} - * - * @param message The message to show. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - export function showInformationMessage(message: string, ...items: T[]): Thenable; - - /** - * Show an information message. - * - * @see {@link window.showInformationMessage showInformationMessage} - * - * @param message The message to show. - * @param options Configures the behaviour of the message. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - export function showInformationMessage(message: string, options: MessageOptions, ...items: T[]): Thenable; - - /** - * Show a warning message. - * - * @see {@link window.showInformationMessage showInformationMessage} - * - * @param message The message to show. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - export function showWarningMessage(message: string, ...items: T[]): Thenable; - - /** - * Show a warning message. - * - * @see {@link window.showInformationMessage showInformationMessage} - * - * @param message The message to show. - * @param options Configures the behaviour of the message. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - export function showWarningMessage(message: string, options: MessageOptions, ...items: T[]): Thenable; - - /** - * Show a warning message. - * - * @see {@link window.showInformationMessage showInformationMessage} - * - * @param message The message to show. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - export function showWarningMessage(message: string, ...items: T[]): Thenable; - - /** - * Show a warning message. - * - * @see {@link window.showInformationMessage showInformationMessage} - * - * @param message The message to show. - * @param options Configures the behaviour of the message. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - export function showWarningMessage(message: string, options: MessageOptions, ...items: T[]): Thenable; - - /** - * Show an error message. - * - * @see {@link window.showInformationMessage showInformationMessage} - * - * @param message The message to show. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - export function showErrorMessage(message: string, ...items: T[]): Thenable; - - /** - * Show an error message. - * - * @see {@link window.showInformationMessage showInformationMessage} - * - * @param message The message to show. - * @param options Configures the behaviour of the message. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - export function showErrorMessage(message: string, options: MessageOptions, ...items: T[]): Thenable; - - /** - * Show an error message. - * - * @see {@link window.showInformationMessage showInformationMessage} - * - * @param message The message to show. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - export function showErrorMessage(message: string, ...items: T[]): Thenable; - - /** - * Show an error message. - * - * @see {@link window.showInformationMessage showInformationMessage} - * - * @param message The message to show. - * @param options Configures the behaviour of the message. - * @param items A set of items that will be rendered as actions in the message. - * @return A thenable that resolves to the selected item or `undefined` when being dismissed. - */ - export function showErrorMessage(message: string, options: MessageOptions, ...items: T[]): Thenable; - - /** - * Shows a selection list allowing multiple selections. - * - * @param items An array of strings, or a promise that resolves to an array of strings. - * @param options Configures the behavior of the selection list. - * @param token A token that can be used to signal cancellation. - * @return A promise that resolves to the selected items or `undefined`. - */ - export function showQuickPick(items: readonly string[] | Thenable, options: QuickPickOptions & { canPickMany: true }, token?: CancellationToken): Thenable; - - /** - * Shows a selection list. - * - * @param items An array of strings, or a promise that resolves to an array of strings. - * @param options Configures the behavior of the selection list. - * @param token A token that can be used to signal cancellation. - * @return A promise that resolves to the selection or `undefined`. - */ - export function showQuickPick(items: readonly string[] | Thenable, options?: QuickPickOptions, token?: CancellationToken): Thenable; - - /** - * Shows a selection list allowing multiple selections. - * - * @param items An array of items, or a promise that resolves to an array of items. - * @param options Configures the behavior of the selection list. - * @param token A token that can be used to signal cancellation. - * @return A promise that resolves to the selected items or `undefined`. - */ - export function showQuickPick(items: readonly T[] | Thenable, options: QuickPickOptions & { canPickMany: true }, token?: CancellationToken): Thenable; - - /** - * Shows a selection list. - * - * @param items An array of items, or a promise that resolves to an array of items. - * @param options Configures the behavior of the selection list. - * @param token A token that can be used to signal cancellation. - * @return A promise that resolves to the selected item or `undefined`. - */ - export function showQuickPick(items: readonly T[] | Thenable, options?: QuickPickOptions, token?: CancellationToken): Thenable; - - /** - * Shows a selection list of {@link workspace.workspaceFolders workspace folders} to pick from. - * Returns `undefined` if no folder is open. - * - * @param options Configures the behavior of the workspace folder list. - * @return A promise that resolves to the workspace folder or `undefined`. - */ - export function showWorkspaceFolderPick(options?: WorkspaceFolderPickOptions): Thenable; - - /** - * Shows a file open dialog to the user which allows to select a file - * for opening-purposes. - * - * @param options Options that control the dialog. - * @returns A promise that resolves to the selected resources or `undefined`. - */ - export function showOpenDialog(options?: OpenDialogOptions): Thenable; - - /** - * Shows a file save dialog to the user which allows to select a file - * for saving-purposes. - * - * @param options Options that control the dialog. - * @returns A promise that resolves to the selected resource or `undefined`. - */ - export function showSaveDialog(options?: SaveDialogOptions): Thenable; - - /** - * Opens an input box to ask the user for input. - * - * The returned value will be `undefined` if the input box was canceled (e.g. pressing ESC). Otherwise the - * returned value will be the string typed by the user or an empty string if the user did not type - * anything but dismissed the input box with OK. - * - * @param options Configures the behavior of the input box. - * @param token A token that can be used to signal cancellation. - * @return A promise that resolves to a string the user provided or to `undefined` in case of dismissal. - */ - export function showInputBox(options?: InputBoxOptions, token?: CancellationToken): Thenable; - - /** - * Creates a {@link QuickPick} to let the user pick an item from a list - * of items of type T. - * - * Note that in many cases the more convenient {@link window.showQuickPick} - * is easier to use. {@link window.createQuickPick} should be used - * when {@link window.showQuickPick} does not offer the required flexibility. - * - * @return A new {@link QuickPick}. - */ - export function createQuickPick(): QuickPick; - - /** - * Creates a {@link InputBox} to let the user enter some text input. - * - * Note that in many cases the more convenient {@link window.showInputBox} - * is easier to use. {@link window.createInputBox} should be used - * when {@link window.showInputBox} does not offer the required flexibility. - * - * @return A new {@link InputBox}. - */ - export function createInputBox(): InputBox; - - /** - * Creates a new {@link OutputChannel output channel} with the given name and language id - * If language id is not provided, then **Log** is used as default language id. - * - * You can access the visible or active output channel as a {@link TextDocument text document} from {@link window.visibleTextEditors visible editors} or {@link window.activeTextEditor active editor} - * and use the language id to contribute language features like syntax coloring, code lens etc., - * - * @param name Human-readable string which will be used to represent the channel in the UI. - * @param languageId The identifier of the language associated with the channel. - */ - export function createOutputChannel(name: string, languageId?: string): OutputChannel; - - /** - * Creates a new {@link LogOutputChannel log output channel} with the given name. - * - * @param name Human-readable string which will be used to represent the channel in the UI. - * @param options Options for the log output channel. - */ - export function createOutputChannel(name: string, options: { log: true }): LogOutputChannel; - - /** - * Create and show a new webview panel. - * - * @param viewType Identifies the type of the webview panel. - * @param title Title of the panel. - * @param showOptions Where to show the webview in the editor. If preserveFocus is set, the new webview will not take focus. - * @param options Settings for the new panel. - * - * @return New webview panel. - */ - export function createWebviewPanel(viewType: string, title: string, showOptions: ViewColumn | { readonly viewColumn: ViewColumn; readonly preserveFocus?: boolean }, options?: WebviewPanelOptions & WebviewOptions): WebviewPanel; - - /** - * Set a message to the status bar. This is a short hand for the more powerful - * status bar {@link window.createStatusBarItem items}. - * - * @param text The message to show, supports icon substitution as in status bar {@link StatusBarItem.text items}. - * @param hideAfterTimeout Timeout in milliseconds after which the message will be disposed. - * @return A disposable which hides the status bar message. - */ - export function setStatusBarMessage(text: string, hideAfterTimeout: number): Disposable; - - /** - * Set a message to the status bar. This is a short hand for the more powerful - * status bar {@link window.createStatusBarItem items}. - * - * @param text The message to show, supports icon substitution as in status bar {@link StatusBarItem.text items}. - * @param hideWhenDone Thenable on which completion (resolve or reject) the message will be disposed. - * @return A disposable which hides the status bar message. - */ - export function setStatusBarMessage(text: string, hideWhenDone: Thenable): Disposable; - - /** - * Set a message to the status bar. This is a short hand for the more powerful - * status bar {@link window.createStatusBarItem items}. - * - * *Note* that status bar messages stack and that they must be disposed when no - * longer used. - * - * @param text The message to show, supports icon substitution as in status bar {@link StatusBarItem.text items}. - * @return A disposable which hides the status bar message. - */ - export function setStatusBarMessage(text: string): Disposable; - - /** - * Show progress in the Source Control viewlet while running the given callback and while - * its returned promise isn't resolve or rejected. - * - * @deprecated Use `withProgress` instead. - * - * @param task A callback returning a promise. Progress increments can be reported with - * the provided {@link Progress}-object. - * @return The thenable the task did return. - */ - export function withScmProgress(task: (progress: Progress) => Thenable): Thenable; - - /** - * Show progress in the editor. Progress is shown while running the given callback - * and while the promise it returned isn't resolved nor rejected. The location at which - * progress should show (and other details) is defined via the passed {@linkcode ProgressOptions}. - * - * @param task A callback returning a promise. Progress state can be reported with - * the provided {@link Progress}-object. - * - * To report discrete progress, use `increment` to indicate how much work has been completed. Each call with - * a `increment` value will be summed up and reflected as overall progress until 100% is reached (a value of - * e.g. `10` accounts for `10%` of work done). - * Note that currently only `ProgressLocation.Notification` is capable of showing discrete progress. - * - * To monitor if the operation has been cancelled by the user, use the provided {@linkcode CancellationToken}. - * Note that currently only `ProgressLocation.Notification` is supporting to show a cancel button to cancel the - * long running operation. - * - * @return The thenable the task-callback returned. - */ - export function withProgress(options: ProgressOptions, task: (progress: Progress<{ message?: string; increment?: number }>, token: CancellationToken) => Thenable): Thenable; - - /** - * Creates a status bar {@link StatusBarItem item}. - * - * @param alignment The alignment of the item. - * @param priority The priority of the item. Higher values mean the item should be shown more to the left. - * @return A new status bar item. - */ - export function createStatusBarItem(alignment?: StatusBarAlignment, priority?: number): StatusBarItem; - - /** - * Creates a status bar {@link StatusBarItem item}. - * - * @param id The unique identifier of the item. - * @param alignment The alignment of the item. - * @param priority The priority of the item. Higher values mean the item should be shown more to the left. - * @return A new status bar item. - */ - export function createStatusBarItem(id: string, alignment?: StatusBarAlignment, priority?: number): StatusBarItem; - - /** - * Creates a {@link Terminal} with a backing shell process. The cwd of the terminal will be the workspace - * directory if it exists. - * - * @param name Optional human-readable string which will be used to represent the terminal in the UI. - * @param shellPath Optional path to a custom shell executable to be used in the terminal. - * @param shellArgs Optional args for the custom shell executable. A string can be used on Windows only which - * allows specifying shell args in - * [command-line format](https://msdn.microsoft.com/en-au/08dfcab2-eb6e-49a4-80eb-87d4076c98c6). - * @return A new Terminal. - * @throws When running in an environment where a new process cannot be started. - */ - export function createTerminal(name?: string, shellPath?: string, shellArgs?: readonly string[] | string): Terminal; - - /** - * Creates a {@link Terminal} with a backing shell process. - * - * @param options A TerminalOptions object describing the characteristics of the new terminal. - * @return A new Terminal. - * @throws When running in an environment where a new process cannot be started. - */ - export function createTerminal(options: TerminalOptions): Terminal; - - /** - * Creates a {@link Terminal} where an extension controls its input and output. - * - * @param options An {@link ExtensionTerminalOptions} object describing - * the characteristics of the new terminal. - * @return A new Terminal. - */ - export function createTerminal(options: ExtensionTerminalOptions): Terminal; - - /** - * Register a {@link TreeDataProvider} for the view contributed using the extension point `views`. - * This will allow you to contribute data to the {@link TreeView} and update if the data changes. - * - * **Note:** To get access to the {@link TreeView} and perform operations on it, use {@link window.createTreeView createTreeView}. - * - * @param viewId Id of the view contributed using the extension point `views`. - * @param treeDataProvider A {@link TreeDataProvider} that provides tree data for the view - */ - export function registerTreeDataProvider(viewId: string, treeDataProvider: TreeDataProvider): Disposable; - - /** - * Create a {@link TreeView} for the view contributed using the extension point `views`. - * @param viewId Id of the view contributed using the extension point `views`. - * @param options Options for creating the {@link TreeView} - * @returns a {@link TreeView}. - */ - export function createTreeView(viewId: string, options: TreeViewOptions): TreeView; - - /** - * Registers a {@link UriHandler uri handler} capable of handling system-wide {@link Uri uris}. - * In case there are multiple windows open, the topmost window will handle the uri. - * A uri handler is scoped to the extension it is contributed from; it will only - * be able to handle uris which are directed to the extension itself. A uri must respect - * the following rules: - * - * - The uri-scheme must be `vscode.env.uriScheme`; - * - The uri-authority must be the extension id (e.g. `my.extension`); - * - The uri-path, -query and -fragment parts are arbitrary. - * - * For example, if the `my.extension` extension registers a uri handler, it will only - * be allowed to handle uris with the prefix `product-name://my.extension`. - * - * An extension can only register a single uri handler in its entire activation lifetime. - * - * * *Note:* There is an activation event `onUri` that fires when a uri directed for - * the current extension is about to be handled. - * - * @param handler The uri handler to register for this extension. - */ - export function registerUriHandler(handler: UriHandler): Disposable; - - /** - * Registers a webview panel serializer. - * - * Extensions that support reviving should have an `"onWebviewPanel:viewType"` activation event and - * make sure that `registerWebviewPanelSerializer` is called during activation. - * - * Only a single serializer may be registered at a time for a given `viewType`. - * - * @param viewType Type of the webview panel that can be serialized. - * @param serializer Webview serializer. - */ - export function registerWebviewPanelSerializer(viewType: string, serializer: WebviewPanelSerializer): Disposable; - - /** - * Register a new provider for webview views. - * - * @param viewId Unique id of the view. This should match the `id` from the - * `views` contribution in the package.json. - * @param provider Provider for the webview views. - * - * @return Disposable that unregisters the provider. - */ - export function registerWebviewViewProvider(viewId: string, provider: WebviewViewProvider, options?: { - /** - * Content settings for the webview created for this view. - */ - readonly webviewOptions?: { - /** - * Controls if the webview element itself (iframe) is kept around even when the view - * is no longer visible. - * - * Normally the webview's html context is created when the view becomes visible - * and destroyed when it is hidden. Extensions that have complex state - * or UI can set the `retainContextWhenHidden` to make the editor keep the webview - * context around, even when the webview moves to a background tab. When a webview using - * `retainContextWhenHidden` becomes hidden, its scripts and other dynamic content are suspended. - * When the view becomes visible again, the context is automatically restored - * in the exact same state it was in originally. You cannot send messages to a - * hidden webview, even with `retainContextWhenHidden` enabled. - * - * `retainContextWhenHidden` has a high memory overhead and should only be used if - * your view's context cannot be quickly saved and restored. - */ - readonly retainContextWhenHidden?: boolean; - }; - }): Disposable; - - /** - * Register a provider for custom editors for the `viewType` contributed by the `customEditors` extension point. - * - * When a custom editor is opened, an `onCustomEditor:viewType` activation event is fired. Your extension - * must register a {@linkcode CustomTextEditorProvider}, {@linkcode CustomReadonlyEditorProvider}, - * {@linkcode CustomEditorProvider}for `viewType` as part of activation. - * - * @param viewType Unique identifier for the custom editor provider. This should match the `viewType` from the - * `customEditors` contribution point. - * @param provider Provider that resolves custom editors. - * @param options Options for the provider. - * - * @return Disposable that unregisters the provider. - */ - export function registerCustomEditorProvider(viewType: string, provider: CustomTextEditorProvider | CustomReadonlyEditorProvider | CustomEditorProvider, options?: { - /** - * Content settings for the webview panels created for this custom editor. - */ - readonly webviewOptions?: WebviewPanelOptions; - - /** - * Only applies to `CustomReadonlyEditorProvider | CustomEditorProvider`. - * - * Indicates that the provider allows multiple editor instances to be open at the same time for - * the same resource. - * - * By default, the editor only allows one editor instance to be open at a time for each resource. If the - * user tries to open a second editor instance for the resource, the first one is instead moved to where - * the second one was to be opened. - * - * When `supportsMultipleEditorsPerDocument` is enabled, users can split and create copies of the custom - * editor. In this case, the custom editor must make sure it can properly synchronize the states of all - * editor instances for a resource so that they are consistent. - */ - readonly supportsMultipleEditorsPerDocument?: boolean; - }): Disposable; - - /** - * Register provider that enables the detection and handling of links within the terminal. - * @param provider The provider that provides the terminal links. - * @return Disposable that unregisters the provider. - */ - export function registerTerminalLinkProvider(provider: TerminalLinkProvider): Disposable; - - /** - * Registers a provider for a contributed terminal profile. - * @param id The ID of the contributed terminal profile. - * @param provider The terminal profile provider. - */ - export function registerTerminalProfileProvider(id: string, provider: TerminalProfileProvider): Disposable; - /** - * Register a file decoration provider. - * - * @param provider A {@link FileDecorationProvider}. - * @return A {@link Disposable} that unregisters the provider. - */ - export function registerFileDecorationProvider(provider: FileDecorationProvider): Disposable; - - /** - * The currently active color theme as configured in the settings. The active - * theme can be changed via the `workbench.colorTheme` setting. - */ - export let activeColorTheme: ColorTheme; - - /** - * An {@link Event} which fires when the active color theme is changed or has changes. - */ - export const onDidChangeActiveColorTheme: Event; - } - - /** - * Options for creating a {@link TreeView} - */ - export interface TreeViewOptions { - - /** - * A data provider that provides tree data. - */ - treeDataProvider: TreeDataProvider; - - /** - * Whether to show collapse all action or not. - */ - showCollapseAll?: boolean; - - /** - * Whether the tree supports multi-select. When the tree supports multi-select and a command is executed from the tree, - * the first argument to the command is the tree item that the command was executed on and the second argument is an - * array containing all selected tree items. - */ - canSelectMany?: boolean; - - /** - * An optional interface to implement drag and drop in the tree view. - */ - dragAndDropController?: TreeDragAndDropController; - } - - /** - * The event that is fired when an element in the {@link TreeView} is expanded or collapsed - */ - export interface TreeViewExpansionEvent { - - /** - * Element that is expanded or collapsed. - */ - readonly element: T; - - } - - /** - * The event that is fired when there is a change in {@link TreeView.selection tree view's selection} - */ - export interface TreeViewSelectionChangeEvent { - - /** - * Selected elements. - */ - readonly selection: readonly T[]; - - } - - /** - * The event that is fired when there is a change in {@link TreeView.visible tree view's visibility} - */ - export interface TreeViewVisibilityChangeEvent { - - /** - * `true` if the {@link TreeView tree view} is visible otherwise `false`. - */ - readonly visible: boolean; - } - - /** - * A file associated with a {@linkcode DataTransferItem}. - */ - export interface DataTransferFile { - /** - * The name of the file. - */ - readonly name: string; - - /** - * The full file path of the file. - * - * May be `undefined` on web. - */ - readonly uri?: Uri; - - /** - * The full file contents of the file. - */ - data(): Thenable; - } - - /** - * Encapsulates data transferred during drag and drop operations. - */ - export class DataTransferItem { - /** - * Get a string representation of this item. - * - * If {@linkcode DataTransferItem.value} is an object, this returns the result of json stringifying {@linkcode DataTransferItem.value} value. - */ - asString(): Thenable; - - /** - * Try getting the {@link DataTransferFile file} associated with this data transfer item. - * - * Note that the file object is only valid for the scope of the drag and drop operation. - * - * @returns The file for the data transfer or `undefined` if the item is either not a file or the - * file data cannot be accessed. - */ - asFile(): DataTransferFile | undefined; - - /** - * Custom data stored on this item. - * - * You can use `value` to share data across operations. The original object can be retrieved so long as the extension that - * created the `DataTransferItem` runs in the same extension host. - */ - readonly value: any; - - /** - * @param value Custom data stored on this item. Can be retrieved using {@linkcode DataTransferItem.value}. - */ - constructor(value: any); - } - - /** - * A map containing a mapping of the mime type of the corresponding transferred data. - * - * Drag and drop controllers that implement {@link TreeDragAndDropController.handleDrag `handleDrag`} can add additional mime types to the - * data transfer. These additional mime types will only be included in the `handleDrop` when the the drag was initiated from - * an element in the same drag and drop controller. - */ - export class DataTransfer implements Iterable<[mimeType: string, item: DataTransferItem]> { - /** - * Retrieves the data transfer item for a given mime type. - * - * @param mimeType The mime type to get the data transfer item for, such as `text/plain` or `image/png`. - * - * Special mime types: - * - `text/uri-list` — A string with `toString()`ed Uris separated by `\r\n`. To specify a cursor position in the file, - * set the Uri's fragment to `L3,5`, where 3 is the line number and 5 is the column number. - */ - get(mimeType: string): DataTransferItem | undefined; - - /** - * Sets a mime type to data transfer item mapping. - * @param mimeType The mime type to set the data for. - * @param value The data transfer item for the given mime type. - */ - set(mimeType: string, value: DataTransferItem): void; - - /** - * Allows iteration through the data transfer items. - * - * @param callbackfn Callback for iteration through the data transfer items. - * @param thisArg The `this` context used when invoking the handler function. - */ - forEach(callbackfn: (item: DataTransferItem, mimeType: string, dataTransfer: DataTransfer) => void, thisArg?: any): void; - - /** - * Get a new iterator with the `[mime, item]` pairs for each element in this data transfer. - */ - [Symbol.iterator](): IterableIterator<[mimeType: string, item: DataTransferItem]>; - } - - /** - * Provides support for drag and drop in `TreeView`. - */ - export interface TreeDragAndDropController { - - /** - * The mime types that the {@link TreeDragAndDropController.handleDrop `handleDrop`} method of this `DragAndDropController` supports. - * This could be well-defined, existing, mime types, and also mime types defined by the extension. - * - * To support drops from trees, you will need to add the mime type of that tree. - * This includes drops from within the same tree. - * The mime type of a tree is recommended to be of the format `application/vnd.code.tree.`. - * - * Use the special `files` mime type to support all types of dropped files {@link DataTransferFile files}, regardless of the file's actual mime type. - * - * To learn the mime type of a dragged item: - * 1. Set up your `DragAndDropController` - * 2. Use the Developer: Set Log Level... command to set the level to "Debug" - * 3. Open the developer tools and drag the item with unknown mime type over your tree. The mime types will be logged to the developer console - * - * Note that mime types that cannot be sent to the extension will be omitted. - */ - readonly dropMimeTypes: readonly string[]; - - /** - * The mime types that the {@link TreeDragAndDropController.handleDrag `handleDrag`} method of this `TreeDragAndDropController` may add to the tree data transfer. - * This could be well-defined, existing, mime types, and also mime types defined by the extension. - * - * The recommended mime type of the tree (`application/vnd.code.tree.`) will be automatically added. - */ - readonly dragMimeTypes: readonly string[]; - - /** - * When the user starts dragging items from this `DragAndDropController`, `handleDrag` will be called. - * Extensions can use `handleDrag` to add their {@link DataTransferItem `DataTransferItem`} items to the drag and drop. - * - * When the items are dropped on **another tree item** in **the same tree**, your `DataTransferItem` objects - * will be preserved. Use the recommended mime type for the tree (`application/vnd.code.tree.`) to add - * tree objects in a data transfer. See the documentation for `DataTransferItem` for how best to take advantage of this. - * - * To add a data transfer item that can be dragged into the editor, use the application specific mime type "text/uri-list". - * The data for "text/uri-list" should be a string with `toString()`ed Uris separated by newlines. To specify a cursor position in the file, - * set the Uri's fragment to `L3,5`, where 3 is the line number and 5 is the column number. - * - * @param source The source items for the drag and drop operation. - * @param dataTransfer The data transfer associated with this drag. - * @param token A cancellation token indicating that drag has been cancelled. - */ - handleDrag?(source: readonly T[], dataTransfer: DataTransfer, token: CancellationToken): Thenable | void; - - /** - * Called when a drag and drop action results in a drop on the tree that this `DragAndDropController` belongs to. - * - * Extensions should fire {@link TreeDataProvider.onDidChangeTreeData onDidChangeTreeData} for any elements that need to be refreshed. - * - * @param dataTransfer The data transfer items of the source of the drag. - * @param target The target tree element that the drop is occurring on. When undefined, the target is the root. - * @param token A cancellation token indicating that the drop has been cancelled. - */ - handleDrop?(target: T | undefined, dataTransfer: DataTransfer, token: CancellationToken): Thenable | void; - } - - /** - * A badge presenting a value for a view - */ - export interface ViewBadge { - - /** - * A label to present in tooltip for the badge. - */ - readonly tooltip: string; - - /** - * The value to present in the badge. - */ - readonly value: number; - } - - /** - * Represents a Tree view - */ - export interface TreeView extends Disposable { - - /** - * Event that is fired when an element is expanded - */ - readonly onDidExpandElement: Event>; - - /** - * Event that is fired when an element is collapsed - */ - readonly onDidCollapseElement: Event>; - - /** - * Currently selected elements. - */ - readonly selection: readonly T[]; - - /** - * Event that is fired when the {@link TreeView.selection selection} has changed - */ - readonly onDidChangeSelection: Event>; - - /** - * `true` if the {@link TreeView tree view} is visible otherwise `false`. - */ - readonly visible: boolean; - - /** - * Event that is fired when {@link TreeView.visible visibility} has changed - */ - readonly onDidChangeVisibility: Event; - - /** - * An optional human-readable message that will be rendered in the view. - * Setting the message to null, undefined, or empty string will remove the message from the view. - */ - message?: string; - - /** - * The tree view title is initially taken from the extension package.json - * Changes to the title property will be properly reflected in the UI in the title of the view. - */ - title?: string; - - /** - * An optional human-readable description which is rendered less prominently in the title of the view. - * Setting the title description to null, undefined, or empty string will remove the description from the view. - */ - description?: string; - - /** - * The badge to display for this TreeView. - * To remove the badge, set to undefined. - */ - badge?: ViewBadge | undefined; - - /** - * Reveals the given element in the tree view. - * If the tree view is not visible then the tree view is shown and element is revealed. - * - * By default revealed element is selected. - * In order to not to select, set the option `select` to `false`. - * In order to focus, set the option `focus` to `true`. - * In order to expand the revealed element, set the option `expand` to `true`. To expand recursively set `expand` to the number of levels to expand. - * **NOTE:** You can expand only to 3 levels maximum. - * - * **NOTE:** The {@link TreeDataProvider} that the `TreeView` {@link window.createTreeView is registered with} with must implement {@link TreeDataProvider.getParent getParent} method to access this API. - */ - reveal(element: T, options?: { select?: boolean; focus?: boolean; expand?: boolean | number }): Thenable; - } - - /** - * A data provider that provides tree data - */ - export interface TreeDataProvider { - /** - * An optional event to signal that an element or root has changed. - * This will trigger the view to update the changed element/root and its children recursively (if shown). - * To signal that root has changed, do not pass any argument or pass `undefined` or `null`. - */ - onDidChangeTreeData?: Event; - - /** - * Get {@link TreeItem} representation of the `element` - * - * @param element The element for which {@link TreeItem} representation is asked for. - * @return TreeItem representation of the element. - */ - getTreeItem(element: T): TreeItem | Thenable; - - /** - * Get the children of `element` or root if no element is passed. - * - * @param element The element from which the provider gets children. Can be `undefined`. - * @return Children of `element` or root if no element is passed. - */ - getChildren(element?: T): ProviderResult; - - /** - * Optional method to return the parent of `element`. - * Return `null` or `undefined` if `element` is a child of root. - * - * **NOTE:** This method should be implemented in order to access {@link TreeView.reveal reveal} API. - * - * @param element The element for which the parent has to be returned. - * @return Parent of `element`. - */ - getParent?(element: T): ProviderResult; - - /** - * Called on hover to resolve the {@link TreeItem.tooltip TreeItem} property if it is undefined. - * Called on tree item click/open to resolve the {@link TreeItem.command TreeItem} property if it is undefined. - * Only properties that were undefined can be resolved in `resolveTreeItem`. - * Functionality may be expanded later to include being called to resolve other missing - * properties on selection and/or on open. - * - * Will only ever be called once per TreeItem. - * - * onDidChangeTreeData should not be triggered from within resolveTreeItem. - * - * *Note* that this function is called when tree items are already showing in the UI. - * Because of that, no property that changes the presentation (label, description, etc.) - * can be changed. - * - * @param item Undefined properties of `item` should be set then `item` should be returned. - * @param element The object associated with the TreeItem. - * @param token A cancellation token. - * @return The resolved tree item or a thenable that resolves to such. It is OK to return the given - * `item`. When no result is returned, the given `item` will be used. - */ - resolveTreeItem?(item: TreeItem, element: T, token: CancellationToken): ProviderResult; - } - - export class TreeItem { - /** - * A human-readable string describing this item. When `falsy`, it is derived from {@link TreeItem.resourceUri resourceUri}. - */ - label?: string | TreeItemLabel; - - /** - * Optional id for the tree item that has to be unique across tree. The id is used to preserve the selection and expansion state of the tree item. - * - * If not provided, an id is generated using the tree item's label. **Note** that when labels change, ids will change and that selection and expansion state cannot be kept stable anymore. - */ - id?: string; - - /** - * The icon path or {@link ThemeIcon} for the tree item. - * When `falsy`, {@link ThemeIcon.Folder Folder Theme Icon} is assigned, if item is collapsible otherwise {@link ThemeIcon.File File Theme Icon}. - * When a file or folder {@link ThemeIcon} is specified, icon is derived from the current file icon theme for the specified theme icon using {@link TreeItem.resourceUri resourceUri} (if provided). - */ - iconPath?: string | Uri | { light: string | Uri; dark: string | Uri } | ThemeIcon; - - /** - * A human-readable string which is rendered less prominent. - * When `true`, it is derived from {@link TreeItem.resourceUri resourceUri} and when `falsy`, it is not shown. - */ - description?: string | boolean; - - /** - * The {@link Uri} of the resource representing this item. - * - * Will be used to derive the {@link TreeItem.label label}, when it is not provided. - * Will be used to derive the icon from current file icon theme, when {@link TreeItem.iconPath iconPath} has {@link ThemeIcon} value. - */ - resourceUri?: Uri; - - /** - * The tooltip text when you hover over this item. - */ - tooltip?: string | MarkdownString | undefined; - - /** - * The {@link Command} that should be executed when the tree item is selected. - * - * Please use `vscode.open` or `vscode.diff` as command IDs when the tree item is opening - * something in the editor. Using these commands ensures that the resulting editor will - * appear consistent with how other built-in trees open editors. - */ - command?: Command; - - /** - * {@link TreeItemCollapsibleState} of the tree item. - */ - collapsibleState?: TreeItemCollapsibleState; - - /** - * Context value of the tree item. This can be used to contribute item specific actions in the tree. - * For example, a tree item is given a context value as `folder`. When contributing actions to `view/item/context` - * using `menus` extension point, you can specify context value for key `viewItem` in `when` expression like `viewItem == folder`. - * ```json - * "contributes": { - * "menus": { - * "view/item/context": [ - * { - * "command": "extension.deleteFolder", - * "when": "viewItem == folder" - * } - * ] - * } - * } - * ``` - * This will show action `extension.deleteFolder` only for items with `contextValue` is `folder`. - */ - contextValue?: string; - - /** - * Accessibility information used when screen reader interacts with this tree item. - * Generally, a TreeItem has no need to set the `role` of the accessibilityInformation; - * however, there are cases where a TreeItem is not displayed in a tree-like way where setting the `role` may make sense. - */ - accessibilityInformation?: AccessibilityInformation; - - /** - * @param label A human-readable string describing this item - * @param collapsibleState {@link TreeItemCollapsibleState} of the tree item. Default is {@link TreeItemCollapsibleState.None} - */ - constructor(label: string | TreeItemLabel, collapsibleState?: TreeItemCollapsibleState); - - /** - * @param resourceUri The {@link Uri} of the resource representing this item. - * @param collapsibleState {@link TreeItemCollapsibleState} of the tree item. Default is {@link TreeItemCollapsibleState.None} - */ - constructor(resourceUri: Uri, collapsibleState?: TreeItemCollapsibleState); - } - - /** - * Collapsible state of the tree item - */ - export enum TreeItemCollapsibleState { - /** - * Determines an item can be neither collapsed nor expanded. Implies it has no children. - */ - None = 0, - /** - * Determines an item is collapsed - */ - Collapsed = 1, - /** - * Determines an item is expanded - */ - Expanded = 2 - } - - /** - * Label describing the {@link TreeItem Tree item} - */ - export interface TreeItemLabel { - - /** - * A human-readable string describing the {@link TreeItem Tree item}. - */ - label: string; - - /** - * Ranges in the label to highlight. A range is defined as a tuple of two number where the - * first is the inclusive start index and the second the exclusive end index - */ - highlights?: [number, number][]; - } - - /** - * Value-object describing what options a terminal should use. - */ - export interface TerminalOptions { - /** - * A human-readable string which will be used to represent the terminal in the UI. - */ - name?: string; - - /** - * A path to a custom shell executable to be used in the terminal. - */ - shellPath?: string; - - /** - * Args for the custom shell executable. A string can be used on Windows only which allows - * specifying shell args in [command-line format](https://msdn.microsoft.com/en-au/08dfcab2-eb6e-49a4-80eb-87d4076c98c6). - */ - shellArgs?: string[] | string; - - /** - * A path or Uri for the current working directory to be used for the terminal. - */ - cwd?: string | Uri; - - /** - * Object with environment variables that will be added to the editor process. - */ - env?: { [key: string]: string | null | undefined }; - - /** - * Whether the terminal process environment should be exactly as provided in - * `TerminalOptions.env`. When this is false (default), the environment will be based on the - * window's environment and also apply configured platform settings like - * `terminal.integrated.env.windows` on top. When this is true, the complete environment - * must be provided as nothing will be inherited from the process or any configuration. - */ - strictEnv?: boolean; - - /** - * When enabled the terminal will run the process as normal but not be surfaced to the user - * until `Terminal.show` is called. The typical usage for this is when you need to run - * something that may need interactivity but only want to tell the user about it when - * interaction is needed. Note that the terminals will still be exposed to all extensions - * as normal. - */ - hideFromUser?: boolean; - - /** - * A message to write to the terminal on first launch, note that this is not sent to the - * process but, rather written directly to the terminal. This supports escape sequences such - * a setting text style. - */ - message?: string; - - /** - * The icon path or {@link ThemeIcon} for the terminal. - */ - iconPath?: Uri | { light: Uri; dark: Uri } | ThemeIcon; - - /** - * The icon {@link ThemeColor} for the terminal. - * The `terminal.ansi*` theme keys are - * recommended for the best contrast and consistency across themes. - */ - color?: ThemeColor; - - /** - * The {@link TerminalLocation} or {@link TerminalEditorLocationOptions} or {@link TerminalSplitLocationOptions} for the terminal. - */ - location?: TerminalLocation | TerminalEditorLocationOptions | TerminalSplitLocationOptions; - - /** - * Opt-out of the default terminal persistence on restart and reload. - * This will only take effect when `terminal.integrated.enablePersistentSessions` is enabled. - */ - isTransient?: boolean; - } - - /** - * Value-object describing what options a virtual process terminal should use. - */ - export interface ExtensionTerminalOptions { - /** - * A human-readable string which will be used to represent the terminal in the UI. - */ - name: string; - - /** - * An implementation of {@link Pseudoterminal} that allows an extension to - * control a terminal. - */ - pty: Pseudoterminal; - - /** - * The icon path or {@link ThemeIcon} for the terminal. - */ - iconPath?: Uri | { light: Uri; dark: Uri } | ThemeIcon; - - /** - * The icon {@link ThemeColor} for the terminal. - * The standard `terminal.ansi*` theme keys are - * recommended for the best contrast and consistency across themes. - */ - color?: ThemeColor; - - /** - * The {@link TerminalLocation} or {@link TerminalEditorLocationOptions} or {@link TerminalSplitLocationOptions} for the terminal. - */ - location?: TerminalLocation | TerminalEditorLocationOptions | TerminalSplitLocationOptions; - - /** - * Opt-out of the default terminal persistence on restart and reload. - * This will only take effect when `terminal.integrated.enablePersistentSessions` is enabled. - */ - isTransient?: boolean; - } - - /** - * Defines the interface of a terminal pty, enabling extensions to control a terminal. - */ - interface Pseudoterminal { - /** - * An event that when fired will write data to the terminal. Unlike - * {@link Terminal.sendText} which sends text to the underlying child - * pseudo-device (the child), this will write the text to parent pseudo-device (the - * _terminal_ itself). - * - * Note writing `\n` will just move the cursor down 1 row, you need to write `\r` as well - * to move the cursor to the left-most cell. - * - * Events fired before {@link Pseudoterminal.open} is called will be be ignored. - * - * **Example:** Write red text to the terminal - * ```typescript - * const writeEmitter = new vscode.EventEmitter(); - * const pty: vscode.Pseudoterminal = { - * onDidWrite: writeEmitter.event, - * open: () => writeEmitter.fire('\x1b[31mHello world\x1b[0m'), - * close: () => {} - * }; - * vscode.window.createTerminal({ name: 'My terminal', pty }); - * ``` - * - * **Example:** Move the cursor to the 10th row and 20th column and write an asterisk - * ```typescript - * writeEmitter.fire('\x1b[10;20H*'); - * ``` - */ - onDidWrite: Event; - - /** - * An event that when fired allows overriding the {@link Pseudoterminal.setDimensions dimensions} of the - * terminal. Note that when set, the overridden dimensions will only take effect when they - * are lower than the actual dimensions of the terminal (ie. there will never be a scroll - * bar). Set to `undefined` for the terminal to go back to the regular dimensions (fit to - * the size of the panel). - * - * Events fired before {@link Pseudoterminal.open} is called will be be ignored. - * - * **Example:** Override the dimensions of a terminal to 20 columns and 10 rows - * ```typescript - * const dimensionsEmitter = new vscode.EventEmitter(); - * const pty: vscode.Pseudoterminal = { - * onDidWrite: writeEmitter.event, - * onDidOverrideDimensions: dimensionsEmitter.event, - * open: () => { - * dimensionsEmitter.fire({ - * columns: 20, - * rows: 10 - * }); - * }, - * close: () => {} - * }; - * vscode.window.createTerminal({ name: 'My terminal', pty }); - * ``` - */ - onDidOverrideDimensions?: Event; - - /** - * An event that when fired will signal that the pty is closed and dispose of the terminal. - * - * Events fired before {@link Pseudoterminal.open} is called will be be ignored. - * - * A number can be used to provide an exit code for the terminal. Exit codes must be - * positive and a non-zero exit codes signals failure which shows a notification for a - * regular terminal and allows dependent tasks to proceed when used with the - * `CustomExecution` API. - * - * **Example:** Exit the terminal when "y" is pressed, otherwise show a notification. - * ```typescript - * const writeEmitter = new vscode.EventEmitter(); - * const closeEmitter = new vscode.EventEmitter(); - * const pty: vscode.Pseudoterminal = { - * onDidWrite: writeEmitter.event, - * onDidClose: closeEmitter.event, - * open: () => writeEmitter.fire('Press y to exit successfully'), - * close: () => {}, - * handleInput: data => { - * if (data !== 'y') { - * vscode.window.showInformationMessage('Something went wrong'); - * } - * closeEmitter.fire(); - * } - * }; - * vscode.window.createTerminal({ name: 'Exit example', pty }); - * ``` - */ - onDidClose?: Event; - - /** - * An event that when fired allows changing the name of the terminal. - * - * Events fired before {@link Pseudoterminal.open} is called will be be ignored. - * - * **Example:** Change the terminal name to "My new terminal". - * ```typescript - * const writeEmitter = new vscode.EventEmitter(); - * const changeNameEmitter = new vscode.EventEmitter(); - * const pty: vscode.Pseudoterminal = { - * onDidWrite: writeEmitter.event, - * onDidChangeName: changeNameEmitter.event, - * open: () => changeNameEmitter.fire('My new terminal'), - * close: () => {} - * }; - * vscode.window.createTerminal({ name: 'My terminal', pty }); - * ``` - */ - onDidChangeName?: Event; - - /** - * Implement to handle when the pty is open and ready to start firing events. - * - * @param initialDimensions The dimensions of the terminal, this will be undefined if the - * terminal panel has not been opened before this is called. - */ - open(initialDimensions: TerminalDimensions | undefined): void; - - /** - * Implement to handle when the terminal is closed by an act of the user. - */ - close(): void; - - /** - * Implement to handle incoming keystrokes in the terminal or when an extension calls - * {@link Terminal.sendText}. `data` contains the keystrokes/text serialized into - * their corresponding VT sequence representation. - * - * @param data The incoming data. - * - * **Example:** Echo input in the terminal. The sequence for enter (`\r`) is translated to - * CRLF to go to a new line and move the cursor to the start of the line. - * ```typescript - * const writeEmitter = new vscode.EventEmitter(); - * const pty: vscode.Pseudoterminal = { - * onDidWrite: writeEmitter.event, - * open: () => {}, - * close: () => {}, - * handleInput: data => writeEmitter.fire(data === '\r' ? '\r\n' : data) - * }; - * vscode.window.createTerminal({ name: 'Local echo', pty }); - * ``` - */ - handleInput?(data: string): void; - - /** - * Implement to handle when the number of rows and columns that fit into the terminal panel - * changes, for example when font size changes or when the panel is resized. The initial - * state of a terminal's dimensions should be treated as `undefined` until this is triggered - * as the size of a terminal isn't known until it shows up in the user interface. - * - * When dimensions are overridden by - * {@link Pseudoterminal.onDidOverrideDimensions onDidOverrideDimensions}, `setDimensions` will - * continue to be called with the regular panel dimensions, allowing the extension continue - * to react dimension changes. - * - * @param dimensions The new dimensions. - */ - setDimensions?(dimensions: TerminalDimensions): void; - } - - /** - * Represents the dimensions of a terminal. - */ - export interface TerminalDimensions { - /** - * The number of columns in the terminal. - */ - readonly columns: number; - - /** - * The number of rows in the terminal. - */ - readonly rows: number; - } - - /** - * Represents how a terminal exited. - */ - export interface TerminalExitStatus { - /** - * The exit code that a terminal exited with, it can have the following values: - * - Zero: the terminal process or custom execution succeeded. - * - Non-zero: the terminal process or custom execution failed. - * - `undefined`: the user forcibly closed the terminal or a custom execution exited - * without providing an exit code. - */ - readonly code: number | undefined; - - /** - * The reason that triggered the exit of a terminal. - */ - readonly reason: TerminalExitReason; - } - - /** - * Terminal exit reason kind. - */ - export enum TerminalExitReason { - /** - * Unknown reason. - */ - Unknown = 0, - - /** - * The window closed/reloaded. - */ - Shutdown = 1, - - /** - * The shell process exited. - */ - Process = 2, - - /** - * The user closed the terminal. - */ - User = 3, - - /** - * An extension disposed the terminal. - */ - Extension = 4, - } - - /** - * A type of mutation that can be applied to an environment variable. - */ - export enum EnvironmentVariableMutatorType { - /** - * Replace the variable's existing value. - */ - Replace = 1, - /** - * Append to the end of the variable's existing value. - */ - Append = 2, - /** - * Prepend to the start of the variable's existing value. - */ - Prepend = 3 - } - - /** - * A type of mutation and its value to be applied to an environment variable. - */ - export interface EnvironmentVariableMutator { - /** - * The type of mutation that will occur to the variable. - */ - readonly type: EnvironmentVariableMutatorType; - - /** - * The value to use for the variable. - */ - readonly value: string; - } - - /** - * A collection of mutations that an extension can apply to a process environment. - */ - export interface EnvironmentVariableCollection extends Iterable<[variable: string, mutator: EnvironmentVariableMutator]> { - /** - * Whether the collection should be cached for the workspace and applied to the terminal - * across window reloads. When true the collection will be active immediately such when the - * window reloads. Additionally, this API will return the cached version if it exists. The - * collection will be invalidated when the extension is uninstalled or when the collection - * is cleared. Defaults to true. - */ - persistent: boolean; - - /** - * Replace an environment variable with a value. - * - * Note that an extension can only make a single change to any one variable, so this will - * overwrite any previous calls to replace, append or prepend. - * - * @param variable The variable to replace. - * @param value The value to replace the variable with. - */ - replace(variable: string, value: string): void; - - /** - * Append a value to an environment variable. - * - * Note that an extension can only make a single change to any one variable, so this will - * overwrite any previous calls to replace, append or prepend. - * - * @param variable The variable to append to. - * @param value The value to append to the variable. - */ - append(variable: string, value: string): void; - - /** - * Prepend a value to an environment variable. - * - * Note that an extension can only make a single change to any one variable, so this will - * overwrite any previous calls to replace, append or prepend. - * - * @param variable The variable to prepend. - * @param value The value to prepend to the variable. - */ - prepend(variable: string, value: string): void; - - /** - * Gets the mutator that this collection applies to a variable, if any. - * - * @param variable The variable to get the mutator for. - */ - get(variable: string): EnvironmentVariableMutator | undefined; - - /** - * Iterate over each mutator in this collection. - * - * @param callback Function to execute for each entry. - * @param thisArg The `this` context used when invoking the handler function. - */ - forEach(callback: (variable: string, mutator: EnvironmentVariableMutator, collection: EnvironmentVariableCollection) => any, thisArg?: any): void; - - /** - * Deletes this collection's mutator for a variable. - * - * @param variable The variable to delete the mutator for. - */ - delete(variable: string): void; - - /** - * Clears all mutators from this collection. - */ - clear(): void; - } - - /** - * A location in the editor at which progress information can be shown. It depends on the - * location how progress is visually represented. - */ - export enum ProgressLocation { - - /** - * Show progress for the source control viewlet, as overlay for the icon and as progress bar - * inside the viewlet (when visible). Neither supports cancellation nor discrete progress nor - * a label to describe the operation. - */ - SourceControl = 1, - - /** - * Show progress in the status bar of the editor. Neither supports cancellation nor discrete progress. - * Supports rendering of {@link ThemeIcon theme icons} via the `$()`-syntax in the progress label. - */ - Window = 10, - - /** - * Show progress as notification with an optional cancel button. Supports to show infinite and discrete - * progress but does not support rendering of icons. - */ - Notification = 15 - } - - /** - * Value-object describing where and how progress should show. - */ - export interface ProgressOptions { - - /** - * The location at which progress should show. - */ - location: ProgressLocation | { viewId: string }; - - /** - * A human-readable string which will be used to describe the - * operation. - */ - title?: string; - - /** - * Controls if a cancel button should show to allow the user to - * cancel the long running operation. Note that currently only - * `ProgressLocation.Notification` is supporting to show a cancel - * button. - */ - cancellable?: boolean; - } - - /** - * A light-weight user input UI that is initially not visible. After - * configuring it through its properties the extension can make it - * visible by calling {@link QuickInput.show}. - * - * There are several reasons why this UI might have to be hidden and - * the extension will be notified through {@link QuickInput.onDidHide}. - * (Examples include: an explicit call to {@link QuickInput.hide}, - * the user pressing Esc, some other input UI opening, etc.) - * - * A user pressing Enter or some other gesture implying acceptance - * of the current state does not automatically hide this UI component. - * It is up to the extension to decide whether to accept the user's input - * and if the UI should indeed be hidden through a call to {@link QuickInput.hide}. - * - * When the extension no longer needs this input UI, it should - * {@link QuickInput.dispose} it to allow for freeing up - * any resources associated with it. - * - * See {@link QuickPick} and {@link InputBox} for concrete UIs. - */ - export interface QuickInput { - - /** - * An optional title. - */ - title: string | undefined; - - /** - * An optional current step count. - */ - step: number | undefined; - - /** - * An optional total step count. - */ - totalSteps: number | undefined; - - /** - * If the UI should allow for user input. Defaults to true. - * - * Change this to false, e.g., while validating user input or - * loading data for the next step in user input. - */ - enabled: boolean; - - /** - * If the UI should show a progress indicator. Defaults to false. - * - * Change this to true, e.g., while loading more data or validating - * user input. - */ - busy: boolean; - - /** - * If the UI should stay open even when loosing UI focus. Defaults to false. - * This setting is ignored on iPad and is always false. - */ - ignoreFocusOut: boolean; - - /** - * Makes the input UI visible in its current configuration. Any other input - * UI will first fire an {@link QuickInput.onDidHide} event. - */ - show(): void; - - /** - * Hides this input UI. This will also fire an {@link QuickInput.onDidHide} - * event. - */ - hide(): void; - - /** - * An event signaling when this input UI is hidden. - * - * There are several reasons why this UI might have to be hidden and - * the extension will be notified through {@link QuickInput.onDidHide}. - * (Examples include: an explicit call to {@link QuickInput.hide}, - * the user pressing Esc, some other input UI opening, etc.) - */ - onDidHide: Event; - - /** - * Dispose of this input UI and any associated resources. If it is still - * visible, it is first hidden. After this call the input UI is no longer - * functional and no additional methods or properties on it should be - * accessed. Instead a new input UI should be created. - */ - dispose(): void; - } - - /** - * A concrete {@link QuickInput} to let the user pick an item from a - * list of items of type T. The items can be filtered through a filter text field and - * there is an option {@link QuickPick.canSelectMany canSelectMany} to allow for - * selecting multiple items. - * - * Note that in many cases the more convenient {@link window.showQuickPick} - * is easier to use. {@link window.createQuickPick} should be used - * when {@link window.showQuickPick} does not offer the required flexibility. - */ - export interface QuickPick extends QuickInput { - - /** - * Current value of the filter text. - */ - value: string; - - /** - * Optional placeholder shown in the filter textbox when no filter has been entered. - */ - placeholder: string | undefined; - - /** - * An event signaling when the value of the filter text has changed. - */ - readonly onDidChangeValue: Event; - - /** - * An event signaling when the user indicated acceptance of the selected item(s). - */ - readonly onDidAccept: Event; - - /** - * Buttons for actions in the UI. - */ - buttons: readonly QuickInputButton[]; - - /** - * An event signaling when a button in the title bar was triggered. - * This event does not fire for buttons on a {@link QuickPickItem}. - */ - readonly onDidTriggerButton: Event; - - /** - * An event signaling when a button in a particular {@link QuickPickItem} was triggered. - * This event does not fire for buttons in the title bar. - */ - readonly onDidTriggerItemButton: Event>; - - /** - * Items to pick from. This can be read and updated by the extension. - */ - items: readonly T[]; - - /** - * If multiple items can be selected at the same time. Defaults to false. - */ - canSelectMany: boolean; - - /** - * If the filter text should also be matched against the description of the items. Defaults to false. - */ - matchOnDescription: boolean; - - /** - * If the filter text should also be matched against the detail of the items. Defaults to false. - */ - matchOnDetail: boolean; - - /* - * An optional flag to maintain the scroll position of the quick pick when the quick pick items are updated. Defaults to false. - */ - keepScrollPosition?: boolean; - - /** - * Active items. This can be read and updated by the extension. - */ - activeItems: readonly T[]; - - /** - * An event signaling when the active items have changed. - */ - readonly onDidChangeActive: Event; - - /** - * Selected items. This can be read and updated by the extension. - */ - selectedItems: readonly T[]; - - /** - * An event signaling when the selected items have changed. - */ - readonly onDidChangeSelection: Event; - } - - /** - * A concrete {@link QuickInput} to let the user input a text value. - * - * Note that in many cases the more convenient {@link window.showInputBox} - * is easier to use. {@link window.createInputBox} should be used - * when {@link window.showInputBox} does not offer the required flexibility. - */ - export interface InputBox extends QuickInput { - - /** - * Current input value. - */ - value: string; - - /** - * Selection range in the input value. Defined as tuple of two number where the - * first is the inclusive start index and the second the exclusive end index. When `undefined` the whole - * pre-filled value will be selected, when empty (start equals end) only the cursor will be set, - * otherwise the defined range will be selected. - * - * This property does not get updated when the user types or makes a selection, - * but it can be updated by the extension. - */ - valueSelection: readonly [number, number] | undefined; - - /** - * Optional placeholder shown when no value has been input. - */ - placeholder: string | undefined; - - /** - * If the input value should be hidden. Defaults to false. - */ - password: boolean; - - /** - * An event signaling when the value has changed. - */ - readonly onDidChangeValue: Event; - - /** - * An event signaling when the user indicated acceptance of the input value. - */ - readonly onDidAccept: Event; - - /** - * Buttons for actions in the UI. - */ - buttons: readonly QuickInputButton[]; - - /** - * An event signaling when a button was triggered. - */ - readonly onDidTriggerButton: Event; - - /** - * An optional prompt text providing some ask or explanation to the user. - */ - prompt: string | undefined; - - /** - * An optional validation message indicating a problem with the current input value. - * By returning a string, the InputBox will use a default {@link InputBoxValidationSeverity} of Error. - * Returning undefined clears the validation message. - */ - validationMessage: string | InputBoxValidationMessage | undefined; - } - - /** - * Button for an action in a {@link QuickPick} or {@link InputBox}. - */ - export interface QuickInputButton { - - /** - * Icon for the button. - */ - readonly iconPath: Uri | { light: Uri; dark: Uri } | ThemeIcon; - - /** - * An optional tooltip. - */ - readonly tooltip?: string | undefined; - } - - /** - * Predefined buttons for {@link QuickPick} and {@link InputBox}. - */ - export class QuickInputButtons { - - /** - * A back button for {@link QuickPick} and {@link InputBox}. - * - * When a navigation 'back' button is needed this one should be used for consistency. - * It comes with a predefined icon, tooltip and location. - */ - static readonly Back: QuickInputButton; - - /** - * @hidden - */ - private constructor(); - } - - /** - * An event signaling when a button in a particular {@link QuickPickItem} was triggered. - * This event does not fire for buttons in the title bar. - */ - export interface QuickPickItemButtonEvent { - /** - * The button that was clicked. - */ - readonly button: QuickInputButton; - /** - * The item that the button belongs to. - */ - readonly item: T; - } - - /** - * An event describing an individual change in the text of a {@link TextDocument document}. - */ - export interface TextDocumentContentChangeEvent { - /** - * The range that got replaced. - */ - readonly range: Range; - /** - * The offset of the range that got replaced. - */ - readonly rangeOffset: number; - /** - * The length of the range that got replaced. - */ - readonly rangeLength: number; - /** - * The new text for the range. - */ - readonly text: string; - } - - export enum TextDocumentChangeReason { - /** The text change is caused by an undo operation. */ - Undo = 1, - - /** The text change is caused by an redo operation. */ - Redo = 2, - } - - /** - * An event describing a transactional {@link TextDocument document} change. - */ - export interface TextDocumentChangeEvent { - - /** - * The affected document. - */ - readonly document: TextDocument; - - /** - * An array of content changes. - */ - readonly contentChanges: readonly TextDocumentContentChangeEvent[]; - - /** - * The reason why the document was changed. - * Is `undefined` if the reason is not known. - */ - readonly reason: TextDocumentChangeReason | undefined; - } - - /** - * Represents reasons why a text document is saved. - */ - export enum TextDocumentSaveReason { - - /** - * Manually triggered, e.g. by the user pressing save, by starting debugging, - * or by an API call. - */ - Manual = 1, - - /** - * Automatic after a delay. - */ - AfterDelay = 2, - - /** - * When the editor lost focus. - */ - FocusOut = 3 - } - - /** - * An event that is fired when a {@link TextDocument document} will be saved. - * - * To make modifications to the document before it is being saved, call the - * {@linkcode TextDocumentWillSaveEvent.waitUntil waitUntil}-function with a thenable - * that resolves to an array of {@link TextEdit text edits}. - */ - export interface TextDocumentWillSaveEvent { - - /** - * The document that will be saved. - */ - readonly document: TextDocument; - - /** - * The reason why save was triggered. - */ - readonly reason: TextDocumentSaveReason; - - /** - * Allows to pause the event loop and to apply {@link TextEdit pre-save-edits}. - * Edits of subsequent calls to this function will be applied in order. The - * edits will be *ignored* if concurrent modifications of the document happened. - * - * *Note:* This function can only be called during event dispatch and not - * in an asynchronous manner: - * - * ```ts - * workspace.onWillSaveTextDocument(event => { - * // async, will *throw* an error - * setTimeout(() => event.waitUntil(promise)); - * - * // sync, OK - * event.waitUntil(promise); - * }) - * ``` - * - * @param thenable A thenable that resolves to {@link TextEdit pre-save-edits}. - */ - waitUntil(thenable: Thenable): void; - - /** - * Allows to pause the event loop until the provided thenable resolved. - * - * *Note:* This function can only be called during event dispatch. - * - * @param thenable A thenable that delays saving. - */ - waitUntil(thenable: Thenable): void; - } - - /** - * An event that is fired when files are going to be created. - * - * To make modifications to the workspace before the files are created, - * call the {@linkcode FileWillCreateEvent.waitUntil waitUntil}-function with a - * thenable that resolves to a {@link WorkspaceEdit workspace edit}. - */ - export interface FileWillCreateEvent { - - /** - * A cancellation token. - */ - readonly token: CancellationToken; - - /** - * The files that are going to be created. - */ - readonly files: readonly Uri[]; - - /** - * Allows to pause the event and to apply a {@link WorkspaceEdit workspace edit}. - * - * *Note:* This function can only be called during event dispatch and not - * in an asynchronous manner: - * - * ```ts - * workspace.onWillCreateFiles(event => { - * // async, will *throw* an error - * setTimeout(() => event.waitUntil(promise)); - * - * // sync, OK - * event.waitUntil(promise); - * }) - * ``` - * - * @param thenable A thenable that delays saving. - */ - waitUntil(thenable: Thenable): void; - - /** - * Allows to pause the event until the provided thenable resolves. - * - * *Note:* This function can only be called during event dispatch. - * - * @param thenable A thenable that delays saving. - */ - waitUntil(thenable: Thenable): void; - } - - /** - * An event that is fired after files are created. - */ - export interface FileCreateEvent { - - /** - * The files that got created. - */ - readonly files: readonly Uri[]; - } - - /** - * An event that is fired when files are going to be deleted. - * - * To make modifications to the workspace before the files are deleted, - * call the {@link FileWillCreateEvent.waitUntil `waitUntil`}-function with a - * thenable that resolves to a {@link WorkspaceEdit workspace edit}. - */ - export interface FileWillDeleteEvent { - - /** - * A cancellation token. - */ - readonly token: CancellationToken; - - /** - * The files that are going to be deleted. - */ - readonly files: readonly Uri[]; - - /** - * Allows to pause the event and to apply a {@link WorkspaceEdit workspace edit}. - * - * *Note:* This function can only be called during event dispatch and not - * in an asynchronous manner: - * - * ```ts - * workspace.onWillCreateFiles(event => { - * // async, will *throw* an error - * setTimeout(() => event.waitUntil(promise)); - * - * // sync, OK - * event.waitUntil(promise); - * }) - * ``` - * - * @param thenable A thenable that delays saving. - */ - waitUntil(thenable: Thenable): void; - - /** - * Allows to pause the event until the provided thenable resolves. - * - * *Note:* This function can only be called during event dispatch. - * - * @param thenable A thenable that delays saving. - */ - waitUntil(thenable: Thenable): void; - } - - /** - * An event that is fired after files are deleted. - */ - export interface FileDeleteEvent { - - /** - * The files that got deleted. - */ - readonly files: readonly Uri[]; - } - - /** - * An event that is fired when files are going to be renamed. - * - * To make modifications to the workspace before the files are renamed, - * call the {@link FileWillCreateEvent.waitUntil `waitUntil`}-function with a - * thenable that resolves to a {@link WorkspaceEdit workspace edit}. - */ - export interface FileWillRenameEvent { - - /** - * A cancellation token. - */ - readonly token: CancellationToken; - - /** - * The files that are going to be renamed. - */ - readonly files: ReadonlyArray<{ readonly oldUri: Uri; readonly newUri: Uri }>; - - /** - * Allows to pause the event and to apply a {@link WorkspaceEdit workspace edit}. - * - * *Note:* This function can only be called during event dispatch and not - * in an asynchronous manner: - * - * ```ts - * workspace.onWillCreateFiles(event => { - * // async, will *throw* an error - * setTimeout(() => event.waitUntil(promise)); - * - * // sync, OK - * event.waitUntil(promise); - * }) - * ``` - * - * @param thenable A thenable that delays saving. - */ - waitUntil(thenable: Thenable): void; - - /** - * Allows to pause the event until the provided thenable resolves. - * - * *Note:* This function can only be called during event dispatch. - * - * @param thenable A thenable that delays saving. - */ - waitUntil(thenable: Thenable): void; - } - - /** - * An event that is fired after files are renamed. - */ - export interface FileRenameEvent { - - /** - * The files that got renamed. - */ - readonly files: ReadonlyArray<{ readonly oldUri: Uri; readonly newUri: Uri }>; - } - - /** - * An event describing a change to the set of {@link workspace.workspaceFolders workspace folders}. - */ - export interface WorkspaceFoldersChangeEvent { - /** - * Added workspace folders. - */ - readonly added: readonly WorkspaceFolder[]; - - /** - * Removed workspace folders. - */ - readonly removed: readonly WorkspaceFolder[]; - } - - /** - * A workspace folder is one of potentially many roots opened by the editor. All workspace folders - * are equal which means there is no notion of an active or primary workspace folder. - */ - export interface WorkspaceFolder { - - /** - * The associated uri for this workspace folder. - * - * *Note:* The {@link Uri}-type was intentionally chosen such that future releases of the editor can support - * workspace folders that are not stored on the local disk, e.g. `ftp://server/workspaces/foo`. - */ - readonly uri: Uri; - - /** - * The name of this workspace folder. Defaults to - * the basename of its {@link Uri.path uri-path} - */ - readonly name: string; - - /** - * The ordinal number of this workspace folder. - */ - readonly index: number; - } - - /** - * Namespace for dealing with the current workspace. A workspace is the collection of one - * or more folders that are opened in an editor window (instance). - * - * It is also possible to open an editor without a workspace. For example, when you open a - * new editor window by selecting a file from your platform's File menu, you will not be - * inside a workspace. In this mode, some of the editor's capabilities are reduced but you can - * still open text files and edit them. - * - * Refer to https://code.visualstudio.com/docs/editor/workspaces for more information on - * the concept of workspaces. - * - * The workspace offers support for {@link workspace.createFileSystemWatcher listening} to fs - * events and for {@link workspace.findFiles finding} files. Both perform well and run _outside_ - * the editor-process so that they should be always used instead of nodejs-equivalents. - */ - export namespace workspace { - - /** - * A {@link FileSystem file system} instance that allows to interact with local and remote - * files, e.g. `vscode.workspace.fs.readDirectory(someUri)` allows to retrieve all entries - * of a directory or `vscode.workspace.fs.stat(anotherUri)` returns the meta data for a - * file. - */ - export const fs: FileSystem; - - /** - * The uri of the first entry of {@linkcode workspace.workspaceFolders workspaceFolders} - * as `string`. `undefined` if there is no first entry. - * - * Refer to https://code.visualstudio.com/docs/editor/workspaces for more information - * on workspaces. - * - * @deprecated Use {@linkcode workspace.workspaceFolders workspaceFolders} instead. - */ - export const rootPath: string | undefined; - - /** - * List of workspace folders (0-N) that are open in the editor. `undefined` when no workspace - * has been opened. - * - * Refer to https://code.visualstudio.com/docs/editor/workspaces for more information - * on workspaces. - */ - export const workspaceFolders: readonly WorkspaceFolder[] | undefined; - - /** - * The name of the workspace. `undefined` when no workspace - * has been opened. - * - * Refer to https://code.visualstudio.com/docs/editor/workspaces for more information on - * the concept of workspaces. - */ - export const name: string | undefined; - - /** - * The location of the workspace file, for example: - * - * `file:///Users/name/Development/myProject.code-workspace` - * - * or - * - * `untitled:1555503116870` - * - * for a workspace that is untitled and not yet saved. - * - * Depending on the workspace that is opened, the value will be: - * * `undefined` when no workspace is opened - * * the path of the workspace file as `Uri` otherwise. if the workspace - * is untitled, the returned URI will use the `untitled:` scheme - * - * The location can e.g. be used with the `vscode.openFolder` command to - * open the workspace again after it has been closed. - * - * **Example:** - * ```typescript - * vscode.commands.executeCommand('vscode.openFolder', uriOfWorkspace); - * ``` - * - * Refer to https://code.visualstudio.com/docs/editor/workspaces for more information on - * the concept of workspaces. - * - * **Note:** it is not advised to use `workspace.workspaceFile` to write - * configuration data into the file. You can use `workspace.getConfiguration().update()` - * for that purpose which will work both when a single folder is opened as - * well as an untitled or saved workspace. - */ - export const workspaceFile: Uri | undefined; - - /** - * An event that is emitted when a workspace folder is added or removed. - * - * **Note:** this event will not fire if the first workspace folder is added, removed or changed, - * because in that case the currently executing extensions (including the one that listens to this - * event) will be terminated and restarted so that the (deprecated) `rootPath` property is updated - * to point to the first workspace folder. - */ - export const onDidChangeWorkspaceFolders: Event; - - /** - * Returns the {@link WorkspaceFolder workspace folder} that contains a given uri. - * * returns `undefined` when the given uri doesn't match any workspace folder - * * returns the *input* when the given uri is a workspace folder itself - * - * @param uri An uri. - * @return A workspace folder or `undefined` - */ - export function getWorkspaceFolder(uri: Uri): WorkspaceFolder | undefined; - - /** - * Returns a path that is relative to the workspace folder or folders. - * - * When there are no {@link workspace.workspaceFolders workspace folders} or when the path - * is not contained in them, the input is returned. - * - * @param pathOrUri A path or uri. When a uri is given its {@link Uri.fsPath fsPath} is used. - * @param includeWorkspaceFolder When `true` and when the given path is contained inside a - * workspace folder the name of the workspace is prepended. Defaults to `true` when there are - * multiple workspace folders and `false` otherwise. - * @return A path relative to the root or the input. - */ - export function asRelativePath(pathOrUri: string | Uri, includeWorkspaceFolder?: boolean): string; - - /** - * This method replaces `deleteCount` {@link workspace.workspaceFolders workspace folders} starting at index `start` - * by an optional set of `workspaceFoldersToAdd` on the `vscode.workspace.workspaceFolders` array. This "splice" - * behavior can be used to add, remove and change workspace folders in a single operation. - * - * **Note:** in some cases calling this method may result in the currently executing extensions (including the - * one that called this method) to be terminated and restarted. For example when the first workspace folder is - * added, removed or changed the (deprecated) `rootPath` property is updated to point to the first workspace - * folder. Another case is when transitioning from an empty or single-folder workspace into a multi-folder - * workspace (see also: https://code.visualstudio.com/docs/editor/workspaces). - * - * Use the {@linkcode onDidChangeWorkspaceFolders onDidChangeWorkspaceFolders()} event to get notified when the - * workspace folders have been updated. - * - * **Example:** adding a new workspace folder at the end of workspace folders - * ```typescript - * workspace.updateWorkspaceFolders(workspace.workspaceFolders ? workspace.workspaceFolders.length : 0, null, { uri: ...}); - * ``` - * - * **Example:** removing the first workspace folder - * ```typescript - * workspace.updateWorkspaceFolders(0, 1); - * ``` - * - * **Example:** replacing an existing workspace folder with a new one - * ```typescript - * workspace.updateWorkspaceFolders(0, 1, { uri: ...}); - * ``` - * - * It is valid to remove an existing workspace folder and add it again with a different name - * to rename that folder. - * - * **Note:** it is not valid to call {@link updateWorkspaceFolders updateWorkspaceFolders()} multiple times - * without waiting for the {@linkcode onDidChangeWorkspaceFolders onDidChangeWorkspaceFolders()} to fire. - * - * @param start the zero-based location in the list of currently opened {@link WorkspaceFolder workspace folders} - * from which to start deleting workspace folders. - * @param deleteCount the optional number of workspace folders to remove. - * @param workspaceFoldersToAdd the optional variable set of workspace folders to add in place of the deleted ones. - * Each workspace is identified with a mandatory URI and an optional name. - * @return true if the operation was successfully started and false otherwise if arguments were used that would result - * in invalid workspace folder state (e.g. 2 folders with the same URI). - */ - export function updateWorkspaceFolders(start: number, deleteCount: number | undefined | null, ...workspaceFoldersToAdd: { readonly uri: Uri; readonly name?: string }[]): boolean; - - /** - * Creates a file system watcher that is notified on file events (create, change, delete) - * depending on the parameters provided. - * - * By default, all opened {@link workspace.workspaceFolders workspace folders} will be watched - * for file changes recursively. - * - * Additional paths can be added for file watching by providing a {@link RelativePattern} with - * a `base` path to watch. If the `pattern` is complex (e.g. contains `**` or path segments), - * the path will be watched recursively and otherwise will be watched non-recursively (i.e. only - * changes to the first level of the path will be reported). - * - * *Note* that requests for recursive file watchers for a `base` path that is inside the opened - * workspace are ignored given all opened {@link workspace.workspaceFolders workspace folders} are - * watched for file changes recursively by default. Non-recursive file watchers however are always - * supported, even inside the opened workspace because they allow to bypass the configured settings - * for excludes (`files.watcherExclude`). If you need to watch in a location that is typically - * excluded (for example `node_modules` or `.git` folder), then you can use a non-recursive watcher - * in the workspace for this purpose. - * - * If possible, keep the use of recursive watchers to a minimum because recursive file watching - * is quite resource intense. - * - * Providing a `string` as `globPattern` acts as convenience method for watching file events in - * all opened workspace folders. It cannot be used to add more folders for file watching, nor will - * it report any file events from folders that are not part of the opened workspace folders. - * - * Optionally, flags to ignore certain kinds of events can be provided. - * - * To stop listening to events the watcher must be disposed. - * - * *Note* that file events from recursive file watchers may be excluded based on user configuration. - * The setting `files.watcherExclude` helps to reduce the overhead of file events from folders - * that are known to produce many file changes at once (such as `node_modules` folders). As such, - * it is highly recommended to watch with simple patterns that do not require recursive watchers - * where the exclude settings are ignored and you have full control over the events. - * - * *Note* that symbolic links are not automatically followed for file watching unless the path to - * watch itself is a symbolic link. - * - * *Note* that file changes for the path to be watched may not be delivered when the path itself - * changes. For example, when watching a path `/Users/somename/Desktop` and the path itself is - * being deleted, the watcher may not report an event and may not work anymore from that moment on. - * The underlying behaviour depends on the path that is provided for watching: - * * if the path is within any of the workspace folders, deletions are tracked and reported unless - * excluded via `files.watcherExclude` setting - * * if the path is equal to any of the workspace folders, deletions are not tracked - * * if the path is outside of any of the workspace folders, deletions are not tracked - * - * If you are interested in being notified when the watched path itself is being deleted, you have - * to watch it's parent folder. Make sure to use a simple `pattern` (such as putting the name of the - * folder) to not accidentally watch all sibling folders recursively. - * - * *Note* that the file paths that are reported for having changed may have a different path casing - * compared to the actual casing on disk on case-insensitive platforms (typically macOS and Windows - * but not Linux). We allow a user to open a workspace folder with any desired path casing and try - * to preserve that. This means: - * * if the path is within any of the workspace folders, the path will match the casing of the - * workspace folder up to that portion of the path and match the casing on disk for children - * * if the path is outside of any of the workspace folders, the casing will match the case of the - * path that was provided for watching - * In the same way, symbolic links are preserved, i.e. the file event will report the path of the - * symbolic link as it was provided for watching and not the target. - * - * ### Examples - * - * The basic anatomy of a file watcher is as follows: - * - * ```ts - * const watcher = vscode.workspace.createFileSystemWatcher(new vscode.RelativePattern(, )); - * - * watcher.onDidChange(uri => { ... }); // listen to files being changed - * watcher.onDidCreate(uri => { ... }); // listen to files/folders being created - * watcher.onDidDelete(uri => { ... }); // listen to files/folders getting deleted - * - * watcher.dispose(); // dispose after usage - * ``` - * - * #### Workspace file watching - * - * If you only care about file events in a specific workspace folder: - * - * ```ts - * vscode.workspace.createFileSystemWatcher(new vscode.RelativePattern(vscode.workspace.workspaceFolders[0], '**​/*.js')); - * ``` - * - * If you want to monitor file events across all opened workspace folders: - * - * ```ts - * vscode.workspace.createFileSystemWatcher('**​/*.js')); - * ``` - * - * *Note:* the array of workspace folders can be empty if no workspace is opened (empty window). - * - * #### Out of workspace file watching - * - * To watch a folder for changes to *.js files outside the workspace (non recursively), pass in a `Uri` to such - * a folder: - * - * ```ts - * vscode.workspace.createFileSystemWatcher(new vscode.RelativePattern(vscode.Uri.file(), '*.js')); - * ``` - * - * And use a complex glob pattern to watch recursively: - * - * ```ts - * vscode.workspace.createFileSystemWatcher(new vscode.RelativePattern(vscode.Uri.file(), '**​/*.js')); - * ``` - * - * Here is an example for watching the active editor for file changes: - * - * ```ts - * vscode.workspace.createFileSystemWatcher(new vscode.RelativePattern(vscode.window.activeTextEditor.document.uri, '*')); - * ``` - * - * @param globPattern A {@link GlobPattern glob pattern} that controls which file events the watcher should report. - * @param ignoreCreateEvents Ignore when files have been created. - * @param ignoreChangeEvents Ignore when files have been changed. - * @param ignoreDeleteEvents Ignore when files have been deleted. - * @return A new file system watcher instance. Must be disposed when no longer needed. - */ - export function createFileSystemWatcher(globPattern: GlobPattern, ignoreCreateEvents?: boolean, ignoreChangeEvents?: boolean, ignoreDeleteEvents?: boolean): FileSystemWatcher; - - /** - * Find files across all {@link workspace.workspaceFolders workspace folders} in the workspace. - * - * @example - * findFiles('**​/*.js', '**​/node_modules/**', 10) - * - * @param include A {@link GlobPattern glob pattern} that defines the files to search for. The glob pattern - * will be matched against the file paths of resulting matches relative to their workspace. Use a {@link RelativePattern relative pattern} - * to restrict the search results to a {@link WorkspaceFolder workspace folder}. - * @param exclude A {@link GlobPattern glob pattern} that defines files and folders to exclude. The glob pattern - * will be matched against the file paths of resulting matches relative to their workspace. When `undefined`, default file-excludes (e.g. the `files.exclude`-setting - * but not `search.exclude`) will apply. When `null`, no excludes will apply. - * @param maxResults An upper-bound for the result. - * @param token A token that can be used to signal cancellation to the underlying search engine. - * @return A thenable that resolves to an array of resource identifiers. Will return no results if no - * {@link workspace.workspaceFolders workspace folders} are opened. - */ - export function findFiles(include: GlobPattern, exclude?: GlobPattern | null, maxResults?: number, token?: CancellationToken): Thenable; - - /** - * Save all dirty files. - * - * @param includeUntitled Also save files that have been created during this session. - * @return A thenable that resolves when the files have been saved. Will return `false` - * for any file that failed to save. - */ - export function saveAll(includeUntitled?: boolean): Thenable; - - /** - * Make changes to one or many resources or create, delete, and rename resources as defined by the given - * {@link WorkspaceEdit workspace edit}. - * - * All changes of a workspace edit are applied in the same order in which they have been added. If - * multiple textual inserts are made at the same position, these strings appear in the resulting text - * in the order the 'inserts' were made, unless that are interleaved with resource edits. Invalid sequences - * like 'delete file a' -> 'insert text in file a' cause failure of the operation. - * - * When applying a workspace edit that consists only of text edits an 'all-or-nothing'-strategy is used. - * A workspace edit with resource creations or deletions aborts the operation, e.g. consecutive edits will - * not be attempted, when a single edit fails. - * - * @param edit A workspace edit. - * @param metadata Optional {@link WorkspaceEditMetadata metadata} for the edit. - * @return A thenable that resolves when the edit could be applied. - */ - export function applyEdit(edit: WorkspaceEdit, metadata?: WorkspaceEditMetadata): Thenable; - - /** - * All text documents currently known to the editor. - */ - export const textDocuments: readonly TextDocument[]; - - /** - * Opens a document. Will return early if this document is already open. Otherwise - * the document is loaded and the {@link workspace.onDidOpenTextDocument didOpen}-event fires. - * - * The document is denoted by an {@link Uri}. Depending on the {@link Uri.scheme scheme} the - * following rules apply: - * * `file`-scheme: Open a file on disk (`openTextDocument(Uri.file(path))`). Will be rejected if the file - * does not exist or cannot be loaded. - * * `untitled`-scheme: Open a blank untitled file with associated path (`openTextDocument(Uri.file(path).with({ scheme: 'untitled' }))`). - * The language will be derived from the file name. - * * For all other schemes contributed {@link TextDocumentContentProvider text document content providers} and - * {@link FileSystemProvider file system providers} are consulted. - * - * *Note* that the lifecycle of the returned document is owned by the editor and not by the extension. That means an - * {@linkcode workspace.onDidCloseTextDocument onDidClose}-event can occur at any time after opening it. - * - * @param uri Identifies the resource to open. - * @return A promise that resolves to a {@link TextDocument document}. - */ - export function openTextDocument(uri: Uri): Thenable; - - /** - * A short-hand for `openTextDocument(Uri.file(fileName))`. - * - * @see {@link workspace.openTextDocument} - * @param fileName A name of a file on disk. - * @return A promise that resolves to a {@link TextDocument document}. - */ - export function openTextDocument(fileName: string): Thenable; - - /** - * Opens an untitled text document. The editor will prompt the user for a file - * path when the document is to be saved. The `options` parameter allows to - * specify the *language* and/or the *content* of the document. - * - * @param options Options to control how the document will be created. - * @return A promise that resolves to a {@link TextDocument document}. - */ - export function openTextDocument(options?: { language?: string; content?: string }): Thenable; - - /** - * Register a text document content provider. - * - * Only one provider can be registered per scheme. - * - * @param scheme The uri-scheme to register for. - * @param provider A content provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerTextDocumentContentProvider(scheme: string, provider: TextDocumentContentProvider): Disposable; - - /** - * An event that is emitted when a {@link TextDocument text document} is opened or when the language id - * of a text document {@link languages.setTextDocumentLanguage has been changed}. - * - * To add an event listener when a visible text document is opened, use the {@link TextEditor} events in the - * {@link window} namespace. Note that: - * - * - The event is emitted before the {@link TextDocument document} is updated in the - * {@link window.activeTextEditor active text editor} - * - When a {@link TextDocument text document} is already open (e.g.: open in another {@link window.visibleTextEditors visible text editor}) this event is not emitted - * - */ - export const onDidOpenTextDocument: Event; - - /** - * An event that is emitted when a {@link TextDocument text document} is disposed or when the language id - * of a text document {@link languages.setTextDocumentLanguage has been changed}. - * - * *Note 1:* There is no guarantee that this event fires when an editor tab is closed, use the - * {@linkcode window.onDidChangeVisibleTextEditors onDidChangeVisibleTextEditors}-event to know when editors change. - * - * *Note 2:* A document can be open but not shown in an editor which means this event can fire - * for a document that has not been shown in an editor. - */ - export const onDidCloseTextDocument: Event; - - /** - * An event that is emitted when a {@link TextDocument text document} is changed. This usually happens - * when the {@link TextDocument.getText contents} changes but also when other things like the - * {@link TextDocument.isDirty dirty}-state changes. - */ - export const onDidChangeTextDocument: Event; - - /** - * An event that is emitted when a {@link TextDocument text document} will be saved to disk. - * - * *Note 1:* Subscribers can delay saving by registering asynchronous work. For the sake of data integrity the editor - * might save without firing this event. For instance when shutting down with dirty files. - * - * *Note 2:* Subscribers are called sequentially and they can {@link TextDocumentWillSaveEvent.waitUntil delay} saving - * by registering asynchronous work. Protection against misbehaving listeners is implemented as such: - * * there is an overall time budget that all listeners share and if that is exhausted no further listener is called - * * listeners that take a long time or produce errors frequently will not be called anymore - * - * The current thresholds are 1.5 seconds as overall time budget and a listener can misbehave 3 times before being ignored. - */ - export const onWillSaveTextDocument: Event; - - /** - * An event that is emitted when a {@link TextDocument text document} is saved to disk. - */ - export const onDidSaveTextDocument: Event; - - /** - * All notebook documents currently known to the editor. - */ - export const notebookDocuments: readonly NotebookDocument[]; - - /** - * Open a notebook. Will return early if this notebook is already {@link notebookDocuments loaded}. Otherwise - * the notebook is loaded and the {@linkcode onDidOpenNotebookDocument}-event fires. - * - * *Note* that the lifecycle of the returned notebook is owned by the editor and not by the extension. That means an - * {@linkcode onDidCloseNotebookDocument}-event can occur at any time after. - * - * *Note* that opening a notebook does not show a notebook editor. This function only returns a notebook document which - * can be shown in a notebook editor but it can also be used for other things. - * - * @param uri The resource to open. - * @returns A promise that resolves to a {@link NotebookDocument notebook} - */ - export function openNotebookDocument(uri: Uri): Thenable; - - /** - * Open an untitled notebook. The editor will prompt the user for a file - * path when the document is to be saved. - * - * @see {@link workspace.openNotebookDocument} - * @param notebookType The notebook type that should be used. - * @param content The initial contents of the notebook. - * @returns A promise that resolves to a {@link NotebookDocument notebook}. - */ - export function openNotebookDocument(notebookType: string, content?: NotebookData): Thenable; - - /** - * An event that is emitted when a {@link NotebookDocument notebook} has changed. - */ - export const onDidChangeNotebookDocument: Event; - - /** - * An event that is emitted when a {@link NotebookDocument notebook} is saved. - */ - export const onDidSaveNotebookDocument: Event; - - /** - * Register a {@link NotebookSerializer notebook serializer}. - * - * A notebook serializer must be contributed through the `notebooks` extension point. When opening a notebook file, the editor will send - * the `onNotebook:` activation event, and extensions must register their serializer in return. - * - * @param notebookType A notebook. - * @param serializer A notebook serializer. - * @param options Optional context options that define what parts of a notebook should be persisted - * @return A {@link Disposable} that unregisters this serializer when being disposed. - */ - export function registerNotebookSerializer(notebookType: string, serializer: NotebookSerializer, options?: NotebookDocumentContentOptions): Disposable; - - /** - * An event that is emitted when a {@link NotebookDocument notebook} is opened. - */ - export const onDidOpenNotebookDocument: Event; - - /** - * An event that is emitted when a {@link NotebookDocument notebook} is disposed. - * - * *Note 1:* There is no guarantee that this event fires when an editor tab is closed. - * - * *Note 2:* A notebook can be open but not shown in an editor which means this event can fire - * for a notebook that has not been shown in an editor. - */ - export const onDidCloseNotebookDocument: Event; - - /** - * An event that is emitted when files are being created. - * - * *Note 1:* This event is triggered by user gestures, like creating a file from the - * explorer, or from the {@linkcode workspace.applyEdit}-api. This event is *not* fired when - * files change on disk, e.g triggered by another application, or when using the - * {@linkcode FileSystem workspace.fs}-api. - * - * *Note 2:* When this event is fired, edits to files that are are being created cannot be applied. - */ - export const onWillCreateFiles: Event; - - /** - * An event that is emitted when files have been created. - * - * *Note:* This event is triggered by user gestures, like creating a file from the - * explorer, or from the {@linkcode workspace.applyEdit}-api, but this event is *not* fired when - * files change on disk, e.g triggered by another application, or when using the - * {@linkcode FileSystem workspace.fs}-api. - */ - export const onDidCreateFiles: Event; - - /** - * An event that is emitted when files are being deleted. - * - * *Note 1:* This event is triggered by user gestures, like deleting a file from the - * explorer, or from the {@linkcode workspace.applyEdit}-api, but this event is *not* fired when - * files change on disk, e.g triggered by another application, or when using the - * {@linkcode FileSystem workspace.fs}-api. - * - * *Note 2:* When deleting a folder with children only one event is fired. - */ - export const onWillDeleteFiles: Event; - - /** - * An event that is emitted when files have been deleted. - * - * *Note 1:* This event is triggered by user gestures, like deleting a file from the - * explorer, or from the {@linkcode workspace.applyEdit}-api, but this event is *not* fired when - * files change on disk, e.g triggered by another application, or when using the - * {@linkcode FileSystem workspace.fs}-api. - * - * *Note 2:* When deleting a folder with children only one event is fired. - */ - export const onDidDeleteFiles: Event; - - /** - * An event that is emitted when files are being renamed. - * - * *Note 1:* This event is triggered by user gestures, like renaming a file from the - * explorer, and from the {@linkcode workspace.applyEdit}-api, but this event is *not* fired when - * files change on disk, e.g triggered by another application, or when using the - * {@linkcode FileSystem workspace.fs}-api. - * - * *Note 2:* When renaming a folder with children only one event is fired. - */ - export const onWillRenameFiles: Event; - - /** - * An event that is emitted when files have been renamed. - * - * *Note 1:* This event is triggered by user gestures, like renaming a file from the - * explorer, and from the {@linkcode workspace.applyEdit}-api, but this event is *not* fired when - * files change on disk, e.g triggered by another application, or when using the - * {@linkcode FileSystem workspace.fs}-api. - * - * *Note 2:* When renaming a folder with children only one event is fired. - */ - export const onDidRenameFiles: Event; - - /** - * Get a workspace configuration object. - * - * When a section-identifier is provided only that part of the configuration - * is returned. Dots in the section-identifier are interpreted as child-access, - * like `{ myExt: { setting: { doIt: true }}}` and `getConfiguration('myExt.setting').get('doIt') === true`. - * - * When a scope is provided configuration confined to that scope is returned. Scope can be a resource or a language identifier or both. - * - * @param section A dot-separated identifier. - * @param scope A scope for which the configuration is asked for. - * @return The full configuration or a subset. - */ - export function getConfiguration(section?: string, scope?: ConfigurationScope | null): WorkspaceConfiguration; - - /** - * An event that is emitted when the {@link WorkspaceConfiguration configuration} changed. - */ - export const onDidChangeConfiguration: Event; - - /** - * Register a task provider. - * - * @deprecated Use the corresponding function on the `tasks` namespace instead - * - * @param type The task kind type this provider is registered for. - * @param provider A task provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerTaskProvider(type: string, provider: TaskProvider): Disposable; - - /** - * Register a filesystem provider for a given scheme, e.g. `ftp`. - * - * There can only be one provider per scheme and an error is being thrown when a scheme - * has been claimed by another provider or when it is reserved. - * - * @param scheme The uri-{@link Uri.scheme scheme} the provider registers for. - * @param provider The filesystem provider. - * @param options Immutable metadata about the provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerFileSystemProvider(scheme: string, provider: FileSystemProvider, options?: { readonly isCaseSensitive?: boolean; readonly isReadonly?: boolean }): Disposable; - - /** - * When true, the user has explicitly trusted the contents of the workspace. - */ - export const isTrusted: boolean; - - /** - * Event that fires when the current workspace has been trusted. - */ - export const onDidGrantWorkspaceTrust: Event; - } - - /** - * The configuration scope which can be a - * a 'resource' or a languageId or both or - * a '{@link TextDocument}' or - * a '{@link WorkspaceFolder}' - */ - export type ConfigurationScope = Uri | TextDocument | WorkspaceFolder | { uri?: Uri; languageId: string }; - - /** - * An event describing the change in Configuration - */ - export interface ConfigurationChangeEvent { - - /** - * Checks if the given section has changed. - * If scope is provided, checks if the section has changed for resources under the given scope. - * - * @param section Configuration name, supports _dotted_ names. - * @param scope A scope in which to check. - * @return `true` if the given section has changed. - */ - affectsConfiguration(section: string, scope?: ConfigurationScope): boolean; - } - - /** - * Namespace for participating in language-specific editor [features](https://code.visualstudio.com/docs/editor/editingevolved), - * like IntelliSense, code actions, diagnostics etc. - * - * Many programming languages exist and there is huge variety in syntaxes, semantics, and paradigms. Despite that, features - * like automatic word-completion, code navigation, or code checking have become popular across different tools for different - * programming languages. - * - * The editor provides an API that makes it simple to provide such common features by having all UI and actions already in place and - * by allowing you to participate by providing data only. For instance, to contribute a hover all you have to do is provide a function - * that can be called with a {@link TextDocument} and a {@link Position} returning hover info. The rest, like tracking the - * mouse, positioning the hover, keeping the hover stable etc. is taken care of by the editor. - * - * ```javascript - * languages.registerHoverProvider('javascript', { - * provideHover(document, position, token) { - * return new Hover('I am a hover!'); - * } - * }); - * ``` - * - * Registration is done using a {@link DocumentSelector document selector} which is either a language id, like `javascript` or - * a more complex {@link DocumentFilter filter} like `{ language: 'typescript', scheme: 'file' }`. Matching a document against such - * a selector will result in a {@link languages.match score} that is used to determine if and how a provider shall be used. When - * scores are equal the provider that came last wins. For features that allow full arity, like {@link languages.registerHoverProvider hover}, - * the score is only checked to be `>0`, for other features, like {@link languages.registerCompletionItemProvider IntelliSense} the - * score is used for determining the order in which providers are asked to participate. - */ - export namespace languages { - - /** - * Return the identifiers of all known languages. - * @return Promise resolving to an array of identifier strings. - */ - export function getLanguages(): Thenable; - - /** - * Set (and change) the {@link TextDocument.languageId language} that is associated - * with the given document. - * - * *Note* that calling this function will trigger the {@linkcode workspace.onDidCloseTextDocument onDidCloseTextDocument} event - * followed by the {@linkcode workspace.onDidOpenTextDocument onDidOpenTextDocument} event. - * - * @param document The document which language is to be changed - * @param languageId The new language identifier. - * @returns A thenable that resolves with the updated document. - */ - export function setTextDocumentLanguage(document: TextDocument, languageId: string): Thenable; - - /** - * Compute the match between a document {@link DocumentSelector selector} and a document. Values - * greater than zero mean the selector matches the document. - * - * A match is computed according to these rules: - * 1. When {@linkcode DocumentSelector} is an array, compute the match for each contained `DocumentFilter` or language identifier and take the maximum value. - * 2. A string will be desugared to become the `language`-part of a {@linkcode DocumentFilter}, so `"fooLang"` is like `{ language: "fooLang" }`. - * 3. A {@linkcode DocumentFilter} will be matched against the document by comparing its parts with the document. The following rules apply: - * 1. When the `DocumentFilter` is empty (`{}`) the result is `0` - * 2. When `scheme`, `language`, `pattern`, or `notebook` are defined but one doesn't match, the result is `0` - * 3. Matching against `*` gives a score of `5`, matching via equality or via a glob-pattern gives a score of `10` - * 4. The result is the maximum value of each match - * - * Samples: - * ```js - * // default document from disk (file-scheme) - * doc.uri; //'file:///my/file.js' - * doc.languageId; // 'javascript' - * match('javascript', doc); // 10; - * match({ language: 'javascript' }, doc); // 10; - * match({ language: 'javascript', scheme: 'file' }, doc); // 10; - * match('*', doc); // 5 - * match('fooLang', doc); // 0 - * match(['fooLang', '*'], doc); // 5 - * - * // virtual document, e.g. from git-index - * doc.uri; // 'git:/my/file.js' - * doc.languageId; // 'javascript' - * match('javascript', doc); // 10; - * match({ language: 'javascript', scheme: 'git' }, doc); // 10; - * match('*', doc); // 5 - * - * // notebook cell document - * doc.uri; // `vscode-notebook-cell:///my/notebook.ipynb#gl65s2pmha`; - * doc.languageId; // 'python' - * match({ notebookType: 'jupyter-notebook' }, doc) // 10 - * match({ notebookType: 'fooNotebook', language: 'python' }, doc) // 0 - * match({ language: 'python' }, doc) // 10 - * match({ notebookType: '*' }, doc) // 5 - * ``` - * - * @param selector A document selector. - * @param document A text document. - * @return A number `>0` when the selector matches and `0` when the selector does not match. - */ - export function match(selector: DocumentSelector, document: TextDocument): number; - - /** - * An {@link Event} which fires when the global set of diagnostics changes. This is - * newly added and removed diagnostics. - */ - export const onDidChangeDiagnostics: Event; - - /** - * Get all diagnostics for a given resource. - * - * @param resource A resource - * @returns An array of {@link Diagnostic diagnostics} objects or an empty array. - */ - export function getDiagnostics(resource: Uri): Diagnostic[]; - - /** - * Get all diagnostics. - * - * @returns An array of uri-diagnostics tuples or an empty array. - */ - export function getDiagnostics(): [Uri, Diagnostic[]][]; - - /** - * Create a diagnostics collection. - * - * @param name The {@link DiagnosticCollection.name name} of the collection. - * @return A new diagnostic collection. - */ - export function createDiagnosticCollection(name?: string): DiagnosticCollection; - - /** - * Creates a new {@link LanguageStatusItem language status item}. - * - * @param id The identifier of the item. - * @param selector The document selector that defines for what editors the item shows. - */ - export function createLanguageStatusItem(id: string, selector: DocumentSelector): LanguageStatusItem; - - /** - * Register a completion provider. - * - * Multiple providers can be registered for a language. In that case providers are sorted - * by their {@link languages.match score} and groups of equal score are sequentially asked for - * completion items. The process stops when one or many providers of a group return a - * result. A failing provider (rejected promise or exception) will not fail the whole - * operation. - * - * A completion item provider can be associated with a set of `triggerCharacters`. When trigger - * characters are being typed, completions are requested but only from providers that registered - * the typed character. Because of that trigger characters should be different than {@link LanguageConfiguration.wordPattern word characters}, - * a common trigger character is `.` to trigger member completions. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A completion provider. - * @param triggerCharacters Trigger completion when the user types one of the characters. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerCompletionItemProvider(selector: DocumentSelector, provider: CompletionItemProvider, ...triggerCharacters: string[]): Disposable; - - /** - * Registers an inline completion provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider An inline completion provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerInlineCompletionItemProvider(selector: DocumentSelector, provider: InlineCompletionItemProvider): Disposable; - - /** - * Register a code action provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A code action provider. - * @param metadata Metadata about the kind of code actions the provider provides. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerCodeActionsProvider(selector: DocumentSelector, provider: CodeActionProvider, metadata?: CodeActionProviderMetadata): Disposable; - - /** - * Register a code lens provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A code lens provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerCodeLensProvider(selector: DocumentSelector, provider: CodeLensProvider): Disposable; - - /** - * Register a definition provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A definition provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerDefinitionProvider(selector: DocumentSelector, provider: DefinitionProvider): Disposable; - - /** - * Register an implementation provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider An implementation provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerImplementationProvider(selector: DocumentSelector, provider: ImplementationProvider): Disposable; - - /** - * Register a type definition provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A type definition provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerTypeDefinitionProvider(selector: DocumentSelector, provider: TypeDefinitionProvider): Disposable; - - /** - * Register a declaration provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A declaration provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerDeclarationProvider(selector: DocumentSelector, provider: DeclarationProvider): Disposable; - - /** - * Register a hover provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A hover provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerHoverProvider(selector: DocumentSelector, provider: HoverProvider): Disposable; - - /** - * Register a provider that locates evaluatable expressions in text documents. - * The editor will evaluate the expression in the active debug session and will show the result in the debug hover. - * - * If multiple providers are registered for a language an arbitrary provider will be used. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider An evaluatable expression provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerEvaluatableExpressionProvider(selector: DocumentSelector, provider: EvaluatableExpressionProvider): Disposable; - - /** - * Register a provider that returns data for the debugger's 'inline value' feature. - * Whenever the generic debugger has stopped in a source file, providers registered for the language of the file - * are called to return textual data that will be shown in the editor at the end of lines. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider An inline values provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerInlineValuesProvider(selector: DocumentSelector, provider: InlineValuesProvider): Disposable; - - /** - * Register a document highlight provider. - * - * Multiple providers can be registered for a language. In that case providers are sorted - * by their {@link languages.match score} and groups sequentially asked for document highlights. - * The process stops when a provider returns a `non-falsy` or `non-failure` result. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A document highlight provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerDocumentHighlightProvider(selector: DocumentSelector, provider: DocumentHighlightProvider): Disposable; - - /** - * Register a document symbol provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A document symbol provider. - * @param metaData metadata about the provider - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerDocumentSymbolProvider(selector: DocumentSelector, provider: DocumentSymbolProvider, metaData?: DocumentSymbolProviderMetadata): Disposable; - - /** - * Register a workspace symbol provider. - * - * Multiple providers can be registered. In that case providers are asked in parallel and - * the results are merged. A failing provider (rejected promise or exception) will not cause - * a failure of the whole operation. - * - * @param provider A workspace symbol provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerWorkspaceSymbolProvider(provider: WorkspaceSymbolProvider): Disposable; - - /** - * Register a reference provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A reference provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerReferenceProvider(selector: DocumentSelector, provider: ReferenceProvider): Disposable; - - /** - * Register a rename provider. - * - * Multiple providers can be registered for a language. In that case providers are sorted - * by their {@link languages.match score} and asked in sequence. The first provider producing a result - * defines the result of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A rename provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerRenameProvider(selector: DocumentSelector, provider: RenameProvider): Disposable; - - /** - * Register a semantic tokens provider for a whole document. - * - * Multiple providers can be registered for a language. In that case providers are sorted - * by their {@link languages.match score} and the best-matching provider is used. Failure - * of the selected provider will cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A document semantic tokens provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerDocumentSemanticTokensProvider(selector: DocumentSelector, provider: DocumentSemanticTokensProvider, legend: SemanticTokensLegend): Disposable; - - /** - * Register a semantic tokens provider for a document range. - * - * *Note:* If a document has both a `DocumentSemanticTokensProvider` and a `DocumentRangeSemanticTokensProvider`, - * the range provider will be invoked only initially, for the time in which the full document provider takes - * to resolve the first request. Once the full document provider resolves the first request, the semantic tokens - * provided via the range provider will be discarded and from that point forward, only the document provider - * will be used. - * - * Multiple providers can be registered for a language. In that case providers are sorted - * by their {@link languages.match score} and the best-matching provider is used. Failure - * of the selected provider will cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A document range semantic tokens provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerDocumentRangeSemanticTokensProvider(selector: DocumentSelector, provider: DocumentRangeSemanticTokensProvider, legend: SemanticTokensLegend): Disposable; - - /** - * Register a formatting provider for a document. - * - * Multiple providers can be registered for a language. In that case providers are sorted - * by their {@link languages.match score} and the best-matching provider is used. Failure - * of the selected provider will cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A document formatting edit provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerDocumentFormattingEditProvider(selector: DocumentSelector, provider: DocumentFormattingEditProvider): Disposable; - - /** - * Register a formatting provider for a document range. - * - * *Note:* A document range provider is also a {@link DocumentFormattingEditProvider document formatter} - * which means there is no need to {@link languages.registerDocumentFormattingEditProvider register} a document - * formatter when also registering a range provider. - * - * Multiple providers can be registered for a language. In that case providers are sorted - * by their {@link languages.match score} and the best-matching provider is used. Failure - * of the selected provider will cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A document range formatting edit provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerDocumentRangeFormattingEditProvider(selector: DocumentSelector, provider: DocumentRangeFormattingEditProvider): Disposable; - - /** - * Register a formatting provider that works on type. The provider is active when the user enables the setting `editor.formatOnType`. - * - * Multiple providers can be registered for a language. In that case providers are sorted - * by their {@link languages.match score} and the best-matching provider is used. Failure - * of the selected provider will cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider An on type formatting edit provider. - * @param firstTriggerCharacter A character on which formatting should be triggered, like `}`. - * @param moreTriggerCharacter More trigger characters. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerOnTypeFormattingEditProvider(selector: DocumentSelector, provider: OnTypeFormattingEditProvider, firstTriggerCharacter: string, ...moreTriggerCharacter: string[]): Disposable; - - /** - * Register a signature help provider. - * - * Multiple providers can be registered for a language. In that case providers are sorted - * by their {@link languages.match score} and called sequentially until a provider returns a - * valid result. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A signature help provider. - * @param triggerCharacters Trigger signature help when the user types one of the characters, like `,` or `(`. - * @param metadata Information about the provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerSignatureHelpProvider(selector: DocumentSelector, provider: SignatureHelpProvider, ...triggerCharacters: string[]): Disposable; - export function registerSignatureHelpProvider(selector: DocumentSelector, provider: SignatureHelpProvider, metadata: SignatureHelpProviderMetadata): Disposable; - - /** - * Register a document link provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A document link provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerDocumentLinkProvider(selector: DocumentSelector, provider: DocumentLinkProvider): Disposable; - - /** - * Register a color provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A color provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerColorProvider(selector: DocumentSelector, provider: DocumentColorProvider): Disposable; - - /** - * Register a inlay hints provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider An inlay hints provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerInlayHintsProvider(selector: DocumentSelector, provider: InlayHintsProvider): Disposable; - - /** - * Register a folding range provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. - * If multiple folding ranges start at the same position, only the range of the first registered provider is used. - * If a folding range overlaps with an other range that has a smaller position, it is also ignored. - * - * A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A folding range provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerFoldingRangeProvider(selector: DocumentSelector, provider: FoldingRangeProvider): Disposable; - - /** - * Register a selection range provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A selection range provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerSelectionRangeProvider(selector: DocumentSelector, provider: SelectionRangeProvider): Disposable; - - /** - * Register a call hierarchy provider. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A call hierarchy provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerCallHierarchyProvider(selector: DocumentSelector, provider: CallHierarchyProvider): Disposable; - - /** - * Register a type hierarchy provider. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A type hierarchy provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerTypeHierarchyProvider(selector: DocumentSelector, provider: TypeHierarchyProvider): Disposable; - - /** - * Register a linked editing range provider. - * - * Multiple providers can be registered for a language. In that case providers are sorted - * by their {@link languages.match score} and the best-matching provider that has a result is used. Failure - * of the selected provider will cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A linked editing range provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerLinkedEditingRangeProvider(selector: DocumentSelector, provider: LinkedEditingRangeProvider): Disposable; - - /** - * Registers a new {@link DocumentDropEditProvider}. - * - * @param selector A selector that defines the documents this provider applies to. - * @param provider A drop provider. - * - * @return A {@link Disposable} that unregisters this provider when disposed of. - */ - export function registerDocumentDropEditProvider(selector: DocumentSelector, provider: DocumentDropEditProvider): Disposable; - - /** - * Set a {@link LanguageConfiguration language configuration} for a language. - * - * @param language A language identifier like `typescript`. - * @param configuration Language configuration. - * @return A {@link Disposable} that unsets this configuration. - */ - export function setLanguageConfiguration(language: string, configuration: LanguageConfiguration): Disposable; - } - - /** - * Represents a notebook editor that is attached to a {@link NotebookDocument notebook}. - */ - export enum NotebookEditorRevealType { - /** - * The range will be revealed with as little scrolling as possible. - */ - Default = 0, - - /** - * The range will always be revealed in the center of the viewport. - */ - InCenter = 1, - - /** - * If the range is outside the viewport, it will be revealed in the center of the viewport. - * Otherwise, it will be revealed with as little scrolling as possible. - */ - InCenterIfOutsideViewport = 2, - - /** - * The range will always be revealed at the top of the viewport. - */ - AtTop = 3 - } - - /** - * Represents a notebook editor that is attached to a {@link NotebookDocument notebook}. - * Additional properties of the NotebookEditor are available in the proposed - * API, which will be finalized later. - */ - export interface NotebookEditor { - - /** - * The {@link NotebookDocument notebook document} associated with this notebook editor. - */ - readonly notebook: NotebookDocument; - - /** - * The primary selection in this notebook editor. - */ - selection: NotebookRange; - - /** - * All selections in this notebook editor. - * - * The primary selection (or focused range) is `selections[0]`. When the document has no cells, the primary selection is empty `{ start: 0, end: 0 }`; - */ - selections: readonly NotebookRange[]; - - /** - * The current visible ranges in the editor (vertically). - */ - readonly visibleRanges: readonly NotebookRange[]; - - /** - * The column in which this editor shows. - */ - readonly viewColumn?: ViewColumn; - - /** - * Scroll as indicated by `revealType` in order to reveal the given range. - * - * @param range A range. - * @param revealType The scrolling strategy for revealing `range`. - */ - revealRange(range: NotebookRange, revealType?: NotebookEditorRevealType): void; - } - - /** - * Renderer messaging is used to communicate with a single renderer. It's returned from {@link notebooks.createRendererMessaging}. - */ - export interface NotebookRendererMessaging { - /** - * An event that fires when a message is received from a renderer. - */ - readonly onDidReceiveMessage: Event<{ - readonly editor: NotebookEditor; - readonly message: any; - }>; - - /** - * Send a message to one or all renderer. - * - * @param message Message to send - * @param editor Editor to target with the message. If not provided, the - * message is sent to all renderers. - * @returns a boolean indicating whether the message was successfully - * delivered to any renderer. - */ - postMessage(message: any, editor?: NotebookEditor): Thenable; - } - - /** - * A notebook cell kind. - */ - export enum NotebookCellKind { - - /** - * A markup-cell is formatted source that is used for display. - */ - Markup = 1, - - /** - * A code-cell is source that can be {@link NotebookController executed} and that - * produces {@link NotebookCellOutput output}. - */ - Code = 2 - } - - /** - * Represents a cell of a {@link NotebookDocument notebook}, either a {@link NotebookCellKind.Code code}-cell - * or {@link NotebookCellKind.Markup markup}-cell. - * - * NotebookCell instances are immutable and are kept in sync for as long as they are part of their notebook. - */ - export interface NotebookCell { - - /** - * The index of this cell in its {@link NotebookDocument.cellAt containing notebook}. The - * index is updated when a cell is moved within its notebook. The index is `-1` - * when the cell has been removed from its notebook. - */ - readonly index: number; - - /** - * The {@link NotebookDocument notebook} that contains this cell. - */ - readonly notebook: NotebookDocument; - - /** - * The kind of this cell. - */ - readonly kind: NotebookCellKind; - - /** - * The {@link TextDocument text} of this cell, represented as text document. - */ - readonly document: TextDocument; - - /** - * The metadata of this cell. Can be anything but must be JSON-stringifyable. - */ - readonly metadata: { readonly [key: string]: any }; - - /** - * The outputs of this cell. - */ - readonly outputs: readonly NotebookCellOutput[]; - - /** - * The most recent {@link NotebookCellExecutionSummary execution summary} for this cell. - */ - readonly executionSummary: NotebookCellExecutionSummary | undefined; - } - - /** - * Represents a notebook which itself is a sequence of {@link NotebookCell code or markup cells}. Notebook documents are - * created from {@link NotebookData notebook data}. - */ - export interface NotebookDocument { - - /** - * The associated uri for this notebook. - * - * *Note* that most notebooks use the `file`-scheme, which means they are files on disk. However, **not** all notebooks are - * saved on disk and therefore the `scheme` must be checked before trying to access the underlying file or siblings on disk. - * - * @see {@link FileSystemProvider} - */ - readonly uri: Uri; - - /** - * The type of notebook. - */ - readonly notebookType: string; - - /** - * The version number of this notebook (it will strictly increase after each - * change, including undo/redo). - */ - readonly version: number; - - /** - * `true` if there are unpersisted changes. - */ - readonly isDirty: boolean; - - /** - * Is this notebook representing an untitled file which has not been saved yet. - */ - readonly isUntitled: boolean; - - /** - * `true` if the notebook has been closed. A closed notebook isn't synchronized anymore - * and won't be re-used when the same resource is opened again. - */ - readonly isClosed: boolean; - - /** - * Arbitrary metadata for this notebook. Can be anything but must be JSON-stringifyable. - */ - readonly metadata: { [key: string]: any }; - - /** - * The number of cells in the notebook. - */ - readonly cellCount: number; - - /** - * Return the cell at the specified index. The index will be adjusted to the notebook. - * - * @param index - The index of the cell to retrieve. - * @return A {@link NotebookCell cell}. - */ - cellAt(index: number): NotebookCell; - - /** - * Get the cells of this notebook. A subset can be retrieved by providing - * a range. The range will be adjusted to the notebook. - * - * @param range A notebook range. - * @returns The cells contained by the range or all cells. - */ - getCells(range?: NotebookRange): NotebookCell[]; - - /** - * Save the document. The saving will be handled by the corresponding {@link NotebookSerializer serializer}. - * - * @return A promise that will resolve to true when the document - * has been saved. Will return false if the file was not dirty or when save failed. - */ - save(): Thenable; - } - - /** - * Describes a change to a notebook cell. - * - * @see {@link NotebookDocumentChangeEvent} - */ - export interface NotebookDocumentCellChange { - - /** - * The affected cell. - */ - readonly cell: NotebookCell; - - /** - * The document of the cell or `undefined` when it did not change. - * - * *Note* that you should use the {@link workspace.onDidChangeTextDocument onDidChangeTextDocument}-event - * for detailed change information, like what edits have been performed. - */ - readonly document: TextDocument | undefined; - - /** - * The new metadata of the cell or `undefined` when it did not change. - */ - readonly metadata: { [key: string]: any } | undefined; - - /** - * The new outputs of the cell or `undefined` when they did not change. - */ - readonly outputs: readonly NotebookCellOutput[] | undefined; - - /** - * The new execution summary of the cell or `undefined` when it did not change. - */ - readonly executionSummary: NotebookCellExecutionSummary | undefined; - } - - /** - * Describes a structural change to a notebook document, e.g newly added and removed cells. - * - * @see {@link NotebookDocumentChangeEvent} - */ - export interface NotebookDocumentContentChange { - - /** - * The range at which cells have been either added or removed. - * - * Note that no cells have been {@link NotebookDocumentContentChange.removedCells removed} - * when this range is {@link NotebookRange.isEmpty empty}. - */ - readonly range: NotebookRange; - - /** - * Cells that have been added to the document. - */ - readonly addedCells: readonly NotebookCell[]; - - /** - * Cells that have been removed from the document. - */ - readonly removedCells: readonly NotebookCell[]; - } - - /** - * An event describing a transactional {@link NotebookDocument notebook} change. - */ - export interface NotebookDocumentChangeEvent { - - /** - * The affected notebook. - */ - readonly notebook: NotebookDocument; - - /** - * The new metadata of the notebook or `undefined` when it did not change. - */ - readonly metadata: { [key: string]: any } | undefined; - - /** - * An array of content changes describing added or removed {@link NotebookCell cells}. - */ - readonly contentChanges: readonly NotebookDocumentContentChange[]; - - /** - * An array of {@link NotebookDocumentCellChange cell changes}. - */ - readonly cellChanges: readonly NotebookDocumentCellChange[]; - } - - /** - * The summary of a notebook cell execution. - */ - export interface NotebookCellExecutionSummary { - - /** - * The order in which the execution happened. - */ - readonly executionOrder?: number; - - /** - * If the execution finished successfully. - */ - readonly success?: boolean; - - /** - * The times at which execution started and ended, as unix timestamps - */ - readonly timing?: { readonly startTime: number; readonly endTime: number }; - } - - /** - * A notebook range represents an ordered pair of two cell indices. - * It is guaranteed that start is less than or equal to end. - */ - export class NotebookRange { - - /** - * The zero-based start index of this range. - */ - readonly start: number; - - /** - * The exclusive end index of this range (zero-based). - */ - readonly end: number; - - /** - * `true` if `start` and `end` are equal. - */ - readonly isEmpty: boolean; - - /** - * Create a new notebook range. If `start` is not - * before or equal to `end`, the values will be swapped. - * - * @param start start index - * @param end end index. - */ - constructor(start: number, end: number); - - /** - * Derive a new range for this range. - * - * @param change An object that describes a change to this range. - * @return A range that reflects the given change. Will return `this` range if the change - * is not changing anything. - */ - with(change: { start?: number; end?: number }): NotebookRange; - } - - /** - * One representation of a {@link NotebookCellOutput notebook output}, defined by MIME type and data. - */ - export class NotebookCellOutputItem { - - /** - * Factory function to create a `NotebookCellOutputItem` from a string. - * - * *Note* that an UTF-8 encoder is used to create bytes for the string. - * - * @param value A string. - * @param mime Optional MIME type, defaults to `text/plain`. - * @returns A new output item object. - */ - static text(value: string, mime?: string): NotebookCellOutputItem; - - /** - * Factory function to create a `NotebookCellOutputItem` from - * a JSON object. - * - * *Note* that this function is not expecting "stringified JSON" but - * an object that can be stringified. This function will throw an error - * when the passed value cannot be JSON-stringified. - * - * @param value A JSON-stringifyable value. - * @param mime Optional MIME type, defaults to `application/json` - * @returns A new output item object. - */ - static json(value: any, mime?: string): NotebookCellOutputItem; - - /** - * Factory function to create a `NotebookCellOutputItem` that uses - * uses the `application/vnd.code.notebook.stdout` mime type. - * - * @param value A string. - * @returns A new output item object. - */ - static stdout(value: string): NotebookCellOutputItem; - - /** - * Factory function to create a `NotebookCellOutputItem` that uses - * uses the `application/vnd.code.notebook.stderr` mime type. - * - * @param value A string. - * @returns A new output item object. - */ - static stderr(value: string): NotebookCellOutputItem; - - /** - * Factory function to create a `NotebookCellOutputItem` that uses - * uses the `application/vnd.code.notebook.error` mime type. - * - * @param value An error object. - * @returns A new output item object. - */ - static error(value: Error): NotebookCellOutputItem; - - /** - * The mime type which determines how the {@linkcode NotebookCellOutputItem.data data}-property - * is interpreted. - * - * Notebooks have built-in support for certain mime-types, extensions can add support for new - * types and override existing types. - */ - mime: string; - - /** - * The data of this output item. Must always be an array of unsigned 8-bit integers. - */ - data: Uint8Array; - - /** - * Create a new notebook cell output item. - * - * @param data The value of the output item. - * @param mime The mime type of the output item. - */ - constructor(data: Uint8Array, mime: string); - } - - /** - * Notebook cell output represents a result of executing a cell. It is a container type for multiple - * {@link NotebookCellOutputItem output items} where contained items represent the same result but - * use different MIME types. - */ - export class NotebookCellOutput { - - /** - * The output items of this output. Each item must represent the same result. _Note_ that repeated - * MIME types per output is invalid and that the editor will just pick one of them. - * - * ```ts - * new vscode.NotebookCellOutput([ - * vscode.NotebookCellOutputItem.text('Hello', 'text/plain'), - * vscode.NotebookCellOutputItem.text('Hello', 'text/html'), - * vscode.NotebookCellOutputItem.text('_Hello_', 'text/markdown'), - * vscode.NotebookCellOutputItem.text('Hey', 'text/plain'), // INVALID: repeated type, editor will pick just one - * ]) - * ``` - */ - items: NotebookCellOutputItem[]; - - /** - * Arbitrary metadata for this cell output. Can be anything but must be JSON-stringifyable. - */ - metadata?: { [key: string]: any }; - - /** - * Create new notebook output. - * - * @param items Notebook output items. - * @param metadata Optional metadata. - */ - constructor(items: NotebookCellOutputItem[], metadata?: { [key: string]: any }); - } - - /** - * NotebookCellData is the raw representation of notebook cells. Its is part of {@linkcode NotebookData}. - */ - export class NotebookCellData { - - /** - * The {@link NotebookCellKind kind} of this cell data. - */ - kind: NotebookCellKind; - - /** - * The source value of this cell data - either source code or formatted text. - */ - value: string; - - /** - * The language identifier of the source value of this cell data. Any value from - * {@linkcode languages.getLanguages getLanguages} is possible. - */ - languageId: string; - - /** - * The outputs of this cell data. - */ - outputs?: NotebookCellOutput[]; - - /** - * Arbitrary metadata of this cell data. Can be anything but must be JSON-stringifyable. - */ - metadata?: { [key: string]: any }; - - /** - * The execution summary of this cell data. - */ - executionSummary?: NotebookCellExecutionSummary; - - /** - * Create new cell data. Minimal cell data specifies its kind, its source value, and the - * language identifier of its source. - * - * @param kind The kind. - * @param value The source value. - * @param languageId The language identifier of the source value. - */ - constructor(kind: NotebookCellKind, value: string, languageId: string); - } - - /** - * Raw representation of a notebook. - * - * Extensions are responsible for creating {@linkcode NotebookData} so that the editor - * can create a {@linkcode NotebookDocument}. - * - * @see {@link NotebookSerializer} - */ - export class NotebookData { - /** - * The cell data of this notebook data. - */ - cells: NotebookCellData[]; - - /** - * Arbitrary metadata of notebook data. - */ - metadata?: { [key: string]: any }; - - /** - * Create new notebook data. - * - * @param cells An array of cell data. - */ - constructor(cells: NotebookCellData[]); - } - - /** - * The notebook serializer enables the editor to open notebook files. - * - * At its core the editor only knows a {@link NotebookData notebook data structure} but not - * how that data structure is written to a file, nor how it is read from a file. The - * notebook serializer bridges this gap by deserializing bytes into notebook data and - * vice versa. - */ - export interface NotebookSerializer { - - /** - * Deserialize contents of a notebook file into the notebook data structure. - * - * @param content Contents of a notebook file. - * @param token A cancellation token. - * @return Notebook data or a thenable that resolves to such. - */ - deserializeNotebook(content: Uint8Array, token: CancellationToken): NotebookData | Thenable; - - /** - * Serialize notebook data into file contents. - * - * @param data A notebook data structure. - * @param token A cancellation token. - * @returns An array of bytes or a thenable that resolves to such. - */ - serializeNotebook(data: NotebookData, token: CancellationToken): Uint8Array | Thenable; - } - - /** - * Notebook content options define what parts of a notebook are persisted. Note - * - * For instance, a notebook serializer can opt-out of saving outputs and in that case the editor doesn't mark a - * notebooks as {@link NotebookDocument.isDirty dirty} when its output has changed. - */ - export interface NotebookDocumentContentOptions { - /** - * Controls if output change events will trigger notebook document content change events and - * if it will be used in the diff editor, defaults to false. If the content provider doesn't - * persist the outputs in the file document, this should be set to true. - */ - transientOutputs?: boolean; - - /** - * Controls if a cell metadata property change event will trigger notebook document content - * change events and if it will be used in the diff editor, defaults to false. If the - * content provider doesn't persist a metadata property in the file document, it should be - * set to true. - */ - transientCellMetadata?: { [key: string]: boolean | undefined }; - - /** - * Controls if a document metadata property change event will trigger notebook document - * content change event and if it will be used in the diff editor, defaults to false. If the - * content provider doesn't persist a metadata property in the file document, it should be - * set to true. - */ - transientDocumentMetadata?: { [key: string]: boolean | undefined }; - } - - /** - * Notebook controller affinity for notebook documents. - * - * @see {@link NotebookController.updateNotebookAffinity} - */ - export enum NotebookControllerAffinity { - /** - * Default affinity. - */ - Default = 1, - /** - * A controller is preferred for a notebook. - */ - Preferred = 2 - } - - /** - * A notebook controller represents an entity that can execute notebook cells. This is often referred to as a kernel. - * - * There can be multiple controllers and the editor will let users choose which controller to use for a certain notebook. The - * {@linkcode NotebookController.notebookType notebookType}-property defines for what kind of notebooks a controller is for and - * the {@linkcode NotebookController.updateNotebookAffinity updateNotebookAffinity}-function allows controllers to set a preference - * for specific notebook documents. When a controller has been selected its - * {@link NotebookController.onDidChangeSelectedNotebooks onDidChangeSelectedNotebooks}-event fires. - * - * When a cell is being run the editor will invoke the {@linkcode NotebookController.executeHandler executeHandler} and a controller - * is expected to create and finalize a {@link NotebookCellExecution notebook cell execution}. However, controllers are also free - * to create executions by themselves. - */ - export interface NotebookController { - - /** - * The identifier of this notebook controller. - * - * _Note_ that controllers are remembered by their identifier and that extensions should use - * stable identifiers across sessions. - */ - readonly id: string; - - /** - * The notebook type this controller is for. - */ - readonly notebookType: string; - - /** - * An array of language identifiers that are supported by this - * controller. Any language identifier from {@linkcode languages.getLanguages getLanguages} - * is possible. When falsy all languages are supported. - * - * Samples: - * ```js - * // support JavaScript and TypeScript - * myController.supportedLanguages = ['javascript', 'typescript'] - * - * // support all languages - * myController.supportedLanguages = undefined; // falsy - * myController.supportedLanguages = []; // falsy - * ``` - */ - supportedLanguages?: string[]; - - /** - * The human-readable label of this notebook controller. - */ - label: string; - - /** - * The human-readable description which is rendered less prominent. - */ - description?: string; - - /** - * The human-readable detail which is rendered less prominent. - */ - detail?: string; - - /** - * Whether this controller supports execution order so that the - * editor can render placeholders for them. - */ - supportsExecutionOrder?: boolean; - - /** - * Create a cell execution task. - * - * _Note_ that there can only be one execution per cell at a time and that an error is thrown if - * a cell execution is created while another is still active. - * - * This should be used in response to the {@link NotebookController.executeHandler execution handler} - * being called or when cell execution has been started else, e.g when a cell was already - * executing or when cell execution was triggered from another source. - * - * @param cell The notebook cell for which to create the execution. - * @returns A notebook cell execution. - */ - createNotebookCellExecution(cell: NotebookCell): NotebookCellExecution; - - /** - * The execute handler is invoked when the run gestures in the UI are selected, e.g Run Cell, Run All, - * Run Selection etc. The execute handler is responsible for creating and managing {@link NotebookCellExecution execution}-objects. - */ - executeHandler: (cells: NotebookCell[], notebook: NotebookDocument, controller: NotebookController) => void | Thenable; - - /** - * Optional interrupt handler. - * - * By default cell execution is canceled via {@link NotebookCellExecution.token tokens}. Cancellation - * tokens require that a controller can keep track of its execution so that it can cancel a specific execution at a later - * point. Not all scenarios allow for that, eg. REPL-style controllers often work by interrupting whatever is currently - * running. For those cases the interrupt handler exists - it can be thought of as the equivalent of `SIGINT` - * or `Control+C` in terminals. - * - * _Note_ that supporting {@link NotebookCellExecution.token cancellation tokens} is preferred and that interrupt handlers should - * only be used when tokens cannot be supported. - */ - interruptHandler?: (notebook: NotebookDocument) => void | Thenable; - - /** - * An event that fires whenever a controller has been selected or un-selected for a notebook document. - * - * There can be multiple controllers for a notebook and in that case a controllers needs to be _selected_. This is a user gesture - * and happens either explicitly or implicitly when interacting with a notebook for which a controller was _suggested_. When possible, - * the editor _suggests_ a controller that is most likely to be _selected_. - * - * _Note_ that controller selection is persisted (by the controllers {@link NotebookController.id id}) and restored as soon as a - * controller is re-created or as a notebook is {@link workspace.onDidOpenNotebookDocument opened}. - */ - readonly onDidChangeSelectedNotebooks: Event<{ readonly notebook: NotebookDocument; readonly selected: boolean }>; - - /** - * A controller can set affinities for specific notebook documents. This allows a controller - * to be presented more prominent for some notebooks. - * - * @param notebook The notebook for which a priority is set. - * @param affinity A controller affinity - */ - updateNotebookAffinity(notebook: NotebookDocument, affinity: NotebookControllerAffinity): void; - - /** - * Dispose and free associated resources. - */ - dispose(): void; - } - - /** - * A NotebookCellExecution is how {@link NotebookController notebook controller} modify a notebook cell as - * it is executing. - * - * When a cell execution object is created, the cell enters the {@linkcode NotebookCellExecutionState.Pending Pending} state. - * When {@linkcode NotebookCellExecution.start start(...)} is called on the execution task, it enters the {@linkcode NotebookCellExecutionState.Executing Executing} state. When - * {@linkcode NotebookCellExecution.end end(...)} is called, it enters the {@linkcode NotebookCellExecutionState.Idle Idle} state. - */ - export interface NotebookCellExecution { - - /** - * The {@link NotebookCell cell} for which this execution has been created. - */ - readonly cell: NotebookCell; - - /** - * A cancellation token which will be triggered when the cell execution is canceled - * from the UI. - * - * _Note_ that the cancellation token will not be triggered when the {@link NotebookController controller} - * that created this execution uses an {@link NotebookController.interruptHandler interrupt-handler}. - */ - readonly token: CancellationToken; - - /** - * Set and unset the order of this cell execution. - */ - executionOrder: number | undefined; - - /** - * Signal that the execution has begun. - * - * @param startTime The time that execution began, in milliseconds in the Unix epoch. Used to drive the clock - * that shows for how long a cell has been running. If not given, the clock won't be shown. - */ - start(startTime?: number): void; - - /** - * Signal that execution has ended. - * - * @param success If true, a green check is shown on the cell status bar. - * If false, a red X is shown. - * If undefined, no check or X icon is shown. - * @param endTime The time that execution finished, in milliseconds in the Unix epoch. - */ - end(success: boolean | undefined, endTime?: number): void; - - /** - * Clears the output of the cell that is executing or of another cell that is affected by this execution. - * - * @param cell Cell for which output is cleared. Defaults to the {@link NotebookCellExecution.cell cell} of - * this execution. - * @return A thenable that resolves when the operation finished. - */ - clearOutput(cell?: NotebookCell): Thenable; - - /** - * Replace the output of the cell that is executing or of another cell that is affected by this execution. - * - * @param out Output that replaces the current output. - * @param cell Cell for which output is cleared. Defaults to the {@link NotebookCellExecution.cell cell} of - * this execution. - * @return A thenable that resolves when the operation finished. - */ - replaceOutput(out: NotebookCellOutput | readonly NotebookCellOutput[], cell?: NotebookCell): Thenable; - - /** - * Append to the output of the cell that is executing or to another cell that is affected by this execution. - * - * @param out Output that is appended to the current output. - * @param cell Cell for which output is cleared. Defaults to the {@link NotebookCellExecution.cell cell} of - * this execution. - * @return A thenable that resolves when the operation finished. - */ - appendOutput(out: NotebookCellOutput | readonly NotebookCellOutput[], cell?: NotebookCell): Thenable; - - /** - * Replace all output items of existing cell output. - * - * @param items Output items that replace the items of existing output. - * @param output Output object that already exists. - * @return A thenable that resolves when the operation finished. - */ - replaceOutputItems(items: NotebookCellOutputItem | readonly NotebookCellOutputItem[], output: NotebookCellOutput): Thenable; - - /** - * Append output items to existing cell output. - * - * @param items Output items that are append to existing output. - * @param output Output object that already exists. - * @return A thenable that resolves when the operation finished. - */ - appendOutputItems(items: NotebookCellOutputItem | readonly NotebookCellOutputItem[], output: NotebookCellOutput): Thenable; - } - - /** - * Represents the alignment of status bar items. - */ - export enum NotebookCellStatusBarAlignment { - - /** - * Aligned to the left side. - */ - Left = 1, - - /** - * Aligned to the right side. - */ - Right = 2 - } - - /** - * A contribution to a cell's status bar - */ - export class NotebookCellStatusBarItem { - /** - * The text to show for the item. - */ - text: string; - - /** - * Whether the item is aligned to the left or right. - */ - alignment: NotebookCellStatusBarAlignment; - - /** - * An optional {@linkcode Command} or identifier of a command to run on click. - * - * The command must be {@link commands.getCommands known}. - * - * Note that if this is a {@linkcode Command} object, only the {@linkcode Command.command command} and {@linkcode Command.arguments arguments} - * are used by the editor. - */ - command?: string | Command; - - /** - * A tooltip to show when the item is hovered. - */ - tooltip?: string; - - /** - * The priority of the item. A higher value item will be shown more to the left. - */ - priority?: number; - - /** - * Accessibility information used when a screen reader interacts with this item. - */ - accessibilityInformation?: AccessibilityInformation; - - /** - * Creates a new NotebookCellStatusBarItem. - * @param text The text to show for the item. - * @param alignment Whether the item is aligned to the left or right. - */ - constructor(text: string, alignment: NotebookCellStatusBarAlignment); - } - - /** - * A provider that can contribute items to the status bar that appears below a cell's editor. - */ - export interface NotebookCellStatusBarItemProvider { - /** - * An optional event to signal that statusbar items have changed. The provide method will be called again. - */ - onDidChangeCellStatusBarItems?: Event; - - /** - * The provider will be called when the cell scrolls into view, when its content, outputs, language, or metadata change, and when it changes execution state. - * @param cell The cell for which to return items. - * @param token A token triggered if this request should be cancelled. - * @return One or more {@link NotebookCellStatusBarItem cell statusbar items} - */ - provideCellStatusBarItems(cell: NotebookCell, token: CancellationToken): ProviderResult; - } - - /** - * Namespace for notebooks. - * - * The notebooks functionality is composed of three loosely coupled components: - * - * 1. {@link NotebookSerializer} enable the editor to open, show, and save notebooks - * 2. {@link NotebookController} own the execution of notebooks, e.g they create output from code cells. - * 3. NotebookRenderer present notebook output in the editor. They run in a separate context. - */ - export namespace notebooks { - - /** - * Creates a new notebook controller. - * - * @param id Identifier of the controller. Must be unique per extension. - * @param notebookType A notebook type for which this controller is for. - * @param label The label of the controller. - * @param handler The execute-handler of the controller. - */ - export function createNotebookController(id: string, notebookType: string, label: string, handler?: (cells: NotebookCell[], notebook: NotebookDocument, controller: NotebookController) => void | Thenable): NotebookController; - - /** - * Register a {@link NotebookCellStatusBarItemProvider cell statusbar item provider} for the given notebook type. - * - * @param notebookType The notebook type to register for. - * @param provider A cell status bar provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerNotebookCellStatusBarItemProvider(notebookType: string, provider: NotebookCellStatusBarItemProvider): Disposable; - - /** - * Creates a new messaging instance used to communicate with a specific renderer. - * - * * *Note 1:* Extensions can only create renderer that they have defined in their `package.json`-file - * * *Note 2:* A renderer only has access to messaging if `requiresMessaging` is set to `always` or `optional` in - * its `notebookRenderer` contribution. - * - * @param rendererId The renderer ID to communicate with - * @returns A new notebook renderer messaging object. - */ - export function createRendererMessaging(rendererId: string): NotebookRendererMessaging; - } - - /** - * Represents the input box in the Source Control viewlet. - */ - export interface SourceControlInputBox { - - /** - * Setter and getter for the contents of the input box. - */ - value: string; - - /** - * A string to show as placeholder in the input box to guide the user. - */ - placeholder: string; - - /** - * Controls whether the input box is enabled (default is `true`). - */ - enabled: boolean; - - /** - * Controls whether the input box is visible (default is `true`). - */ - visible: boolean; - } - - interface QuickDiffProvider { - - /** - * Provide a {@link Uri} to the original resource of any given resource uri. - * - * @param uri The uri of the resource open in a text editor. - * @param token A cancellation token. - * @return A thenable that resolves to uri of the matching original resource. - */ - provideOriginalResource?(uri: Uri, token: CancellationToken): ProviderResult; - } - - /** - * The theme-aware decorations for a - * {@link SourceControlResourceState source control resource state}. - */ - export interface SourceControlResourceThemableDecorations { - - /** - * The icon path for a specific - * {@link SourceControlResourceState source control resource state}. - */ - readonly iconPath?: string | Uri | ThemeIcon; - } - - /** - * The decorations for a {@link SourceControlResourceState source control resource state}. - * Can be independently specified for light and dark themes. - */ - export interface SourceControlResourceDecorations extends SourceControlResourceThemableDecorations { - - /** - * Whether the {@link SourceControlResourceState source control resource state} should - * be striked-through in the UI. - */ - readonly strikeThrough?: boolean; - - /** - * Whether the {@link SourceControlResourceState source control resource state} should - * be faded in the UI. - */ - readonly faded?: boolean; - - /** - * The title for a specific - * {@link SourceControlResourceState source control resource state}. - */ - readonly tooltip?: string; - - /** - * The light theme decorations. - */ - readonly light?: SourceControlResourceThemableDecorations; - - /** - * The dark theme decorations. - */ - readonly dark?: SourceControlResourceThemableDecorations; - } - - /** - * An source control resource state represents the state of an underlying workspace - * resource within a certain {@link SourceControlResourceGroup source control group}. - */ - export interface SourceControlResourceState { - - /** - * The {@link Uri} of the underlying resource inside the workspace. - */ - readonly resourceUri: Uri; - - /** - * The {@link Command} which should be run when the resource - * state is open in the Source Control viewlet. - */ - readonly command?: Command; - - /** - * The {@link SourceControlResourceDecorations decorations} for this source control - * resource state. - */ - readonly decorations?: SourceControlResourceDecorations; - - /** - * Context value of the resource state. This can be used to contribute resource specific actions. - * For example, if a resource is given a context value as `diffable`. When contributing actions to `scm/resourceState/context` - * using `menus` extension point, you can specify context value for key `scmResourceState` in `when` expressions, like `scmResourceState == diffable`. - * ```json - * "contributes": { - * "menus": { - * "scm/resourceState/context": [ - * { - * "command": "extension.diff", - * "when": "scmResourceState == diffable" - * } - * ] - * } - * } - * ``` - * This will show action `extension.diff` only for resources with `contextValue` is `diffable`. - */ - readonly contextValue?: string; - } - - /** - * A source control resource group is a collection of - * {@link SourceControlResourceState source control resource states}. - */ - export interface SourceControlResourceGroup { - - /** - * The id of this source control resource group. - */ - readonly id: string; - - /** - * The label of this source control resource group. - */ - label: string; - - /** - * Whether this source control resource group is hidden when it contains - * no {@link SourceControlResourceState source control resource states}. - */ - hideWhenEmpty?: boolean; - - /** - * This group's collection of - * {@link SourceControlResourceState source control resource states}. - */ - resourceStates: SourceControlResourceState[]; - - /** - * Dispose this source control resource group. - */ - dispose(): void; - } - - /** - * An source control is able to provide {@link SourceControlResourceState resource states} - * to the editor and interact with the editor in several source control related ways. - */ - export interface SourceControl { - - /** - * The id of this source control. - */ - readonly id: string; - - /** - * The human-readable label of this source control. - */ - readonly label: string; - - /** - * The (optional) Uri of the root of this source control. - */ - readonly rootUri: Uri | undefined; - - /** - * The {@link SourceControlInputBox input box} for this source control. - */ - readonly inputBox: SourceControlInputBox; - - /** - * The UI-visible count of {@link SourceControlResourceState resource states} of - * this source control. - * - * If undefined, this source control will - * - display its UI-visible count as zero, and - * - contribute the count of its {@link SourceControlResourceState resource states} to the UI-visible aggregated count for all source controls - */ - count?: number; - - /** - * An optional {@link QuickDiffProvider quick diff provider}. - */ - quickDiffProvider?: QuickDiffProvider; - - /** - * Optional commit template string. - * - * The Source Control viewlet will populate the Source Control - * input with this value when appropriate. - */ - commitTemplate?: string; - - /** - * Optional accept input command. - * - * This command will be invoked when the user accepts the value - * in the Source Control input. - */ - acceptInputCommand?: Command; - - /** - * Optional status bar commands. - * - * These commands will be displayed in the editor's status bar. - */ - statusBarCommands?: Command[]; - - /** - * Create a new {@link SourceControlResourceGroup resource group}. - */ - createResourceGroup(id: string, label: string): SourceControlResourceGroup; - - /** - * Dispose this source control. - */ - dispose(): void; - } - - export namespace scm { - - /** - * The {@link SourceControlInputBox input box} for the last source control - * created by the extension. - * - * @deprecated Use SourceControl.inputBox instead - */ - export const inputBox: SourceControlInputBox; - - /** - * Creates a new {@link SourceControl source control} instance. - * - * @param id An `id` for the source control. Something short, e.g.: `git`. - * @param label A human-readable string for the source control. E.g.: `Git`. - * @param rootUri An optional Uri of the root of the source control. E.g.: `Uri.parse(workspaceRoot)`. - * @return An instance of {@link SourceControl source control}. - */ - export function createSourceControl(id: string, label: string, rootUri?: Uri): SourceControl; - } - - /** - * A DebugProtocolMessage is an opaque stand-in type for the [ProtocolMessage](https://microsoft.github.io/debug-adapter-protocol/specification#Base_Protocol_ProtocolMessage) type defined in the Debug Adapter Protocol. - */ - export interface DebugProtocolMessage { - // Properties: see [ProtocolMessage details](https://microsoft.github.io/debug-adapter-protocol/specification#Base_Protocol_ProtocolMessage). - } - - /** - * A DebugProtocolSource is an opaque stand-in type for the [Source](https://microsoft.github.io/debug-adapter-protocol/specification#Types_Source) type defined in the Debug Adapter Protocol. - */ - export interface DebugProtocolSource { - // Properties: see [Source details](https://microsoft.github.io/debug-adapter-protocol/specification#Types_Source). - } - - /** - * A DebugProtocolBreakpoint is an opaque stand-in type for the [Breakpoint](https://microsoft.github.io/debug-adapter-protocol/specification#Types_Breakpoint) type defined in the Debug Adapter Protocol. - */ - export interface DebugProtocolBreakpoint { - // Properties: see [Breakpoint details](https://microsoft.github.io/debug-adapter-protocol/specification#Types_Breakpoint). - } - - /** - * Configuration for a debug session. - */ - export interface DebugConfiguration { - /** - * The type of the debug session. - */ - type: string; - - /** - * The name of the debug session. - */ - name: string; - - /** - * The request type of the debug session. - */ - request: string; - - /** - * Additional debug type specific properties. - */ - [key: string]: any; - } - - /** - * A debug session. - */ - export interface DebugSession { - - /** - * The unique ID of this debug session. - */ - readonly id: string; - - /** - * The debug session's type from the {@link DebugConfiguration debug configuration}. - */ - readonly type: string; - - /** - * The parent session of this debug session, if it was created as a child. - * @see DebugSessionOptions.parentSession - */ - readonly parentSession?: DebugSession; - - /** - * The debug session's name is initially taken from the {@link DebugConfiguration debug configuration}. - * Any changes will be properly reflected in the UI. - */ - name: string; - - /** - * The workspace folder of this session or `undefined` for a folderless setup. - */ - readonly workspaceFolder: WorkspaceFolder | undefined; - - /** - * The "resolved" {@link DebugConfiguration debug configuration} of this session. - * "Resolved" means that - * - all variables have been substituted and - * - platform specific attribute sections have been "flattened" for the matching platform and removed for non-matching platforms. - */ - readonly configuration: DebugConfiguration; - - /** - * Send a custom request to the debug adapter. - */ - customRequest(command: string, args?: any): Thenable; - - /** - * Maps a breakpoint in the editor to the corresponding Debug Adapter Protocol (DAP) breakpoint that is managed by the debug adapter of the debug session. - * If no DAP breakpoint exists (either because the editor breakpoint was not yet registered or because the debug adapter is not interested in the breakpoint), the value `undefined` is returned. - * - * @param breakpoint A {@link Breakpoint} in the editor. - * @return A promise that resolves to the Debug Adapter Protocol breakpoint or `undefined`. - */ - getDebugProtocolBreakpoint(breakpoint: Breakpoint): Thenable; - } - - /** - * A custom Debug Adapter Protocol event received from a {@link DebugSession debug session}. - */ - export interface DebugSessionCustomEvent { - /** - * The {@link DebugSession debug session} for which the custom event was received. - */ - readonly session: DebugSession; - - /** - * Type of event. - */ - readonly event: string; - - /** - * Event specific information. - */ - readonly body: any; - } - - /** - * A debug configuration provider allows to add debug configurations to the debug service - * and to resolve launch configurations before they are used to start a debug session. - * A debug configuration provider is registered via {@link debug.registerDebugConfigurationProvider}. - */ - export interface DebugConfigurationProvider { - /** - * Provides {@link DebugConfiguration debug configuration} to the debug service. If more than one debug configuration provider is - * registered for the same type, debug configurations are concatenated in arbitrary order. - * - * @param folder The workspace folder for which the configurations are used or `undefined` for a folderless setup. - * @param token A cancellation token. - * @return An array of {@link DebugConfiguration debug configurations}. - */ - provideDebugConfigurations?(folder: WorkspaceFolder | undefined, token?: CancellationToken): ProviderResult; - - /** - * Resolves a {@link DebugConfiguration debug configuration} by filling in missing values or by adding/changing/removing attributes. - * If more than one debug configuration provider is registered for the same type, the resolveDebugConfiguration calls are chained - * in arbitrary order and the initial debug configuration is piped through the chain. - * Returning the value 'undefined' prevents the debug session from starting. - * Returning the value 'null' prevents the debug session from starting and opens the underlying debug configuration instead. - * - * @param folder The workspace folder from which the configuration originates from or `undefined` for a folderless setup. - * @param debugConfiguration The {@link DebugConfiguration debug configuration} to resolve. - * @param token A cancellation token. - * @return The resolved debug configuration or undefined or null. - */ - resolveDebugConfiguration?(folder: WorkspaceFolder | undefined, debugConfiguration: DebugConfiguration, token?: CancellationToken): ProviderResult; - - /** - * This hook is directly called after 'resolveDebugConfiguration' but with all variables substituted. - * It can be used to resolve or verify a {@link DebugConfiguration debug configuration} by filling in missing values or by adding/changing/removing attributes. - * If more than one debug configuration provider is registered for the same type, the 'resolveDebugConfigurationWithSubstitutedVariables' calls are chained - * in arbitrary order and the initial debug configuration is piped through the chain. - * Returning the value 'undefined' prevents the debug session from starting. - * Returning the value 'null' prevents the debug session from starting and opens the underlying debug configuration instead. - * - * @param folder The workspace folder from which the configuration originates from or `undefined` for a folderless setup. - * @param debugConfiguration The {@link DebugConfiguration debug configuration} to resolve. - * @param token A cancellation token. - * @return The resolved debug configuration or undefined or null. - */ - resolveDebugConfigurationWithSubstitutedVariables?(folder: WorkspaceFolder | undefined, debugConfiguration: DebugConfiguration, token?: CancellationToken): ProviderResult; - } - - /** - * Represents a debug adapter executable and optional arguments and runtime options passed to it. - */ - export class DebugAdapterExecutable { - - /** - * Creates a description for a debug adapter based on an executable program. - * - * @param command The command or executable path that implements the debug adapter. - * @param args Optional arguments to be passed to the command or executable. - * @param options Optional options to be used when starting the command or executable. - */ - constructor(command: string, args?: string[], options?: DebugAdapterExecutableOptions); - - /** - * The command or path of the debug adapter executable. - * A command must be either an absolute path of an executable or the name of an command to be looked up via the PATH environment variable. - * The special value 'node' will be mapped to the editor's built-in Node.js runtime. - */ - readonly command: string; - - /** - * The arguments passed to the debug adapter executable. Defaults to an empty array. - */ - readonly args: string[]; - - /** - * Optional options to be used when the debug adapter is started. - * Defaults to undefined. - */ - readonly options?: DebugAdapterExecutableOptions; - } - - /** - * Options for a debug adapter executable. - */ - export interface DebugAdapterExecutableOptions { - - /** - * The additional environment of the executed program or shell. If omitted - * the parent process' environment is used. If provided it is merged with - * the parent process' environment. - */ - env?: { [key: string]: string }; - - /** - * The current working directory for the executed debug adapter. - */ - cwd?: string; - } - - /** - * Represents a debug adapter running as a socket based server. - */ - export class DebugAdapterServer { - - /** - * The port. - */ - readonly port: number; - - /** - * The host. - */ - readonly host?: string | undefined; - - /** - * Create a description for a debug adapter running as a socket based server. - */ - constructor(port: number, host?: string); - } - - /** - * Represents a debug adapter running as a Named Pipe (on Windows)/UNIX Domain Socket (on non-Windows) based server. - */ - export class DebugAdapterNamedPipeServer { - /** - * The path to the NamedPipe/UNIX Domain Socket. - */ - readonly path: string; - - /** - * Create a description for a debug adapter running as a Named Pipe (on Windows)/UNIX Domain Socket (on non-Windows) based server. - */ - constructor(path: string); - } - - /** - * A debug adapter that implements the Debug Adapter Protocol can be registered with the editor if it implements the DebugAdapter interface. - */ - export interface DebugAdapter extends Disposable { - - /** - * An event which fires after the debug adapter has sent a Debug Adapter Protocol message to the editor. - * Messages can be requests, responses, or events. - */ - readonly onDidSendMessage: Event; - - /** - * Handle a Debug Adapter Protocol message. - * Messages can be requests, responses, or events. - * Results or errors are returned via onSendMessage events. - * @param message A Debug Adapter Protocol message - */ - handleMessage(message: DebugProtocolMessage): void; - } - - /** - * A debug adapter descriptor for an inline implementation. - */ - export class DebugAdapterInlineImplementation { - - /** - * Create a descriptor for an inline implementation of a debug adapter. - */ - constructor(implementation: DebugAdapter); - } - - export type DebugAdapterDescriptor = DebugAdapterExecutable | DebugAdapterServer | DebugAdapterNamedPipeServer | DebugAdapterInlineImplementation; - - export interface DebugAdapterDescriptorFactory { - /** - * 'createDebugAdapterDescriptor' is called at the start of a debug session to provide details about the debug adapter to use. - * These details must be returned as objects of type {@link DebugAdapterDescriptor}. - * Currently two types of debug adapters are supported: - * - a debug adapter executable is specified as a command path and arguments (see {@link DebugAdapterExecutable}), - * - a debug adapter server reachable via a communication port (see {@link DebugAdapterServer}). - * If the method is not implemented the default behavior is this: - * createDebugAdapter(session: DebugSession, executable: DebugAdapterExecutable) { - * if (typeof session.configuration.debugServer === 'number') { - * return new DebugAdapterServer(session.configuration.debugServer); - * } - * return executable; - * } - * @param session The {@link DebugSession debug session} for which the debug adapter will be used. - * @param executable The debug adapter's executable information as specified in the package.json (or undefined if no such information exists). - * @return a {@link DebugAdapterDescriptor debug adapter descriptor} or undefined. - */ - createDebugAdapterDescriptor(session: DebugSession, executable: DebugAdapterExecutable | undefined): ProviderResult; - } - - /** - * A Debug Adapter Tracker is a means to track the communication between the editor and a Debug Adapter. - */ - export interface DebugAdapterTracker { - /** - * A session with the debug adapter is about to be started. - */ - onWillStartSession?(): void; - /** - * The debug adapter is about to receive a Debug Adapter Protocol message from the editor. - */ - onWillReceiveMessage?(message: any): void; - /** - * The debug adapter has sent a Debug Adapter Protocol message to the editor. - */ - onDidSendMessage?(message: any): void; - /** - * The debug adapter session is about to be stopped. - */ - onWillStopSession?(): void; - /** - * An error with the debug adapter has occurred. - */ - onError?(error: Error): void; - /** - * The debug adapter has exited with the given exit code or signal. - */ - onExit?(code: number | undefined, signal: string | undefined): void; - } - - export interface DebugAdapterTrackerFactory { - /** - * The method 'createDebugAdapterTracker' is called at the start of a debug session in order - * to return a "tracker" object that provides read-access to the communication between the editor and a debug adapter. - * - * @param session The {@link DebugSession debug session} for which the debug adapter tracker will be used. - * @return A {@link DebugAdapterTracker debug adapter tracker} or undefined. - */ - createDebugAdapterTracker(session: DebugSession): ProviderResult; - } - - /** - * Represents the debug console. - */ - export interface DebugConsole { - /** - * Append the given value to the debug console. - * - * @param value A string, falsy values will not be printed. - */ - append(value: string): void; - - /** - * Append the given value and a line feed character - * to the debug console. - * - * @param value A string, falsy values will be printed. - */ - appendLine(value: string): void; - } - - /** - * An event describing the changes to the set of {@link Breakpoint breakpoints}. - */ - export interface BreakpointsChangeEvent { - /** - * Added breakpoints. - */ - readonly added: readonly Breakpoint[]; - - /** - * Removed breakpoints. - */ - readonly removed: readonly Breakpoint[]; - - /** - * Changed breakpoints. - */ - readonly changed: readonly Breakpoint[]; - } - - /** - * The base class of all breakpoint types. - */ - export class Breakpoint { - /** - * The unique ID of the breakpoint. - */ - readonly id: string; - /** - * Is breakpoint enabled. - */ - readonly enabled: boolean; - /** - * An optional expression for conditional breakpoints. - */ - readonly condition?: string | undefined; - /** - * An optional expression that controls how many hits of the breakpoint are ignored. - */ - readonly hitCondition?: string | undefined; - /** - * An optional message that gets logged when this breakpoint is hit. Embedded expressions within {} are interpolated by the debug adapter. - */ - readonly logMessage?: string | undefined; - - protected constructor(enabled?: boolean, condition?: string, hitCondition?: string, logMessage?: string); - } - - /** - * A breakpoint specified by a source location. - */ - export class SourceBreakpoint extends Breakpoint { - /** - * The source and line position of this breakpoint. - */ - readonly location: Location; - - /** - * Create a new breakpoint for a source location. - */ - constructor(location: Location, enabled?: boolean, condition?: string, hitCondition?: string, logMessage?: string); - } - - /** - * A breakpoint specified by a function name. - */ - export class FunctionBreakpoint extends Breakpoint { - /** - * The name of the function to which this breakpoint is attached. - */ - readonly functionName: string; - - /** - * Create a new function breakpoint. - */ - constructor(functionName: string, enabled?: boolean, condition?: string, hitCondition?: string, logMessage?: string); - } - - /** - * Debug console mode used by debug session, see {@link DebugSessionOptions options}. - */ - export enum DebugConsoleMode { - /** - * Debug session should have a separate debug console. - */ - Separate = 0, - - /** - * Debug session should share debug console with its parent session. - * This value has no effect for sessions which do not have a parent session. - */ - MergeWithParent = 1 - } - - /** - * Options for {@link debug.startDebugging starting a debug session}. - */ - export interface DebugSessionOptions { - - /** - * When specified the newly created debug session is registered as a "child" session of this - * "parent" debug session. - */ - parentSession?: DebugSession; - - /** - * Controls whether lifecycle requests like 'restart' are sent to the newly created session or its parent session. - * By default (if the property is false or missing), lifecycle requests are sent to the new session. - * This property is ignored if the session has no parent session. - */ - lifecycleManagedByParent?: boolean; - - /** - * Controls whether this session should have a separate debug console or share it - * with the parent session. Has no effect for sessions which do not have a parent session. - * Defaults to Separate. - */ - consoleMode?: DebugConsoleMode; - - /** - * Controls whether this session should run without debugging, thus ignoring breakpoints. - * When this property is not specified, the value from the parent session (if there is one) is used. - */ - noDebug?: boolean; - - /** - * Controls if the debug session's parent session is shown in the CALL STACK view even if it has only a single child. - * By default, the debug session will never hide its parent. - * If compact is true, debug sessions with a single child are hidden in the CALL STACK view to make the tree more compact. - */ - compact?: boolean; - - /** - * When true, a save will not be triggered for open editors when starting a debug session, regardless of the value of the `debug.saveBeforeStart` setting. - */ - suppressSaveBeforeStart?: boolean; - - /** - * When true, the debug toolbar will not be shown for this session. - */ - suppressDebugToolbar?: boolean; - - /** - * When true, the window statusbar color will not be changed for this session. - */ - suppressDebugStatusbar?: boolean; - - /** - * When true, the debug viewlet will not be automatically revealed for this session. - */ - suppressDebugView?: boolean; - } - - /** - * A DebugConfigurationProviderTriggerKind specifies when the `provideDebugConfigurations` method of a `DebugConfigurationProvider` is triggered. - * Currently there are two situations: to provide the initial debug configurations for a newly created launch.json or - * to provide dynamically generated debug configurations when the user asks for them through the UI (e.g. via the "Select and Start Debugging" command). - * A trigger kind is used when registering a `DebugConfigurationProvider` with {@link debug.registerDebugConfigurationProvider}. - */ - export enum DebugConfigurationProviderTriggerKind { - /** - * `DebugConfigurationProvider.provideDebugConfigurations` is called to provide the initial debug configurations for a newly created launch.json. - */ - Initial = 1, - /** - * `DebugConfigurationProvider.provideDebugConfigurations` is called to provide dynamically generated debug configurations when the user asks for them through the UI (e.g. via the "Select and Start Debugging" command). - */ - Dynamic = 2 - } - - /** - * Namespace for debug functionality. - */ - export namespace debug { - - /** - * The currently active {@link DebugSession debug session} or `undefined`. The active debug session is the one - * represented by the debug action floating window or the one currently shown in the drop down menu of the debug action floating window. - * If no debug session is active, the value is `undefined`. - */ - export let activeDebugSession: DebugSession | undefined; - - /** - * The currently active {@link DebugConsole debug console}. - * If no debug session is active, output sent to the debug console is not shown. - */ - export let activeDebugConsole: DebugConsole; - - /** - * List of breakpoints. - */ - export let breakpoints: readonly Breakpoint[]; - - /** - * An {@link Event} which fires when the {@link debug.activeDebugSession active debug session} - * has changed. *Note* that the event also fires when the active debug session changes - * to `undefined`. - */ - export const onDidChangeActiveDebugSession: Event; - - /** - * An {@link Event} which fires when a new {@link DebugSession debug session} has been started. - */ - export const onDidStartDebugSession: Event; - - /** - * An {@link Event} which fires when a custom DAP event is received from the {@link DebugSession debug session}. - */ - export const onDidReceiveDebugSessionCustomEvent: Event; - - /** - * An {@link Event} which fires when a {@link DebugSession debug session} has terminated. - */ - export const onDidTerminateDebugSession: Event; - - /** - * An {@link Event} that is emitted when the set of breakpoints is added, removed, or changed. - */ - export const onDidChangeBreakpoints: Event; - - /** - * Register a {@link DebugConfigurationProvider debug configuration provider} for a specific debug type. - * The optional {@link DebugConfigurationProviderTriggerKind triggerKind} can be used to specify when the `provideDebugConfigurations` method of the provider is triggered. - * Currently two trigger kinds are possible: with the value `Initial` (or if no trigger kind argument is given) the `provideDebugConfigurations` method is used to provide the initial debug configurations to be copied into a newly created launch.json. - * With the trigger kind `Dynamic` the `provideDebugConfigurations` method is used to dynamically determine debug configurations to be presented to the user (in addition to the static configurations from the launch.json). - * Please note that the `triggerKind` argument only applies to the `provideDebugConfigurations` method: so the `resolveDebugConfiguration` methods are not affected at all. - * Registering a single provider with resolve methods for different trigger kinds, results in the same resolve methods called multiple times. - * More than one provider can be registered for the same type. - * - * @param debugType The debug type for which the provider is registered. - * @param provider The {@link DebugConfigurationProvider debug configuration provider} to register. - * @param triggerKind The {@link DebugConfigurationProviderTriggerKind trigger} for which the 'provideDebugConfiguration' method of the provider is registered. If `triggerKind` is missing, the value `DebugConfigurationProviderTriggerKind.Initial` is assumed. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerDebugConfigurationProvider(debugType: string, provider: DebugConfigurationProvider, triggerKind?: DebugConfigurationProviderTriggerKind): Disposable; - - /** - * Register a {@link DebugAdapterDescriptorFactory debug adapter descriptor factory} for a specific debug type. - * An extension is only allowed to register a DebugAdapterDescriptorFactory for the debug type(s) defined by the extension. Otherwise an error is thrown. - * Registering more than one DebugAdapterDescriptorFactory for a debug type results in an error. - * - * @param debugType The debug type for which the factory is registered. - * @param factory The {@link DebugAdapterDescriptorFactory debug adapter descriptor factory} to register. - * @return A {@link Disposable} that unregisters this factory when being disposed. - */ - export function registerDebugAdapterDescriptorFactory(debugType: string, factory: DebugAdapterDescriptorFactory): Disposable; - - /** - * Register a debug adapter tracker factory for the given debug type. - * - * @param debugType The debug type for which the factory is registered or '*' for matching all debug types. - * @param factory The {@link DebugAdapterTrackerFactory debug adapter tracker factory} to register. - * @return A {@link Disposable} that unregisters this factory when being disposed. - */ - export function registerDebugAdapterTrackerFactory(debugType: string, factory: DebugAdapterTrackerFactory): Disposable; - - /** - * Start debugging by using either a named launch or named compound configuration, - * or by directly passing a {@link DebugConfiguration}. - * The named configurations are looked up in '.vscode/launch.json' found in the given folder. - * Before debugging starts, all unsaved files are saved and the launch configurations are brought up-to-date. - * Folder specific variables used in the configuration (e.g. '${workspaceFolder}') are resolved against the given folder. - * @param folder The {@link WorkspaceFolder workspace folder} for looking up named configurations and resolving variables or `undefined` for a non-folder setup. - * @param nameOrConfiguration Either the name of a debug or compound configuration or a {@link DebugConfiguration} object. - * @param parentSessionOrOptions Debug session options. When passed a parent {@link DebugSession debug session}, assumes options with just this parent session. - * @return A thenable that resolves when debugging could be successfully started. - */ - export function startDebugging(folder: WorkspaceFolder | undefined, nameOrConfiguration: string | DebugConfiguration, parentSessionOrOptions?: DebugSession | DebugSessionOptions): Thenable; - - /** - * Stop the given debug session or stop all debug sessions if session is omitted. - * @param session The {@link DebugSession debug session} to stop; if omitted all sessions are stopped. - */ - export function stopDebugging(session?: DebugSession): Thenable; - - /** - * Add breakpoints. - * @param breakpoints The breakpoints to add. - */ - export function addBreakpoints(breakpoints: readonly Breakpoint[]): void; - - /** - * Remove breakpoints. - * @param breakpoints The breakpoints to remove. - */ - export function removeBreakpoints(breakpoints: readonly Breakpoint[]): void; - - /** - * Converts a "Source" descriptor object received via the Debug Adapter Protocol into a Uri that can be used to load its contents. - * If the source descriptor is based on a path, a file Uri is returned. - * If the source descriptor uses a reference number, a specific debug Uri (scheme 'debug') is constructed that requires a corresponding ContentProvider and a running debug session - * - * If the "Source" descriptor has insufficient information for creating the Uri, an error is thrown. - * - * @param source An object conforming to the [Source](https://microsoft.github.io/debug-adapter-protocol/specification#Types_Source) type defined in the Debug Adapter Protocol. - * @param session An optional debug session that will be used when the source descriptor uses a reference number to load the contents from an active debug session. - * @return A uri that can be used to load the contents of the source. - */ - export function asDebugSourceUri(source: DebugProtocolSource, session?: DebugSession): Uri; - } - - /** - * Namespace for dealing with installed extensions. Extensions are represented - * by an {@link Extension}-interface which enables reflection on them. - * - * Extension writers can provide APIs to other extensions by returning their API public - * surface from the `activate`-call. - * - * ```javascript - * export function activate(context: vscode.ExtensionContext) { - * let api = { - * sum(a, b) { - * return a + b; - * }, - * mul(a, b) { - * return a * b; - * } - * }; - * // 'export' public api-surface - * return api; - * } - * ``` - * When depending on the API of another extension add an `extensionDependencies`-entry - * to `package.json`, and use the {@link extensions.getExtension getExtension}-function - * and the {@link Extension.exports exports}-property, like below: - * - * ```javascript - * let mathExt = extensions.getExtension('genius.math'); - * let importedApi = mathExt.exports; - * - * console.log(importedApi.mul(42, 1)); - * ``` - */ - export namespace extensions { - - /** - * Get an extension by its full identifier in the form of: `publisher.name`. - * - * @param extensionId An extension identifier. - * @return An extension or `undefined`. - */ - export function getExtension(extensionId: string): Extension | undefined; - - /** - * All extensions currently known to the system. - */ - export const all: readonly Extension[]; - - /** - * An event which fires when `extensions.all` changes. This can happen when extensions are - * installed, uninstalled, enabled or disabled. - */ - export const onDidChange: Event; - } - - /** - * Collapsible state of a {@link CommentThread comment thread} - */ - export enum CommentThreadCollapsibleState { - /** - * Determines an item is collapsed - */ - Collapsed = 0, - - /** - * Determines an item is expanded - */ - Expanded = 1 - } - - /** - * Comment mode of a {@link Comment} - */ - export enum CommentMode { - /** - * Displays the comment editor - */ - Editing = 0, - - /** - * Displays the preview of the comment - */ - Preview = 1 - } - - /** - * The state of a comment thread. - */ - export enum CommentThreadState { - Unresolved = 0, - Resolved = 1 - } - - /** - * A collection of {@link Comment comments} representing a conversation at a particular range in a document. - */ - export interface CommentThread { - /** - * The uri of the document the thread has been created on. - */ - readonly uri: Uri; - - /** - * The range the comment thread is located within the document. The thread icon will be shown - * at the last line of the range. - */ - range: Range; - - /** - * The ordered comments of the thread. - */ - comments: readonly Comment[]; - - /** - * Whether the thread should be collapsed or expanded when opening the document. - * Defaults to Collapsed. - */ - collapsibleState: CommentThreadCollapsibleState; - - /** - * Whether the thread supports reply. - * Defaults to true. - */ - canReply: boolean; - - /** - * Context value of the comment thread. This can be used to contribute thread specific actions. - * For example, a comment thread is given a context value as `editable`. When contributing actions to `comments/commentThread/title` - * using `menus` extension point, you can specify context value for key `commentThread` in `when` expression like `commentThread == editable`. - * ```json - * "contributes": { - * "menus": { - * "comments/commentThread/title": [ - * { - * "command": "extension.deleteCommentThread", - * "when": "commentThread == editable" - * } - * ] - * } - * } - * ``` - * This will show action `extension.deleteCommentThread` only for comment threads with `contextValue` is `editable`. - */ - contextValue?: string; - - /** - * The optional human-readable label describing the {@link CommentThread Comment Thread} - */ - label?: string; - - /** - * The optional state of a comment thread, which may affect how the comment is displayed. - */ - state?: CommentThreadState; - - /** - * Dispose this comment thread. - * - * Once disposed, this comment thread will be removed from visible editors and Comment Panel when appropriate. - */ - dispose(): void; - } - - /** - * Author information of a {@link Comment} - */ - export interface CommentAuthorInformation { - /** - * The display name of the author of the comment - */ - name: string; - - /** - * The optional icon path for the author - */ - iconPath?: Uri; - } - - /** - * Reactions of a {@link Comment} - */ - export interface CommentReaction { - /** - * The human-readable label for the reaction - */ - readonly label: string; - - /** - * Icon for the reaction shown in UI. - */ - readonly iconPath: string | Uri; - - /** - * The number of users who have reacted to this reaction - */ - readonly count: number; - - /** - * Whether the {@link CommentAuthorInformation author} of the comment has reacted to this reaction - */ - readonly authorHasReacted: boolean; - } - - /** - * A comment is displayed within the editor or the Comments Panel, depending on how it is provided. - */ - export interface Comment { - /** - * The human-readable comment body - */ - body: string | MarkdownString; - - /** - * {@link CommentMode Comment mode} of the comment - */ - mode: CommentMode; - - /** - * The {@link CommentAuthorInformation author information} of the comment - */ - author: CommentAuthorInformation; - - /** - * Context value of the comment. This can be used to contribute comment specific actions. - * For example, a comment is given a context value as `editable`. When contributing actions to `comments/comment/title` - * using `menus` extension point, you can specify context value for key `comment` in `when` expression like `comment == editable`. - * ```json - * "contributes": { - * "menus": { - * "comments/comment/title": [ - * { - * "command": "extension.deleteComment", - * "when": "comment == editable" - * } - * ] - * } - * } - * ``` - * This will show action `extension.deleteComment` only for comments with `contextValue` is `editable`. - */ - contextValue?: string; - - /** - * Optional reactions of the {@link Comment} - */ - reactions?: CommentReaction[]; - - /** - * Optional label describing the {@link Comment} - * Label will be rendered next to authorName if exists. - */ - label?: string; - - /** - * Optional timestamp that will be displayed in comments. - * The date will be formatted according to the user's locale and settings. - */ - timestamp?: Date; - } - - /** - * Command argument for actions registered in `comments/commentThread/context`. - */ - export interface CommentReply { - /** - * The active {@link CommentThread comment thread} - */ - thread: CommentThread; - - /** - * The value in the comment editor - */ - text: string; - } - - /** - * Commenting range provider for a {@link CommentController comment controller}. - */ - export interface CommentingRangeProvider { - /** - * Provide a list of ranges which allow new comment threads creation or null for a given document - */ - provideCommentingRanges(document: TextDocument, token: CancellationToken): ProviderResult; - } - - /** - * Represents a {@link CommentController comment controller}'s {@link CommentController.options options}. - */ - export interface CommentOptions { - /** - * An optional string to show on the comment input box when it's collapsed. - */ - prompt?: string; - - /** - * An optional string to show as placeholder in the comment input box when it's focused. - */ - placeHolder?: string; - } - - /** - * A comment controller is able to provide {@link CommentThread comments} support to the editor and - * provide users various ways to interact with comments. - */ - export interface CommentController { - /** - * The id of this comment controller. - */ - readonly id: string; - - /** - * The human-readable label of this comment controller. - */ - readonly label: string; - - /** - * Comment controller options - */ - options?: CommentOptions; - - /** - * Optional commenting range provider. Provide a list {@link Range ranges} which support commenting to any given resource uri. - * - * If not provided, users cannot leave any comments. - */ - commentingRangeProvider?: CommentingRangeProvider; - - /** - * Create a {@link CommentThread comment thread}. The comment thread will be displayed in visible text editors (if the resource matches) - * and Comments Panel once created. - * - * @param uri The uri of the document the thread has been created on. - * @param range The range the comment thread is located within the document. - * @param comments The ordered comments of the thread. - */ - createCommentThread(uri: Uri, range: Range, comments: readonly Comment[]): CommentThread; - - /** - * Optional reaction handler for creating and deleting reactions on a {@link Comment}. - */ - reactionHandler?: (comment: Comment, reaction: CommentReaction) => Thenable; - - /** - * Dispose this comment controller. - * - * Once disposed, all {@link CommentThread comment threads} created by this comment controller will also be removed from the editor - * and Comments Panel. - */ - dispose(): void; - } - - namespace comments { - /** - * Creates a new {@link CommentController comment controller} instance. - * - * @param id An `id` for the comment controller. - * @param label A human-readable string for the comment controller. - * @return An instance of {@link CommentController comment controller}. - */ - export function createCommentController(id: string, label: string): CommentController; - } - - /** - * Represents a session of a currently logged in user. - */ - export interface AuthenticationSession { - /** - * The identifier of the authentication session. - */ - readonly id: string; - - /** - * The access token. - */ - readonly accessToken: string; - - /** - * The account associated with the session. - */ - readonly account: AuthenticationSessionAccountInformation; - - /** - * The permissions granted by the session's access token. Available scopes - * are defined by the {@link AuthenticationProvider}. - */ - readonly scopes: readonly string[]; - } - - /** - * The information of an account associated with an {@link AuthenticationSession}. - */ - export interface AuthenticationSessionAccountInformation { - /** - * The unique identifier of the account. - */ - readonly id: string; - - /** - * The human-readable name of the account. - */ - readonly label: string; - } - - - /** - * Options to be used when getting an {@link AuthenticationSession} from an {@link AuthenticationProvider}. - */ - export interface AuthenticationGetSessionOptions { - /** - * Whether the existing user session preference should be cleared. - * - * For authentication providers that support being signed into multiple accounts at once, the user will be - * prompted to select an account to use when {@link authentication.getSession getSession} is called. This preference - * is remembered until {@link authentication.getSession getSession} is called with this flag. - * - * Defaults to false. - */ - clearSessionPreference?: boolean; - - /** - * Whether login should be performed if there is no matching session. - * - * If true, a modal dialog will be shown asking the user to sign in. If false, a numbered badge will be shown - * on the accounts activity bar icon. An entry for the extension will be added under the menu to sign in. This - * allows quietly prompting the user to sign in. - * - * If there is a matching session but the extension has not been granted access to it, setting this to true - * will also result in an immediate modal dialog, and false will add a numbered badge to the accounts icon. - * - * Defaults to false. - * - * Note: you cannot use this option with {@link AuthenticationGetSessionOptions.silent silent}. - */ - createIfNone?: boolean; - - /** - * Whether we should attempt to reauthenticate even if there is already a session available. - * - * If true, a modal dialog will be shown asking the user to sign in again. This is mostly used for scenarios - * where the token needs to be re minted because it has lost some authorization. - * - * If there are no existing sessions and forceNewSession is true, it will behave identically to - * {@link AuthenticationGetSessionOptions.createIfNone createIfNone}. - * - * This defaults to false. - */ - forceNewSession?: boolean | { detail: string }; - - /** - * Whether we should show the indication to sign in in the Accounts menu. - * - * If false, the user will be shown a badge on the Accounts menu with an option to sign in for the extension. - * If true, no indication will be shown. - * - * Defaults to false. - * - * Note: you cannot use this option with any other options that prompt the user like {@link AuthenticationGetSessionOptions.createIfNone createIfNone}. - */ - silent?: boolean; - } - - /** - * Basic information about an {@link AuthenticationProvider} - */ - export interface AuthenticationProviderInformation { - /** - * The unique identifier of the authentication provider. - */ - readonly id: string; - - /** - * The human-readable name of the authentication provider. - */ - readonly label: string; - } - - /** - * An {@link Event} which fires when an {@link AuthenticationSession} is added, removed, or changed. - */ - export interface AuthenticationSessionsChangeEvent { - /** - * The {@link AuthenticationProvider} that has had its sessions change. - */ - readonly provider: AuthenticationProviderInformation; - } - - /** - * Options for creating an {@link AuthenticationProvider}. - */ - export interface AuthenticationProviderOptions { - /** - * Whether it is possible to be signed into multiple accounts at once with this provider. - * If not specified, will default to false. - */ - readonly supportsMultipleAccounts?: boolean; - } - - /** - * An {@link Event} which fires when an {@link AuthenticationSession} is added, removed, or changed. - */ - export interface AuthenticationProviderAuthenticationSessionsChangeEvent { - /** - * The {@link AuthenticationSession AuthenticationSessions} of the {@link AuthenticationProvider} that have been added. - */ - readonly added: readonly AuthenticationSession[] | undefined; - - /** - * The {@link AuthenticationSession AuthenticationSessions} of the {@link AuthenticationProvider} that have been removed. - */ - readonly removed: readonly AuthenticationSession[] | undefined; - - /** - * The {@link AuthenticationSession AuthenticationSessions} of the {@link AuthenticationProvider} that have been changed. - * A session changes when its data excluding the id are updated. An example of this is a session refresh that results in a new - * access token being set for the session. - */ - readonly changed: readonly AuthenticationSession[] | undefined; - } - - /** - * A provider for performing authentication to a service. - */ - export interface AuthenticationProvider { - /** - * An {@link Event} which fires when the array of sessions has changed, or data - * within a session has changed. - */ - readonly onDidChangeSessions: Event; - - /** - * Get a list of sessions. - * @param scopes An optional list of scopes. If provided, the sessions returned should match - * these permissions, otherwise all sessions should be returned. - * @returns A promise that resolves to an array of authentication sessions. - */ - getSessions(scopes?: readonly string[]): Thenable; - - /** - * Prompts a user to login. - * - * If login is successful, the onDidChangeSessions event should be fired. - * - * If login fails, a rejected promise should be returned. - * - * If the provider has specified that it does not support multiple accounts, - * then this should never be called if there is already an existing session matching these - * scopes. - * @param scopes A list of scopes, permissions, that the new session should be created with. - * @returns A promise that resolves to an authentication session. - */ - createSession(scopes: readonly string[]): Thenable; - - /** - * Removes the session corresponding to session id. - * - * If the removal is successful, the onDidChangeSessions event should be fired. - * - * If a session cannot be removed, the provider should reject with an error message. - * @param sessionId The id of the session to remove. - */ - removeSession(sessionId: string): Thenable; - } - - - /** - * Namespace for authentication. - */ - export namespace authentication { - /** - * Get an authentication session matching the desired scopes. Rejects if a provider with providerId is not - * registered, or if the user does not consent to sharing authentication information with - * the extension. If there are multiple sessions with the same scopes, the user will be shown a - * quickpick to select which account they would like to use. - * - * Currently, there are only two authentication providers that are contributed from built in extensions - * to the editor that implement GitHub and Microsoft authentication: their providerId's are 'github' and 'microsoft'. - * @param providerId The id of the provider to use - * @param scopes A list of scopes representing the permissions requested. These are dependent on the authentication provider - * @param options The {@link AuthenticationGetSessionOptions} to use - * @returns A thenable that resolves to an authentication session - */ - export function getSession(providerId: string, scopes: readonly string[], options: AuthenticationGetSessionOptions & { createIfNone: true }): Thenable; - - /** - * Get an authentication session matching the desired scopes. Rejects if a provider with providerId is not - * registered, or if the user does not consent to sharing authentication information with - * the extension. If there are multiple sessions with the same scopes, the user will be shown a - * quickpick to select which account they would like to use. - * - * Currently, there are only two authentication providers that are contributed from built in extensions - * to the editor that implement GitHub and Microsoft authentication: their providerId's are 'github' and 'microsoft'. - * @param providerId The id of the provider to use - * @param scopes A list of scopes representing the permissions requested. These are dependent on the authentication provider - * @param options The {@link AuthenticationGetSessionOptions} to use - * @returns A thenable that resolves to an authentication session - */ - export function getSession(providerId: string, scopes: readonly string[], options: AuthenticationGetSessionOptions & { forceNewSession: true | { detail: string } }): Thenable; - - /** - * Get an authentication session matching the desired scopes. Rejects if a provider with providerId is not - * registered, or if the user does not consent to sharing authentication information with - * the extension. If there are multiple sessions with the same scopes, the user will be shown a - * quickpick to select which account they would like to use. - * - * Currently, there are only two authentication providers that are contributed from built in extensions - * to the editor that implement GitHub and Microsoft authentication: their providerId's are 'github' and 'microsoft'. - * @param providerId The id of the provider to use - * @param scopes A list of scopes representing the permissions requested. These are dependent on the authentication provider - * @param options The {@link AuthenticationGetSessionOptions} to use - * @returns A thenable that resolves to an authentication session if available, or undefined if there are no sessions - */ - export function getSession(providerId: string, scopes: readonly string[], options?: AuthenticationGetSessionOptions): Thenable; - - /** - * An {@link Event} which fires when the authentication sessions of an authentication provider have - * been added, removed, or changed. - */ - export const onDidChangeSessions: Event; - - /** - * Register an authentication provider. - * - * There can only be one provider per id and an error is being thrown when an id - * has already been used by another provider. Ids are case-sensitive. - * - * @param id The unique identifier of the provider. - * @param label The human-readable name of the provider. - * @param provider The authentication provider provider. - * @params options Additional options for the provider. - * @return A {@link Disposable} that unregisters this provider when being disposed. - */ - export function registerAuthenticationProvider(id: string, label: string, provider: AuthenticationProvider, options?: AuthenticationProviderOptions): Disposable; - } - - /** - * Namespace for localization-related functionality in the extension API. To use this properly, - * you must have `l10n` defined in your extension manifest and have bundle.l10n..json files. - * For more information on how to generate bundle.l10n..json files, check out the - * [vscode-l10n repo](https://github.com/microsoft/vscode-l10n). - * - * Note: Built-in extensions (for example, Git, TypeScript Language Features, GitHub Authentication) - * are excluded from the `l10n` property requirement. In other words, they do not need to specify - * a `l10n` in the extension manifest because their translated strings come from Language Packs. - */ - export namespace l10n { - /** - * Marks a string for localization. If a localized bundle is available for the language specified by - * {@link env.language} and the bundle has a localized value for this message, then that localized - * value will be returned (with injected {@link args} values for any templated values). - * @param message - The message to localize. Supports index templating where strings like `{0}` and `{1}` are - * replaced by the item at that index in the {@link args} array. - * @param args - The arguments to be used in the localized string. The index of the argument is used to - * match the template placeholder in the localized string. - * @returns localized string with injected arguments. - * @example `l10n.t('Hello {0}!', 'World');` - */ - export function t(message: string, ...args: Array): string; - - /** - * Marks a string for localization. If a localized bundle is available for the language specified by - * {@link env.language} and the bundle has a localized value for this message, then that localized - * value will be returned (with injected {@link args} values for any templated values). - * @param message The message to localize. Supports named templating where strings like `{foo}` and `{bar}` are - * replaced by the value in the Record for that key (foo, bar, etc). - * @param args The arguments to be used in the localized string. The name of the key in the record is used to - * match the template placeholder in the localized string. - * @returns localized string with injected arguments. - * @example `l10n.t('Hello {name}', { name: 'Erich' });` - */ - export function t(message: string, args: Record): string; - /** - * Marks a string for localization. If a localized bundle is available for the language specified by - * {@link env.language} and the bundle has a localized value for this message, then that localized - * value will be returned (with injected args values for any templated values). - * @param options The options to use when localizing the message. - * @returns localized string with injected arguments. - */ - export function t(options: { - /** - * The message to localize. If {@link options.args args} is an array, this message supports index templating where strings like - * `{0}` and `{1}` are replaced by the item at that index in the {@link options.args args} array. If `args` is a `Record`, - * this supports named templating where strings like `{foo}` and `{bar}` are replaced by the value in - * the Record for that key (foo, bar, etc). - */ - message: string; - /** - * The arguments to be used in the localized string. As an array, the index of the argument is used to - * match the template placeholder in the localized string. As a Record, the key is used to match the template - * placeholder in the localized string. - */ - args?: Array | Record; - /** - * A comment to help translators understand the context of the message. - */ - comment: string | string[]; - }): string; - /** - * The bundle of localized strings that have been loaded for the extension. - * It's undefined if no bundle has been loaded. The bundle is typically not loaded if - * there was no bundle found or when we are running with the default language. - */ - export const bundle: { [key: string]: string } | undefined; - /** - * The URI of the localization bundle that has been loaded for the extension. - * It's undefined if no bundle has been loaded. The bundle is typically not loaded if - * there was no bundle found or when we are running with the default language. - */ - export const uri: Uri | undefined; - } - - /** - * Namespace for testing functionality. Tests are published by registering - * {@link TestController} instances, then adding {@link TestItem TestItems}. - * Controllers may also describe how to run tests by creating one or more - * {@link TestRunProfile} instances. - */ - export namespace tests { - /** - * Creates a new test controller. - * - * @param id Identifier for the controller, must be globally unique. - * @param label A human-readable label for the controller. - * @returns An instance of the {@link TestController}. - */ - export function createTestController(id: string, label: string): TestController; - } - - /** - * The kind of executions that {@link TestRunProfile TestRunProfiles} control. - */ - export enum TestRunProfileKind { - Run = 1, - Debug = 2, - Coverage = 3, - } - - /** - * Tags can be associated with {@link TestItem TestItems} and - * {@link TestRunProfile TestRunProfiles}. A profile with a tag can only - * execute tests that include that tag in their {@link TestItem.tags} array. - */ - export class TestTag { - /** - * ID of the test tag. `TestTag` instances with the same ID are considered - * to be identical. - */ - readonly id: string; - - /** - * Creates a new TestTag instance. - * @param id ID of the test tag. - */ - constructor(id: string); - } - - /** - * A TestRunProfile describes one way to execute tests in a {@link TestController}. - */ - export interface TestRunProfile { - /** - * Label shown to the user in the UI. - * - * Note that the label has some significance if the user requests that - * tests be re-run in a certain way. For example, if tests were run - * normally and the user requests to re-run them in debug mode, the editor - * will attempt use a configuration with the same label of the `Debug` - * kind. If there is no such configuration, the default will be used. - */ - label: string; - - /** - * Configures what kind of execution this profile controls. If there - * are no profiles for a kind, it will not be available in the UI. - */ - readonly kind: TestRunProfileKind; - - /** - * Controls whether this profile is the default action that will - * be taken when its kind is actioned. For example, if the user clicks - * the generic "run all" button, then the default profile for - * {@link TestRunProfileKind.Run} will be executed, although the - * user can configure this. - */ - isDefault: boolean; - - /** - * Associated tag for the profile. If this is set, only {@link TestItem} - * instances with the same tag will be eligible to execute in this profile. - */ - tag: TestTag | undefined; - - /** - * If this method is present, a configuration gear will be present in the - * UI, and this method will be invoked when it's clicked. When called, - * you can take other editor actions, such as showing a quick pick or - * opening a configuration file. - */ - configureHandler: (() => void) | undefined; - - /** - * Handler called to start a test run. When invoked, the function should call - * {@link TestController.createTestRun} at least once, and all test runs - * associated with the request should be created before the function returns - * or the returned promise is resolved. - * - * @param request Request information for the test run. - * @param cancellationToken Token that signals the used asked to abort the - * test run. If cancellation is requested on this token, all {@link TestRun} - * instances associated with the request will be - * automatically cancelled as well. - */ - runHandler: (request: TestRunRequest, token: CancellationToken) => Thenable | void; - - /** - * Deletes the run profile. - */ - dispose(): void; - } - - /** - * Entry point to discover and execute tests. It contains {@link TestController.items} which - * are used to populate the editor UI, and is associated with - * {@link TestController.createRunProfile run profiles} to allow - * for tests to be executed. - */ - export interface TestController { - /** - * The id of the controller passed in {@link tests.createTestController}. - * This must be globally unique. - */ - readonly id: string; - - /** - * Human-readable label for the test controller. - */ - label: string; - - /** - * A collection of "top-level" {@link TestItem} instances, which can in - * turn have their own {@link TestItem.children children} to form the - * "test tree." - * - * The extension controls when to add tests. For example, extensions should - * add tests for a file when {@link workspace.onDidOpenTextDocument} - * fires in order for decorations for tests within a file to be visible. - * - * However, the editor may sometimes explicitly request children using the - * {@link resolveHandler} See the documentation on that method for more details. - */ - readonly items: TestItemCollection; - - /** - * Creates a profile used for running tests. Extensions must create - * at least one profile in order for tests to be run. - * @param label A human-readable label for this profile. - * @param kind Configures what kind of execution this profile manages. - * @param runHandler Function called to start a test run. - * @param isDefault Whether this is the default action for its kind. - * @param tag Profile test tag. - * @returns An instance of a {@link TestRunProfile}, which is automatically - * associated with this controller. - */ - createRunProfile(label: string, kind: TestRunProfileKind, runHandler: (request: TestRunRequest, token: CancellationToken) => Thenable | void, isDefault?: boolean, tag?: TestTag): TestRunProfile; - - /** - * A function provided by the extension that the editor may call to request - * children of a test item, if the {@link TestItem.canResolveChildren} is - * `true`. When called, the item should discover children and call - * {@link TestController.createTestItem} as children are discovered. - * - * Generally the extension manages the lifecycle of test items, but under - * certain conditions the editor may request the children of a specific - * item to be loaded. For example, if the user requests to re-run tests - * after reloading the editor, the editor may need to call this method - * to resolve the previously-run tests. - * - * The item in the explorer will automatically be marked as "busy" until - * the function returns or the returned thenable resolves. - * - * @param item An unresolved test item for which children are being - * requested, or `undefined` to resolve the controller's initial {@link TestController.items items}. - */ - resolveHandler?: (item: TestItem | undefined) => Thenable | void; - - /** - * If this method is present, a refresh button will be present in the - * UI, and this method will be invoked when it's clicked. When called, - * the extension should scan the workspace for any new, changed, or - * removed tests. - * - * It's recommended that extensions try to update tests in realtime, using - * a {@link FileSystemWatcher} for example, and use this method as a fallback. - * - * @returns A thenable that resolves when tests have been refreshed. - */ - refreshHandler: ((token: CancellationToken) => Thenable | void) | undefined; - - /** - * Creates a {@link TestRun}. This should be called by the - * {@link TestRunProfile} when a request is made to execute tests, and may - * also be called if a test run is detected externally. Once created, tests - * that are included in the request will be moved into the queued state. - * - * All runs created using the same `request` instance will be grouped - * together. This is useful if, for example, a single suite of tests is - * run on multiple platforms. - * - * @param request Test run request. Only tests inside the `include` may be - * modified, and tests in its `exclude` are ignored. - * @param name The human-readable name of the run. This can be used to - * disambiguate multiple sets of results in a test run. It is useful if - * tests are run across multiple platforms, for example. - * @param persist Whether the results created by the run should be - * persisted in the editor. This may be false if the results are coming from - * a file already saved externally, such as a coverage information file. - * @returns An instance of the {@link TestRun}. It will be considered "running" - * from the moment this method is invoked until {@link TestRun.end} is called. - */ - createTestRun(request: TestRunRequest, name?: string, persist?: boolean): TestRun; - - /** - * Creates a new managed {@link TestItem} instance. It can be added into - * the {@link TestItem.children} of an existing item, or into the - * {@link TestController.items}. - * - * @param id Identifier for the TestItem. The test item's ID must be unique - * in the {@link TestItemCollection} it's added to. - * @param label Human-readable label of the test item. - * @param uri URI this TestItem is associated with. May be a file or directory. - */ - createTestItem(id: string, label: string, uri?: Uri): TestItem; - - /** - * Unregisters the test controller, disposing of its associated tests - * and unpersisted results. - */ - dispose(): void; - } - - /** - * A TestRunRequest is a precursor to a {@link TestRun}, which in turn is - * created by passing a request to {@link TestController.createTestRun}. The - * TestRunRequest contains information about which tests should be run, which - * should not be run, and how they are run (via the {@link TestRunRequest.profile profile}). - * - * In general, TestRunRequests are created by the editor and pass to - * {@link TestRunProfile.runHandler}, however you can also create test - * requests and runs outside of the `runHandler`. - */ - export class TestRunRequest { - /** - * A filter for specific tests to run. If given, the extension should run - * all of the included tests and all their children, excluding any tests - * that appear in {@link TestRunRequest.exclude}. If this property is - * undefined, then the extension should simply run all tests. - * - * The process of running tests should resolve the children of any test - * items who have not yet been resolved. - */ - readonly include: readonly TestItem[] | undefined; - - /** - * An array of tests the user has marked as excluded from the test included - * in this run; exclusions should apply after inclusions. - * - * May be omitted if no exclusions were requested. Test controllers should - * not run excluded tests or any children of excluded tests. - */ - readonly exclude: readonly TestItem[] | undefined; - - /** - * The profile used for this request. This will always be defined - * for requests issued from the editor UI, though extensions may - * programmatically create requests not associated with any profile. - */ - readonly profile: TestRunProfile | undefined; - - /** - * @param include Array of specific tests to run, or undefined to run all tests - * @param exclude An array of tests to exclude from the run. - * @param profile The run profile used for this request. - */ - constructor(include?: readonly TestItem[], exclude?: readonly TestItem[], profile?: TestRunProfile); - } - - /** - * A TestRun represents an in-progress or completed test run and - * provides methods to report the state of individual tests in the run. - */ - export interface TestRun { - /** - * The human-readable name of the run. This can be used to - * disambiguate multiple sets of results in a test run. It is useful if - * tests are run across multiple platforms, for example. - */ - readonly name: string | undefined; - - /** - * A cancellation token which will be triggered when the test run is - * canceled from the UI. - */ - readonly token: CancellationToken; - - /** - * Whether the test run will be persisted across reloads by the editor. - */ - readonly isPersisted: boolean; - - /** - * Indicates a test is queued for later execution. - * @param test Test item to update. - */ - enqueued(test: TestItem): void; - - /** - * Indicates a test has started running. - * @param test Test item to update. - */ - started(test: TestItem): void; - - /** - * Indicates a test has been skipped. - * @param test Test item to update. - */ - skipped(test: TestItem): void; - - /** - * Indicates a test has failed. You should pass one or more - * {@link TestMessage TestMessages} to describe the failure. - * @param test Test item to update. - * @param message Messages associated with the test failure. - * @param duration How long the test took to execute, in milliseconds. - */ - failed(test: TestItem, message: TestMessage | readonly TestMessage[], duration?: number): void; - - /** - * Indicates a test has errored. You should pass one or more - * {@link TestMessage TestMessages} to describe the failure. This differs - * from the "failed" state in that it indicates a test that couldn't be - * executed at all, from a compilation error for example. - * @param test Test item to update. - * @param message Messages associated with the test failure. - * @param duration How long the test took to execute, in milliseconds. - */ - errored(test: TestItem, message: TestMessage | readonly TestMessage[], duration?: number): void; - - /** - * Indicates a test has passed. - * @param test Test item to update. - * @param duration How long the test took to execute, in milliseconds. - */ - passed(test: TestItem, duration?: number): void; - - /** - * Appends raw output from the test runner. On the user's request, the - * output will be displayed in a terminal. ANSI escape sequences, - * such as colors and text styles, are supported. - * - * @param output Output text to append. - * @param location Indicate that the output was logged at the given - * location. - * @param test Test item to associate the output with. - */ - appendOutput(output: string, location?: Location, test?: TestItem): void; - - /** - * Signals that the end of the test run. Any tests included in the run whose - * states have not been updated will have their state reset. - */ - end(): void; - } - - /** - * Collection of test items, found in {@link TestItem.children} and - * {@link TestController.items}. - */ - export interface TestItemCollection extends Iterable<[id: string, testItem: TestItem]> { - /** - * Gets the number of items in the collection. - */ - readonly size: number; - - /** - * Replaces the items stored by the collection. - * @param items Items to store. - */ - replace(items: readonly TestItem[]): void; - - /** - * Iterate over each entry in this collection. - * - * @param callback Function to execute for each entry. - * @param thisArg The `this` context used when invoking the handler function. - */ - forEach(callback: (item: TestItem, collection: TestItemCollection) => unknown, thisArg?: any): void; - - /** - * Adds the test item to the children. If an item with the same ID already - * exists, it'll be replaced. - * @param item Item to add. - */ - add(item: TestItem): void; - - /** - * Removes a single test item from the collection. - * @param itemId Item ID to delete. - */ - delete(itemId: string): void; - - /** - * Efficiently gets a test item by ID, if it exists, in the children. - * @param itemId Item ID to get. - * @returns The found item or undefined if it does not exist. - */ - get(itemId: string): TestItem | undefined; - } - - /** - * An item shown in the "test explorer" view. - * - * A `TestItem` can represent either a test suite or a test itself, since - * they both have similar capabilities. - */ - export interface TestItem { - /** - * Identifier for the `TestItem`. This is used to correlate - * test results and tests in the document with those in the workspace - * (test explorer). This cannot change for the lifetime of the `TestItem`, - * and must be unique among its parent's direct children. - */ - readonly id: string; - - /** - * URI this `TestItem` is associated with. May be a file or directory. - */ - readonly uri: Uri | undefined; - - /** - * The children of this test item. For a test suite, this may contain the - * individual test cases or nested suites. - */ - readonly children: TestItemCollection; - - /** - * The parent of this item. It's set automatically, and is undefined - * top-level items in the {@link TestController.items} and for items that - * aren't yet included in another item's {@link TestItem.children children}. - */ - readonly parent: TestItem | undefined; - - /** - * Tags associated with this test item. May be used in combination with - * {@link TestRunProfile.tag tags}, or simply as an organizational feature. - */ - tags: readonly TestTag[]; - - /** - * Indicates whether this test item may have children discovered by resolving. - * - * If true, this item is shown as expandable in the Test Explorer view and - * expanding the item will cause {@link TestController.resolveHandler} - * to be invoked with the item. - * - * Default to `false`. - */ - canResolveChildren: boolean; - - /** - * Controls whether the item is shown as "busy" in the Test Explorer view. - * This is useful for showing status while discovering children. - * - * Defaults to `false`. - */ - busy: boolean; - - /** - * Display name describing the test case. - */ - label: string; - - /** - * Optional description that appears next to the label. - */ - description?: string; - - /** - * A string that should be used when comparing this item - * with other items. When `falsy` the {@link TestItem.label label} - * is used. - */ - sortText?: string | undefined; - - /** - * Location of the test item in its {@link TestItem.uri uri}. - * - * This is only meaningful if the `uri` points to a file. - */ - range: Range | undefined; - - /** - * Optional error encountered while loading the test. - * - * Note that this is not a test result and should only be used to represent errors in - * test discovery, such as syntax errors. - */ - error: string | MarkdownString | undefined; - } - - /** - * Message associated with the test state. Can be linked to a specific - * source range -- useful for assertion failures, for example. - */ - export class TestMessage { - /** - * Human-readable message text to display. - */ - message: string | MarkdownString; - - /** - * Expected test output. If given with {@link TestMessage.actualOutput actualOutput }, a diff view will be shown. - */ - expectedOutput?: string; - - /** - * Actual test output. If given with {@link TestMessage.expectedOutput expectedOutput }, a diff view will be shown. - */ - actualOutput?: string; - - /** - * Associated file location. - */ - location?: Location; - - /** - * Creates a new TestMessage that will present as a diff in the editor. - * @param message Message to display to the user. - * @param expected Expected output. - * @param actual Actual output. - */ - static diff(message: string | MarkdownString, expected: string, actual: string): TestMessage; - - /** - * Creates a new TestMessage instance. - * @param message The message to show to the user. - */ - constructor(message: string | MarkdownString); - } - - /** - * The tab represents a single text based resource. - */ - export class TabInputText { - /** - * The uri represented by the tab. - */ - readonly uri: Uri; - /** - * Constructs a text tab input with the given URI. - * @param uri The URI of the tab. - */ - constructor(uri: Uri); - } - - /** - * The tab represents two text based resources - * being rendered as a diff. - */ - export class TabInputTextDiff { - /** - * The uri of the original text resource. - */ - readonly original: Uri; - /** - * The uri of the modified text resource. - */ - readonly modified: Uri; - /** - * Constructs a new text diff tab input with the given URIs. - * @param original The uri of the original text resource. - * @param modified The uri of the modified text resource. - */ - constructor(original: Uri, modified: Uri); - } - - /** - * The tab represents a custom editor. - */ - export class TabInputCustom { - /** - * The uri that the tab is representing. - */ - readonly uri: Uri; - /** - * The type of custom editor. - */ - readonly viewType: string; - /** - * Constructs a custom editor tab input. - * @param uri The uri of the tab. - * @param viewType The viewtype of the custom editor. - */ - constructor(uri: Uri, viewType: string); - } - - /** - * The tab represents a webview. - */ - export class TabInputWebview { - /** - * The type of webview. Maps to {@linkcode WebviewPanel.viewType WebviewPanel's viewType} - */ - readonly viewType: string; - /** - * Constructs a webview tab input with the given view type. - * @param viewType The type of webview. Maps to {@linkcode WebviewPanel.viewType WebviewPanel's viewType} - */ - constructor(viewType: string); - } - - /** - * The tab represents a notebook. - */ - export class TabInputNotebook { - /** - * The uri that the tab is representing. - */ - readonly uri: Uri; - /** - * The type of notebook. Maps to {@linkcode NotebookDocument.notebookType NotebookDocuments's notebookType} - */ - readonly notebookType: string; - /** - * Constructs a new tab input for a notebook. - * @param uri The uri of the notebook. - * @param notebookType The type of notebook. Maps to {@linkcode NotebookDocument.notebookType NotebookDocuments's notebookType} - */ - constructor(uri: Uri, notebookType: string); - } - - /** - * The tabs represents two notebooks in a diff configuration. - */ - export class TabInputNotebookDiff { - /** - * The uri of the original notebook. - */ - readonly original: Uri; - /** - * The uri of the modified notebook. - */ - readonly modified: Uri; - /** - * The type of notebook. Maps to {@linkcode NotebookDocument.notebookType NotebookDocuments's notebookType} - */ - readonly notebookType: string; - /** - * Constructs a notebook diff tab input. - * @param original The uri of the original unmodified notebook. - * @param modified The uri of the modified notebook. - * @param notebookType The type of notebook. Maps to {@linkcode NotebookDocument.notebookType NotebookDocuments's notebookType} - */ - constructor(original: Uri, modified: Uri, notebookType: string); - } - - /** - * The tab represents a terminal in the editor area. - */ - export class TabInputTerminal { - /** - * Constructs a terminal tab input. - */ - constructor(); - } - - /** - * Represents a tab within a {@link TabGroup group of tabs}. - * Tabs are merely the graphical representation within the editor area. - * A backing editor is not a guarantee. - */ - export interface Tab { - - /** - * The text displayed on the tab. - */ - readonly label: string; - - /** - * The group which the tab belongs to. - */ - readonly group: TabGroup; - - /** - * Defines the structure of the tab i.e. text, notebook, custom, etc. - * Resource and other useful properties are defined on the tab kind. - */ - readonly input: TabInputText | TabInputTextDiff | TabInputCustom | TabInputWebview | TabInputNotebook | TabInputNotebookDiff | TabInputTerminal | unknown; - - /** - * Whether or not the tab is currently active. - * This is dictated by being the selected tab in the group. - */ - readonly isActive: boolean; - - /** - * Whether or not the dirty indicator is present on the tab. - */ - readonly isDirty: boolean; - - /** - * Whether or not the tab is pinned (pin icon is present). - */ - readonly isPinned: boolean; - - /** - * Whether or not the tab is in preview mode. - */ - readonly isPreview: boolean; - } - - /** - * An event describing change to tabs. - */ - export interface TabChangeEvent { - /** - * The tabs that have been opened. - */ - readonly opened: readonly Tab[]; - /** - * The tabs that have been closed. - */ - readonly closed: readonly Tab[]; - /** - * Tabs that have changed, e.g have changed - * their {@link Tab.isActive active} state. - */ - readonly changed: readonly Tab[]; - } - - /** - * An event describing changes to tab groups. - */ - export interface TabGroupChangeEvent { - /** - * Tab groups that have been opened. - */ - readonly opened: readonly TabGroup[]; - /** - * Tab groups that have been closed. - */ - readonly closed: readonly TabGroup[]; - /** - * Tab groups that have changed, e.g have changed - * their {@link TabGroup.isActive active} state. - */ - readonly changed: readonly TabGroup[]; - } - - /** - * Represents a group of tabs. A tab group itself consists of multiple tabs. - */ - export interface TabGroup { - /** - * Whether or not the group is currently active. - * - * *Note* that only one tab group is active at a time, but that multiple tab - * groups can have an {@link activeTab active tab}. - * - * @see {@link Tab.isActive} - */ - readonly isActive: boolean; - - /** - * The view column of the group. - */ - readonly viewColumn: ViewColumn; - - /** - * The active {@link Tab tab} in the group. This is the tab whose contents are currently - * being rendered. - * - * *Note* that there can be one active tab per group but there can only be one {@link TabGroups.activeTabGroup active group}. - */ - readonly activeTab: Tab | undefined; - - /** - * The list of tabs contained within the group. - * This can be empty if the group has no tabs open. - */ - readonly tabs: readonly Tab[]; - } - - /** - * Represents the main editor area which consists of multple groups which contain tabs. - */ - export interface TabGroups { - /** - * All the groups within the group container. - */ - readonly all: readonly TabGroup[]; - - /** - * The currently active group. - */ - readonly activeTabGroup: TabGroup; - - /** - * An {@link Event event} which fires when {@link TabGroup tab groups} have changed. - */ - readonly onDidChangeTabGroups: Event; - - /** - * An {@link Event event} which fires when {@link Tab tabs} have changed. - */ - readonly onDidChangeTabs: Event; - - /** - * Closes the tab. This makes the tab object invalid and the tab - * should no longer be used for further actions. - * Note: In the case of a dirty tab, a confirmation dialog will be shown which may be cancelled. If cancelled the tab is still valid - * - * @param tab The tab to close. - * @param preserveFocus When `true` focus will remain in its current position. If `false` it will jump to the next tab. - * @returns A promise that resolves to `true` when all tabs have been closed. - */ - close(tab: Tab | readonly Tab[], preserveFocus?: boolean): Thenable; - - /** - * Closes the tab group. This makes the tab group object invalid and the tab group - * should no longer be used for further actions. - * @param tabGroup The tab group to close. - * @param preserveFocus When `true` focus will remain in its current position. - * @returns A promise that resolves to `true` when all tab groups have been closed. - */ - close(tabGroup: TabGroup | readonly TabGroup[], preserveFocus?: boolean): Thenable; - } - - /** - * A special value wrapper denoting a value that is safe to not clean. - * This is to be used when you can guarantee no identifiable information is contained in the value and the cleaning is improperly redacting it. - */ - export class TelemetryTrustedValue { - readonly value: T; - - constructor(value: T); - } - - /** - * A telemetry logger which can be used by extensions to log usage and error telementry. - * - * A logger wraps around an {@link TelemetrySender sender} but it guarantees that - * - user settings to disable or tweak telemetry are respected, and that - * - potential sensitive data is removed - * - * It also enables an "echo UI" that prints whatever data is send and it allows the editor - * to forward unhandled errors to the respective extensions. - * - * To get an instance of a `TelemetryLogger`, use - * {@link env.createTelemetryLogger `createTelemetryLogger`}. - */ - export interface TelemetryLogger { - - /** - * An {@link Event} which fires when the enablement state of usage or error telemetry changes. - */ - readonly onDidChangeEnableStates: Event; - - /** - * Whether or not usage telemetry is enabled for this logger. - */ - readonly isUsageEnabled: boolean; - - /** - * Whether or not error telemetry is enabled for this logger. - */ - readonly isErrorsEnabled: boolean; - - /** - * Log a usage event. - * - * After completing cleaning, telemetry setting checks, and data mix-in calls `TelemetrySender.sendEventData` to log the event. - * Automatically supports echoing to extension telemetry output channel. - * @param eventName The event name to log - * @param data The data to log - */ - logUsage(eventName: string, data?: Record): void; - - /** - * Log an error event. - * - * After completing cleaning, telemetry setting checks, and data mix-in calls `TelemetrySender.sendEventData` to log the event. Differs from `logUsage` in that it will log the event if the telemetry setting is Error+. - * Automatically supports echoing to extension telemetry output channel. - * @param eventName The event name to log - * @param data The data to log - */ - logError(eventName: string, data?: Record): void; - - /** - * Log an error event. - * - * Calls `TelemetrySender.sendErrorData`. Does cleaning, telemetry checks, and data mix-in. - * Automatically supports echoing to extension telemetry output channel. - * Will also automatically log any exceptions thrown within the extension host process. - * @param error The error object which contains the stack trace cleaned of PII - * @param data Additional data to log alongside the stack trace - */ - logError(error: Error, data?: Record): void; - - /** - * Dispose this object and free resources. - */ - dispose(): void; - } - - /** - * The telemetry sender is the contract between a telemetry logger and some telemetry service. **Note** that extensions must NOT - * call the methods of their sender directly as the logger provides extra guards and cleaning. - * - * ```js - * const sender: vscode.TelemetrySender = {...}; - * const logger = vscode.env.createTelemetryLogger(sender); - * - * // GOOD - uses the logger - * logger.logUsage('myEvent', { myData: 'myValue' }); - * - * // BAD - uses the sender directly: no data cleansing, ignores user settings, no echoing to the telemetry output channel etc - * sender.logEvent('myEvent', { myData: 'myValue' }); - * ``` - */ - export interface TelemetrySender { - /** - * Function to send event data without a stacktrace. Used within a {@link TelemetryLogger} - * - * @param eventName The name of the event which you are logging - * @param data A serializable key value pair that is being logged - */ - sendEventData(eventName: string, data?: Record): void; - - /** - * Function to send an error. Used within a {@link TelemetryLogger} - * - * @param error The error being logged - * @param data Any additional data to be collected with the exception - */ - sendErrorData(error: Error, data?: Record): void; - - /** - * Optional flush function which will give this sender a chance to send any remaining events - * as its {@link TelemetryLogger} is being disposed - */ - flush?(): void | Thenable; - } - - /** - * Options for creating a {@link TelemetryLogger} - */ - export interface TelemetryLoggerOptions { - /** - * Whether or not you want to avoid having the built-in common properties such as os, extension name, etc injected into the data object. - * Defaults to `false` if not defined. - */ - readonly ignoreBuiltInCommonProperties?: boolean; - - /** - * Whether or not unhandled errors on the extension host caused by your extension should be logged to your sender. - * Defaults to `false` if not defined. - */ - readonly ignoreUnhandledErrors?: boolean; - - /** - * Any additional common properties which should be injected into the data object. - */ - readonly additionalCommonProperties?: Record; - } -} - -/** - * Thenable is a common denominator between ES6 promises, Q, jquery.Deferred, WinJS.Promise, - * and others. This API makes no assumption about what promise library is being used which - * enables reusing existing code without migrating to a specific promise implementation. Still, - * we recommend the use of native promises which are available in this editor. - */ -interface Thenable { - /** - * Attaches callbacks for the resolution and/or rejection of the Promise. - * @param onfulfilled The callback to execute when the Promise is resolved. - * @param onrejected The callback to execute when the Promise is rejected. - * @returns A Promise for the completion of which ever callback is executed. - */ - then(onfulfilled?: (value: T) => TResult | Thenable, onrejected?: (reason: any) => TResult | Thenable): Thenable; - then(onfulfilled?: (value: T) => TResult | Thenable, onrejected?: (reason: any) => void): Thenable; -} diff --git a/inline-completions/vscode.proposed.inlineCompletionsAdditions.d.ts b/inline-completions/vscode.proposed.inlineCompletionsAdditions.d.ts new file mode 100644 index 00000000..8db82579 --- /dev/null +++ b/inline-completions/vscode.proposed.inlineCompletionsAdditions.d.ts @@ -0,0 +1,37 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'vscode' { + + // https://github.com/microsoft/vscode/issues/124024 @hediet @alexdima + + export interface InlineCompletionItem { + /** + * If set to `true`, unopened closing brackets are removed and unclosed opening brackets are closed. + * Defaults to `false`. + */ + completeBracketPairs?: boolean; + } + + export interface InlineCompletionItemProvider { + // eslint-disable-next-line local/vscode-dts-provider-naming + handleDidShowCompletionItem?(completionItem: InlineCompletionItem): void; + + /** + * Is called when an inline completion item was accepted partially. + * @param acceptedLength The length of the substring of the inline completion that was accepted already. + */ + // eslint-disable-next-line local/vscode-dts-provider-naming + handleDidPartiallyAcceptCompletionItem?(completionItem: InlineCompletionItem, acceptedLength: number): void; + } + + // When finalizing `commands`, make sure to add a corresponding constructor parameter. + export interface InlineCompletionList { + /** + * A list of commands associated with the inline completions of this list. + */ + commands?: Command[]; + } +}