From 4f2c0e15af2c13d80eda69bfa86d91cc3cb63126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Fri, 11 Nov 2022 03:17:41 -0300 Subject: [PATCH] ecode: Added codicon to support completion symbols icons. Improved auto-complete plugin and several fixes. Implementing signature help. --- bin/assets/fonts/codicon.ttf | Bin 0 -> 72672 bytes bin/assets/fonts/nonicons.ttf | Bin 95440 -> 104056 bytes include/eepp/scene/event.hpp | 1 + include/eepp/ui/doc/textdocument.hpp | 4 + projects/linux/ecode/build.app.sh | 1 + projects/macos/ecode/build.app.sh | 1 + projects/mingw32/ecode/build.app.sh | 1 + src/eepp/ui/doc/textdocument.cpp | 8 + src/eepp/ui/uicodeeditor.cpp | 2 + src/tools/ecode/ecode.cpp | 24 +- .../autocomplete/autocompleteplugin.cpp | 380 +++++++++++++----- .../autocomplete/autocompleteplugin.hpp | 64 ++- .../plugins/formatter/formatterplugin.cpp | 6 +- .../plugins/formatter/formatterplugin.hpp | 6 +- .../ecode/plugins/linter/linterplugin.cpp | 7 +- .../ecode/plugins/linter/linterplugin.hpp | 8 +- .../ecode/plugins/lsp/lspclientplugin.cpp | 57 ++- .../ecode/plugins/lsp/lspclientplugin.hpp | 12 +- .../ecode/plugins/lsp/lspclientserver.cpp | 77 ++-- .../plugins/lsp/lspclientservermanager.cpp | 18 +- .../plugins/lsp/lspclientservermanager.hpp | 7 +- src/tools/ecode/plugins/lsp/lspprotocol.hpp | 64 +++ src/tools/ecode/plugins/pluginmanager.cpp | 55 ++- src/tools/ecode/plugins/pluginmanager.hpp | 31 +- 24 files changed, 619 insertions(+), 215 deletions(-) create mode 100644 bin/assets/fonts/codicon.ttf diff --git a/bin/assets/fonts/codicon.ttf b/bin/assets/fonts/codicon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..bab11139af89dcf8aed0b5e21cb9e33547cc4cb4 GIT binary patch literal 72672 zcmeFa37A{eeFu8Z)zw{fudeQubhT?{G?HdKn`hBT<7JEoo5f>{0b|VK0kheFfpJ1u zoCSiNga9FskO@iJKq#d)At|LPO@ouB*^{P_rfHg{X~NL7C6Y^N;-+aD;QjvhNaHc2 zeP8>%_rCYO*Rg&&($!tg`JZ$C`#ENuF=n#cSct7W^_+8Oy6!6PXN)&+blaKdjEvRK zJY@>s@5c8_F1vQuyxCa!cE+@WjHMpkz4w+Yo6hb#8S8xuV?R7;&lS5a-|@kR&cV6Q z0h4=hK)O)+b9_Dm^zOO#hMWIs?$wuZzoU#P5A41EvR!wqIC}+S-GhvUwp_dG=6UI> z9QWrboZofbu4}J&|Ihzu6XO!D=f9Z0{*5<`pL6ss#^p~j<_|E`o#RS+fA!T@U*W@a zWceR|G&q8z_x$LiuUs5m^RLVlSG=YC#BFpYmALk0KFo*kRbvtz#UI`KQT`_82jA$Z zfq#s>8hj6a$M==@iUpbC&rnHaB ze1PA}!ua+%_HDecXqWdgo1MW>wQvYWf6d?4D>q)wKHt3Ls1>v>%TGmriYFaEJ7^jG z{=fKN8vMU+47~d4>+AIEj{R@ny`E10OOyYl35|jOZ_XEpD3W<3u}GRjF3QgYa+`&| zhNC3Y2T?-$;jE$$XY?Vt23!?z6YD zKW0bSIzG?dz>@q!?0xK3zJe?4W%dd`!2XE+Ci?_`E8od(=hyM={0e>ZHCw~hLiad{t!F2*4QwMjm2F{XvaReawC_^1a5uY#UCXXx z*Ry%HkG+xIz~01eWH+&!*)428doz0rdmFor9boTd?_zhdyV%|AJ?tL#UUo0LkG-FL zfGw~OvIp3Q*oWC~u#d6_*+V$zW9(t}TkJ9RarQ~}1p5^G1NLe58TK@^yU(&OurIPN zu`jc)u&=VOv9GfqLI+%AKW6{PUSL0AP4*)DXZBO}Gj@#q8~b~X%4Z{Q|Bm%F@+ox>N{4Es5I2m3wtPdvoCSwDBU!D?)hox=C=`}ke_-TY4W+q}V7 zafw~QKgNHHKg@69H}hNge*R|u7Jeg(u`_st-OoSFE@Pi(-(-KvzQH!LS+1bdSGKDSwsb+H!n`1_#K{($`%dxrf5`*Y}>f62bfzQ?}L{)T;v zJ|fYRY>K5>ik-%OhaKYU!GTDV{r~%4gb3h$ zPmlo?2zZh}z_E7WGr)d?@=^i566IwAWQ8;@7hs1`ULn8>D6bUYZ$P6x<_!YinXLIH0dP;&yitIyLwS<`I4W!2ECAlhnzsnBBuZGK1n^tde6s*J zFKfcuB(Pgi((?em0_EETXcRW-Hvk-(HE$DOub_Op0Jt`5-Yx+C&6@Nb04Hb7g97Xm zDBmH#={fHd0H0^gcL^}M2hj!KM87))_;!?c32^Gey9M}VDBml<&qH~y0H?maPk>XO zP&)xmefxd^$P(7PUx58C$`1(ei%>2IK+>@02L;HMZ9X7CQng8R1W4L8KP*5}wMpXu zfNWw-NLK=+6l)SK0LUxW{HOpV7i&H!02#)b4+%h;vF67FAlF#)VF5@u*8D92$U4@1 zL;zBcHGf+G@{cti6@VmU&EFA#Ok~YN0+5cZN%H}KoMg?%1Ryb4^Wy@Lovit|0Hi2u zQvU&vr>yx&0Z3NXB-#Oxv8?%o0HiHz{+Rzb^n;%$lDPAWfzD2Lh1K ztof7xBsFXPp#WqyYkpb)(wjADoB@#Itoa!MNOabGS^%=0HIE2D%CqKY1t9NP^K$}_ z{H*!M0?+|i^Ya4G23Ye?1fUnN<`)FmNhrT409}DKza#*yfi=G@0R4eAzajulf;GP? z0G)z0zb*jnf;GP>06l{>|4aZH2Wvhf0NsN%pA}%2p!}8q^bywla{*{3todyL=qRlD z7Xr{$So1pq&|6sZF9o2%u;zCKpv$o4UkN~~Va@LeK)+$lzZQU|!63evF7sv(4koK?*yPtvF48j z*lj5PUH}>vYyN`(bS>8WM*(PEtoecf^e@)@i2$@L)@%wuCu7Z)0JJmKJSqS^jWz#C z02&)>z9<0QjWz#S09qVtz9ayBjy3;90Gb_Z{!{=u9&7$g0NNgF9ut7x$D02t01c2e ze=Y!BkTw5J09qky{z3ryA#47-05nC`{G|YU2<3kW1nv42J_FDrS@UH9Xq2q^iU4#= z)_hd}S|*ee0qC2o#RZ^wvX&$O9h9{~0?3xBLFR!wPFI$hgr)NfM(2E zo&a=Y)`|Yxx4urCBQ_0Iiy}(gM)0St}y|O`El{0?@fxD<=T$ zo3-)+(8F1)AOMY=wTc4J%~`8U09rb0bqhdWXRRIqXzr|45`YfRTD<}c{n{!EpsQG` zBEYHNssfz)r%!-W|MUxR>W38qocduvfD>H@1vt@cNPrW~h6Om$Y(#()%~lGK2e~yW zz==*{0-WeHF2IRS69Sy*R1@Gtr%3@$?XC-OYIj3`Q@f`GIJJ9~0H=1Z7U0zGH3FR4 zy;guzyQc*>wRN2U`7l~13BZ@lTI&TkwQoj%Q=3i};MArK0-V~kQGipMP7&bLrc(tt zwdphgPHj3}fKwee32>_8tN^DvZWiEF$1?;t)p3ger+RG_;PlM11mJ;Yt+NFD-G2I32r0fYY&E0-TOrD!{3{On_gGvJJi)pRW+$SE0O8fM0`>egpUoDE9~;n!s9g z9>Cv*@@fHoD@wWs;J2aND?pKu*0losc9ho%@PjC?7vS$eIWNH9iE^I+e;3L(2=F^l zzEOZ8IW4La!0$mxbprT%QQjzk7zAtGB*5Q~@@4^kKgwGK_yU(Gh^RfVCC` z;5T3`qA9?hLP<0Q;7eew4+)T0to305icz&bA^=YVYZ2W6_O~dB?f_R&65Rnlg_7tF z@as`NBmmz8Ykf?BJ&y8W0lpFCZwc@XC?65vCd%Iy;OC-zRDioEe@B3Kp*$qO&Ov!t z0A3H)dQ1TR57zp)06ZbAMb8G{6Jf1S2*5kSTAvhP|Ag{)1$YSM69Vv^uoj&Muzr+J z3UCMI?+d`Q!djmafRBZ>{y+fU7SjL~OD8C^9{}F5bsQ^4lto2O+iaECaOaR^`)_O*O z(fEB<03IjS`j!BEPptLl0*u=9Z2|bBSnDqY;F)5r?+Cz0#ae$U0B;p*eOCZ}E7tle z0eG-j>w5z5WwF*@3&5+zTHhCde~Y#LMgX2J*7|_}d|s?Ya{yqwQ2tN=elXVhkpMhm zto57#d}FM&C;%@RYdtRje;I52odBb8^kV_|&{*s51>j9%t$z?;T`2!ifRxzQ3j)kT z`4a(n-B_zBKr!VOod>`Z$67}P;FDvme-eOqjq`>)!+z_46+T;0t7}e-}Vxnzeo@ z0RJFs{f7WNg{<`}0g7w4UKW7&khNYBpeT5Y+6=&>NUos(@GY{VTmW81b`*1i0DmJp z8WMo#ksXx<;DcmG!vgR|vZHt&0e(q#6wf2TL&=Wfc?9?>*-?5P0IwxGY6!r8$&Q)= z@MN;15dn4xr6oY#&EW5T)a(U#s>k?V8pY*8oHR*@auR>cw zheF?xSIGCu&xMEa@1pQ0!{1P@RtxH!`huot*J;n`4;Y(`_ZgotzG=qIirFwXnHQNi zns=D@n@^fQj6@>ykw+t+i9Bx^*3H&q)-UWad$awp{j2DP=$`2P(a$(3=WOQ==kZu3 zc600tv43zKH|O5tKJRVz9*^7c4e>qk+v4}eABsO7|9t$J_)in_i8~XIBz~H_G3_}tWh$3CDRo2YooOXKnZ79fSo&+}7c+KdEVCsupLsa*Oy;F* zD!U=OH~UETSGl+4p2&S8FXb=EKU|0x<_m`kzbsx_e609V*UGMiu1|OUL)S05VE8{;L|J6i%VsPThiH9eS z)h22?YM-fnyY}Mb!O7p4JTm!W{p|XD{R{OM8@a}%jXN5L8lP_*opPsUrXHR;vdUex zX4TEBo>=wL>fY7cS07ycxz#^d)3xTbHP5Wo*51DMo6}EBzpyT|?zVN0to!Ln+fI7? zq@S)oW&P)7+?mT~_Rl;v^U}$EC!ciko|Er5`GpO+4UcY=H(t5%fsHSm5-EivJr$tVC!)XhrJE!kB{cD?sH|^i_?O8TEIeYKy(aoo9zHamTHb1rbyPJP` z#`ZJrJ>y$v{CvxbEthZkauTMUbuYz3j2!FuGn$Ko-1y?;*Kj`xU%ocJy$+?y!yLW|NNS**UVq@$!os9cVh3^*Cwxh=XHJ8J#^iVukXTa!aSyk zCG4IUd~_4!8!Ar>^B$Wg;>jXUj;%vjNA0QBr{(dn0{4@?Qmsr(OJfBoZgW+s4s(Cy zS_FiumFi?2|EiP2QjaYq;^Jf#Cnbh?ZDN|^@=M*K9Wtvt?XsU&y(g($#QCRy8MX zXX1tt&)9}%YqBh>dMe7@m6_f(rP7+-%t~T9!~+>(Vi|Z-`#_^4+BH#~=JnwaK2=K7 z638Q|pc@)KHqAl95`t*)o@6N9!?}|$6+B5dLaA~hR!l{n^sC8ab-3#LRsYM$a!NAv zP&pGTxICJRg%UmSNUE6eaYArb5|0j^uj2XOlI27xQL2?{(D_UtUrZ{y1Ls8eS?cOQ=A#lo;pEF{ng^LM=JC4Jgqm32X*~H zqcKvc99~%12a(x%z6(7f%2?f3t2MlhSL=R4t=1cTR-<9{9TCL=6xNj8*Jn@R1BeB= zfg7mMe|6NTMAzf_xV}`ai?JqXR>g?w8RlZBT+!!M?1t5NqBuT1UMS$L=%ok82GhaY z{e63{u2}VYv^ZXDpHNJ)fyX+;w~$qaV{xoohe$$@YDhctjS@#iXe(J^6T> z&Rny`8vMym2H)N;-8B{tc!M{#%Qns0v@KIF)~P?aEQotXhbT0qj`JjyW@Q;uF;Vqv zel-#03BShE>#tmOh|g`$lwWwLRxZz4_wuQ7rh7KFt1~}(z)!NUhbM70IJsKtQKDQa zNUQnS=eW&Fvy!3iPz-6aB!%^GJ#0vkMp)S) z>tX2{N!mLVUm?l-yp58yd7~t6=3J7b!Nst~)$n3i*Fvh&JpdN0Ykcd(TX`tN6?GBk zEb@?q#vSKndBl2Z6kn;2SE{A@_(Z(~W|r_LL1Rqo1UMRMU7sW#oB$UYmL?&o#_Cli z5wH7`wTVipr!i-0v-zy#^;Wp9b8p@~UE*Qw4Xz)}CCv1Sp)TEx$9y+>rjgoWcBfoV zGp2O?v@K_bWQosu?(98bU6UC6b^UJY6Tx>3&^0Q! zZ~1r)iJX(wpyDO9K8{X3&7Jo)$)<6{Fz=8mz1LOqx95l76Fkd^#qO22oO$Z(6x8R= zeUX!aXxJ!Q1xhHTM7+pL^~ts1n36v}S+7(pwv^}bDEG(X$+1bW`)Z}8;+ds*vOYFB zQRz|Q$z!^qsehpAmS2p9!m6UiD|tsXwV7lwIis78ivfE883IPbRyqXfheKx|7LkO-(Zo(&@ti4M_h-G#Gx^1jg1dVrmVFdwGi5 zqqZy9u5}R|4lSdk9LY+hN>G;-;#5R>f|f&b9F;f)ctNm zR9rb*iJE2pCPg)^+wZqNppJ_s@RVkR!ij>@AB*L^WU@cro3*6-LfmuXo@hdBvw|l4 zt*RQI)}<${;-Qk0JfwFlCPlpcJmL0aQ@tv;?2!vLyyual$+z9mZB*{wz*>TX@X z%(0!z^t)wc=lS;jIaRVQSeO!jM;hXftD#6FWISy+j`8%TL!ra=M?%uatcpA3HoS)G zd7dlyGdl)epi#`;BR#ARZ9oNEuZ=ek8L>0YhE64t3cJ|wC9ztz9 z6>-(Kf^MTFsMP2zTT%-ll*FMECFn}k(Mq*esn;gN2fPn(5E**uDELAJ@Ac7Xoa}>3 z_AH&VmQUiU>gcdE0Br$0Gq|N+N|OFsfT9A1xld9IRhFQ3hl9dUBuRHH@Mz-Vawr^D zIL9fHgae_F<>=D=lB9&8QXfAQoDtlFNBvmNQc^udulty+8A@7-m{7JgGlGwXCcBEI zX)4z=hwcFZ5OTwKw&G~?XJMY>5U0oD2v_NlclJdJW#+H=r? z^_YeKtsikq8{WkT}Za8M=AjK zVUpEo0!&L4s5Q2f^b>JEL0SPxO=W3b#5*$Z_L-y=dgGvfiD*BL-l&yw zu=tMY-Xi|MbryAfab{t`s}Mbf?vesMN8z(Oo%l7W40&FnaZF`mHHWySAq^v!G(_lM z;4rvt4SFH$fKrXfl!swOlR)YjmO#YXH@k+qoT6FadZmxc7SxN96e;!;BfQrv+u{By zH$ax+wSJeM*R5nWpG!ux@0rQ2uB1tqWwH?`o1n|M?L=){RpH636Uk=iGSl&W$8>ly z?N@WrXs+s~lbqTUqqo3jk3t{!gArPSMlyh`pz$DscO7zYPKB@gOp+PUBLk4NEbL@7 zD-aeWAjl-Cw@dm?f&*4{aQwC3Y1DHk=Ph_SBDPD!J_3;t{8ilJf0fQbl;zH6uF?qx zbeXDZ5XgciGE1XFT768 zCPTgzHVrkTghQItZoc#yw>tY>b>YJ?EYGRw(abS&<o^=z zG+mX$Av2^Jrh&(z8h92C%V8}9VQ0$f-<{{pO`o@n-WqbYZXevjj|chL1COt#vgU7Y+9;aEaa?A zOe5V+@OBB>BiXjSl*d;uL9oF1^D$OSpq5{%jVdKr3lr=3M5#xuf!45m1J5NXmXCVT zwNbYobCS?dIQO55nNXg4iU~IwjrYbb{IUU;#Ryp-B!l3H`6ie0{RRZ1a*cd=TE54VEokLg|i|%%pH;I&yJjT9^y6a zbN(ctQ^!Xrer%t)bk4K56Yc}Oh`cVJ4Q}w-bB@7(L+8N12#-tqS8?jneO^XxG5n$R zwvt8df5*A8b33nv&IcU9HG#hbwL6AcjJOmzR>&LLIN~iV96NI4@IvRl(7YFDro+!# zRaoE+my5401w)5&o@&7tjhxo{{H&Ur>W_!tfwF^KAAN5n@@j~U@`dmIU$H1pc` zRbbJR8&&Sy)s1zJ8nUj(3eoP~?m{Z2i_bhQ8>8K^-tK52IFu^j=ioEd`M7Us1?8rC zl^%7JZar#q@Gzf@1Trol{3l^ZEPMGUKE6|{Pelt++e$~FyN5KmTk^#meG5Uu32CZn zL@fK9*VeFC)SOE&2()P0$`|ci(uk7wk8gIgXxmoAFjXz|$=5ca-L&QMF#;PDQBqGh zVTGSr1w#%5W@3DzQiWNHUI@JY2q~1-Y__Zi(=)4kpSMNH(?P5ucsmd;I}axGT)n&V zq0`StkjseKTaPPXFIJTnYcSFOB#f&X-5qc{5g?~$+{Su;FQmUHzm+YjIkg9Aw0~eNDqeC zShBhhFU8}fK6=}j@5|#gI@|t^gR^lulJ62L!GzwV!lSSjxfp?dbX+eg@W5j4QNV#n z`UNZ(95?XdkgrWqONf6!d7|eA?hsK-kaZ;L6NDb18yy~yT?1~IVzN;#YbMGHkc6fX zUKx%VhxZvV(~KDn=(jP$xCNE~3bL1>SvAE4$!KG7Pfm?+Z$~WX30+;$LcuD0l`F6Ol0fYAB>d3% z?SMDy&FJnFI7LTZB%zZfVVMk)N1{$-f&vZ&lT>P=8*rdXB>j=tmQfy^`b?vx?$`!*R<{%#^L`c1Dk=W;SNqdS#$^amq_seTZZ6u90pp zSx9mxnhZO(4Q)7heC2ZsT6NaU3rCX_4RdlCF(jx>j6Yv13%1(wI$BD zthRM{ZK<-I?gr^aZOi3fU*C}t)Hf=ds-Fw$8!D#V|Fpu~YS-8qa1kdBYMeYRedQG? zMCO+GJL;UE^%9*r!w^_b#fL&P=HKh798mKF!o3kw^fi=i%hx#O zrGm9CBwsNk5kNus3?mcTb-lV{bQEF6`|PnXyYcDRTL9lMaDF{kn0DaLVlKhw}j!BmBfcd|VzzC4MPUYH%=6?Z|!}FG}$9qAJAU0=|b2)mbm; zplXYT_e@T|u|%I2bbWT_U|vt|@UjVYguZW^J*dz0C^=)NftNQst4EOp)}g%$N|it# zJP2M-JjqWW8V6=7D&QY?Uc$+t8H>Y4pK40sNoPcVX36=;RpT~Y*|T7D_l0z063;!n zf0^&___Ivv=T7Xr9(V-cJq8CCQS%XJ@>bp5ul5o!P_gl`Nx znhc?j2Lqq<$&^Khm<_58=RCOTv_$;~+mL!LNs>Rvxewx3Y7hI^tpCz7giaiy0X z3T~1c&bkpvw(O4P6Vf(iH&^PigRLqF#HB(fAc@TlYU}8HK1w z82U%I0k#;PF$I(|iAMO|mnm$d9QC>yl#3!Az%VO(_eQ;IrNp z8{kkn+?ZQ9;<~qZi{8n1fk`!<{+WBkd)8gnHt2!WHu84`77WxFc&o^d7Y`zkaCuh9 zb;DKiOD&RbaZxqRlPZ;GT(>;8U}^{G7~bZ+w(NdZ*hA$1nwy_rfRY2t46{SWnvDoF zs6Nnf73J`G5NHzRRv`XLekP1+d@aDjRgp0hq+F;;^g67Fx{7hFLIT47f$#>8`zpMx z{^{BEt9#}AXXBlQJ<>Havf@swUyny5I{}f{9g@v3SJeUAwA`re z4afbkTj-72si}cTht~!18xML?4I@Pig9PSm+W`v3M-~o3T7fM`HkS`6FTRcNTC$$3 z9}7}M;DL~9r`6zr*_rSh53d!XxP)^r>aK939_OXLzEaalMj}Z|dQ^@1eoTF|5SDGj zf-gn33|kI=DHM*-mq<8tcbwDOo3_$jEX3Vxylnq2~;D1jKIUnj3E zDPWV}&^0*f>s2t9(!?Y=%wdUQn5ke&zM6oC(_LvfW+g+O$7Mv~)MP5D zCajdqJuj4;jW`WwOiDzf2|l|b>fN*Q)Kjl|?{6P)qVagtv62$5(sf*Bn5KcNbc4H| zl(d{k#F@o4JQ2i zH~WfrVEJ3G60+&C9#H=7|0|_+abyAwf{m*P49Na#*YE_}I zD!+)U$MM(ZZ{mE6Fgo$?2k68FoPmB6_glpMu=N-2hZzE1yf9ljr8IY7@7nhD;&(`r z(!%V*;@g+5Tk{)rk`im;8udAMG!;-|S|0PYd!T5b9Z znoNU*f}Ki}fnb2@w?tGTEwTxHUvz??bS&wW(Fzf#%Yj!XptEg2p8s}m>N*rP=$Eil zCP*JiR7z`6NdyGQE2rWG;}5;6kRA?)65J!zI;maY9CQXbEWk5h`j1bj;3uU7ESbq2 z((hp#5xg!^FL_)y-dRFOI5%WWoENha#0p-|K&*hlB$Sw=Hzb2^0z-&m=MmiE_oOJY ziypsFx`^*Cky~uo7+>vJ7|AX-j#B!lI^sjS#~WSbGq<%qio8uAGENC-It z@KSmhs6j4T4cgqS=S@eW2a;Do7XGDrMBV9Vn;&Rj6J2%<2(fg{NG^9#GI_9jC$9Nx z^9UTf=FGwNHN>xU*i((bN808)V6G6oHe&4vhXu(Q2o1<%1(`A-5RMFla&1m9oCF;6 z@QXWuq?ib!Xa@4o4NZ~NTvEceB+{!LE^|rPQiJn?3slQ=VAY!NrsE>hR161UFofbe zyeJ0!A_hyNPX0XfBt|2quS$+|xbY_G19C$kzsNla$2Pi~93l|ROQK^P2{sDp(QsB? z4TaNYM%CkSQ_G)~*JaHQDefv4**VB3l9gS#NVb%V$rnv#%(pY1Kja2bDit*k$ed-^I9Si)6$W2Skbk7Mpn(J7Nc7PLtE$~ z8MKu29`frXXl(&xT!JET#5nSNyjB*;s)_o(Lzsm-4;^~tm-ZD`*xsgn@KnHmgB)7# z6Y9y)4ceP78^!c%&;9Q$`HS24+Lq5B%)wuLiXS!O_Tw`dgq-I7&qnB?&pv$q$@h4(@uKFss-ITNV}qU*_s0wm ziOhwMq1#s{he)`z=QHXhW3*9hU?^y*l+!3Ws))JL{`%Mu~NI>G87WSSzYYrLdx`M-_jcOGcsQ?$Zqq0n8)Go;%#8I86jTgh3qj^KAHzJeXjh4Pn+ief@ilb#=gO*DBxCfAjraR2Hf&7h?DZwP zRxd3ShOKPQOm$mE*GQ&!wV%lK%-XqhGK$7^c;PF{<|O8E6(p_JioEvne=#Q=T%&qT$+!lN5kx^vFTY<{9k;&~}m9qu=4TiiD}{SWu^$h0rLM0mrk;F~454p4*_l_^-wIOMLdN3h zv~snMd|L7klNh94Lnf?>CAS}?Jm4CX5R!04;#p+p!lSGr zAGIJMr?xgRaAC#jt6G)d{RXGk>WT2dVcc=R>gRTErPt>Dkrg}|=EH+#38uJ{@5#rm zIX_d*?EeVY?KJWy($Tw+QW5FvquccNS@%Y88(t{dZZXXVBK=a-bseb>w@DXVyDP_W zpGYi^Jjhri;$<>poM&?Bq3&3$dnlc6(}?oU;v!oQ#=>OBwFAjdE~cfi;?Kt5>pNHE zH(a9+_fZaZ!5;BEL~FuGj59vr-3PA-4&QQ1(L(&TEh96~rO3mFfmjxaLAWUfPS77d z)Ld?^)eq}0K*nLCoy_ySXDjq= z*}cfuLG^%7^@MvNXS!5d$_82}&sUbJQYr7NEY+oRJ$XIb^o3?fX~i_C*ZYFYWrn#j*5!K}Ry` zI!|9LH|FMu2tizE@nB9v0k*sM#4gB(3Rt1(|7hk&!XG zKllh|C!q8gG$mK7cTOk>RqB664|7$npeo zxNqOS{g}Ut!4!CT_s#>zU@)GcK!BKo&x6;PXf-Gy6k5T_Nk3UyXrzi^JU01wG8yZ< zdXHO{o*2g0cYeY-$>V|4xES?qx+IZ@oq#uN0)0hlG#p&y3_@xZG_z^gNA<}n0$BJ* zu^>w6ft+YdmTLWD$$qC&h*pv-tMP&pQlk}jpu3VzOR;Fa;#Hzues_;kk%z3I&Wl!< zIsNs4s_V;o((G9=oET0=BFFS%PuXAL#Q_uKDDualLQluFybsrPS`2C)a{3@ zTu)b0iD+{?9o$LWR5M?5oAy`OOI3R6O4|%6s>Ti52)sZW8C&Q6!Pj>;4 zTA@dGbb>_N!$D#WvhKf#7*#O+Ul#&B;8y15z`afk8+BwVtay#A&%m~>A}T_L$-fR- zC!cH$eiq@C!$a1FldU1IaR7ZI>={~+Xr6)K7xAU7Z^VCNGGHp=Yt!4VG*Zo!XYh%FO8LSVDrNiYb6J_)HRbTBMeqI5{|h{6rc z5qe!n<6%*gTDvEbggtF0vW09s;&i3M2GZs9q>(a`NaKU)T-CHF79%Jy%TOvxrp!HBC9}N7LFANlT=IA% zAY236tWzVo(KvWyM&Hz9_4ix7^wzUfgW0LY1%2k8lGTrY8*F-qUW&XjCU_M1Qp0zoN5HoTVuA6?2A;lMsrzjcs&Lg zUg$xpBhkc0Ez{8T`{1*xBW`ed$Eu~IwxGJG6D=l$f&lWM1L3g3`xxwgazTzw_z-9~ zHa-STViL+VcpIGn={?S6syBQGGu~|D%Q{vW8~TwW3yKv_AW1cB%;>xjk6UnpnTB?T zYjwxnzeeqM&rv(%sdfwWId^BnoANZIX~ZgeB*z;_12?0{tWQpvlq#|m(<9ri8*%i& z5`azz9$9SbdBTbbzCo*iRgmzh{t#*~%J2d2l$ULsqiNSrO%a}^kA}Bf(>CnWHmugP zeS5t1N3PM3FMw5mHuQIBN{5ZGjaYlwZbYL~$e(P??nI3Ozj?4W$$;M>hnUPV%LLwv zI@u(c;q{;*Feo8j$scG!xc0W}x!w_hB~V59s;f8@kTm5Mi?;=GWBVOaAJK_ub_Hl?cgYMebf_g%gWU_ z6NY0c0S<)gKnyI#(&5RQMI2DqJwx{@o(pMx9B*_Q(U1pScTR}~WUf4YqoZycG0^!V zi4jKi#YI<`@uqC@o5+&Pd9`e5{x@=A&?Z5s$v!J&e=JxcAdXx&-q=)^=uWK z3XZ$ZS!B@>A%nB$D|1L`5LZBbI3KB|ZGX>ypzTAnhZI7Hq{f1qK$xk+$oPOLqcs9S zK`urWU!W;M(DACTkcOaAdRC=sBjAeymtv_g93rFmv4V>~jx7*OSGJLd9x}{$F@{`q zSvMS{<{L;Rw~AR^kz?fI*2}9M#Ih_yj<|?~Y6|q*h#r?>I?N+oM%I=QR&t(g=JaS1 z&QnXXZ8=qrtGLFB+L~cTBXEEuPc5q&TITLiCJSE1fq%)IKgbHq0^ZTru@GmHM#G0SCZc^-h`|O*RuC+VY zk}VRf(+>)duDKEW%ml^9tbO~en_r;oZ*J56Ma<{mnRW5Vzz8g<&uyBGoMoQ%TW4&J zoMWE->ZVQRS!X@7d9!);*~Evix5seXpVQ`xeu9EH#DK=(TZ6lWc;pf%I@c z=8cYW?j@3ZJuG6?Tw+GcgME#mXf+k-I%aHxY6fnE6k|-r$$%%#ERXx0y*e`C*)SUg zUn2hvaY)KTB;5_X0JA=*T;g?g!{jFhK(Pl@%e@KHb`EPbm(>Yjb#U>rTZtVr)_bUj zd%PO8`T6;))T>Fi7W23q_>L$C63>N+LuN4q15_2FNP=ns_Z}VzA(4AVAJY@Y-k36{ zds`iK_qmF5s_uREGsTUHb8SUA7#W6R$av<${55QZqFOlE&tMYv)uI+PvC0VxRHbk{4*zEeyex#B zXULEF(1J(j(^@`UNeh+mhjlVo?1ZIKVIwR_!P0}JIgx>$nna6Nk{zCBH)VCG`- zVuJ_p>%bPo^bJPjTg>oZv0JnI^>NXau?xIHBWK_~^gIMf@BHvd_K%!-l+37Tw>@q!T?xKfuE z=)cF!RVumQO&7`Jd~kDU#i|vd&7yd-$U4Uq40zKk`2Qtn{I0<0Jr^zQs6h%=Wm2lp zcwi|}loUbI@oI7!F*R~F1i~a(VT%rhYkh#c@X(r7SfWv6C5V)xyHeyBPnEo!9S@s+ zRM%ZClyIC#O+zpi>$a_s`Ze2#gmf*Fiz{YC(_?0dvSV$!2$YPdSOgV|gjA;yq}kdj zp7ZvE;>ZLJX^4!)GNIj(*hj*W9f##*InJ9yMx@)0mQ_irT2y%x(liDQZ=?EIYqm3mC z$hJb8tMF%0GC5SpAkPX(0?NNrWw1)Sup%VOmLsb!5<+}49Jj&LQRK2wuDd2=WL(bo zrVeRFrzKchMh(Ksx#)YswrwhMBxdU&`6EOvOO`_`aC_f2bXS!fP%m_`6xOm?P!V)S zg4R&NM0!aglr4|R(GIn5H=;z$SloJZSPtnnz9^;zeHlC%|8pGKOx@5fra+BzX|KRK z6a;7xw5BdtQAg?B2!RFRFf3#Qoe(C%LKLZ*q(CPUBZw@WWJwwt<30sIDgSH|e38U# zAl0tYEGz`H9My95Xh4tl2yrbniQ_@ru_SR&bu9e9D8UfGNU^D<7$>UXnkohm)!&Kd zi&nAADi*D-qV=taBF%vXq-^Xxr3%6X!zFmqgQ^x#K(V7A4QsYzsd6M3Gqz`^I%DSK zcc^iPhDp?vzE`xnx@>WG8Z$y>Qr=}Ab7m5BLLNt(O2XAhgP=pC$)rj&B0KywM1nWs zggFBxjl?dPCiKljiOAy_Sj?BoFC&hZ=b(*d#X=k-{WZjKkIx)C6-H)Q;Gqr3Av+O_ z6I>DulYkmL7mtD%2`mmpw#IT|jO3Q4j02zemqjQ;*wk6Hy9>4y?Ip4aI_O1cyGSsk za3ReR>S!b#BDhAnX$>Ps?D90$o*WV;M<+PBB!?s^PG8~NiutMX3IERg0 z2ry1Copr8R-^y0Ac#TA2F+UbVc7nO|`kaC(fq}KG{VJAif=m*hdy{NO1Evr)4uB&? zWEG=NdoYfh<#Hp~UJ$Q4FjsNE(~zQxBH$hLe<}qwRWw-Bj5MNpV4}mfKym?w61p=X ztf^pk3#g2g0ZOSR*fs*IfmV}Cx8WUj!wtJ!o;rM>?3M9CT7(Cl*}%Ar=sKzqC(gGI z7S$memdq5^>EpCYW!C!;PDAB9R1{|{*GFQ(s+Zy8)=>qj6>0^qF)@_#T}jA+CeveW#zK6& z!%K+gQf?ouKS0C@`gfpp`w7xAXbCBHOd~Cr90Y0|>u<>cR2!dKX`LdXk9)E!uCj{J z=wxglHZWP5*;^bpCf8-k!}~naeJwA-SQ?EGMAXeEu}a&Ou~&mBVTG}-C5(J5iaf2T5gmc=PR>A}YBF|&pdD2dY&JzJ z=`HNMBHNY{OAX}WnFNl8EQAiBLWU7#WIW&jL(s`6asvh!Y`8dvJujAM0u>oMVvSPj z2+<_i9||NHt<(d>3VwT{ia!dSN%TRmA5e0f80avk4HYxPg>cw5;b#tou#h~YlgetM z#O@PZD>z9<)n!CnENt$A4HiMYFn5yCBG&SU3nS_NjkMWgf7hxNhAgLXi!c^{V>2eM zU_lk_0DzR}h$dTJ)sJ~`82jOHBqVV!&SQSnwd9a(^vkj_u&RigAL|Ao!*ajj3Bha0Ylz~_W22KHs z->`!db_aoyK^t7+9HK(7UuEA$+Vw^bTfT$c4bV~8$qXvIu6A{S20FGOz&iH$(u$p~{vlQ4APxWJD*Kj;~~_33)A;SJ{7TVV$Gf90i6sH9pl#0#cA=~eJn zz%syUd0nPbM=wBuvytYf^AI*eK%5NwgMgB_y@Y*0usdcFT{F09dMuY4n_e{-xOoF* zGtjLfu(S)%8%E*jU5{M-Gsur~!fIFqZ>pdJ*;geR5#!h;XmSE;?J@80nUY(OusB(# zBMQK zHS0khrmR^Ksrcz`=Pk%xX^+_q*7^o{M`f%nrGGpv){%1M2wWBz+nu;U6yABtjmbk7 zrpQ5%6CBt!lsy<2edMPj-!>V5!Dr!~$38oyTAyQfb(ztZp3&j|tmM7MYs$r#S&S4T zQSU1s*R+pou@8MH{|-%ihaP*=o8Eefrd^`J<_91S&M9Kyg? zdHQAKp6s%U8|+!Tc!^c98m|8Gu}|+RZm?#HyDD&vb>f(r;69x_4B-0d+z+ZI`Ew|f zia?)(+hQH?0jL<2iue%R7+Edl3jQ_9%VHkL?Zyj^UPr<%33fL45b7f^~v= z1=}Ys^Ec)jKjH6z69ewD`9r(}kwD;p{p8)wR9swy*`>IvACYcvFlRE_>dY_4KI$Qv4X|&kgek=*I%z_ zj;AAzwQE;65&=`jCTW@$($Z-vA-WY4sm$nKA+z$x3n?HLNEQo)p&?n&H53}{B;~4< z)DMpwj=t<#5!YL@zJVvq^n0gm8kR<9PjQ`SV`h55hEsK;KQ-lNa&mWW2%NGfpO`*l zjoaO$=POEf(3(7T7R*FEH;(_aCkFp2^WY%~7@JrEi+N0bA{tGIto-IpmWOVwpsQW` zrVUh7+>Q@3w{Jk30^cJ>|MM8VWRa~DGmjK{+zz`URYCbW zWo(jqMqA7w!3bg%al=5-pg7Mh(dek-j9v{Vql_(fun`Q&$KhxWUbL<*#o!_T$dP^X zqoeaHSB_%S8a>!!2sYFFu)})|c+u1=!JFDPG5H945yM;!U&_f;o3?)pO@?O(^Cp-& zXfHfgfxis?6hG(zT0vUHwiZf|wT*;F3JcQgeQ=frq@k}GaYnG809MYC*-ofKkxAXf>eB>v<$>L%n&DlI>!kilXxPBM zJ-Usdq>m%IblgWwadi*l9Cfe5T??fnObe#wWYtYX~G0LK5V%Mx7tEm7jAjqZ&O^09ywTE=zpyIH(gH3)( z79pJ}nsOrvuf8T5FT^A(QyJ)TyCbfNeH}-~6X{H-n2A-~VhVpe9fJIvJ}Hw*OEwaj zh6Z~x=FjAK6v}+UjlpEDtsb+XaNqCJl9skiuYxyFW?YT(gf`3UPzKLv14i7hx(%?UB*<57k^TnKvE21Ulpuuq+LqkiNkiYJ-7r#wG+SpXBUfg!=~ew^ul1+t-4CI zd!1f#W6>eSMf#|#6k_xnzE$0@6a3~ln}w}^>j@Vm=vGQ3IQ@(`-N*^MS=vxHR~|cUIx_ePajd_;H|Izmb`I?=b@}Rmy7pG#w*NvpyhiQyig69x zxf1W4(5pS}$!oPT9a3>90hX1cw&Y^2n>K`Zqg_{;$5zk>fp$;3%+P-FYTLO!i7wjc zboY`oC9p-=a~Mb9l2CE#K~fH^MzVo0;na%Ib_@Klbdh93N+?PNN_hnT--KalN=1?N zA?#2Fe}4R3j*j#oq&+E-#JfCQA^HnGOfjG=G;c&Nz>7w(FBm2YNhX9$Lq(|5$TuT) z4EH3>BP_O}gmQn}|Iz#PtR7LeMtE2XD=-IX<>yvJJG1YRe!5qN??aG+Dj9>Hc_H+FX~45Z>P}zZ3tZwb|h`{ zGYSJcP9MOuk=jAN8@xtgqm$+BkHUU}=n|`$P*t$|X>6v5%!Nr}yl}?S)l;hp_O!=?%j zj(tjXnBPZeqf%^I_Mcv-Vy1}wO;5P4GauPwpf~L;K)in08cMP5B2IhpiA{6vmJJ;- zqp%Xyq?m}RwUcK1L&!Tvv|J8Z(d}Z^wUcW*bDq}vS2&IbZJhG<;#OE z!d$7YSh9e@Iak*6x*x-0HEfT9>Y3PsCS=(>748~H<}0!r%286yfV$JN-IA~0Y5TFR zlpYHA`q;zi;zC}}>0U^lL8HMIW#prUgq|JPt|RbvlRkVB{eP%sQh*`6F?whO1#6md zgfc4Osv56DP?DQ!=@+b7t5nAo__DBu1~aeZiv!#(U|YpGuYk#tf~6>F#Z_gktR7bJ zzN)CQr5PpLbdnWp$r5c@E6aP<`oy!fw&dOQdP&EXyy0y6 zoL0KEckS`6SGOA9_y4L20EeT|_&)c!&o#mB%J0<+|M!o-zu8hxc$vbhyDr-KXy09s z532d0%!3bR6334pJ@Mf9xZPfKTzC9I$2x4^4ezjJXV|VM+L!NI%TRs(@^$kn8ouE> zR>%#Y8hqX(6|_}Od)7l-w5)@qEzjXil+h5wg zo*VpiH@qG%o1KU*qWuo;BA{T$eYd5kpzY;eKbBF@VOTX7>I`pToW)BK7O^g+UkX5} zCsEJ~qjMYnMtqaSd{}!HiEjKA3sPYyRugibgHkGys-ars7aCMf} z@JL>ggX?*T{`d~%PI%YCa&J?z^hdaUzi6!N=zEIu+ne`%sj_zT*UrArJrh>*d8zZu zl(juBpW&XcZ(s7gUb-y6$zEw$JKk$^yDVz=irT?%_S-jaZtH%;&ukmx=#H_cIrgCU z%^f{5A>p`$+mHoH9Ncm^CIlPG6rVTXPKdqL5*M%noBlQ8T&Ibw5*&;>%G_B_=_oo0 z0f#TKOzbFgTB|oKFSk2hP2C%-riPE@j{jGTfX&9yU5j6MU5SGO+G&wR$B#rLx>IZ*xBXBOqovs@g7;P~ zb>`Yl0^eIBv2Hs}wj(zc%Xo!Usa`Upn|@TvnOv@%>Fms$iZthT!z?9K+U`IsO?GBW zo}Es{i}g~@h1t{n*YtPL74eW2%t4>mLc9ACl|jv`>pDC(`tLD_plI$OGDFuO?G>p( z(HYqtiF6o|_Y#QTVLGVoU#jGe0V);Q$p?$QsR#{X#_CBg1igz9j^F|LEx%^!b`G}` zq?va(Z=by?LvTuB46n|<-Fb)TNrQ2SMBAf%o}}?4x?XS$@H>}wCC(mi7%>P7#5W3| z(&*MT2om~`wu5dV;^0=G9-qufU?f^)0wXa~wW&e|=BEAQ@|8WX^W=eCE4U@kXFIa6 zK{>B27nNJ08ARAfPji&x4}}~4HQC(uHCyvG#1dr%5-Ke0%Qy{jY3kCoYd3B)1B5pb z6-PkBx36bK3H6KINV7rx033x<-n>Z|3h2;N`aXX?i0lz!$c{*kcj8E-!NW)BMFoLJ zyPIfNDjl$TR1HI%i)n*ys+RD?ks&JK|4bg(c)XH|BS(!vX?N{Dx4(u_K*v0w@`J0- zBNGy5F!Ck;^Ly9;lwlGt8E2?ugteFdUT-#uWy?RKIeZWfI3b@XSUGYRBP#+tGz=96 zlqPd>PuxJ;GU1(4@RO9T}db576Y^Hde|8&0NARcoN z9i+5zu)b{Rbp1X-Q!jnuUB50-@;7g8_exA|qGfmLfbZxP=}#GDQ`fI=Zr->taq}h` zqOf-)dQR?_xWo{%AVetFtG#A!d4hC~bd>yt8~`g_`02g5{dqn>@4XTHhU2EHD%$Qb zf^LkyXTe1T_4~PAgZz}}W{IREBrR?tts%r=#lgRaoK+Z4w?&lC=H}*diOzH}Unqg( z5pCHu1a$X(_x3aoWDB4`P4vdDxArwR_qA3=+S^AeG_mg7raw^`v_u_Eb>X-1v#RbR zEC=1%xDLlVD8vHXZY;(S3j}_NW)cfx*a-jH227+ouTlr?gDI6ft_-~Et)U@HRk}$> zff!~*YKcM)<)D@7$i}{9rwZMBa+fdDByFzhDrKCR8HYIHT`_&Flg`HxaSJ&@h+8`R zu?NnSzituKv~$Hmh{n@Vd-s8*+OFVHV36dG6~HT03Ty*@gA=0H+uYUF+}kTKjA-w| zF)cb3iSiJ6QzDYYYl?XqunLeziBu{h5c`Fmm z6-5b~E8*B`rClY*T!-j@#U2atKg_8Ju))>UUO z-Z(LF9fr0t(4{6i_8;2csWPPBg9c7ZmLB=#`r9n|p4VIfl|b?*@E2k;x2iPjzK_lr zzFmpsg|g}Cqv|K@x3jWrzNPi!&3|}1pZH9opwd%6Y*{}%akRbtU8}7uv|DZF#|w*x z{vCaRdZ=2$IO03$UP#T|nEr;22>#(`pFQ=)2X?gi*1SgNN^m>T3nc=dYR9K0rcQkI zx!uow{<$juc0U);_Ds|N)O4UAa*o^qc?F+FBz5FL36NlIKram0JAR)Vo3ie^SH9he zFJG=+=5KCq;v$M12VE@&=zG(5piLtS89JMz674uJ{${|EUMZ~!ZE^4$SpawYp*KzQv{Y5IZ z8cDNm#F-JtR5Iflul?HBe*T#K3A-bij>j^12HHJ`(b}YpL}Kscdok?zyvbjYi+e)y zP>;v!ah{BVLi`jk$XB~ZMT0@wNkxp2$j5Os6k_EUg;hZ^e-%+%a%g-E$@wd-o!PFI zlyb=t)l+Qg#CZ~btE^LUtaK!rO@oi)7J56$#Hes_0%GK$Y%&wITHM^L@JL9tRC4)x zJB(Jfqb}S)cRO%HiS!}I?ku)fns+y+$rh=UGf~QAdq`>&w$EN-jeT0))Ei(3kMgVb zzVQ3o|8D{^ql5GPcm8J63s^3RxAfxx3j6q%7k3RYok?0A@#$rer8!{w@ZcC!CBjxU#yjrf3RzplSeNZizVan zWR`HjtmkC2PBSJq7gxq)d;ak#F03R4bImkZxSaE{5>>@V>tV#Vi&+AOlAdA0!D;Vu zO+OIE3)O2LF8TA`X>->u^Ymk1{&MH1CG@lx&*IHZqvrNTrY6c3jNJA!ZM4&nD^H>b z>#R+}q3dWLJn{GWBaK-XIQV{IJ?d_3xY6~({Jb|mUv&otoQ_K!4nLi%s%6UjY+`CE z@mX`~=T2N>?DF+`k^^!Lmq?btuw3S+2i58pZ4$2na0w(F2Nj0lq?#gvJL+;R$<8O?19Y5aX z?AzDS-%i)@*~+nF6^u7O==d9tRlJJ3&l&3HptH}dNVoZXipc+BCkas8f=J>~I6GlF zM<6xZN(EsvE(sXxU=0Z8XTC|mp>03A$wv_vL-5xW+_C3JdfD(IxhW~f@6Q%h(*6s+ z9ZQG=>^&{;SI&YKr+Go4`ebA?6>Yec+eae_@Yy(I9(O_uH3vo{(Ss?Yx=bZ z|HVOL>H(+H6`l;r5I>F#y+<^Tj2Se6yaja@<2XGDeS^Y5Ksoe_1O=Oz&_UKr_ zcS=>I?+;F4#R{sZL5$lZexC0 zM{Rgs7`K6hDo@83C_)&Dcge`~o-Rj#OEjMMOI6ZvjKr@7wmG!z7yt^42QA6m-f5fr zDp8)D&X7IibndXtwUTc<0aY&Q=$SEb{}!H249wc0N!S?QrD^Ab_j&`ZR-OO%k`~ui zF~|S;NId$mZwq`lmHDcpuOOy7rtDnaa{Qm(7numR#+T2#_<448OrHpL7z0K_u2p_R zu#OvKmF0u_%M_rPFIm^GOH4f}(`2op?Irg8#eDILV+Zfid3zqmbN&sIHGZ59DZJ>v zh$AJA3I`qG9Ao34Q6Pz>&ymPdSQs6Vt42h86wj7W9VNHP5R(5w*Fugv_$6dt{v=9} zY;VY1!S+oQ7lI8Se_S9R0R3)4^C$KH;FtvC2Opln-BY<7*a6qCU&kA$=JjrB`7QJb z@^w$4d{AZF@2Kcb&B+~7f_@;6y{6eiW-Ph_|Ff;*5>Z0G18;+0FHIll`N&Pu+ays% zr=XB5tMzJ4q(2i2CCV>2+d9+P&8|#y%3+PNi|= z5`=9c^kL?TN$NyJ5ND!P+1*^Q6A8P}yu0!=5U;5g4-<;WlE@USYRPEiRJJ+0^%uOe zU^NSk>=rz9iAt3?IjwLOV^^u$tl~b7>RALLj3x+2#9J7ynt+tpX9{l=9{kr+w!)`$ zud~;JX)~iv0hfR6=8sAvg*Ia@YE1uDA$RN6txKj|&vGHjc`}6}p*O@dOGJSLDAEtM zo(HYiaRdRP2T!p3o6a^}Zu)T3N1Hy)Xb-|)u*IWB(vc6$^>Mf(aeAjC#xz!g0QAVj z6H~wTkHi*-Zb!=#D0s#LT?x@OSb&P95i#RwC5q^OAV+c!fmGZD!>(CJIScQ>jo4Il z+BBU}tqvn5)>_V(p#kgXAS+1&ciE0yyxF(wh%qbDXXSBil>m^qW#sW0MJe!+?rzI9 zlb+jcMw;W6XS~mL2V5^nu8){WOqrPkHJ0W!h+2vdV1?b^P1Q_K<08Hxt>#x5i^h|hr@#+&^hxjd_kHY8sns51y$S|X`!dZ+mA8n^k5U$^l+}!?$ z*xwxIo)_99pBMh(`5MH<$9xLs@AHfx@rw|vHmjtlJmIVaz6H!XFG<;HShU$>+M#h!dE-cn%Q*ha_eGC%VO&Vdnh&(tiw6xOOdFP1P6=vmMl;NO=pX5G@{9PER_MG z{#7Kj*fn-uSPhkpvRU~pM7PoP@jo$z00rkcb`K6*pCUtlsQQ}Tq zbdBhlJ$QDJ#y#1zk9f7a=9dLDJWZS?Mk^?{K85&WMxZ9d48{GedSg;t%RvS6luM;M@|oYy#y z_BcP==>HcUXu6 z{)~OPil;}yT0sBL$*C zI4^2y+{~pyf{nwR8WBqcViV(3RF~r3SHiJDCY=wx)h%yQlXGKJn=Aojs)OesPo0$c z21EQS$bB6()pU$;Y)=uylukw zHxqX@&W}QZ&`GE9XxQ;U0!Bi;2T%)szl86Lbbr@7-SN)yMqACH-%6TztMd6BZ?&o7 z(M0&VVdY<{3wOT4jxN-;8-FZ^*k%Lb$K<^-vIhO6cTiouGHA29d-}ASJMhX;&3-O1 zk(o%m>5+P%L;5eYrN&ql8#fEwXz9Lm`ue9nK*q4!iIvR!uOKLd?fxgs&4QL9wKjv; z5Xhl0KtwrlgoR3MMU27CT)WlVo@?*5%3keYiVVgps%64DQSOUOPDc95C#;EywUp!@ zo|w?$i@)YOO@EC(GEE6}y&e!fh5k@yFVw)HGVOu^&d*jdY(!X5ZB;++rH{DYL^cDY z2>Rxw-Cog6y1BM|OV%Z|XephkPW!0~iAp*${=r;2mBU~{DuL4X4!Wtrk^OE8RZU=L zpk2f!>dR-6saK>3U)n)Jg6}}k;k`x5)jUX@ePJAH+K^7R*qc~fuU!LG5%N7LP>9HG z+8E362`{(F@d-qTpdY^3^i5sf9oo|qqErC9=$YF(_set7JVRgjZMD-sfhN48X4Hb! zN?Sof`SCWM>X*n_Bd!Ws8~csh9^S&2u)k}Wnx1_gIbLhkq}2;7C#YKx+(-Xomsc(3 zilc{Yr|4DNta~;uz3t4abLQ}yo_TGYTl}#uI`b6#+9711JL8OeS46mBOpX{5Fe8{F zTAyv?MKgzD6z&*0h1_XT2oSTCY{uDF`%Kg65Vw- zEr5P>n1LorRD?5hT6Z0IceN6UdF9qZTl?VPkM(Tr3=I^&Q5@+3^K4IT^pUpe&h2nq zwFK?d3r)DE=@F#GCn%F*Fn2SdXrOWb$3IkpzrgOz5}1#V<1h<(FUb*;5HwUnIP`Fb zM6t67>J@!Jf$6}MshShy{mpuSxui3BCndoG7C#>(5X}bS&v9Hp!!oYJB~yrl$FlDE zboLm2WDY5l0eE0F!hDDiWwzFm9n1WBp~kg)_wCI(ZY`hb9b9;V6y+aEbaf>@6qo2{ggKTDd@Rwh)_Vw45xNqN|tTP#1Q5)kbPt=Oi+S&^!jDcf3Ivwye6Q+ z00y_cB3A#BkJm3Q0Ew6ur_8Wlv;*q&C(`jJV#%1Y!7Mz#zS84B_%$~ir3@F}Ri zug`5gBzA{nGG8v|54E~|C!ehfiI%C z<%NH+KW_8)?9+VZpFMQ%_vPjDFY|}^7p@VYPX;zo*1;+kCg0LMj!q{cC=;(8K5l!h z+1ANpeX*X-SW9m%+S)g=Pkx>!?6B86dZ;rwbbQp#C8|Rsd)v*7{Kz!&`B+pJNGhOQ z!`Jz$Z%XmC-}34=azkQ49twU)H=@jg?V0wDO#6WY?U@cX-+*S_rz!m^$9g9Iq7s>) z*GH|L8Ugc0i*Tb7Nsrjzi?6as=|xGeQgnnVK11l0vo8?G@{O7NBL^2w>Qk3?0Xjs(sFRo0>zd*btzR)V6wvKU;<9q&nVv401+2UgC@<~*+7 zdiSQkfs*)GRcQNR#dPVT^}m^#Nj{Y8>&(%mMU;P^255mT-k#se4Ptrc6PQPNH_ z&=H)rl*Rt`=)a4C_(QTta-idoZ^oXjr@VA>@7`!EmpbU=q88|yAl#ay6-Sj3iJN;< zI5?QFbta+J*%XpcJUT8>&}IT9WrDb}w}o2V70IXhEz50AoAC$tquX%JMC_4WDX$%^ zQ#{h1OF5Mi9xgG0gNe$va_B!m2UY5yutS;<1*3rSs+5FB1Yk9ui@4E*3y>iIXsv0e ztpLZKIfFuY+Pg$^Yu_RKCdAevSf2-&=l9am3?frEDn2AMYP~d4loh<2)w?i)Yn9&< zD2s*Ps7Z`@K~vyiJr16@E>-nYl`I;eXl)sY`WH1EhJ>u+o`!7s|%*0oqZ1LTYsOM1!J8??UyE(?0- z=r7=1^=u3bEJ##=c@?Y6Q&Us!;hy^bOox}P9opS}P(>edrkq2WOy_;^czv?w9pD+b z(FNmhmyUYdkL7lXC~C1lX!`?g;$pNVEC_L$9pvc!v!T-xo^fEBWQ0xeqp1`tsmDpvs2 zRy+W)JaL}&X_@fDUD{V&S5-)krsTXs$PW~7Bm{S1jJQi6#>A+|P?7)Dd%sBXTHH3S zPaGB{$>GCJUa5Sa)4R{<@oLUUue0BUkH;KWL&Web!ZECz$~#|hz1KTEZCv&K4{}*+ zuLICY$e$;WseB}urd||w0;XNiE;iX{NpV&>8I` zo7*IuHBRfEj1LBl&^QJP>W@5(Sb?FY37jZj89SoqAe3D%up#d?PEL51TjXJFzARLq z_paZtPfvXgKn657j0AXN!eNb=6OVuKE4bI_&yP4gPd#08Mn7L-XemU_YXqCtc8s2! zzTpep8#g}tzNj8YPv|Zkb>343H_TtV{IMfAxFe!{@)$9AWE3IB!El#hF8ra)2$>@0 z5X9QAu|JBm0q)yh)WgO(><=PF)5OGa`xd6?R8S^*7wl^87q|{{5`#!aQw=+BNxkp; zy(j%)G@8!&v`ypZNYuE`$)Hc{1pv_Zi}MXze%R8^cGdN(Q&-K}QeA0Se2k>_m@>bp zn~@fx9sOyFfr>_85V4#;U6f=)z3~OfhRTbt z$l#>NXEz{rRm7t>?hWS9`#FTxa4dQ4>o z2YP!Ru_7zxgw^Gh{&ruPwD<%?~C!6S918TT1sA*HDMB7 z_DE0fz~JfTHg51r`wGXJxwIoPIMh=upvIW^prvncVgbDotVlsg9);h>z9wA-_ zI1D0DYJe=#@PjDs;#*XuFoKR?ixbh z%G7cl)y{0Tv)Yk6Ay80lZC|`splt_I&j7Y^2{u7cCilgj1f~gyC^BDWvmHGhxm?F_ zU?@Oj+R?9~TdXnj4pDDSyLElBZBk($^^J@mPn@uyK>-;@3Z=RxFY%KvQ)OSaLUSW|tz1DG97j!FtQW-gI0BJ3x3;EhnPP3= zk$!LFi4ip6UgyX}t@v55|B(R>OnEJRt>j-0WHr$R`B}2yUKn9?650k?bO|0Zy|=n= zJz~DqJhHhwx<0x*+fsoMW#)tT|}XT+JXsT z*1KHy`X}E%BtAx7CyA94w@s~YB$&GM+__GThv7d*a)rrr@MR63L%Kcj5H$DmkWYQ! ziBEp={qNt_SZ-X*ES26Qip!U&hghnhLgS@w(RaT8@LlzIzh4h6=KE`?)Wc$Q3^c*p zXg@39K=JDmKVUH1YJyhzZfCO=*u&*deQI3~zUt&RFbsw(>iR&UQy9CkF>f4vi zw0hW7-87QTSCHdaUUzb*`Eve>IvBkz7+EGx6WQ(l~Cy`HPI}=`) z=W%hfzNOTh;`M{MDD*>cC}ms+2+W#bVN4ZzMJr&@C`lj->=lS;?5JWn{&C>CA%TO| z)Ms*+(#12RxQUeG(;qH`?)bXW_ij>^tz*_l`+dbmA3Bc0{Xj@}jy5^2YKOP~@-Q zyj|+voT{l(d;II-rkcC`ne^y+1&dAm#|ID zsAQ}uGZ1Jeu#WfQk1TRB_E#Shiva!7IC7r0>Y7_JF;tmln>hm&5VDBmc#WWzRPv;A zZ=sc~V*Pbw0v3|W*K2mUWdYnL!&YbSZbxOfAls4RTDMg1ua{0|Ut>ZF||KNa(A91Ss^Gg6|~b+V8VR{?Jdd5fb9-AbM;9<7L;wyWKX z9*zcSLs|E^_myHj$4~4gt4aIda6PkIlC6^bvuI>%wwyfB;t?_lw5`#)CvVRsBa*1Kq;s;q0j%xhBW|ww-bXPXbjeup`To7&lcq&W zBCV<0QcU*v&lk4VHP*Q5uXc{KSot}3uI-+QVt%{}dB0R2sFg~!lG@ufaj3YKS}hp0 zW5;)WsaPM7)*YxbxwMR_F<^aPFCX)W@d%R<{4aGeI`IS+2NZFK)%FR0-kJE1$>--@ zc)qzRir5ukS0dG)Sy}lRw{WfCK9AoMnvCh|NaC=$X7n?)ThF7Zo!AYm%)|gZf`yZy7TQbF@Vf- zO66>_Pg zM}4e!nVG0ld~zpEq?<{8;XrquqtWy^eGLK!ihKA-T8_DX$A4%s=^&2764OWCjau$G zec)MtM-D%$!|M=8^%c3=O$|I`!|%%nxpq?{6IqBW?8qlL5a^OQ(91aX*E;bhEb%^K zqks#z8v`3MAd4{GzI9VG2rO_o#iBGViP=b~IlQR0*!eD&&=diBHAr>rjIy2cH47(8Fo2XelrQjTk;)k$wW&$Zlx?hKx4le zJ|cKpUxz$+(QZlZd;n|Yj@>Dri&@=CZ>z8f|kDc(m)kCIvC~;1I9~WUl;xm6p?~?A1k20riFJXDdEpVp2 z=W0_c2xkJ&mizdnsot$Mtc)Mq$);D+0|PObXxxIvVeX-aFc%R^&gh63`3_{1mEt(dGl#Gs-@F2Wy#ivuOpOf)dZ9X(Lb>Pe!JKTXm=g*Y4$F_gd zs?f4~Joh7s=HGAm`IZ6CcW0-sx66~r3`V@fiAZ_-!V-l)4NDXuPMhTKF7bP&&uBOL zKWq28F|Pe{U1YbnHz@L$6zL9VKGx@n+Eu%@k#?i05S{e);^lit;*>ZZ3Kd&25zc{i z41XwBu@FAoe&5ku(aOP-e0S__IW*QCZ5uhrck3ZvArhckoXE5$GIsBts+BRzDw2U8Dg)eMCh(>5^VfTB%Q?(QVo*0)ba^;HmNW9*Cq5 zc(vZi-YMVpmK++BwQKhm-CE6sgA_p6j> zH1TLch4r%PE4R6|Xhm~QESKypiaNBdr!7**<%*G(o^m{wljFH|Kt*qg|`Npv_0To{A>Qt5&|pt@>*N- z-1k?85`|G_!j+4z6U$#NcPqCkPKHE@+#HyeA8Gm- z=0FV_R29u1nOY$(!-8ZZ2>EF8$Hikvf`(9=0Vpr@1&?`zVVssrMaYrw$0*lpwyah! z6=kOny(|hLJc;T&05ws~?~tP^E`8%es-kWjkxSSgLtYY!=2I^`Z#aito8rWHAS(0f zd9*{gH+Mv1*@Ue!7?>jjEEJJGCiE>2a4(COjGWRh`!NTISF?J5v~NfH$@4d5sp^;|FGWQ`aZx9y|} z$s+@bt>Vhu1c=teME)&hrCO|N2?QJH8>R|r2s>ig1|iHbl`OSqidoVMSolMsO|~qQ z^u=7#iABVWVMdY}^~?DB;ogOj86a2UZ4HQIEYfUPc7fR&6KHsr)p*K7T1>R1ct3nI zp|`e~EF~hT4#!EY1i4kW1U-!F7h;+3?90;XP+ogZ&$El;w)8*+eKW~g~Ilby3!Ro~iJ&#sl`n(L) zhrXM1k2z?Jm;S&RZgIM&t2Jk;*DYADZFbqOPCq)4>ec@~*nGI=tUbwEY9dujJ>7B`^^~uxm$A?i(DBE}7=4yj(`F!9<|II%h%2p@KUrMx zPsB@K>}3M~{i;UXY%ECSkl0Xu~p*;+=gwGQ=y?bwR36Z}^Q0h@TYiqYYH!M^98RxSD7q1J@!L;=fd z!}6he4&8UC=kK6IsYIr)l1aern5fnCV{iCN?fduvls*8VB1fA%>zMx&_EQ++E`B9? zgp1OAr}b1YX0Bbk>4S%OR@#8_4BflZ+e$tR;MnJ%1h#x`FkJnfm2hpsVO|@C8T&l1d3@temarFmFf zQ!b9@X zc+WILCP4%pZSU4|sOhg6S4pjHM8d)e3Q3e;W^)`r8uNYGBkA2;?z=m7m9qDZz3b$W zBgcT>Xg^l@f#Usb*6a^VKO^+TpC{6Gq354OJ8H28i3X)5le&(0W0G?_J)PaOZTb56 z>C@JeZ+p_bdiCprC$gur^7WxT_trA?qkEq``~aFHpXU@gQSuVgtG$R!emk(zYt7pT zVyMnq2w9kTh7^F3*$@5HFGVMB-^LLzpc8F)>y)r83Sx>(4(-E$hMG_kiLnXIa@DW5 z^hORuOYON_dntOrD0Ft0(*}?nzINQZU1@eQ5iE3A>#}Wb)a$60vnx6$gXqEo9UeZ3 zIXGm=w$h+P7U6M}D>%iloHLAoJ_9DcR4nL}W!jj@c|rff=0H}_f+;?2+GSv5bgaf) z#D0ar4f05LrmMVwEzi_#pS$MbAW5d{bPJuCqwi88f;6 z1M!ClaF(|F7}nkh{ZP(^f%iU4Ou?wKMs#Ijt; z|Ad*{lYyXZ`-{Ff{tn+SF#|Do`LE}&Oas|x*2zA(r%wX| zkhzqRub&>C88|*Vy6>Lh#=urzOI{(#w=2F2yP?OTx}l5V7)W#|!u*}W3KAw{dg>ba zDZO2VscTPFl6`y9)k@yTbaZ#-jdY9MQgV%yov9U3y-ca-*^hPYAxdw;n|j(d(jC=` zXJp#DE2m8(S!gZdQC@*a`D@|-&+ru)#s6>PE2gsWsXOr%8L08+|3Ac6WRMH33wRIu zUi2MU%%Q{jf1t9G)q?+`i4vjjrVwLBrToYj;p1C-lKB0M;LL{ep^Uy<;%!{Y%*92yX-~qHi0qJC885rtUGAsL zZEjch4bmFSM`IpW%!8-e`%u~GcDvlRHmA$&-tJ53$$Mmd!0rV8fjBrEQ7lUu_^dW_()LUwm9HCCD+3?&JUcW>@h73&8; z^^Re%ibP*kjqsF2q~n2DEL}k{XIX0B&`{j-TI|{px5JeP(nM^cG?q$NI#4^|?RByv z@ps8c%&qatCwjsCG$L(NxL=V5E`}*N9v2X6e|&=T;_Fv^-Wq;Y7EBqJJO4u~eFg}6 z3KISnPGB!wk{=OB--Kh+myN{Na67`#*J@x{iSTq8U0SvXeuZnom|q>V5W%f);CF+T z6^B~+hJ=eBh4uAYx4v$@@GXw*_-ymMemp@ZBVw%Sm_!MSEmPQSc^i2A(9w=K9frys zj&`gSGFI@rK|O@NFYwnZ?R2rj3Yjlb5eYxI{nLT(Txy5wTpwO`O8eW1qZ=yzllaYn z)0&DBQsm;wiV2Co8`rNNcxk`5eEh*qai=TeBreW$U7OE1D2RmWq0WqXuv1R2ZrhOc{UJrCb{~!s2L-@Mzce`BXoXB8) zZk|5o0No~yJgPmZg|xwhYHS!C+ldT{9Sx2SJ+@iHIEIw=4Mem->rga)+8T)Q^;o%_ zY&+W4cH+cM4_F7r*rsP+t0xAn-g06vQG1fCHt9?`^JIG~MjwCf_bG|E^DTI2IuK7; zm&JAlJ}jwt1`L^9!k%_SIB3qNTMv&_P-NB9^>j(K?%j7R-Fg5arDgZ4AlWf^1Q zIS)}lQ7@5}0#;j++SP(`BD)VyrqkZZ2ZsI)M<~0b2JSzZPiGDss(;8Yq;t?|EhoD= zvIhoB?ykC9>^uA z>9y06O~uHzb+{)Xe37>~XZP43KG}ud)SfOPspIio52{G*^!lWYQ%o$~k~ZQewdfo0 z)tc85e|xP5{tiC(zE5ucMV|P+T->eM{=2>Lr+h%fAK#9)-PH2uk&%v$k-L5L9|E(A zzX?#Hf;)bwW8{bktlS{o8OlRqm-h3Kpr2s$vX~&V`5jppx#xm2$2#?=Ki0SO8U6X( z8TX0q)SgaKlJvsWh4Mt4_x3Rv!kpR?WR3NRKOW1UumO5T%B;lagcvWxqw4tYCF{{6 z$;dr+WGLyz1|!jXBC+}S9@8#Nqx16dXPu+)&WeKSaDMUh&MDIxiC%(=arMpHpP28U) zQB?Qn`2O*cA_@uNVTkDk^sgQK5Zt4I|E~FzJ3pRBaUtjSjkCn^G{S5}Ybvg)1Y{!b z6iYaXsHWE?a*5X^EQ>FH<6$Lvw$M8YqO(I%2b}{|02@dMmFgiMmnvpXb3@EDUnjny zuQSu}*ChdmivOq4SZp+wvEE{3_zgEdmJmQd!nh5}Lwy<{OBN{Jau9?E1M!DkU53#b zRW94kTlW(kHBZ8-(Wr~3mm3{rlO#)q$TocN7Z99XUyCH!Rz^)#cxBfo$}6B85`cO65Slj+wY+u^53zfsx44(Jjxt z@aJ$6c-M!Sf38nYlQcGsnF1VbG@z+$9v^UC-Y^pA0>0!&wtYs!ax|qS-xq%M{Y?ao z;S1ldMllFHs2)?N)RSsj&8j)Iq}HJg-S{(?#zsw|pOL6xFimU*sKQ~4M#hIk`EBOM z_L(&fpbOs@*DEv(YPBO$s$tZ|!rciKii2_RqGN|tuX(BTW>X4DN+z=VvKz$@EVG{^R1bf=>AINPK9_K)jfUDtpElnswZ=1)-`l*Wfg zh5as25i>4>b95gW;LM>(rU2!{X^&y?WvbPSrSb0SaIrd6FX8Q95^T%;Xzm5|KF@vh z^>~p;4x_WDF-+;h8RyEq_7p^C0hBoJe0fT0rD;PYjk^lO zXQq^m9VOX9x!JZP1c_8{WJjer>9pNEla`6&XF)QXgdO{mBBM9K-~_x=9__RLnC#lnMg(T{o+_NqWx-^9D+Aj$k&J2z=ti)AL=W4 zG-k)6k^Pb>Z%|0Sq~C>c&!g1lkpqUvekCmQ)ow}J%u-%31;LJ!vP#s(%;6&u$+Kth zNY^N!He)qnzK(0$pm9J+c%)u>n6KQxAL_F~L)I=7YV39c8$ucRlB_<4EI0ZO=?{tp z2f<4j5Ib(EhWBv2(6zLYFa8gic{C+mBIClst|h1gbZE5Q6xAGoHo%QoRtr5314ODv zfg&;qm`GSEmduf_z>*MtmXK89?Q}4=Fc$Uvm6VN$jrdzJqY27oSjteLEP9W~dwN=o zTO6Tx{b?xOEoEbG2?1~)VdjCh7MZ;!Hp$r1o0 z31|Z|g|W$@M9hKcPUGyB1x&pR9!}1YgCzDdQ80X;trqD??b92xCH1Ptxt0@%cz=4 zNOnmsmyR$>7%7GPnWh*?9U71qHVJMO+hqdAmN$|7Qaq0~;NpTLRD^W$NyO4osI@c@ zx(;lxU+$j1!g4T_U6U= zGnA3U7ALZL;G?~zj}YUfSqeq+pKwl`a6p*|q4aMLyC;$-9AG%ZK59kwHjxo>+6x`) zvLrP#VdKTpEZejXNJ@KKtUkMCZ(G`ZSI6NF_o&-GS7gwau3svbFP+%6>+1Esz7zML zA-X4!rMK~-wKiQkT|634$E^<>LZf~+RV3Uud)MI;tW(W($X zd?yJT+s(@6#vd%1Own}mgq@x@e<#*?4*)4C3oO8hah@rABBGb07uAtWGid-?$u}da zII^f}3E`mlLTFmg8d1l_!iY@Esv$u@Bfs&IRcyVetJp=|4ucr8RYiydV^7&qO;n#! zO*^P%{I_4ami}B3oPr8o!N>6sIn{JtWFyhW)`ZV5N$Vjk>p?#zGPSW^{5|0NX=`Rh ze4J#%@X@fDgjR{%jWrIzZcxD<0;GjiPLz?nvn;jaJW9YH>MW!6Qa$3dwKAv=Ok%Qu z@>ph}r@PfDbL>wb$Sfj;+H)^U#RJz>Wp6r#&NrR6W8GD!`!~yODy5=hNm|S9%a`Bl z96&-!<4SQ5d~;|RB=nn+dTCcWn#{MgI|mLX3b?PCUT;?$Gpe=xMH(({?7cT?MyB3X z>P)99X&gbS4snUD<8&r^jC5-3SbJgb+nhs*BKe5nsSY`Zq*C;;3iMxEU%8DvSZ6GX z5F~vmmf14ecP6n@A=m#Iiauy}8K@#K_4vA!r)$P%r>c(n)mZ z=BCU)iWR*J`RW*AxaFW~s+qr=cuVFhwtX%<5C0=E6ipsOzCJ2vV7ld^;QsJDwqO*} z=Q-~`BfLL+ey`}U@JdSjuDOtr%fj+ooBlx}eR`pdFf4cKB1b?)Ye+vM znvya|V4p-z(BOxtHA@n(G^Sc&F2*9$YVYam-;*os$)rlGQZYOfGx1c)NlH>_7GT?H z>C9wQl(f*rd;&FeF7syzH*RJ+!5nW+rBX)HO~Gig1R7Str8QMyMVf$_1NN< zG`f~&s~v01mem@wu@FM7JKVBYSCMml1(qnMM0+nvtZ!G2=54Tgt^AQLOZ;oqfk}LP zChThy)4ex=W|+1(Ib}`z&bUuJp?|MVPHvLfv{$-rdyU&F-(Ta*?MiHwjMfDin)1c* z8pFcKw@FT_CJ!iEp4)XKPg%B|KU%SG_fAi2>d>+YJ1EsYBNd(EX96uJTD46foSHB} zBLtf+M6bYR0YDv(4_g7fEd$tpeW9C7X|1~x6;SA__U*0;39HBtOX|n6Rq2-Wsg-*w zq=9;_QkW zxv#%upu$m5NBW6cK%8U>QL*aia~_tFZv0Dw-?Qze`kILs8DTI#}*G>20JdFEr4J(A{CVnTtKYsGyZybnB^_KSJ zoOF*@?{u<#rOp;7Kj;a)aKOQF#2MG0Zv~Y{?>87A;liTeUJWE8wPQRp)|p^>D2ZlL z(2T|RSU6hAm{uQ0GOLclR!Alq1B<4wG!#fRQ5o*9?}Og$!=phc#0Q;9zYQ|vK*i}C zv^zWP!N_i-y&TycFSo~cMcUgVyUcRAz~YpJUXjF{RB$3oV}gukad6a<5o~@ujr(cE z?ytC&0gxv3M!)UJ&E~F1xvU?fw=N;LDMTJ59iEkf(1~Dg*|7wmNePH3qEGY;q(89N zh)(YWe*Uk=6YHGhi3g8J3#3O4#MN$dbR7ASmj!&Q+O7RGOc8VivKG$(NWGuoM5NX3 z8Z0nN`G^MULYoGK2egmy;1??Z8?3ydIuPd$5al9mqW!^f!@`h=9swZ-`i+nT149eM zO|&2|xJYB@G}u`akOl{b`H$i=k3utZ>&42#)39lBcgAU>7&syfmx(yJ^00T&H1R|? zf}n6pFvZ09AP426k+g-5grErxSGDQTJZwSgR9sXD~cm#>vpV?(tS9pnu^Q6>jz)J3{@E zU)k7;-cg(HGPo*!4a0fl=Y2>LXV*n7gY^+wF~TAh8sAti!%a-I_?KO}be%NzAf-;^ zaE&a3%_^o_vX4zqdBm-G6NGe6TfQwFzwZIK4~bD@wUUSjeP?}c?f^(ix2E~SVpC`% zXa`&y0AVCdX-DPew}F;6)2$t?X{6K|lFuhcD4qkV-gxfXamL#|WzB14NyA;f`9^K$eM4(y(2CkO@E8+RMRO-Pt^` zyRHfDuyI(VUfc4P_NDZfGqE_1GI(I5_|{?h^Apz?EEvvt{+DbRZU)8|u7~td)-fLk zb_jdNF`11r^caOaNo?~4ZM?+F>>uLs_{(T@9Hx47<48w1zKItVBSNhBr+g2AYpkPe zb;@4uLEw0wO=OxA&nAA#K(@HzdV&*?h=Y*MM?&+MB>Dz#AVKz$QkLsW9~HIj6|iAk zlGn@%@?aN&L6O=7oRzCdniH=ZYp8D$qT+3wC_E}hQzWLi>5 z!1gjnv)NR0zSy!SnQ;iTDrct&fgwkI)@hGLTk!#_p-%(O)y}$Y=^wo(-`3pPdC+xo zr9#%r2Wx=%qWa#bO(8QTqgKYR9=Q@C$%k<(_VBMhlM|MH%MYU!syRpm+3TCGHocc| zi})qR?g9!CG0!m-5#)Ip0iW3~W=?-<`bz6@S^ML@qo=+~#C$p&15S9SuPA)-JMlD$hw{np@fSwj*K7ftMB;HLXi?QUX#|wqvZe@^E7=>#z zazQjIC{A)Y;epJg8O@={M2D#r#V|(jFVkpSG;>CUIkz1Sdn zkQN?dCJGVM!Y{B}ZWLZ}AO_~Lwl83igC?SUq=|{?i#npl7Z7h-+A7_- z7E`^sZkXl>ZFYfi=F^(+{T7-o?RY~RE4JT|z#+!mOTA$|G{qooK%_+a&^$Cl6=Y`} zxi999u~N|#af(Z}+Mx*Moo)w$gTH$_WbHS@+XB+=WOkY5wI@@2=%cWaAeqE^#S3VuTxk38Lhe`qHjF!+^Yt1?+$ z09(X*2JFi?L?y_(CdTP-sf9@WiE>hpxsR6bpY+N{?;D!ScBWJcOaUD_f0Be8HSd@6 zwalaLV_Hw7G+yl@v_)V2dQ`uAJ?hB7FI#@|nKLh6_!-e{ zG_fN8hOf2bTf8c?1`l3ED80Y!qfPkRQH~aZ<1yCral%q=We z?pdB|oL^sGIWRaVS2PwEmj`B-FE-6KEjP_IE$H7R^w5o_`KFDgMUV_vUv%!yE1%%X zRnQI>xPPgs0{<>t>ClVrIgMVs!P)Tn71~O!U+0)?t@8T>XV)lmhEglE>pI&~qhP4RyrMLBbmtk<{NBs=au1L77D`?{q%2KvU zs+4lzMAGE{%&Hu54tYg@F8(aAZOoxIuplIHYp1HHF4e87sz>#z8V&`!)NZv0lLB}Y z%&S2)r1q&{HKO+81v93`)r6W<2e4Eh(g1Hq)iHHkoly6vSE-ZgUUi?kUp;`Y%#?aa zJ**y4kK#4+YW!v%SEto$)D!s6yjHzVy?tLn?@pQ~R}zplQbzN&sh{R{Ok)xT1|ss6S4E%k5IO?6BCw)!3Q zyXyDU@2fvh|5klXeO>*b`giKztN)<>qx#>~AE`f9x7DAh|3m$$`ZM+C>Mzt^s{f?E zp}wj9PxYVGU#Y)V|3&>*^*8Eo)${7_)PGa|UH!fKAL?7`|5E=`eOtYt{=sNsMHSnI z_GiHSo4~2bHj+lla17T-8yO>OU>G&>7-Wk^$!IoOj8>z~C>!l0dFeDNMwiiTRE-{^ z*QgnFW0$ep*kkk=dyRfP2?mWJW1lf>j2QckQDe*)HztfpA~j4da|KZ=5$4jJFsUj78(3v1BY8E5;>b)mSsujSb@|h_@wbE<7bRdH<>fD zv&$Px>-m}4^@XQq)*Jn2R~s`IR+bl**4H94b8{wS>-@q~4SQyFb@_7t+2!@~S$}hO zVRd$~(Lc9*dFjq0i;Z*ZxjU{|U6?<=p1$MI#!B!+xj)#H8@YCaZ#6Z z#{s!IDA>P3-{bDQXRDC4%QGtp|IEfpYUb+3Div=$wY;(x(>uwtymVu=e{FqvCGKx0 z&O%-(b=}n)Yl|~$=VjO4-i^v;?Cj#q(uL^R<;6L^mM*CDnh2+`Qnb`}Cb-Bq2 zw;QzLs&#gCp>b|@X05^2^2{7t>n2;5*BYylvm5h?*_p-0(%j6d!^UF&!V)xoVQJpq zTi#for+4OExxas{v9z{8&o!*s^NraH{ahc@TmJsy!rFR@{ijx!mvjqm?MUl6;Thd> zcDP3i&7NOfzS!uWU0hykq=TJ{GfyvET)4Wuzp$kD-QfIcgVtMZIKj9$x3IX_nDc@? zR=@d1zke*X^H{i}+c&)0@6S80*2m)ht-6ejg>{DG%<7!QFq~PHSC7vwF08Cv;Q;ma z+d{Tn_BZDA`!CYmDSvlkMRsC(C&~icV6|RcoLTYjwAoo+?Z3!zljc9Wu++%$d$F-Z zhc2wmZmh}Ty>)0~iPv9Ve5x@gSIbo{zbi9qYyEm=HIm^jqd_i_Qp)pr}x$7!-os=rP-Jr3v-QSUT4R#aPQ*s*@eZ1J-2Y~Tt7=kV=kpP7v`6s z3-pN`XF};==$~3`T%;1gb*qgfieM6OohdCZGeYKuBVSC$#hEL-K?0(?u(GzWmTFvF zS-;YMd0~k)B&jK@-?cHlZ8n~sUEG*!*o~)GW|rnOePEOE!I5>Ln~V;-aU~#ga}hQZ z=NgSUX~iVOhmKxYnpwSK>20A9w%($S3o{A5xiWXo)f;OYXL+-Y#YWNJy>gKeasf)Q z%Gg<6y^_7-uG$sBaVD= zhfieOU~h4O^=9=-cyf8Au_TYvmqzCymeKhImfCq%2UZXW(7HV@BnZm2Acytl%FJrR zl5M(uzEP5`l?|4o)yAa_hPJ;r%)P{M7>M;o@viIVR%gzwcieS&ez|{rxqtTj%+h>g zt$f$%rN-s(Wah;u9S)q|IICZNc}ZSD?=7yUgUtn@dXR&-zaN`lTt3^d{Su|Y&H2@t zvuBwE{H~numo+imWPUsTQO4mqof6Y~+`$UdSk2C_E^jd5uFxFk`q!_lG*ahjS7y8J zx|rTE&(pwke)K$xY5M%~>cUk>5Y%{;ffA#x%j>a)rL)UV#~H#b8PSEMbIaz!(%K4x zCb_V-2CdSq=K9;Kji4v>?pl0-XD!Ue-y%fhO7tyj%S-Ns#@U&({qoie@D7m+jVqDG znad6{hl_$yVh4MyL~(z!j?&rR+4m*#B z?-L%=Pm_zo%H44ytO{gyePfMhOKU-Z%wT$D7lo}oyRpa!+*n^exA3&Jb;QxrU+By# z%WqWnlERG1_}~~9%J$;SdP;9CuQG|H8T}c#NdH5f{HxYi8x8-&26R+kXD`C>^{<_0 zhMK~}zz!xBml>zrWV3O>r-M=1j9;9YUuvvd7iSh^?#|3bWy`)evl5Ke2%8CEScMa} zE;i6kQkUnZOg3c|wU?IrgU#sD@_HjHU&2H8uS4HyA?^;2B$lD2=VoRb zDVYcTE2}I*jmxR!)%lsFg{%7QuO(SL=<$AL zF*uk0w$BFpJ5h$rvJC-Z>@3YT)=W03%lX)9W4`fpS{7FXI@UZm*~V(z-`77+QDTEP zU|EM1;y%62eJhJsc;E^Id691B5p1G|;<}ZMwexb5-oMb8qnd2XiV$wCou@)8%M>7s zEcXWMgiqSzs|?1*dTw=jnUU|WT0S{T?l=@#g)Ls)ID5r{k?Nm0%aAhlmK4JgB(CMl zwruG&el4*!Lkr70_#10c`Ax2|rZGa!Q9CEtX70fDrPiR*v*$T;_3D*mu%o3ue>0S^=NB4_bLJXM4}x1l|1u`y zYchAPq}ON}8Mw0z2>xutU0dFe#uW~5b$Kzfwz9}FyS-Al{(+F5Cm2dhyvCv}tY5$8 ze=NNzZ|ZNIpIJPYls5_nYHIDuMTFCSq~DnZzI4g_*O94IZ^L+aK_|QQ3(hz%4c+ z>ofCldThS2o>-q*yC7uVLVepnx>#vAR0{bXz5rS8d}?cN_TpT6Ylp>cVP?tQ+J|&* zJne1mt_bB=I}dBT{j~Lq8&7XPVB;)mo{dC!2gN@P^M^cdub*eKQ1 z@HaPBV(W~Rwb=S9b#rJ2__RRlv%Mz^x4U&tud2zd-HjD<{qlmaP&wg~`k5dwr?cm; z^usjg?>a=ExOX0mZ@?BU&UqV4cQIX@(rettk}Na!wy^1jUDB`bNi&1A*b%IGiEv*w zv>;$Tbuna**b0O`n@uLKUZ&WD>?|=1jHfO}FC$TymuFUGKX!R$efGS4`TWAVKO)&= zdiBdVj{D1?CENX%;WD#qUC`sUpHYNVHn-!*#?pl)+TPo~hCcJJGOsQ#UlfX>f2kB| G@&6lypH_AN literal 0 HcmV?d00001 diff --git a/bin/assets/fonts/nonicons.ttf b/bin/assets/fonts/nonicons.ttf index c14aa53e9b9dafdc147af8831585915ab63e8d3d..7750e22289ea6010af1df384da6bd069b83538dc 100644 GIT binary patch literal 104056 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 literal 95440 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 HRZR4Mkadd( UIGlyphIcon::New( icon.first, mimeIconFont, icon.second ) ); } + if ( codIconFont && codIconFont->loaded() ) { + std::unordered_map codIcons = { + { "symbol-text", 0xea93 }, { "symbol-method", 0xea8c }, + { "symbol-function", 0xea8c }, { "symbol-constructor", 0xea8c }, + { "symbol-field", 0xeb5f }, { "symbol-variable", 0xea88 }, + { "symbol-class", 0xeb5b }, { "symbol-interface", 0xeb61 }, + { "symbol-module", 0xea8b }, { "symbol-property", 0xeb65 }, + { "symbol-unit", 0xea96 }, { "symbol-value", 0xea95 }, + { "symbol-enum", 0xea95 }, { "symbol-keyword", 0xeb62 }, + { "symbol-snippet", 0xeb66 }, { "symbol-color", 0xeb5c }, + { "symbol-file", 0xeb60 }, { "symbol-reference", 0xea94 }, + { "symbol-folder", 0xea83 }, { "symbol-enum-member", 0xeb5e }, + { "symbol-constant", 0xeb5d }, { "symbol-struct", 0xea91 }, + { "symbol-event", 0xea86 }, { "symbol-operator", 0xeb64 }, + { "symbol-type-parameter", 0xea92 }, + }; + + for ( const auto& icon : codIcons ) + iconTheme->add( UIGlyphIcon::New( icon.first, codIconFont, icon.second ) ); + } + mUISceneNode->getUIIconThemeManager()->setCurrentTheme( iconTheme ); UIWidgetCreator::registerWidget( "searchbar", UISearchBar::New ); diff --git a/src/tools/ecode/plugins/autocomplete/autocompleteplugin.cpp b/src/tools/ecode/plugins/autocomplete/autocompleteplugin.cpp index db2b2585f..f8f4bb7e8 100644 --- a/src/tools/ecode/plugins/autocomplete/autocompleteplugin.cpp +++ b/src/tools/ecode/plugins/autocomplete/autocompleteplugin.cpp @@ -18,38 +18,54 @@ namespace ecode { #define AUTO_COMPLETE_THREADED 0 #endif -static std::vector +static json getURIAndPositionJSON( UICodeEditor* editor ) { + json data; + auto doc = editor->getDocumentRef(); + auto sel = doc->getSelection(); + data["uri"] = doc->getURI().toString(); + data["position"] = { { "line", sel.start().line() }, { "character", sel.start().column() } }; + return data; +} + +static AutoCompletePlugin::SymbolsList fuzzyMatchSymbols( const std::vector& symbolsVec, const std::string& match, const size_t& max ) { - std::multimap> matchesMap; - std::vector matches; + AutoCompletePlugin::SymbolsList matches; + matches.reserve( max ); int score; + bool firstHasSortText = !symbolsVec[0]->empty() + ? symbolsVec[0]->at( 0 ).sortText != symbolsVec[0]->at( 0 ).text + : false; for ( const auto& symbols : symbolsVec ) { for ( const auto& symbol : *symbols ) { - if ( ( score = String::fuzzyMatch( symbol, match ) ) > 0 ) { - matchesMap.insert( { score, symbol } ); + if ( ( score = String::fuzzyMatch( symbol.text, match ) ) > 0 || firstHasSortText ) { + if ( std::find( matches.begin(), matches.end(), symbol ) == matches.end() ) { + symbol.setScore( score ); + matches.push_back( symbol ); + } } } + if ( firstHasSortText ) + break; } - std::string prevMatch; - for ( auto& res : matchesMap ) { - if ( matches.size() < max ) { - if ( std::find( matches.begin(), matches.end(), res.second ) == matches.end() ) - matches.emplace_back( res.second ); - } + if ( firstHasSortText ) { + std::sort( matches.begin(), matches.end() ); + } else { + std::sort( matches.begin(), matches.end(), + []( const auto& left, const auto& right ) { return left.score > right.score; } ); } return matches; } -UICodeEditorPlugin* AutoCompletePlugin::New( const PluginManager* pluginManager ) { +UICodeEditorPlugin* AutoCompletePlugin::New( PluginManager* pluginManager ) { return eeNew( AutoCompletePlugin, ( pluginManager ) ); } -AutoCompletePlugin::AutoCompletePlugin( const PluginManager* pluginManager ) : +AutoCompletePlugin::AutoCompletePlugin( PluginManager* pluginManager ) : mManager( pluginManager ), mSymbolPattern( "[%a_ñàáâãäåèéêëìíîïòóôõöùúûüýÿÑÀÁÂÃÄÅÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝ][%w_" "ñàáâãäåèéêëìíîïòóôõöùúûüýÿÑÀÁÂÃÄÅÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝ]*" ), - mBoxPadding( PixelDensity::dpToPx( Rectf( 4, 4, 4, 4 ) ) ), + mBoxPadding( PixelDensity::dpToPx( Rectf( 4, 4, 12, 4 ) ) ), mPool( pluginManager->getThreadPool() ) { mManager->subscribeMessages( this, [&]( const PluginMessage& msg ) -> PluginRequestHandle { return processResponse( msg ); @@ -105,6 +121,12 @@ void AutoCompletePlugin::onRegister( UICodeEditor* editor ) { resetSuggestions( editor ); } ) ); + listeners.push_back( editor->addEventListener( + Event::OnFocusLoss, [&]( const Event* ) { resetSignatureHelp(); } ) ); + + listeners.push_back( editor->addEventListener( + Event::OnDocumentUndoRedo, [&]( const Event* ) { resetSignatureHelp(); } ) ); + listeners.push_back( editor->addEventListener( Event::OnDocumentSyntaxDefinitionChange, [&]( const Event* ev ) { const DocSyntaxDefEvent* event = static_cast( ev ); @@ -134,6 +156,8 @@ void AutoCompletePlugin::onUnregister( UICodeEditor* editor ) { return; if ( mSuggestionsEditor == editor ) resetSuggestions( editor ); + if ( mSignatureHelpEditor == editor ) + resetSignatureHelp(); Lock l( mDocMutex ); TextDocument* doc = mEditorDocs[editor]; auto cbs = mEditors[editor]; @@ -150,6 +174,28 @@ void AutoCompletePlugin::onUnregister( UICodeEditor* editor ) { } bool AutoCompletePlugin::onKeyDown( UICodeEditor* editor, const KeyEvent& event ) { + bool ret = false; + if ( mSignatureHelpVisible ) { + if ( event.getKeyCode() == KEY_ESCAPE ) { + resetSignatureHelp(); + editor->invalidateDraw(); + ret = true; + } else if ( event.getKeyCode() == EE::Window::KEY_BACKSPACE || + event.getKeyCode() == EE::Window::KEY_DELETE ) { + auto lang = editor->getDocumentRef()->getSyntaxDefinition().getLSPName(); + auto cap = mCapabilities.find( lang ); + if ( cap != mCapabilities.end() ) { + auto curChar = event.getKeyCode() == EE::Window::KEY_BACKSPACE + ? editor->getDocumentRef()->getPrevChar() + : editor->getDocumentRef()->getCurrentChar(); + const auto& signatureTrigger = cap->second.signatureHelpProvider.triggerCharacters; + if ( std::find( signatureTrigger.begin(), signatureTrigger.end(), curChar ) != + signatureTrigger.end() ) { + resetSignatureHelp(); + } + } + } + } if ( !mSuggestions.empty() ) { if ( event.getKeyCode() == KEY_DOWN ) { if ( mSuggestionIndex + 1 < (int)mSuggestions.size() ) { @@ -180,6 +226,7 @@ bool AutoCompletePlugin::onKeyDown( UICodeEditor* editor, const KeyEvent& event return true; } else if ( event.getKeyCode() == KEY_ESCAPE ) { resetSuggestions( editor ); + resetSignatureHelp(); editor->invalidateDraw(); return true; } else if ( event.getKeyCode() == KEY_HOME ) { @@ -224,7 +271,25 @@ bool AutoCompletePlugin::onKeyDown( UICodeEditor* editor, const KeyEvent& event updateSuggestions( partialSymbol, editor ); return true; } - return false; + return ret; +} + +void AutoCompletePlugin::requestSignatureHelp( UICodeEditor* editor ) { + mSignatureHelpEditor = editor; + auto doc = editor->getDocumentRef(); + mSignatureHelpPosition = editor->getDocumentRef()->getSelection().start(); + + mPool->run( [&, editor]() { + json data = getURIAndPositionJSON( editor ); + mManager->sendRequest( this, PluginMessageType::SignatureHelp, PluginMessageFormat::JSON, + &data ); + } ); +} + +void AutoCompletePlugin::requestCodeCompletion( UICodeEditor* editor ) { + json data = getURIAndPositionJSON( editor ); + mManager->sendRequest( this, PluginMessageType::CodeCompletion, PluginMessageFormat::JSON, + &data ); } bool AutoCompletePlugin::onTextInput( UICodeEditor* editor, const TextInputEvent& event ) { @@ -233,6 +298,20 @@ bool AutoCompletePlugin::onTextInput( UICodeEditor* editor, const TextInputEvent auto lang = editor->getDocumentRef()->getSyntaxDefinition().getLSPName(); auto cap = mCapabilities.find( lang ); if ( cap != mCapabilities.end() ) { + const auto& signatureTrigger = cap->second.signatureHelpProvider.triggerCharacters; + if ( std::find( signatureTrigger.begin(), signatureTrigger.end(), event.getChar() ) != + signatureTrigger.end() ) { + requestSignatureHelp( editor ); + } + + if ( mSignatureHelpVisible ) { + auto doc = editor->getDocumentRef(); + auto curPos = doc->getSelection().start(); + if ( curPos.line() != mSignatureHelpPosition.line() || + curPos < doc->startOfWord( doc->positionOffset( mSignatureHelpPosition, 1 ) ) ) + resetSignatureHelp(); + } + const auto& triggerCharacters = cap->second.completionProvider.triggerCharacters; if ( partialSymbol.size() >= 1 || std::find( triggerCharacters.begin(), triggerCharacters.end(), event.getChar() ) != @@ -294,48 +373,74 @@ void AutoCompletePlugin::pickSuggestion( UICodeEditor* editor ) { std::string symbol( getPartialSymbol( editor->getDocumentRef().get() ) ); if ( !symbol.empty() ) editor->getDocument().execute( "delete-to-previous-word" ); - editor->getDocument().textInput( mSuggestions[mSuggestionIndex] ); + editor->getDocument().textInput( mSuggestions[mSuggestionIndex].text ); mReplacing = false; resetSuggestions( editor ); } -PluginRequestHandle AutoCompletePlugin::processResponse( const PluginMessage& msg ) { - if ( msg.isResponse() && msg.type == PluginMessageType::CodeCompletion ) { - auto completion = msg.asCodeCompletion(); - SymbolsList suggestions; - for ( const auto& item : completion ) { - if ( !item.textEdit.text.empty() ) - suggestions.push_back( item.textEdit.text ); - else if ( !item.insertText.empty() ) - suggestions.push_back( item.insertText ); - else - suggestions.push_back( item.filterText ); - } - if ( suggestions.empty() || !mSuggestionsEditor ) - return {}; - std::string symbol( getPartialSymbol( mSuggestionsEditor->getDocumentRef().get() ) ); - const std::string& lang = - mSuggestionsEditor->getDocument().getSyntaxDefinition().getLanguageName(); +PluginRequestHandle +AutoCompletePlugin::processCodeCompletion( const std::vector& completion ) { + SymbolsList suggestions; + for ( const auto& item : completion ) { + if ( !item.textEdit.text.empty() ) + suggestions.push_back( { item.kind, item.textEdit.text, item.detail, item.sortText, + item.textEdit.range } ); + else if ( !item.insertText.empty() ) + suggestions.push_back( { item.kind, item.insertText, item.detail, item.sortText } ); + else + suggestions.push_back( { item.kind, item.filterText, item.detail, item.sortText } ); + } + if ( suggestions.empty() || !mSuggestionsEditor ) + return {}; + UICodeEditor* editor = nullptr; + { + Lock l( mSuggestionsEditorMutex ); + editor = mSuggestionsEditor; + } + if ( !editor ) + return {}; + std::string symbol( getPartialSymbol( editor->getDocumentRef().get() ) ); + const std::string& lang = editor->getDocument().getSyntaxDefinition().getLanguageName(); + bool hasLangSuggestions = false; + { Lock l2( mLangSymbolsMutex ); auto langSuggestions = mLangCache.find( lang ); - std::vector fuzzySuggestions; - if ( symbol.empty() ) { - Lock l( mSuggestionsMutex ); - mSuggestions = suggestions; - } else { - if ( langSuggestions == mLangCache.end() ) { - fuzzySuggestions = fuzzyMatchSymbols( { &suggestions }, symbol, - eemax( 100UL, suggestions.size() ) ); - } else { - auto& symbols = langSuggestions->second; - fuzzySuggestions = fuzzyMatchSymbols( { &suggestions, &symbols }, symbol, - eemax( 100UL, suggestions.size() ) ); - } - Lock l( mSuggestionsMutex ); - mSuggestions = fuzzySuggestions; + hasLangSuggestions = langSuggestions == mLangCache.end(); + } + if ( symbol.empty() || hasLangSuggestions ) { + Lock l( mSuggestionsMutex ); + mSuggestions = suggestions; + } else { + SymbolsList fuzzySuggestions; + { + Lock l2( mLangSymbolsMutex ); + auto& symbols = mLangCache[lang]; + fuzzySuggestions = fuzzyMatchSymbols( { &suggestions, &symbols }, symbol, + eemax( 100UL, suggestions.size() ) ); } + Lock l( mSuggestionsMutex ); + mSuggestions = fuzzySuggestions; + } - mSuggestionsEditor->runOnMainThread( [this] { mSuggestionsEditor->invalidateDraw(); } ); + editor->runOnMainThread( [editor] { editor->invalidateDraw(); } ); + + return {}; +} + +PluginRequestHandle +AutoCompletePlugin::processSignatureHelp( const LSPSignatureHelp& signatureHelp ) { + mSignatureHelpVisible = true; + mSignatureHelp = signatureHelp; + if ( mSignatureHelp.signatures.empty() ) + resetSignatureHelp(); + return {}; +} + +PluginRequestHandle AutoCompletePlugin::processResponse( const PluginMessage& msg ) { + if ( msg.isResponse() && msg.type == PluginMessageType::CodeCompletion ) { + return processCodeCompletion( msg.asCodeCompletion() ); + } else if ( msg.isResponse() && msg.type == PluginMessageType::SignatureHelp ) { + return processSignatureHelp( msg.asSignatureHelp() ); } else if ( msg.isBroadcast() && msg.type == PluginMessageType::LanguageServerCapabilities ) { if ( msg.asLanguageServerCapabilities().ready ) { LSPServerCapabilities cap = msg.asLanguageServerCapabilities(); @@ -383,25 +488,52 @@ void AutoCompletePlugin::update( UICodeEditor* ) { void AutoCompletePlugin::postDraw( UICodeEditor* editor, const Vector2f& startScroll, const Float& lineHeight, const TextPosition& cursor ) { - std::vector suggestions; + bool drawsSuggestions = + !( mSuggestions.empty() || !mSuggestionsEditor || mSuggestionsEditor != editor ); + bool drawsSignature = mSignatureHelpVisible && mSignatureHelpEditor == editor && + !mSignatureHelp.signatures.empty() && mSignatureHelpPosition.isValid(); + if ( !drawsSuggestions && !drawsSignature ) + return; + + TextPosition start = + editor->getDocument().startOfWord( editor->getDocument().startOfWord( cursor ) ); + Primitives primitives; + const SyntaxColorScheme& scheme = editor->getColorScheme(); + const auto& normalStyle = scheme.getEditorSyntaxStyle( "suggestion" ); + const auto& selectedStyle = scheme.getEditorSyntaxStyle( "suggestion_selected" ); + + if ( drawsSignature ) { + auto cursig = mSignatureHelp.signatures[mSignatureHelp.activeSignature]; + Vector2f pos( startScroll.x + editor->getXOffsetCol( mSignatureHelpPosition ), + startScroll.y + mSignatureHelpPosition.line() * lineHeight - lineHeight - + mBoxPadding.Top - mBoxPadding.Bottom ); + primitives.setColor( Color( selectedStyle.background ).blendAlpha( editor->getAlpha() ) ); + primitives.drawRoundedRectangle( + Rectf( pos, Sizef( editor->getTextWidth( cursig.label ) + mBoxPadding.Left + + mBoxPadding.Right, + mRowHeight ) ), + 0.f, Vector2f::One, 6 ); + Text text( "", editor->getFont(), editor->getFontSize() ); + text.setFillColor( normalStyle.color ); + text.setStyle( normalStyle.style ); + text.setString( cursig.label ); + text.draw( pos.x + mBoxPadding.Left, pos.y + mBoxPadding.Top ); + } + + if ( !drawsSuggestions ) + return; + + SymbolsList suggestions; { Lock l( mSuggestionsMutex ); - if ( mSuggestions.empty() || !mSuggestionsEditor || mSuggestionsEditor != editor ) - return; suggestions = mSuggestions; } - Primitives primitives; - TextPosition start = - editor->getDocument().startOfWord( editor->getDocument().startOfWord( cursor ) ); Vector2f cursorPos( startScroll.x + editor->getXOffsetCol( start ), startScroll.y + cursor.line() * lineHeight + lineHeight ); size_t largestString = 0; size_t max = eemin( mSuggestionsMaxVisible, suggestions.size() ); - const SyntaxColorScheme& scheme = editor->getColorScheme(); mRowHeight = lineHeight + mBoxPadding.Top + mBoxPadding.Bottom; - const auto& normalStyle = scheme.getEditorSyntaxStyle( "suggestion" ); - const auto& selectedStyle = scheme.getEditorSyntaxStyle( "suggestion_selected" ); const auto& barStyle = scheme.getEditorSyntaxStyle( "suggestion_scrollbar" ); if ( cursorPos.y + mRowHeight * max > editor->getPixelsSize().getHeight() ) cursorPos.y -= lineHeight + mRowHeight * max; @@ -410,31 +542,48 @@ void AutoCompletePlugin::postDraw( UICodeEditor* editor, const Vector2f& startSc eemin( mSuggestionsStartIndex + mSuggestionsMaxVisible, suggestions.size() ); for ( size_t i = mSuggestionsStartIndex; i < maxIndex; i++ ) - largestString = eemax( largestString, editor->getTextWidth( suggestions[i] ) ); - - Sizef bar( PixelDensity::dpToPx( 8 ), - mBoxRect.getSize().getHeight() * - ( mSuggestionsMaxVisible / (Float)suggestions.size() ) ); + largestString = eemax( largestString, editor->getTextWidth( suggestions[i].text ) ); + Sizef bar( PixelDensity::dpToPxI( 6 ), + mRowHeight * max * ( mSuggestionsMaxVisible / (Float)suggestions.size() ) ); + Sizef iconSpace( PixelDensity::dpToPxI( 16 ), mRowHeight ); mBoxRect = Rectf( Vector2f( cursorPos.x, cursorPos.y ) - editor->getScreenPos(), - Sizef( largestString + mBoxPadding.Left + mBoxPadding.Right + bar.getWidth(), + Sizef( largestString + mBoxPadding.Left + mBoxPadding.Right + + iconSpace.getWidth() + bar.getWidth(), mRowHeight * max ) ); size_t count = 0; + Rectf boxRect( { mBoxRect.getPosition() + editor->getScreenPos(), mBoxRect.getSize() } ); + primitives.setColor( Color( normalStyle.background ).blendAlpha( editor->getAlpha() ) ); + primitives.drawRoundedRectangle( boxRect, 0.f, Vector2f::One, 6 ); + for ( size_t i = mSuggestionsStartIndex; i < maxIndex; i++ ) { + if ( mSuggestionIndex == (int)i ) { + primitives.setColor( + Color( selectedStyle.background ).blendAlpha( editor->getAlpha() ) ); + primitives.drawRoundedRectangle( + Rectf( Vector2f( cursorPos.x, cursorPos.y + mRowHeight * count ), + Sizef( mBoxRect.getWidth(), mRowHeight ) ), + 0.f, Vector2f::One, 6 ); + } Text text( "", editor->getFont(), editor->getFontSize() ); text.setFillColor( mSuggestionIndex == (int)i ? selectedStyle.color : normalStyle.color ); text.setStyle( mSuggestionIndex == (int)i ? selectedStyle.style : normalStyle.style ); - text.setString( suggestions[i] ); - primitives.setColor( - Color( mSuggestionIndex == (int)i ? selectedStyle.background : normalStyle.background ) - .blendAlpha( editor->getAlpha() ) ); - primitives.drawRectangle( - Rectf( Vector2f( cursorPos.x, cursorPos.y + mRowHeight * count ), - Sizef( largestString + mBoxPadding.Left + mBoxPadding.Right + bar.getWidth(), - mRowHeight ) ) ); - text.draw( cursorPos.x + mBoxPadding.Left, + text.setString( suggestions[i].text ); + + text.draw( cursorPos.x + iconSpace.getWidth() + mBoxPadding.Left, cursorPos.y + mRowHeight * count + mBoxPadding.Top ); + + Drawable* icon = editor->getUISceneNode()->findIconDrawable( + LSPCompletionItemHelper::toIconString( suggestions[i].kind ), + PixelDensity::dpToPxI( 12 ) ); + + if ( icon ) { + Vector2f padding( + eefloor( ( iconSpace.getWidth() - icon->getSize().getWidth() ) * 0.5f ), + eefloor( ( iconSpace.getHeight() - icon->getSize().getHeight() ) * 0.5f ) ); + icon->draw( { cursorPos.x + padding.x, cursorPos.y + mRowHeight * count + padding.y } ); + } count++; } @@ -442,14 +591,19 @@ void AutoCompletePlugin::postDraw( UICodeEditor* editor, const Vector2f& startSc return; primitives.setColor( barStyle.color ); - Float yPos = mSuggestionsStartIndex > 0 - ? mSuggestionsStartIndex / - (Float)( ( suggestions.size() - 1 ) - mSuggestionsMaxVisible ) - : 0; - primitives.drawRectangle( - { Vector2f( cursorPos.x + mBoxRect.getWidth() - bar.getWidth(), - cursorPos.y + ( mBoxRect.getHeight() - bar.getHeight() ) * yPos ), - bar } ); + Float yPos = + mSuggestionsStartIndex > 0 + ? mSuggestionsStartIndex / (Float)( suggestions.size() - mSuggestionsMaxVisible ) + : 0; + Rectf barRect( { Vector2f( cursorPos.x + mBoxRect.getWidth() - bar.getWidth(), + cursorPos.y + ( mBoxRect.getHeight() - bar.getHeight() ) * yPos ), + bar } ); + if ( bar.getHeight() < 8 ) { + primitives.drawRectangle( barRect ); + } else { + primitives.drawRoundedRectangle( barRect, 0, Vector2f::One, + (int)eefloor( bar.getWidth() * 0.5f ) ); + } } bool AutoCompletePlugin::onMouseDown( UICodeEditor* editor, const Vector2i& position, @@ -457,25 +611,34 @@ bool AutoCompletePlugin::onMouseDown( UICodeEditor* editor, const Vector2i& posi if ( mSuggestions.empty() || !mSuggestionsEditor || mSuggestionsEditor != editor || !( flags & EE_BUTTON_LMASK ) ) return false; - Vector2f localPos( editor->convertToNodeSpace( position.asFloat() ) ); - if ( mBoxRect.contains( localPos ) ) + if ( mBoxRect.contains( localPos ) ) { + localPos -= { mBoxRect.Left, mBoxRect.Top }; + mSuggestionIndex = mSuggestionsStartIndex + localPos.y / mRowHeight; + editor->invalidateDraw(); return true; + } return false; } -bool AutoCompletePlugin::onMouseClick( UICodeEditor* editor, const Vector2i& position, - const Uint32& flags ) { - if ( mSuggestions.empty() || !mSuggestionsEditor || mSuggestionsEditor != editor || - !( flags & EE_BUTTON_LMASK ) ) +bool AutoCompletePlugin::onMouseUp( UICodeEditor* editor, const Vector2i& position, + const Uint32& flags ) { + if ( mSuggestions.empty() || !mSuggestionsEditor || mSuggestionsEditor != editor ) return false; Vector2f localPos( editor->convertToNodeSpace( position.asFloat() ) ); if ( mBoxRect.contains( localPos ) ) { - localPos -= { mBoxRect.Left, mBoxRect.Top }; - mSuggestionIndex = localPos.y / mRowHeight; - editor->invalidateDraw(); - return true; + if ( flags & EE_BUTTON_WUMASK ) { + mSuggestionsStartIndex = eemax( 0, mSuggestionsStartIndex - mSuggestionsMaxVisible ); + editor->invalidateDraw(); + return true; + } else if ( flags & EE_BUTTON_WDMASK ) { + mSuggestionsStartIndex = + eemax( 0, eemin( (int)mSuggestions.size() - mSuggestionsMaxVisible, + mSuggestionsStartIndex + mSuggestionsMaxVisible ) ); + editor->invalidateDraw(); + return true; + } } return false; } @@ -500,10 +663,12 @@ bool AutoCompletePlugin::onMouseMove( UICodeEditor* editor, const Vector2i& posi return false; Vector2f localPos( editor->convertToNodeSpace( position.asFloat() ) ); - if ( mBoxRect.contains( localPos ) ) + if ( mBoxRect.contains( localPos ) ) { editor->getUISceneNode()->setCursor( Cursor::Hand ); - else + return true; + } else { editor->getUISceneNode()->setCursor( !editor->isLocked() ? Cursor::IBeam : Cursor::Arrow ); + } return false; } @@ -551,12 +716,24 @@ void AutoCompletePlugin::resetSuggestions( UICodeEditor* editor ) { Lock l( mSuggestionsMutex ); mSuggestionIndex = 0; mSuggestionsStartIndex = 0; - mSuggestionsEditor = nullptr; + { + Lock l( mSuggestionsEditorMutex ); + mSuggestionsEditor = nullptr; + } mSuggestions.clear(); if ( editor && editor->hasFocus() ) editor->getUISceneNode()->setCursor( !editor->isLocked() ? Cursor::IBeam : Cursor::Arrow ); } +void AutoCompletePlugin::resetSignatureHelp() { + mSignatureHelpVisible = false; + mSignatureHelpEditor = nullptr; + mSignatureHelpPosition = {}; + mSignatureHelp.signatures.clear(); + mSignatureHelp.activeSignature = 0; + mSignatureHelp.activeParameter = 0; +} + AutoCompletePlugin::SymbolsList AutoCompletePlugin::getDocumentSymbols( TextDocument* doc ) { LuaPattern pattern( mSymbolPattern ); AutoCompletePlugin::SymbolsList symbols; @@ -583,17 +760,12 @@ AutoCompletePlugin::SymbolsList AutoCompletePlugin::getDocumentSymbols( TextDocu void AutoCompletePlugin::runUpdateSuggestions( const std::string& symbol, const SymbolsList& symbols, UICodeEditor* editor ) { { - mSuggestionsEditor = editor; - if ( tryRequestCapabilities( editor ) ) { - json data; - auto doc = editor->getDocumentRef(); - auto sel = doc->getSelection(); - data["uri"] = doc->getURI().toString(); - data["position"] = { { "line", sel.start().line() }, - { "character", sel.start().column() } }; - mManager->sendRequest( this, PluginMessageType::CodeCompletion, - PluginMessageFormat::JSON, &data ); + { + Lock l( mSuggestionsEditorMutex ); + mSuggestionsEditor = editor; } + if ( tryRequestCapabilities( editor ) ) + requestCodeCompletion( editor ); if ( symbol.empty() ) return; Lock l( mLangSymbolsMutex ); diff --git a/src/tools/ecode/plugins/autocomplete/autocompleteplugin.hpp b/src/tools/ecode/plugins/autocomplete/autocompleteplugin.hpp index 9377a8fb1..189219b84 100644 --- a/src/tools/ecode/plugins/autocomplete/autocompleteplugin.hpp +++ b/src/tools/ecode/plugins/autocomplete/autocompleteplugin.hpp @@ -18,7 +18,38 @@ namespace ecode { class AutoCompletePlugin : public UICodeEditorPlugin { public: - typedef std::vector SymbolsList; + class Suggestion { + public: + LSPCompletionItemKind kind{ LSPCompletionItemKind::Text }; + std::string text; + std::string detail; + std::string sortText; + TextRange range; + double score{ 0 }; + + void setScore( const double& score ) const { + const_cast( this )->score = score; + } + + Suggestion( const std::string& text ) : text( text ), sortText( text ) {} + + Suggestion( const LSPCompletionItemKind& kind, const std::string& text, + const std::string& detail, const std::string& sortText, + const TextRange& range = {} ) : + kind( kind ), + text( text ), + detail( detail ), + sortText( sortText.empty() ? text : sortText ), + range( range ){}; + + bool operator<( const Suggestion& other ) { return getCmpStr() < other.getCmpStr(); } + + bool operator==( const Suggestion& other ) { return text == other.text; } + + protected: + const std::string* getCmpStr() const { return !sortText.empty() ? &sortText : &text; } + }; + typedef std::vector SymbolsList; static PluginDefinition Definition() { return { "autocomplete", @@ -29,7 +60,7 @@ class AutoCompletePlugin : public UICodeEditorPlugin { { 0, 1, 0 } }; } - static UICodeEditorPlugin* New( const PluginManager* pluginManager ); + static UICodeEditorPlugin* New( PluginManager* pluginManager ); virtual ~AutoCompletePlugin(); @@ -49,7 +80,7 @@ class AutoCompletePlugin : public UICodeEditorPlugin { void postDraw( UICodeEditor*, const Vector2f& startScroll, const Float& lineHeight, const TextPosition& cursor ); bool onMouseDown( UICodeEditor*, const Vector2i&, const Uint32& ); - bool onMouseClick( UICodeEditor*, const Vector2i&, const Uint32& ); + bool onMouseUp( UICodeEditor*, const Vector2i&, const Uint32& ); bool onMouseDoubleClick( UICodeEditor*, const Vector2i&, const Uint32& ); bool onMouseMove( UICodeEditor*, const Vector2i&, const Uint32& ); @@ -74,13 +105,7 @@ class AutoCompletePlugin : public UICodeEditorPlugin { void setDirty( bool dirty ); protected: - struct Suggestion { - std::string text; - std::string desc; - std::string sortText; - TextRange range; - }; - const PluginManager* mManager{ nullptr }; + PluginManager* mManager{ nullptr }; std::string mSymbolPattern; Rectf mBoxPadding; std::shared_ptr mPool; @@ -95,6 +120,7 @@ class AutoCompletePlugin : public UICodeEditorPlugin { bool mDirty{ false }; bool mClosing{ false }; bool mReplacing{ false }; + bool mSignatureHelpVisible{ false }; struct DocCache { Uint64 changeId{ static_cast( -1 ) }; SymbolsList symbols; @@ -103,18 +129,22 @@ class AutoCompletePlugin : public UICodeEditorPlugin { std::unordered_map mLangCache; SymbolsList mLangDirty; - std::vector mSuggestions; + std::vector mSuggestions; + Mutex mSuggestionsEditorMutex; UICodeEditor* mSuggestionsEditor{ nullptr }; + UICodeEditor* mSignatureHelpEditor{ nullptr }; Int32 mSuggestionIndex{ 0 }; Int32 mSuggestionsMaxVisible{ 8 }; Int32 mSuggestionsStartIndex{ 0 }; std::map mCapabilities; Mutex mCapabilitiesMutex; + LSPSignatureHelp mSignatureHelp; + TextPosition mSignatureHelpPosition; Float mRowHeight{ 0 }; Rectf mBoxRect; - AutoCompletePlugin( const PluginManager* pluginManager ); + AutoCompletePlugin( PluginManager* pluginManager ); void resetSuggestions( UICodeEditor* editor ); @@ -136,6 +166,16 @@ class AutoCompletePlugin : public UICodeEditorPlugin { PluginRequestHandle processResponse( const PluginMessage& msg ); bool tryRequestCapabilities( UICodeEditor* editor ); + + void requestCodeCompletion( UICodeEditor* editor ); + + void requestSignatureHelp( UICodeEditor* editor ); + + PluginRequestHandle processCodeCompletion( const std::vector& completion ); + + PluginRequestHandle processSignatureHelp( const LSPSignatureHelp& signatureHelp ); + + void resetSignatureHelp(); }; } // namespace ecode diff --git a/src/tools/ecode/plugins/formatter/formatterplugin.cpp b/src/tools/ecode/plugins/formatter/formatterplugin.cpp index 67d3d1f70..d7c5d66f4 100644 --- a/src/tools/ecode/plugins/formatter/formatterplugin.cpp +++ b/src/tools/ecode/plugins/formatter/formatterplugin.cpp @@ -22,11 +22,11 @@ namespace ecode { #define FORMATTER_THREADED 0 #endif -UICodeEditorPlugin* FormatterPlugin::New( const PluginManager* pluginManager ) { +UICodeEditorPlugin* FormatterPlugin::New( PluginManager* pluginManager ) { return eeNew( FormatterPlugin, ( pluginManager ) ); } -FormatterPlugin::FormatterPlugin( const PluginManager* pluginManager ) : +FormatterPlugin::FormatterPlugin( PluginManager* pluginManager ) : mPool( pluginManager->getThreadPool() ) { #if FORMATTER_THREADED mPool->run( [&, pluginManager] { load( pluginManager ); }, [] {} ); @@ -183,7 +183,7 @@ void FormatterPlugin::loadFormatterConfig( const std::string& path ) { } } -void FormatterPlugin::load( const PluginManager* pluginManager ) { +void FormatterPlugin::load( PluginManager* pluginManager ) { registerNativeFormatters(); std::vector paths; diff --git a/src/tools/ecode/plugins/formatter/formatterplugin.hpp b/src/tools/ecode/plugins/formatter/formatterplugin.hpp index a521477fc..5cf79c908 100644 --- a/src/tools/ecode/plugins/formatter/formatterplugin.hpp +++ b/src/tools/ecode/plugins/formatter/formatterplugin.hpp @@ -29,7 +29,7 @@ class FormatterPlugin : public UICodeEditorPlugin { { 0, 1, 0 } }; } - static UICodeEditorPlugin* New( const PluginManager* pluginManager ); + static UICodeEditorPlugin* New( PluginManager* pluginManager ); virtual ~FormatterPlugin(); @@ -84,9 +84,9 @@ class FormatterPlugin : public UICodeEditorPlugin { bool mReady{ false }; Uint32 mOnDocumentSaveCb{ 0 }; - FormatterPlugin( const PluginManager* pluginManager ); + FormatterPlugin( PluginManager* pluginManager ); - void load( const PluginManager* pluginManager ); + void load( PluginManager* pluginManager ); void loadFormatterConfig( const std::string& path ); diff --git a/src/tools/ecode/plugins/linter/linterplugin.cpp b/src/tools/ecode/plugins/linter/linterplugin.cpp index 78012c7fe..77cbf855c 100644 --- a/src/tools/ecode/plugins/linter/linterplugin.cpp +++ b/src/tools/ecode/plugins/linter/linterplugin.cpp @@ -22,11 +22,11 @@ namespace ecode { #define LINTER_THREADED 0 #endif -UICodeEditorPlugin* LinterPlugin::New( const PluginManager* pluginManager ) { +UICodeEditorPlugin* LinterPlugin::New( PluginManager* pluginManager ) { return eeNew( LinterPlugin, ( pluginManager ) ); } -LinterPlugin::LinterPlugin( const PluginManager* pluginManager ) : +LinterPlugin::LinterPlugin( PluginManager* pluginManager ) : mManager( pluginManager ), mPool( pluginManager->getThreadPool() ) { #if LINTER_THREADED mPool->run( [&, pluginManager] { load( pluginManager ); }, [] {} ); @@ -301,7 +301,7 @@ TextDocument* LinterPlugin::getDocumentFromURI( const URI& uri ) { return nullptr; } -void LinterPlugin::load( const PluginManager* pluginManager ) { +void LinterPlugin::load( PluginManager* pluginManager ) { pluginManager->subscribeMessages( this, [&]( const auto& notification ) -> PluginRequestHandle { return processMessage( notification ); } ); @@ -727,6 +727,7 @@ bool LinterPlugin::onMouseMove( UICodeEditor* editor, const Vector2i& pos, const mHoveringMatch = true; editor->runOnMainThread( [&, editor] { editor->setTooltipText( match.text ); + editor->getTooltip()->setHorizontalAlign( UI_HALIGN_LEFT ); editor->getTooltip()->setDontAutoHideOnMouseMove( true ); editor->getTooltip()->setPixelsPosition( Vector2f( pos.x, pos.y ) ); if ( !editor->getTooltip()->isVisible() ) diff --git a/src/tools/ecode/plugins/linter/linterplugin.hpp b/src/tools/ecode/plugins/linter/linterplugin.hpp index d89af8fd0..8205909f0 100644 --- a/src/tools/ecode/plugins/linter/linterplugin.hpp +++ b/src/tools/ecode/plugins/linter/linterplugin.hpp @@ -55,7 +55,7 @@ class LinterPlugin : public UICodeEditorPlugin { LinterPlugin::New, { 0, 1, 0 } }; } - static UICodeEditorPlugin* New( const PluginManager* pluginManager ); + static UICodeEditorPlugin* New( PluginManager* pluginManager ); virtual ~LinterPlugin(); @@ -96,7 +96,7 @@ class LinterPlugin : public UICodeEditorPlugin { void setEnableLSPDiagnostics( bool enableLSPDiagnostics ); protected: - const PluginManager* mManager{ nullptr }; + PluginManager* mManager{ nullptr }; std::shared_ptr mPool; std::vector mLinters; std::unordered_map> mEditors; @@ -119,9 +119,9 @@ class LinterPlugin : public UICodeEditorPlugin { std::set mLanguagesDisabled; std::set mLSPLanguagesDisabled; - LinterPlugin( const PluginManager* pluginManager ); + LinterPlugin( PluginManager* pluginManager ); - void load( const PluginManager* pluginManager ); + void load( PluginManager* pluginManager ); void lintDoc( std::shared_ptr doc ); diff --git a/src/tools/ecode/plugins/lsp/lspclientplugin.cpp b/src/tools/ecode/plugins/lsp/lspclientplugin.cpp index 067d7d937..dddc7ab51 100644 --- a/src/tools/ecode/plugins/lsp/lspclientplugin.cpp +++ b/src/tools/ecode/plugins/lsp/lspclientplugin.cpp @@ -13,11 +13,11 @@ using json = nlohmann::json; namespace ecode { -UICodeEditorPlugin* LSPClientPlugin::New( const PluginManager* pluginManager ) { +UICodeEditorPlugin* LSPClientPlugin::New( PluginManager* pluginManager ) { return eeNew( LSPClientPlugin, ( pluginManager ) ); } -LSPClientPlugin::LSPClientPlugin( const PluginManager* pluginManager ) : +LSPClientPlugin::LSPClientPlugin( PluginManager* pluginManager ) : mManager( pluginManager ), mThreadPool( pluginManager->getThreadPool() ) { mThreadPool->run( [&, pluginManager] { load( pluginManager ); }, [] {} ); } @@ -48,11 +48,12 @@ void LSPClientPlugin::update( UICodeEditor* ) { mClientManager.updateDirty(); } -PluginRequestHandle LSPClientPlugin::processCodeCompletionRequest( const PluginMessage& msg ) { - if ( !msg.isRequest() || !msg.isJSON() ) - return {}; +struct LSPPositionAndServer { + LSPPosition loc; + LSPClientServer* server{ nullptr }; +}; - const auto& data = msg.asJSON(); +LSPPositionAndServer getLSPLocationFromJSON( LSPClientServerManager& manager, const json& data ) { if ( !data.contains( "uri" ) || !data.contains( "position" ) ) return {}; @@ -61,12 +62,23 @@ PluginRequestHandle LSPClientPlugin::processCodeCompletionRequest( const PluginM return {}; URI uri( data["uri"] ); - auto server = mClientManager.getOneLSPClientServer( uri ); + auto server = manager.getOneLSPClientServer( uri ); if ( !server ) return {}; + return { { uri, position }, server }; +} - auto ret = server->documentCompletion( - uri, position, [&]( const PluginIDType& id, const std::vector& items ) { +PluginRequestHandle LSPClientPlugin::processCodeCompletionRequest( const PluginMessage& msg ) { + if ( !msg.isRequest() || !msg.isJSON() ) + return {}; + + auto res = getLSPLocationFromJSON( mClientManager, msg.asJSON() ); + if ( !res.server ) + return {}; + + auto ret = res.server->documentCompletion( + res.loc.uri, res.loc.pos, + [&]( const PluginIDType& id, const std::vector& items ) { mManager->sendResponse( this, PluginMessageType::CodeCompletion, PluginMessageFormat::CodeCompletion, &items, id ); } ); @@ -74,6 +86,23 @@ PluginRequestHandle LSPClientPlugin::processCodeCompletionRequest( const PluginM return ret; } +PluginRequestHandle LSPClientPlugin::processSignatureHelpRequest( const PluginMessage& msg ) { + if ( !msg.isRequest() || !msg.isJSON() ) + return {}; + + auto res = getLSPLocationFromJSON( mClientManager, msg.asJSON() ); + if ( !res.server ) + return {}; + + auto ret = res.server->signatureHelp( + res.loc.uri, res.loc.pos, [&]( const PluginIDType& id, const LSPSignatureHelp& data ) { + mManager->sendResponse( this, PluginMessageType::SignatureHelp, + PluginMessageFormat::SignatureHelp, &data, id ); + } ); + + return ret; +} + PluginRequestHandle LSPClientPlugin::processMessage( const PluginMessage& msg ) { switch ( msg.type ) { case PluginMessageType::WorkspaceFolderChanged: { @@ -86,6 +115,12 @@ PluginRequestHandle LSPClientPlugin::processMessage( const PluginMessage& msg ) return ret; break; } + case PluginMessageType::SignatureHelp: { + auto ret = processSignatureHelpRequest( msg ); + if ( !ret.isEmpty() ) + return ret; + break; + } case PluginMessageType::LanguageServerCapabilities: { if ( msg.isRequest() && msg.isJSON() ) { const auto& data = msg.asJSON(); @@ -108,7 +143,7 @@ PluginRequestHandle LSPClientPlugin::processMessage( const PluginMessage& msg ) return PluginRequestHandle::empty(); } -void LSPClientPlugin::load( const PluginManager* pluginManager ) { +void LSPClientPlugin::load( PluginManager* pluginManager ) { pluginManager->subscribeMessages( this, [&]( const auto& notification ) -> PluginRequestHandle { return processMessage( notification ); } ); @@ -361,7 +396,7 @@ void LSPClientPlugin::onUnregister( UICodeEditor* editor ) { mDocs.erase( doc ); } -const PluginManager* LSPClientPlugin::getManager() const { +PluginManager* LSPClientPlugin::getManager() const { return mManager; } diff --git a/src/tools/ecode/plugins/lsp/lspclientplugin.hpp b/src/tools/ecode/plugins/lsp/lspclientplugin.hpp index 8acafb3f3..1a99b89c0 100644 --- a/src/tools/ecode/plugins/lsp/lspclientplugin.hpp +++ b/src/tools/ecode/plugins/lsp/lspclientplugin.hpp @@ -29,7 +29,7 @@ class LSPClientPlugin : public UICodeEditorPlugin { { 0, 0, 1 } }; } - static UICodeEditorPlugin* New( const PluginManager* pluginManager ); + static UICodeEditorPlugin* New( PluginManager* pluginManager ); virtual ~LSPClientPlugin(); @@ -49,7 +49,7 @@ class LSPClientPlugin : public UICodeEditorPlugin { const std::unordered_map& getEditorDocs() { return mEditorDocs; }; - const PluginManager* getManager() const; + PluginManager* getManager() const; virtual bool onCreateContextMenu( UICodeEditor* editor, UIPopUpMenu* menu, const Vector2i& position, const Uint32& flags ); @@ -67,7 +67,7 @@ class LSPClientPlugin : public UICodeEditorPlugin { const LSPClientServerManager& getClientManager() const; protected: - const PluginManager* mManager{ nullptr }; + PluginManager* mManager{ nullptr }; std::shared_ptr mThreadPool; Clock mClock; Mutex mDocMutex; @@ -85,9 +85,9 @@ class LSPClientPlugin : public UICodeEditorPlugin { LSPHover mCurrentHover; Time mHoverDelay{ Seconds( 1.f ) }; - LSPClientPlugin( const PluginManager* pluginManager ); + LSPClientPlugin( PluginManager* pluginManager ); - void load( const PluginManager* pluginManager ); + void load( PluginManager* pluginManager ); void loadLSPConfig( std::vector& lsps, const std::string& path ); @@ -97,6 +97,8 @@ class LSPClientPlugin : public UICodeEditorPlugin { PluginRequestHandle processMessage( const PluginMessage& msg ); PluginRequestHandle processCodeCompletionRequest( const PluginMessage& msg ); + + PluginRequestHandle processSignatureHelpRequest( const PluginMessage& msg ); }; } // namespace ecode diff --git a/src/tools/ecode/plugins/lsp/lspclientserver.cpp b/src/tools/ecode/plugins/lsp/lspclientserver.cpp index 4c7b53dfe..86af6b444 100644 --- a/src/tools/ecode/plugins/lsp/lspclientserver.cpp +++ b/src/tools/ecode/plugins/lsp/lspclientserver.cpp @@ -631,29 +631,33 @@ static std::vector parseDocumentCompletion( const json& resul std::vector ret; if ( result.empty() ) return {}; - const json& items = - ( result.is_object() && result.contains( "items" ) ) ? result["items"] : result; + try { + const json& items = + ( result.is_object() && result.contains( "items" ) ) ? result["items"] : result; - for ( const auto& item : items ) { - auto label = item.value( MEMBER_LABEL, "" ); - auto detail = item.value( MEMBER_DETAIL, "" ); - LSPMarkupContent doc = item.contains( MEMBER_DOCUMENTATION ) - ? parseMarkupContent( item.at( MEMBER_DOCUMENTATION ) ) - : LSPMarkupContent{}; - auto filterText = item.value( "filterText", label ); - auto insertText = item.value( "insertText", label ); - auto sortText = item.value( "sortText", label ); - LSPTextEdit textEdit; - if ( item.contains( "textEdit" ) ) - textEdit = parseTextEdit( item["textEdit"] ); - auto kind = static_cast( item.value( MEMBER_KIND, 1 ) ); - const std::vector additionalTextEdits = - item.contains( "additionalTextEdits" ) - ? parseTextEditArray( item.at( "additionalTextEdits" ) ) - : std::vector{}; + for ( const auto& item : items ) { + auto label = item.value( MEMBER_LABEL, "" ); + auto detail = item.value( MEMBER_DETAIL, "" ); + LSPMarkupContent doc = item.contains( MEMBER_DOCUMENTATION ) + ? parseMarkupContent( item.at( MEMBER_DOCUMENTATION ) ) + : LSPMarkupContent{}; + auto filterText = item.value( "filterText", label ); + auto insertText = item.value( "insertText", label ); + auto sortText = item.value( "sortText", label ); + LSPTextEdit textEdit; + if ( item.contains( "textEdit" ) ) + textEdit = parseTextEdit( item["textEdit"] ); + auto kind = static_cast( item.value( MEMBER_KIND, 1 ) ); + const std::vector additionalTextEdits = + item.contains( "additionalTextEdits" ) + ? parseTextEditArray( item.at( "additionalTextEdits" ) ) + : std::vector{}; - ret.push_back( { label, kind, detail, doc, sortText, insertText, filterText, textEdit, - additionalTextEdits } ); + ret.push_back( { label, kind, detail, doc, sortText, insertText, filterText, textEdit, + additionalTextEdits } ); + } + } catch ( const json::exception& err ) { + Log::warning( "Error parsing parseDocumentCompletion: %s", err.what() ); } return ret; } @@ -662,7 +666,8 @@ static LSPSignatureInformation parseSignatureInformation( const json& json ) { LSPSignatureInformation info; info.label = json.value( MEMBER_LABEL, "" ); - info.documentation = parseMarkupContent( json.value( MEMBER_DOCUMENTATION, {} ) ); + if ( json.contains( MEMBER_DOCUMENTATION ) ) + info.documentation = parseMarkupContent( json.at( MEMBER_DOCUMENTATION ) ); const auto& params = json.at( "parameters" ); for ( const auto& par : params ) { auto label = par.at( MEMBER_LABEL ); @@ -692,16 +697,21 @@ static LSPSignatureInformation parseSignatureInformation( const json& json ) { static LSPSignatureHelp parseSignatureHelp( const json& sig ) { LSPSignatureHelp ret; - const auto& sigInfos = sig.at( "signatures" ); - for ( const auto& info : sigInfos ) - ret.signatures.push_back( parseSignatureInformation( info ) ); - ret.activeSignature = sig.value( "activeSignature", 0 ); - ret.activeParameter = sig.value( "activeParameter", 0 ); - ret.activeSignature = eemin( eemax( ret.activeSignature, 0 ), (int)ret.signatures.size() ); - ret.activeParameter = eemax( ret.activeParameter, 0 ); - if ( !ret.signatures.empty() ) { - ret.activeParameter = eemin( - ret.activeParameter, (int)ret.signatures.at( ret.activeSignature ).parameters.size() ); + try { + const auto& sigInfos = sig.at( "signatures" ); + for ( const auto& info : sigInfos ) + ret.signatures.push_back( parseSignatureInformation( info ) ); + ret.activeSignature = sig.value( "activeSignature", 0 ); + ret.activeParameter = sig.value( "activeParameter", 0 ); + ret.activeSignature = eemin( eemax( ret.activeSignature, 0 ), (int)ret.signatures.size() ); + ret.activeParameter = eemax( ret.activeParameter, 0 ); + if ( !ret.signatures.empty() ) { + ret.activeParameter = + eemin( ret.activeParameter, + (int)ret.signatures.at( ret.activeSignature ).parameters.size() ); + } + } catch ( const json::exception& err ) { + Log::warning( "Error parsing parseSignatureHelp: %s", err.what() ); } return ret; } @@ -1293,8 +1303,7 @@ LSPClientServer::LSPRequestHandle LSPClientServer::switchSourceHeader( const URI return send( newRequest( "textDocument/switchSourceHeader", textDocumentURI( document ) ), [this]( const IdType&, json res ) { if ( res.is_string() ) { - mManager->goToLocation( - { res.get(), TextRange{ { 0, 0 }, { 0, 0 } } } ); + mManager->goToLocation( { res.get(), TextRange() } ); } } ); } diff --git a/src/tools/ecode/plugins/lsp/lspclientservermanager.cpp b/src/tools/ecode/plugins/lsp/lspclientservermanager.cpp index d934d4548..3cb0aef7f 100644 --- a/src/tools/ecode/plugins/lsp/lspclientservermanager.cpp +++ b/src/tools/ecode/plugins/lsp/lspclientservermanager.cpp @@ -8,7 +8,7 @@ namespace ecode { LSPClientServerManager::LSPClientServerManager() {} -void LSPClientServerManager::load( LSPClientPlugin* plugin, const PluginManager* pluginManager, +void LSPClientServerManager::load( LSPClientPlugin* plugin, PluginManager* pluginManager, std::vector&& lsps ) { mPlugin = plugin; mPluginManager = pluginManager; @@ -117,15 +117,17 @@ void LSPClientServerManager::goToLocation( const LSPLocation& loc ) { std::string path( loc.uri.getPath() ); FileInfo fileInfo( path ); if ( fileInfo.exists() && fileInfo.isRegularFile() ) { - splitter->loadAsyncFileFromPathInNewTab( path, mThreadPool, - [loc]( UICodeEditor* editor, auto ) { - editor->goToLine( loc.range.start() ); - editor->setFocus(); - } ); + splitter->loadAsyncFileFromPathInNewTab( + path, mThreadPool, [loc]( UICodeEditor* editor, auto ) { + if ( loc.range.isValid() ) + editor->goToLine( loc.range.start() ); + editor->setFocus(); + } ); } } else { tab->getTabWidget()->setTabSelected( tab ); - splitter->editorFromTab( tab )->goToLine( loc.range.start() ); + if ( loc.range.isValid() ) + splitter->editorFromTab( tab )->goToLine( loc.range.start() ); splitter->editorFromTab( tab )->setFocus(); } } ); @@ -169,7 +171,7 @@ void LSPClientServerManager::getAndGoToLocation( const std::shared_ptrgetAndGoToLocation( doc->getURI(), doc->getSelection().start(), search ); } -const PluginManager* LSPClientServerManager::getPluginManager() const { +PluginManager* LSPClientServerManager::getPluginManager() const { return mPluginManager; } diff --git a/src/tools/ecode/plugins/lsp/lspclientservermanager.hpp b/src/tools/ecode/plugins/lsp/lspclientservermanager.hpp index 1308ec199..80977ddcc 100644 --- a/src/tools/ecode/plugins/lsp/lspclientservermanager.hpp +++ b/src/tools/ecode/plugins/lsp/lspclientservermanager.hpp @@ -16,8 +16,7 @@ class LSPClientServerManager { public: LSPClientServerManager(); - void load( LSPClientPlugin*, const PluginManager* pluginManager, - std::vector&& lsps ); + void load( LSPClientPlugin*, PluginManager* pluginManager, std::vector&& lsps ); // async void run( const std::shared_ptr& doc ); @@ -55,13 +54,13 @@ class LSPClientServerManager { void getAndGoToLocation( const std::shared_ptr& doc, const std::string& search ); - const PluginManager* getPluginManager() const; + PluginManager* getPluginManager() const; LSPClientPlugin* getPlugin() const; protected: friend class LSPClientServer; - const PluginManager* mPluginManager{ nullptr }; + PluginManager* mPluginManager{ nullptr }; LSPClientPlugin* mPlugin{ nullptr }; std::shared_ptr mThreadPool; std::map> mClients; diff --git a/src/tools/ecode/plugins/lsp/lspprotocol.hpp b/src/tools/ecode/plugins/lsp/lspprotocol.hpp index 41ffd7800..022038a7b 100644 --- a/src/tools/ecode/plugins/lsp/lspprotocol.hpp +++ b/src/tools/ecode/plugins/lsp/lspprotocol.hpp @@ -31,6 +31,11 @@ enum class LSPErrorCode { ContentModified = -32801 }; +struct LSPPosition { + URI uri; + TextPosition pos; +}; + struct LSPLocation { URI uri; TextRange range; @@ -287,6 +292,65 @@ enum class LSPCompletionItemKind { TypeParameter = 25, }; +class LSPCompletionItemHelper { + public: + static std::string toIconString( const LSPCompletionItemKind& kind ) { + switch ( kind ) { + case LSPCompletionItemKind::Text: + return "symbol-text"; + case LSPCompletionItemKind::Method: + return "symbol-method"; + case LSPCompletionItemKind::Function: + return "symbol-function"; + case LSPCompletionItemKind::Constructor: + return "symbol-constructor"; + case LSPCompletionItemKind::Field: + return "symbol-field"; + case LSPCompletionItemKind::Variable: + return "symbol-variable"; + case LSPCompletionItemKind::Class: + return "symbol-class"; + case LSPCompletionItemKind::Interface: + return "symbol-interface"; + case LSPCompletionItemKind::Module: + return "symbol-module"; + case LSPCompletionItemKind::Property: + return "symbol-property"; + case LSPCompletionItemKind::Unit: + return "symbol-unit"; + case LSPCompletionItemKind::Value: + return "symbol-value"; + case LSPCompletionItemKind::Enum: + return "symbol-enum"; + case LSPCompletionItemKind::Keyword: + return "symbol-keyword"; + case LSPCompletionItemKind::Snippet: + return "symbol-snippet"; + case LSPCompletionItemKind::Color: + return "symbol-color"; + case LSPCompletionItemKind::File: + return "symbol-file"; + case LSPCompletionItemKind::Reference: + return "symbol-reference"; + case LSPCompletionItemKind::Folder: + return "symbol-folder"; + case LSPCompletionItemKind::EnumMember: + return "symbol-enum-member"; + case LSPCompletionItemKind::Constant: + return "symbol-constant"; + case LSPCompletionItemKind::Struct: + return "symbol-struct"; + case LSPCompletionItemKind::Event: + return "symbol-event"; + case LSPCompletionItemKind::Operator: + return "symbol-operator"; + case LSPCompletionItemKind::TypeParameter: + return "symbol-type-parameter"; + } + return "symbol-text"; + } +}; + struct LSPCompletionItem { std::string label; LSPCompletionItemKind kind; diff --git a/src/tools/ecode/plugins/pluginmanager.cpp b/src/tools/ecode/plugins/pluginmanager.cpp index 8db2673c0..a583599f7 100644 --- a/src/tools/ecode/plugins/pluginmanager.cpp +++ b/src/tools/ecode/plugins/pluginmanager.cpp @@ -41,7 +41,10 @@ bool PluginManager::setEnabled( const std::string& id, bool enable ) { } if ( !enable && plugin != nullptr ) { eeSAFE_DELETE( plugin ); - mSubscribedPlugins.erase( id ); + { + Lock l( mSubscribedPluginsMutex ); + mSubscribedPlugins.erase( id ); + } mPlugins.erase( id ); } return false; @@ -111,10 +114,15 @@ void PluginManager::setWorkspaceFolder( const std::string& workspaceFolder ) { PluginRequestHandle PluginManager::sendRequest( UICodeEditorPlugin* pluginWho, PluginMessageType type, PluginMessageFormat format, - const void* data ) const { + const void* data ) { if ( mClosing ) return PluginRequestHandle::empty(); - for ( const auto& plugin : mSubscribedPlugins ) { + SubscribedPlugins subscribedPlugins; + { + Lock l( mSubscribedPluginsMutex ); + subscribedPlugins = mSubscribedPlugins; + } + for ( const auto& plugin : subscribedPlugins ) { if ( pluginWho->getId() != plugin.first ) { auto handle = plugin.second( { type, format, data } ); if ( !handle.isEmpty() ) @@ -126,36 +134,50 @@ PluginRequestHandle PluginManager::sendRequest( UICodeEditorPlugin* pluginWho, void PluginManager::sendResponse( UICodeEditorPlugin* pluginWho, PluginMessageType type, PluginMessageFormat format, const void* data, - const PluginIDType& responseID ) const { + const PluginIDType& responseID ) { if ( mClosing ) return; - for ( const auto& plugin : mSubscribedPlugins ) + SubscribedPlugins subscribedPlugins; + { + Lock l( mSubscribedPluginsMutex ); + subscribedPlugins = mSubscribedPlugins; + } + for ( const auto& plugin : subscribedPlugins ) if ( pluginWho->getId() != plugin.first ) plugin.second( { type, format, data, responseID } ); } void PluginManager::sendBroadcast( UICodeEditorPlugin* pluginWho, PluginMessageType type, - PluginMessageFormat format, const void* data ) const { + PluginMessageFormat format, const void* data ) { if ( mClosing ) return; - for ( const auto& plugin : mSubscribedPlugins ) + SubscribedPlugins subscribedPlugins; + { + Lock l( mSubscribedPluginsMutex ); + subscribedPlugins = mSubscribedPlugins; + } + for ( const auto& plugin : subscribedPlugins ) if ( pluginWho->getId() != plugin.first ) plugin.second( { type, format, data, -1 } ); } void PluginManager::subscribeMessages( - UICodeEditorPlugin* plugin, - std::function cb ) const { - const_cast( this )->mSubscribedPlugins[plugin->getId()] = cb; + UICodeEditorPlugin* plugin, std::function cb ) { + { + Lock l( mSubscribedPluginsMutex ); + mSubscribedPlugins[plugin->getId()] = cb; + } if ( !mWorkspaceFolder.empty() ) { json data{ { "folder", mWorkspaceFolder } }; cb( { PluginMessageType::WorkspaceFolderChanged, PluginMessageFormat::JSON, &data } ); } } -void PluginManager::unsubscribeMessages( UICodeEditorPlugin* plugin ) const { - if ( !mClosing ) - const_cast( this )->mSubscribedPlugins.erase( plugin->getId() ); +void PluginManager::unsubscribeMessages( UICodeEditorPlugin* plugin ) { + if ( !mClosing ) { + Lock l( mSubscribedPluginsMutex ); + mSubscribedPlugins.erase( plugin->getId() ); + } } void PluginManager::setSplitter( UICodeEditorSplitter* splitter ) { @@ -166,7 +188,12 @@ void PluginManager::sendBroadcast( const PluginMessageType& notification, const PluginMessageFormat& format, void* data ) { if ( mClosing ) return; - for ( const auto& plugin : mSubscribedPlugins ) + SubscribedPlugins subscribedPlugins; + { + Lock l( mSubscribedPluginsMutex ); + subscribedPlugins = mSubscribedPlugins; + } + for ( const auto& plugin : subscribedPlugins ) plugin.second( { notification, format, data } ); } diff --git a/src/tools/ecode/plugins/pluginmanager.hpp b/src/tools/ecode/plugins/pluginmanager.hpp index 3f0aefc06..7a355f752 100644 --- a/src/tools/ecode/plugins/pluginmanager.hpp +++ b/src/tools/ecode/plugins/pluginmanager.hpp @@ -21,7 +21,7 @@ namespace ecode { class PluginManager; -typedef std::function PluginCreatorFn; +typedef std::function PluginCreatorFn; #ifdef minor #undef minor @@ -63,10 +63,17 @@ enum class PluginMessageType { // and position LanguageServerCapabilities, // Request the language server capabilities of a language if there // is any available, it will be returned as a broadcast + SignatureHelp, // Request the LSP Client to provide function/method signature help Undefined }; -enum class PluginMessageFormat { JSON, Diagnostics, CodeCompletion, LanguageServerCapabilities }; +enum class PluginMessageFormat { + JSON, + Diagnostics, + CodeCompletion, + LanguageServerCapabilities, + SignatureHelp +}; using PluginIDType = Int64; @@ -94,6 +101,10 @@ struct PluginMessage { return *static_cast( data ); } + const LSPSignatureHelp& asSignatureHelp() const { + return *static_cast( data ); + } + bool isResponse() const { return -1 != responseID && 0 != responseID; } bool isRequest() const { return -1 != responseID && 0 == responseID; } @@ -168,24 +179,26 @@ class PluginManager { void setWorkspaceFolder( const std::string& workspaceFolder ); PluginRequestHandle sendRequest( UICodeEditorPlugin* pluginWho, PluginMessageType type, - PluginMessageFormat format, const void* data ) const; + PluginMessageFormat format, const void* data ); void sendResponse( UICodeEditorPlugin* pluginWho, PluginMessageType type, PluginMessageFormat format, const void* data, - const PluginIDType& responseID ) const; + const PluginIDType& responseID ); void sendBroadcast( UICodeEditorPlugin* pluginWho, PluginMessageType, PluginMessageFormat, - const void* data ) const; + const void* data ); void sendBroadcast( const PluginMessageType& notification, const PluginMessageFormat& format, void* data ); void subscribeMessages( UICodeEditorPlugin* plugin, - std::function cb ) const; + std::function cb ); - void unsubscribeMessages( UICodeEditorPlugin* plugin ) const; + void unsubscribeMessages( UICodeEditorPlugin* plugin ); protected: + using SubscribedPlugins = + std::map>; friend class App; std::string mResourcesPath; std::string mPluginsPath; @@ -195,8 +208,8 @@ class PluginManager { std::map mDefinitions; std::shared_ptr mThreadPool; UICodeEditorSplitter* mSplitter{ nullptr }; - std::map> - mSubscribedPlugins; + Mutex mSubscribedPluginsMutex; + SubscribedPlugins mSubscribedPlugins; bool mClosing{ false }; bool hasDefinition( const std::string& id );