From 8970ebcd93f252293bf0ac5b56847b3e77848491 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 6 Jan 2020 13:49:35 -0800 Subject: [PATCH] Added error/warning panel, region support --- BeefLibs/Beefy2D/src/theme/dark/DarkTheme.bf | 2 + BeefLibs/Beefy2D/src/widgets/ListView.bf | 2 +- IDE/BeefProj.toml | 2 +- IDE/dist/images/DarkUI.png | Bin 31133 -> 31295 bytes IDE/dist/images/DarkUI.psd | Bin 379877 -> 384747 bytes IDE/dist/images/DarkUI_2.png | Bin 52873 -> 53058 bytes IDE/dist/images/DarkUI_4.png | Bin 96322 -> 96554 bytes IDE/dist/images/DarkUI_4.psd | Bin 1275175 -> 1277752 bytes IDE/mintest/BeefProj.toml | 8 +- IDE/mintest/src/main3.bf | 28 ++++- IDE/src/BuildContext.bf | 2 +- IDE/src/Commands.bf | 2 + IDE/src/Compiler/BfCompiler.bf | 64 +++++++++-- IDE/src/Compiler/BfPassInstance.bf | 44 ++++++-- IDE/src/IDEApp.bf | 53 ++++++--- IDE/src/ScriptManager.bf | 16 ++- IDE/src/Settings.bf | 4 +- IDE/src/TestManager.bf | 21 +++- IDE/src/ui/ErrorsPanel.bf | 109 ++++++++++++++++--- IDE/src/ui/NavigationBar.bf | 2 +- IDE/src/ui/Panel.bf | 4 + IDE/src/ui/ProjectPanel.bf | 2 +- IDE/src/ui/SourceViewPanel.bf | 29 +++-- IDE/src/ui/StatusBar.bf | 25 ++++- IDEHelper/Compiler/BfCompiler.cpp | 16 +++ IDEHelper/Compiler/BfDefBuilder.cpp | 62 ++++++----- IDEHelper/Compiler/BfDefBuilder.h | 1 + IDEHelper/Compiler/BfExprEvaluator.cpp | 2 +- IDEHelper/Compiler/BfModule.cpp | 7 +- IDEHelper/Compiler/BfReducer.cpp | 29 +++-- IDEHelper/Compiler/BfStmtEvaluator.cpp | 5 +- IDEHelper/Compiler/BfSystem.cpp | 39 +++++-- IDEHelper/Compiler/BfSystem.h | 4 +- 33 files changed, 454 insertions(+), 130 deletions(-) diff --git a/BeefLibs/Beefy2D/src/theme/dark/DarkTheme.bf b/BeefLibs/Beefy2D/src/theme/dark/DarkTheme.bf index 72e9e6bc..20a20471 100644 --- a/BeefLibs/Beefy2D/src/theme/dark/DarkTheme.bf +++ b/BeefLibs/Beefy2D/src/theme/dark/DarkTheme.bf @@ -179,6 +179,8 @@ namespace Beefy.theme.dark ThreadBreakpointUnbound, Search, CheckIndeterminate, + CodeError, + CodeWarning, COUNT }; diff --git a/BeefLibs/Beefy2D/src/widgets/ListView.bf b/BeefLibs/Beefy2D/src/widgets/ListView.bf index 0728eefe..17f42b90 100644 --- a/BeefLibs/Beefy2D/src/widgets/ListView.bf +++ b/BeefLibs/Beefy2D/src/widgets/ListView.bf @@ -78,7 +78,7 @@ namespace Beefy.widgets { if (mIsFocused != value) { - Selected = true; + Selected = value; mIsFocused = value; if (mListView.mOnFocusChanged.HasListeners) mListView.mOnFocusChanged(this); diff --git a/IDE/BeefProj.toml b/IDE/BeefProj.toml index 3bb0bd29..e0746b6f 100644 --- a/IDE/BeefProj.toml +++ b/IDE/BeefProj.toml @@ -25,7 +25,7 @@ OtherLinkFlags = "" TargetDirectory = "$(WorkspaceDir)/dist" TargetName = "BeefIDE_d" OtherLinkFlags = "$(LinkFlags) Comdlg32.lib kernel32.lib user32.lib advapi32.lib shell32.lib IDEHelper64_d.lib" -DebugCommandArguments = "-proddir=C:\\proj\\CycloBuddy" +DebugCommandArguments = "-proddir=c:\\beef\\idehelper\\tests" DebugWorkingDirectory = "c:\\Beef\\IDE\\Tests\\EmptyTest" EnvironmentVars = ["_NO_DEBUG_HEAP=1"] diff --git a/IDE/dist/images/DarkUI.png b/IDE/dist/images/DarkUI.png index 50820446aa80bb16fbb097a87ad4ebb75319ad0c..2ea7867693c1a102cc7c5bce20dcb1930eeb9583 100644 GIT binary patch delta 12272 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 diff --git a/IDE/dist/images/DarkUI.psd b/IDE/dist/images/DarkUI.psd index 9b0d27223e5a6c7051e44f5a2a19f5b4875ee8e8..47e2720f74a3f1e8130713990a785e65f2af9a61 100644 GIT binary patch delta 5500 zcmd5=eNQz#y(dQKZoubkX{GQ3;9BF^LAfE@~p@uZ-<0<>x53`h{gD7-A9V5o^t$*seO!)V$&%>Um}ovA@VxRj?c}}+iXD)k>x^XIHrlqzKu6{d1o z>B*cmo$XI|>Zs5MKmg!;et-J)z|o7TqMxV;Y9lwI0&kNsg-oviP)epj7x<&koD3{q zbnAlqK>3#fI8gRZ!@ja{ZB3U(UON<6*S>dd+m2-dc)~rv{q-2lvBfceTfEf0;o=J? zo{eZ<`CRGDRl|~+d~XWis&QLt)#Z=XE7~oqn{HZmF27h7_tD=SlV){Ij&_Z`UKaV} zf#86;uIVW7+jTj{lm;Y#huyy4ILa*N)+TK$U%r0FQ?B|OmXX-3 z!-upkS{k5!scC~vI&xooc+U*EIy^|zA7u8(y2 zc73pB*G=oP@%k3kNyqx_NddgO#?%#u?6FdW4jK`e8r{I3ZDQ zNQ~BpdWsZqC8pHTBj8ZLN@w60I1Uhxhekptwa|zylp?->51U0R&&{8Nn zlRyn72i4u6rV&Vm1fXY+7f^->XgCFQsy85`1f-#bzila#IlGKDcEMo2a^+fCaGUop zs*>i-N`71MI(Z(KT_l5C z&R4(YnXl(tInTVBpS#5*?|F~^{4bvQVbow`Liq)6Tzf<`W*o%u(>`^E(YbaZ_k=Bj z3HgRb{H5&`COGK6h#UPMOq@7h4Har+^-+9;LI=Pbe8An&j0CEbPw0|TWz=pJ8zYpv z!rAXG{mMvTNw6Jd^|iI{}uBtlOOp_vPy3SCKr z0eung@Wscc!lVaOMfb6L2E8~3c2IUB=824k;ku{cbQ$wfQ8Eq>p9iC4$#ax-T$BN4 z%92;`=kuY|GscK_@Z^QiDr& zhnJ+LT6h{~9)(iN85i2o7sp@*9D=mR;cOU;Rvw2TJ>MaiyhDC^fSIrGL+)BeixMuu ziMF-pXht-#Njm>6kMxepzv7HLvanjWwD zMVdZ7!Gtons*`zO6;BFCp(e$$A5W-d8YI3d&!RhZBDQ`M+uGfKG&V%AwW2>YFz0DU zR$fC1hZ*r5an{7>(c#0)h`z7QW+fr-w$B49F+$rWKeYN^OczB|<%>!#5XJ^ODP!&n zOz+*YDq8RZs&2dDS_ynyg46C6+`>J(_#4)37pyLOIk6zP$kb_f_PINH z$$-#K4tCnfiC=SJqb_XJg-uxQvQZCY=CnEc+#Th;gv13o*eM?QH5VG{LPK3>1eHre zU67emnHG?~y=aSxP36i79gmLaFoqdwI90_XhER%z>CY z4?yuLWfD*h=)WU6#WE1ufuqMIu1TDtMq={6SQ+~p%~X`+DR4=ia>ujywG&D$9Ha%2 zU@}Mt^T8Z)%^)Kk!~+99eNq_?2aN{NRGUGyv#Itm5QqIv_0&pdz1sBCqE<`JP6SC{ z3bBw(uE)p~17h*!FO)fxSR1L*-2D% zhnBX>z8h7l*)%F@BTXPydp-JA%^L3$h4}RmE%swm*{gzs9H{kZy=I&JWKUk_;r^^a zhPKF`)k%QyW+F{eJ4i>j3NG6&bSRB|RNXFgfjdH%trlHNBSCZscS(1SnHoiL`%`Q~E*&C3i79HH|4T!X)TT_SZo4o+8#vkO1^ zGCLwh?I3U6Rx);>v?F3b(I_4Y^=JI*OB%Z8_@&CtYhqWFG#%h7`sCCADkJE Ap#T5? delta 3248 zcmb7G3slqB8Nc@?{{*BhF+u}TG$3fFM3N97!OElJ1FSv zA=?(<$F7%E4mVi!MoWgl5^pfa8)Ec^I94T(d0xuRmv0%Sw-^dzV~e8gdP8iXRUcho zw&*QZV~jp7zbGz0#+Glh#+qJ_sxEWRo*kdc=BWcXga7a3;s1*p`*J|s^I_Rmbt=1D zrsj4BT#M#@J2L{ltg*b2I$Mqa|7l<^rZ%u`9dg#0ri3Z%sZYriY;e9Do!-MwL9 zArCt4?)yhV`|iQIZC~FSeA_qT^Gj8SYI^RE-BTUw0WA-&gsdNIy}9OkodTh?GX&&I1(_T3!DI712i;sr+^50p=dC3S(wkl^+2vN zdw$R5l+A;Rybrr=dpI1r5{7c$I?^So4ZW1-qZ`rQCV<<3y?WzraoK>rmWDkQ0a?-pD zRY5Lq-8v=SegGZBN!73mYqe0zy*?CyM5JAZ7elEHJzw#?)L~x)W00mFCm}ff{|CP! z;`S2dNGKQ6?TsYE6Je29WN#X-NrIV3bC>w7kL+k~q`l6Y z(B)`CE0D6gJWovi=qh+zY~t;Eyd;op-3fbyiLf)Zq~_Cpk!_lbZ+8+E8VjYJT~KiGqCS^cnD`Nl5#23H!F8%?znGqXmjbXWXcy`5q(<(~x+?cJ+QTcLow~3A_4F zgv>-zchu*_Q<{{9#2d=4{*kPmVmnegG&c zZ26VtPs_kG$6|-g;VR>ic%BlU!tyfb)ba`&3Pxp!-Qg)h++oV{Pg)+BxT+)IRIm)Wd6oDY5~?0t<+v{{>ko zYBY!hdeZfsyl4tsg{@j<0wu*-#zaZGmf?jrv`i``Ge$Bglx!Bsz({5~-I+%T!Zo7= z%g#}PpCW|O!&Sr*!k7}MO=Xq4Sshi?~%Yr6n?T-*h=3YNL8g5TCw z0ko@?8EvMZcTNkS6V5PEbXRbOiJ_$J3=>Dmg)>YnC1cJq7E1C&^6^;#<~xyS+{{F( Qo8@LAY56PN%sW2+22#&$@c;k- diff --git a/IDE/dist/images/DarkUI_2.png b/IDE/dist/images/DarkUI_2.png index dcfece260a752a33e563554ec7b1b237f121b5ff..66a37c0cce67a38c759bff41720d0c6ebad9db91 100644 GIT binary patch delta 14826 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 delta 14618 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 LZ{#Xom<0ZR_rNBn diff --git a/IDE/dist/images/DarkUI_4.png b/IDE/dist/images/DarkUI_4.png index b7d44fc7d15a8fc0e09dabc0b4a11aa5f2a9678d..504b41e243e9f0b3fb802baff1f578a0b65b56a7 100644 GIT binary patch delta 19219 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 diff --git a/IDE/dist/images/DarkUI_4.psd b/IDE/dist/images/DarkUI_4.psd index 333d6e5b2c7dd25f79dba1c9015bb06f62bc4801..26298d1b71d0bb5dcca1e6a31eb1cc06dd452da5 100644 GIT binary patch delta 13320 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 REWySwY1~-xHSMg!{|3V7H4p#* delta 12776 zcmchd349#Io$sr4-4JJUqV2mZr+1*v|SJge@*v$(IpZ7l1 zzxtn5-96J9GxOy~Z210@!?*hB1^*J*MYC(O>qBLgb=5VYP)T-GMP);IMMHUIb!lZ? zV@*Y4Rn@{H^l3VONd4m4ico1~!&F5>V?_;)(u(@|b3C>GF}rYy=dQHi)=+KLmdc8% z((PNfY%8q})r3knZ{N1Hw6Zd^xo+F`itW{*EejhmpYeRC&iPBV+N@CN`>$Z$zjl27 zpqjC;aMsVN7rxe)OX>RgNBiUS(82=)Z)DQ>h1);%*{rnB5<)1&lsSL?j!&wDoDG|M zUN)&B6{M1cM42>f>L2z5;1XIjKe403FZ{iTL&B2AQ?wqE+%Wiva!q(sU+mlO`hQ+%IdGZloAW=oYMP#{`}fky`J$`W({=M5SD!~$&v(4FVc~b?>J+{8 zHG0)T?289H3p;K)ldAvY&z1kSkoC=2NQuORFJ*nTS(H|}hMROHrIn&?#G(CUe_V}gF+1v8O%aT2R zu34*`{rdcv+4CVbHL&T8?)oOQs7uYTO*6?u**OLsFmB#fK(JNKCRd1hoNv7z6(f%14O>uIU87*7s3mzx9T3)-+ zHbXsb=4P>^&G_mrI_#d~`^NLTlQ-LI7}I;`9=Gya{kNZ|)3|B9B2TH*C->5GKX})7 zr|6gMqaDVVuA@x-&u{(CuhAvvYF?Uu@|N{R=FN1sdx9n7%U`GNQ{Lw@R(+Fx)v5Gt zF!WoJ7u8p8;EjI8d800_5Vy3>$a;)E?>uN%9yaixxsTzMKQ%6YKDp(Ue=y#7fnMos zdFAW+g~xF>=bSbF=xl|4{5ai6*XcJtq`dcU!oc6eEAlP;S2}<17iRVL8|Z3d^lkd2 zZ~oEn>qc6H-r;U%8UGMX?md&`yw25eI^>jRg2q=8$>(XN(Ku};?`CGi={;oAW#a*g}dj&#)dY<{irzbbK}N##r^v}@T@r7IwRJhOuD@%jqy&!eH9Pb z#^YUz`=@c$S|ik>xUc+Gbp}2F+(+lCLBrp#+~jO<)uqOR11oL&jq`_;F6YkY!p0S| zN{tg78rSdpmV!6PBj2EcdAu_pc!S>b7`Qc0inyyUrRgUhP)^Gy>(H$J;)7yox?H+l zys3Y6sbBB^rSgok{>wTpcfH>9E2S-Y{)c|0Z2aKU?wmhcG17mh{K0cSu40vu9maj? zmmE_}XDeO5^f)f%Y)f9sYsVFQ^1lBu`@mfs%~bRC-$s;QI_n?Q?})y;{%>L*X8oJa z(#M?#<;^U0%z5Px{n6;q)JOAV`L-NU-gt0bNQFF*7xFi2CDJ8um zhjim#&KCU3SxnkVkTf9YC%KqgNgn=HZ6ZC;dXh~#(A7?=$$8`)QVXviJ$0mvq>~cF zO<386u@Su?tm(p>N7j)|WDqJO=VQNq)XGsQME_70(QxWEY}ka07$5E1+plKBSbmnx{5+fc6@<2!k>P%VMsK#ic;dc<&6O!aIHA5jF-~6}iu*~x zh7wQ=Vy->qr$etZuDs$yGx;=n<3lXK{WRbg#tzKceh!BPRDS?xfh$5DFhz?E*OH;f z9|#P_vHUY)p9dKycSi#x=g$EpCy*mN8(IpGyV3HHXn6_FWDfR&tQ;P&bJPG@tw35% zKsbRM9Ekv%%kfD!5MVh9(w3MfvG^siOAIF}2mIrfkf+pNW8Iqs{8+H6b^vBU} za~|Y578HeekmY#9Dp;%z=GZ|G=3q`NNOG9t2j>|2Y@AB0HiI-b$Z~zb+#rrzGpJx@ zK~;oikmTAZ(qOJ7^UEUPE{x?8l!Q{{S}Y5`jM&Ug5gUmk*@{JZLOhq{*}3XmUT$8l zmFLBrmx~lZAWBv)htKlNT%V|*mfRpEFF#Knf6nvfODCL1@*_|pFWF<}lRTEM=H=(- znfVHumXU}fG?0Qg8q7j6S6~$qNGT{R_;aCJP*_+HElh61 zi&&vrR9FN)v{8NPn9t;rFNN$Qt8SSl%>p-mzCovE4Ry7d8~}U zl5(reTV94FQdCqF=~@VRS#s@}a#E3io`vl4WL7D!D1WPhl*gecWLAjG>562XSCR?_ z*_FH^QK?o`&Q-!!Dk>3)3a@ZF)*w^q9Ku6&Wrr$KX+u^Ox~0!ymC7o_3~{1Lg^w0q zX+la>B~r=7N>z0gt5z{r$EtWW*3VU2RVmd~RnET2eE&Sj%fp!Z{5k3-LOo zwyri>hlO<>cy)EGR)wi$b-dO@IxekfVs*(yzPkFl`g*k1lR6s`)~v?{NY~Y~x>!B0 z;}ET{v+7kR$Liq&>zPC878 zwJRO%@KP{iw0GD@CfXSaMEVRqcm3q@L8mUPz*W)g*%efV{@CZKNN>fZAzwj zC)vcLyqh{ZH+62Z5m=obc%87sjmf6PP6ZjWGr5p-#=BBFySh5Xu)9bn>q-^AOt8*X zNw*6H2Jty`@lGn5X=hh*8><^@yR9yzyQ_fya%SQ}b~FLDVe z)|2ddrI+;By=qTyZ_kUp$)vZhx3{maH{Qp4?Y=bOVu;B`hV-#s-+SUjAL*U5`@Eu~ zw=cPc+SlLT$NG66>1TcG`ui}PqffXPIBb+zzal*w-YT~ThGAWDE34l#(2rsFs{{T0 z1K4zcOVNRTHjscz=lWp@N;1X!6|`GOB)5nR@Ih;U3@$?qGNCvW9Z&}c22e^iT7zW3 z8dL`c2M12UU4%{zCX4nERzhru4@Q-%gH<}f9O=pd3zHh2byh6dp)C?uDw zL&HPEiJ_F?Avi-EeB3uSK0Y>wv^`Ex zVq-+6h0n(nk#|2em&eJ(3F!6lWQL3!lOip~t{jNct z!}@C@lVrkz!jK6uC@w9>8Zr@^R3;{`O@5sb-<$r`o}!aeY?48IDrIhRY7)oP6n2@4 zAro^eB8DErTKR=ae0NLiXH#S{3?-nKp~w{7mq0~)EpxsLp4yMvv^B-2*Gx@MPfbmW zS&S)r+9M-e!1NTG=2JeT3q^~K704bqCB7-95JnJkuld+@pP8Pr(0F7T*Jdo8PU9+# z=sz*jij9rSX+Qd4a1a&aC+6y>jv2Q;m;O|5y7*oC@|oS+@q6*-^&9e(b#tls?U-D! zci-;OEuXtw{*EjXWcPucJ7L5x%idj^KR3H~=j`q)5QyKay}M?1uOtu?b^FXU@2Rie zx^3U(duR6SpPAh~)qN4Z7RzOX`1Wqwyzl+FIYPR3U$J}J?gP8TPQr)r9oV&P?-kqN zt=YDF^Ol|4I%jw7>73oW&F%9!S=3XuZ`-{8z+Tb1_WiBBW7Ge)?##>OmYer(n>?^* z&+Oj)$!6yov0wUC+b-WfyLWQ`-q{^uf6ZC3cN=#8OKURS%jufgCoX#{mKj_98N+n$ z0&+cmljy-O5n|lr4C*7lkt0T8#3B|Q!Hk@F{sBK zWpq0&!zge^J584(c_C+$qjJ3eLJI!!g?PxXFQhc%de7W-WGlIu>?PkPHrjrw7k*ahxO~rPMX5d8W_(OP=yhT^hOuB)tB_`t2bPe9RV!RQns7l^I)r0EU z7(Q|eZ)h2$V0{XSW9LQe_6m84*lWn$@#(Cy^gY#?g{}Y2eP$vNPsHOa!Q&*sU|F0e(nZQCplZi$Sv6r5R9M0*igDxK z?`8ZzZAp#C++oK&@fZR-&SNCbVi_WGBupaik)2kY#^QF2ql+2W-DuGH(y}9A z>}7(iXi!mEw)qJj|NCDVFa0JXlN!f6s`$tH#-Yf)KRH2hCx+)9nJ|CsS_RNwb(hHe~xCZmMvnD5lnj${Oabn(pM zA~|D0;YD@^r;svXg+!j|Zy(9%sOBi}GYb0I8M0`eVWNZ#hc9BB9I_x=TE58iw~l0V z9Xxp?!#H_l&BCYtA3u&d9>;I#tS0kzW2`pwdZqPaJ(zLhd!fu7RBvg_{EdO>nCBxr zq!+ej{`kM}kkpt4EYpmLwIgxaMB*Swl_RR6a>Wrd6v zU(RawefW>jO>bnCewdHZ!)LN4Q#(HL$Ef@$T>Rk^#)()KJ_;MntXq8_^}%Fx?PDMJ zb5y?}eeI*h_tMs8e)y+zqyAFn+MJL2v6(Ga=jv}B$?yv=c<_;|wZr3^m6U9 zJ#-T62jB`M$?G5@0gphna=Z>80;ma40f;;S!H+};#>$n2%eQNO zo!z6ItN&q}R#8K8mjoLEnhA37p)7%kBsoelAOI(sbJ&q=)ho7Zv+EOJLt*GNB>X6} zoU5;%(fV|IJ6>@$FEi063(`hn*aCJ#VpwJcGur}jh(01+?d5)}CaGs0m53;6(w z1T9K9EUCCSE*%MuSg|VlZ2r&sJ$tlSJ#Ck^TKDhPranPR%wk^hDv;63us}h{mQ}Ob z=JNy?S`w_Nq&Qr{i>(r$!;gybzYEQ3PnQ#*pF}As0p9@z5)#x%SY8r=oVqG_kzHb! z>fhd@JzJS5O%ePDN15s3q8N~oi;B!73}R*60Y$d{(C4+I4)Jj~P#i3XNgf1}g@a;2iYA|@lXqP)D~RsGI=+VepREQmpZ3$Y4b&S7KFGGszw zACRCpB&;ApK9>WrO0PqO1Uv%SK@h9-xtK_Q^nmtEzgM82sw%586-Ev) zp*3)vNYpAN8nUZWr7tSrQCPuUZp2TJDF5I3iL15G>#bL7m)6?Vk{4N3DyR{NkWauN z9Dq<@M*<@8>L?^wky+(M6N>uLtF@=A5)ublk`M`2v|O#$R96EYi6H7?B)gg;gMV;I zm_I4byGtLwR@eIgD$0B z$a49RU`4bJ1c^vwWV`5yA-3xDNB&lO2H=K)1qoDS*Qo*%S@oJrkt8(2B&-c;WJ_dJ zmykyP$rrR|H@S?6NDAcQAQABT6c-rP3s7{H!;YMkm;sT%it3eydi{y(wHImyEHVLp zREGco4241oH^*I&WHzi3jL4B_&`*9*J6gy>UJxK~p(p^52}Qt%7;HSGiu9R~cwOJ- zM|57|Tc>B3u3JbFp$-vAR}TMNJ!@3si+`e;7GEE0w3uczM>rk=HaaZ7%|`> zVS#v7FcED9J^}}7O+i5rq*jn1bgmYG$RMTH|DE5gwh)iYEL%W5(Rk#DFPx&1v7H6Q5bo_l&p5I%z+xk+htq3c`xl5~PB^WU$mNY`&Uq)lZkNuESH zPQ$*Vzja9aliw#%QYXL?-}H{lkm9gOp7f4xeNB70jC968ggDqy1c(S^$UOMs(?avH|tV?hv0xIff^Ac0EEo$m;gx#IK;YBBt`-`((Av0 zwV*hFLM9~O5NJ~m?e4L<*MJE1fFB77V}lo2vO%&UedwFoi4wttl-{1+KlQBY?dgFd zh7DZgg#$8_=%Kv;Mkh#u|5CrN#&@p1^PBhw_vu@-%g%bLSF)o7Fw!FU(FtPmU##?8 zqW|nxZA&NZ>t%fk@DXz;ksE>|pfEMYA?K&k!#P$run*6jwLUq3vrJsz+@ngm@s12OnfNtwuC z#34=ZZN5V1w`&(|bSP5-q$vU|JMhUI1i+Kf+Y&&Lk%&|K-M6*R7IVp<*f1R#wnqeUvgG{E zh&ntXQql-W6&n#3^Xn!)>J?0BbkrUpz)v=?lOlOkhDb^}C1y#cQYEVrX%p=pefT@t zud@X^0)ygXAXZ~^bSxpE)Ui?K;v{|iJGk(Bzl;AC73e7rP9>ldllbWrJX5T)Mz*O*rDHaSep*g@rgy?CJPFW zvkBlSDHB#m27qM8Hum8*4+GvGx z!Ng=7icP9$nm7%5wFJ;402Bn& zgfBtgxLXT|?#-p2%9no3M6U`#fUl7LQ3L@s7>auPL7MP(f|1G_w=XKvBX)9=4m z>(6)!q)Ct`QxGSe-lxs9(o+Z6v{$mF>BN*rQYJP{r>5DIDv**T36l+YBw>>c9%W4_ m(*iNkS5ovBFW2()Ki;Q>)<(dV!h$bB7WB4p{`a*F$NmpPa9vvf diff --git a/IDE/mintest/BeefProj.toml b/IDE/mintest/BeefProj.toml index 840a63e9..18efa131 100644 --- a/IDE/mintest/BeefProj.toml +++ b/IDE/mintest/BeefProj.toml @@ -73,7 +73,7 @@ BeefLibType = "Static" [Configs.Test.Win64] CLibType = "Static" -BeefLibType = "Static" +BeefLibType = "DynamicDebug" [Configs.Test.WinFart] BuildKind = "Normal" @@ -88,8 +88,6 @@ BuildKind = "StaticLib" BuildKind = "StaticLib" RelocType = "PIC" -[ProjectFolder] - [[ProjectFolder.Items]] Type = "Source" Path = "../../../temp/test.txt" @@ -98,3 +96,7 @@ Path = "../../../temp/test.txt" Type = "Folder" Path = "../../../temp/borf" AutoInclude = true + +[[ProjectFolder.Items]] +Type = "Source" +Path = "../../../temp/test.bf" diff --git a/IDE/mintest/src/main3.bf b/IDE/mintest/src/main3.bf index f0585e42..88fd7a55 100644 --- a/IDE/mintest/src/main3.bf +++ b/IDE/mintest/src/main3.bf @@ -8,6 +8,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Threading; +#region EnumA Crapsos [AllowDuplicates] enum EnumA { @@ -18,12 +19,35 @@ enum EnumA Zoop = 1 } +struct StructA +{ + public int mA; + public int mB; +} + +#region Blurg struct Blurg { + static mixin MixA(var sa2) + { + sa2.mA++; + } + + static mixin MixB(mut StructA sa2) + { + sa2.mA++; + } + + static void MethodA(mut StructA sa) + { + MixA!(sa); + //MixB!(mut sa); + } + public static int32 Hey() { - int a = 123; - int* aPtr = &a; + StructA sa = .(); + sa.mA = 123 return (int32)123; } diff --git a/IDE/src/BuildContext.bf b/IDE/src/BuildContext.bf index d8f103e2..0e7d29a6 100644 --- a/IDE/src/BuildContext.bf +++ b/IDE/src/BuildContext.bf @@ -135,7 +135,7 @@ namespace IDE { mScriptManager = new .(); mScriptManager.mProjectName = new String(project.mProjectName); - mScriptManager.mAllowCompiling = true; + mScriptManager.mIsBuildScript = true; mScriptManager.mSoftFail = true; mScriptManager.mVerbosity = gApp.mVerbosity; didCommands = true; diff --git a/IDE/src/Commands.bf b/IDE/src/Commands.bf index 9fbf0bc1..55dc7c77 100644 --- a/IDE/src/Commands.bf +++ b/IDE/src/Commands.bf @@ -250,6 +250,8 @@ namespace IDE Add("Show Class View", new => gApp.ShowClassViewPanel); Add("Show Current", new => gApp.Cmd_ShowCurrent); Add("Show Disassembly", new => gApp.[Friend]ShowDisassemblyAtStack); + Add("Show Errors", new => gApp.[Friend]ShowErrors); + Add("Show Error Next", new => gApp.ShowErrorNext); Add("Show File Externally", new => gApp.Cmd_ShowFileExternally); Add("Show Find Results", new => gApp.ShowFindResults); Add("Show Fixit", new => gApp.Cmd_ShowFixit); diff --git a/IDE/src/Compiler/BfCompiler.bf b/IDE/src/Compiler/BfCompiler.bf index 5cd0b7ff..9045d191 100644 --- a/IDE/src/Compiler/BfCompiler.bf +++ b/IDE/src/Compiler/BfCompiler.bf @@ -8,6 +8,7 @@ using Beefy.widgets; using Beefy; using Beefy.utils; using IDE.Util; +using IDE.ui; namespace IDE.Compiler { @@ -295,6 +296,8 @@ namespace IDE.Compiler protected override void DoProcessQueue() { + BfPassInstance.PassKind passKind = .None; + BfPassInstance passInstance = null; bool didPassInstanceAlloc = false; @@ -312,6 +315,23 @@ namespace IDE.Compiler command = mCommandQueue[0]; } + bool commandProcessed = true; + defer + { + if (commandProcessed) + { + using (mMonitor.Enter()) + { + delete command; + if (!mShuttingDown) + { + var poppedCmd = mCommandQueue.PopFront(); + Debug.Assert(poppedCmd == command); + } + } + } + } + if (command is SetPassInstanceCommand) { var setPassInstanceCommand = (SetPassInstanceCommand)command; @@ -345,9 +365,12 @@ namespace IDE.Compiler var projectSource = projectSourceCommand.mProjectSource; if (projectSource.mIncludeKind != .Ignore) { + BfProject bfProject = null; + using (projectSource.mProject.mMonitor.Enter()) { projectSourceCommand.mProjectSource.GetFullImportPath(sourceFilePath); + bfProject = mBfSystem.GetBfProject(projectSource.mProject); } bool canMoveSourceString = true; @@ -389,10 +412,15 @@ namespace IDE.Compiler else bfParser.SetSource("", sourceFilePath); bfParser.SetCharIdData(ref char8IdData); + + //passInstance.SetProject(bfProject); worked &= bfParser.Parse(passInstance, false); worked &= bfParser.Reduce(passInstance); + //passInstance.SetProject(bfProject); worked &= bfParser.BuildDefs(passInstance, null, false); + passKind = .Parse; + // Do this to make sure we re-trigger errors in parse/reduce/builddefs if (!worked) projectSource.HasChangedSinceLastCompile = true; @@ -402,6 +430,15 @@ namespace IDE.Compiler if (command is ProjectSourceRemovedCommand) { var fileRemovedCommand = (ProjectSourceRemovedCommand)command; + let projectSource = fileRemovedCommand.mProjectSource; + + using (projectSource.mProject.mMonitor.Enter()) + { + String sourceFilePath = scope String(); + projectSource.GetFullImportPath(sourceFilePath); + gApp.mErrorsPanel.ClearParserErrors(sourceFilePath); + } + var bfParser = mBfSystem.FileRemoved(fileRemovedCommand.mProjectSource); if (bfParser != null) { @@ -421,13 +458,24 @@ namespace IDE.Compiler if (command is ResolveAllCommand) { + if (passKind != .None) + { + commandProcessed = false; + break; + } + var resolvePassData = BfResolvePassData.Create(ResolveType.Classify); // If we get canceled then try again after waiting a couple updates if (!ClassifySource(passInstance, null, resolvePassData, null)) QueueDeferredResolveAll(); + delete resolvePassData; mBfSystem.RemoveOldParsers(); mBfSystem.RemoveOldData(); + passKind = .Classify; + + // End after resolveAll + break; } if (command is SetWorkspaceOptionsCommand) @@ -444,22 +492,16 @@ namespace IDE.Compiler { mWantsActiveViewRefresh = true; } - - using (mMonitor.Enter()) - { - delete command; - if (!mShuttingDown) - { - var poppedCmd = mCommandQueue.PopFront(); - Debug.Assert(poppedCmd == command); - } - } } mBfSystem.Unlock(); if (didPassInstanceAlloc) - delete passInstance; + { + if ((passKind != .None) && (mIsResolveOnly)) + gApp.mErrorsPanel.ProcessPassInstance(passInstance, passKind); + delete passInstance; + } } void HandleOptions(BfProject hotBfProject, int32 hotIdx) diff --git a/IDE/src/Compiler/BfPassInstance.bf b/IDE/src/Compiler/BfPassInstance.bf index 5808db88..52e87734 100644 --- a/IDE/src/Compiler/BfPassInstance.bf +++ b/IDE/src/Compiler/BfPassInstance.bf @@ -10,6 +10,13 @@ namespace IDE.Compiler { public class BfPassInstance { + public enum PassKind + { + None, + Parse, + Classify + } + [StdCall, CLink] static extern void BfPassInstance_Delete(void* bfSystem); @@ -23,12 +30,12 @@ namespace IDE.Compiler static extern int32 BfPassInstance_GetErrorCount(void* mNativeResolvePassData); [StdCall, CLink] - static extern char8* BfPassInstance_GetErrorData(void* mNativeResolvePassData, int32 errorIdx, out bool isWarning, - out bool isAfter, out bool isDeferred, out bool isWhileSpecializing, - out bool isPersistent, out int32 srcStart, out int32 srcEnd, out int32 moreInfoCount); + static extern char8* BfPassInstance_GetErrorData(void* mNativeResolvePassData, int32 errorIdx, out int32 code, out bool isWarning, + out bool isAfter, out bool isDeferred, out bool isWhileSpecializing, out bool isPersistent, out char8* projectName, + out char8* fileName, out int32 srcStart, out int32 srcEnd, int32* srcLine, int32* srcColumn, out int32 moreInfoCount); [StdCall, CLink] - static extern char8* BfPassInstance_Error_GetMoreInfoData(void* mNativeResolvePassData, int32 errorIdx, int32 moreInfoIdx, out char8* fileName, out int32 srcStart, out int32 srcEnd); + static extern char8* BfPassInstance_Error_GetMoreInfoData(void* mNativeResolvePassData, int32 errorIdx, int32 moreInfoIdx, out char8* fileName, out int32 srcStart, out int32 srcEnd, int32* srcLine, int32* srcColumn); [StdCall, CLink] static extern bool BfPassInstance_HadSignatureChanges(void* mNativeResolvePassData); @@ -36,18 +43,22 @@ namespace IDE.Compiler public class BfError { public bool mIsWarning; + public int32 mCode; public bool mIsAfter; public bool mIsDeferred; public bool mIsWhileSpecializing; public bool mIsPersistent; + public String mProject ~ delete _; public String mError ~ delete _; public int32 mSrcStart; public int32 mSrcEnd; + public int32 mLine = -1; + public int32 mColumn = -1; public int32 mMoreInfoCount; public bool mOwnsSpan; public IdSpan mIdSpan ~ { if (mOwnsSpan) _.Dispose(); }; public int32 mErrorIdx = -1; - public String mFileName ~ delete _; + public String mFilePath ~ delete _; public List mMoreInfo ~ DeleteContainerAndItems!(_); } @@ -110,21 +121,30 @@ namespace IDE.Compiler return BfPassInstance_GetErrorCount(mNativeBfPassInstance); } - public void GetErrorData(int32 errorIdx, BfError bfError) + public void GetErrorData(int32 errorIdx, BfError bfError, bool getLine = false) { Debug.Assert(bfError.mError == null); bfError.mErrorIdx = errorIdx; - bfError.mError = new String(BfPassInstance_GetErrorData(mNativeBfPassInstance, errorIdx, out bfError.mIsWarning, out bfError.mIsAfter, out bfError.mIsDeferred, - out bfError.mIsWhileSpecializing, out bfError.mIsPersistent, out bfError.mSrcStart, out bfError.mSrcEnd, out bfError.mMoreInfoCount)); + char8* projectName = null; + char8* fileName = null; + bfError.mError = new String(BfPassInstance_GetErrorData(mNativeBfPassInstance, errorIdx, out bfError.mCode, out bfError.mIsWarning, out bfError.mIsAfter, out bfError.mIsDeferred, + out bfError.mIsWhileSpecializing, out bfError.mIsPersistent, out projectName, out fileName, out bfError.mSrcStart, out bfError.mSrcEnd, + getLine ? &bfError.mLine : null, getLine ? &bfError.mColumn : null, + out bfError.mMoreInfoCount)); + if (projectName != null) + bfError.mProject = new String(projectName); + if (fileName != null) + bfError.mFilePath = new String(fileName); } - public void GetMoreInfoErrorData(int32 errorIdx, int32 moreInfoIdx, BfError bfError) + public void GetMoreInfoErrorData(int32 errorIdx, int32 moreInfoIdx, BfError bfError, bool getLine = false) { char8* fileName = null; - char8* errorStr = BfPassInstance_Error_GetMoreInfoData(mNativeBfPassInstance, errorIdx, moreInfoIdx, out fileName, out bfError.mSrcStart, out bfError.mSrcEnd); - Debug.Assert(bfError.mFileName == null); + char8* errorStr = BfPassInstance_Error_GetMoreInfoData(mNativeBfPassInstance, errorIdx, moreInfoIdx, out fileName, out bfError.mSrcStart, out bfError.mSrcEnd, + getLine ? &bfError.mLine : null, getLine ? &bfError.mColumn : null); + Debug.Assert(bfError.mFilePath == null); if (fileName != null) - bfError.mFileName = new String(fileName); + bfError.mFilePath = new String(fileName); if (bfError.mError == null) bfError.mError = new String(errorStr); else diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index d7622a1d..30492446 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -176,6 +176,7 @@ namespace IDE public WatchPanel mWatchPanel; public MemoryPanel mMemoryPanel; public CallStackPanel mCallStackPanel; + public ErrorsPanel mErrorsPanel; public BreakpointPanel mBreakpointPanel; public ModulePanel mModulePanel; public ThreadPanel mThreadPanel; @@ -625,6 +626,7 @@ namespace IDE RemoveAndDelete!(mProjectPanel); RemoveAndDelete!(mClassViewPanel); + RemoveAndDelete!(mErrorsPanel); RemoveAndDelete!(mOutputPanel); RemoveAndDelete!(mImmediatePanel); RemoveAndDelete!(mFindResultsPanel); @@ -4327,6 +4329,18 @@ namespace IDE ShowPanel(mCallStackPanel, "Call Stack"); } + [IDECommand] + public void ShowErrors() + { + ShowPanel(mErrorsPanel, "Errors"); + } + + [IDECommand] + public void ShowErrorNext() + { + mErrorsPanel.ShowErrorNext(); + } + [IDECommand] public void ShowWatches() { @@ -4868,20 +4882,21 @@ namespace IDE ////////// subMenu = root.AddMenuItem("&View"); - AddMenuItem(subMenu, "Work&space Explorer", "Show Workspace Explorer"); - AddMenuItem(subMenu, "C&lass View", "Show Class View"); - AddMenuItem(subMenu, "&Immediate Window", "Show Immediate"); - AddMenuItem(subMenu, "&Threads", "Show Threads"); + AddMenuItem(subMenu, "A&utoComplete", "Show Autocomplete Panel"); + AddMenuItem(subMenu, "&Auto Watches", "Show Auto Watches"); + AddMenuItem(subMenu, "&Breakpoints", "Show Breakpoints"); AddMenuItem(subMenu, "&Call Stack", "Show Call Stack"); - AddMenuItem(subMenu, "&Watches", "Show Watches"); - AddMenuItem(subMenu, "&Auto Watches", "Show Auto Watches"); - AddMenuItem(subMenu, "&Breakpoints", "Show Breakpoints"); + AddMenuItem(subMenu, "C&lass View", "Show Class View"); + AddMenuItem(subMenu, "E&rrors", "Show Errors"); + AddMenuItem(subMenu, "&Find Results", "Show Find Results"); + AddMenuItem(subMenu, "&Immediate Window", "Show Immediate"); AddMenuItem(subMenu, "&Memory", "Show Memory"); AddMenuItem(subMenu, "Mo&dules", "Show Modules"); AddMenuItem(subMenu, "&Output", "Show Output"); - AddMenuItem(subMenu, "&Find Results", "Show Find Results"); AddMenuItem(subMenu, "&Profiler", "Show Profiler"); - AddMenuItem(subMenu, "A&utoComplete", "Show Autocomplete Panel"); + AddMenuItem(subMenu, "&Threads", "Show Threads"); + AddMenuItem(subMenu, "&Watches", "Show Watches"); + AddMenuItem(subMenu, "Work&space Explorer", "Show Workspace Explorer"); subMenu.AddMenuItem(null); AddMenuItem(subMenu, "Next Document Panel", "Next Document Panel"); AddMenuItem(subMenu, "Navigate Backwards", "Navigate Backwards"); @@ -8904,7 +8919,7 @@ namespace IDE bool bfHadOutputChanges; List bfFileNames = scope List(); bfCompiler.GetOutputFileNames(bfProject, false, out bfHadOutputChanges, bfFileNames); - defer(scope) ClearAndDeleteItems(bfFileNames); + defer ClearAndDeleteItems(bfFileNames); if (bfHadOutputChanges) project.mNeedsTargetRebuild = true; } @@ -10227,6 +10242,8 @@ namespace IDE mCallStackPanel.mAutoDelete = false; mBreakpointPanel = new BreakpointPanel(); mBreakpointPanel.mAutoDelete = false; + mErrorsPanel = new ErrorsPanel(); + mErrorsPanel.mAutoDelete = false; mModulePanel = new ModulePanel(); mModulePanel.mAutoDelete = false; mThreadPanel = new ThreadPanel(); @@ -10857,6 +10874,9 @@ namespace IDE didClean = true; OutputLine("Cleaned Beef."); + if (mErrorsPanel != null) + mErrorsPanel.ClearParserErrors(null); + delete mBfResolveCompiler; delete mBfResolveSystem; delete mBfResolveHelper; @@ -10932,6 +10952,9 @@ namespace IDE { OutputLine("Cleaned."); + if (mErrorsPanel != null) + mErrorsPanel.ClearParserErrors(null); + let workspaceOptions = GetCurWorkspaceOptions(); delete mBfResolveHelper; @@ -11038,17 +11061,17 @@ namespace IDE } } + CurrentWorkspaceConfigChanged(); + if (mBfResolveSystem != null) { - for (var project in mWorkspace.mProjects) + /*for (var project in mWorkspace.mProjects) { if (IsProjectEnabled(project)) QueueProjectItems(project); - } + }*/ mBfResolveCompiler.QueueDeferredResolveAll(); } - - CurrentWorkspaceConfigChanged(); } mBfBuildSystem.Update(); @@ -11519,6 +11542,8 @@ namespace IDE if ((mBuildContext == null) && (!IsCompiling)) DeleteAndNullify!(mLaunchData); + + mErrorsPanel?.CheckResolveAll(); } public void ShowPassOutput(BfPassInstance bfPassInstance) diff --git a/IDE/src/ScriptManager.bf b/IDE/src/ScriptManager.bf index fec32ae5..3f93cf18 100644 --- a/IDE/src/ScriptManager.bf +++ b/IDE/src/ScriptManager.bf @@ -72,7 +72,7 @@ namespace IDE public String mExpectingError ~ delete _; public bool mHadExpectingError; public int mDoneTicks; - public bool mAllowCompiling; + public bool mIsBuildScript; public bool mSoftFail; public Verbosity mVerbosity = .Quiet; public String mProjectName ~ delete _; @@ -950,7 +950,7 @@ namespace IDE if (gApp.IsCompiling) { - if (!ScriptManager.sActiveManager.mAllowCompiling) + if (!ScriptManager.sActiveManager.mIsBuildScript) return false; } @@ -960,8 +960,16 @@ namespace IDE if (gApp.mDebugger == null) return true; - if ((!gApp.AreTestsRunning()) && (!gApp.mDebugger.HasPendingDebugLoads()) && - ((gApp.mExecutionPaused) || (!gApp.mDebugger.mIsRunning))) + bool checkRunState = (!gApp.mDebugger.HasPendingDebugLoads()) && + ((gApp.mExecutionPaused) || (!gApp.mDebugger.mIsRunning)); + + if ((!ScriptManager.sActiveManager.mIsBuildScript) && (gApp.AreTestsRunning())) + checkRunState = false; + + /*if (gApp.AreTestsRunning()) + checkRunState = false;*/ + + if (checkRunState) { var runState = gApp.mDebugger.GetRunState(); if (runState == .Terminating) diff --git a/IDE/src/Settings.bf b/IDE/src/Settings.bf index bd66992c..499f306c 100644 --- a/IDE/src/Settings.bf +++ b/IDE/src/Settings.bf @@ -451,12 +451,14 @@ namespace IDE Add("Save All", "Ctrl+Shift+S"); Add("Save File", "Ctrl+S"); Add("Set Next Statement", "Ctrl+Shift+F10"); - Add("Show Current", "Alt+C"); Add("Show Auto Watches", "Ctrl+Alt+A"); Add("Show Autocomplete Panel", "Ctrl+Alt+U"); Add("Show Breakpoints", "Ctrl+Alt+B"); Add("Show Call Stack", "Ctrl+Alt+C"); Add("Show Class View", "Ctrl+Alt+L"); + Add("Show Current", "Alt+C"); + Add("Show Errors", "Ctrl+Alt+E"); + Add("Show Error Next", "Ctrl+Shift+F12"); Add("Show File Externally", "Ctrl+Tilde"); Add("Show Find Results", "Ctrl+Alt+F"); Add("Show Fixit", "Ctrl+Period"); diff --git a/IDE/src/TestManager.bf b/IDE/src/TestManager.bf index a1a8eb52..52d07f64 100644 --- a/IDE/src/TestManager.bf +++ b/IDE/src/TestManager.bf @@ -183,6 +183,9 @@ namespace IDE cmd.Append(clientStr, 0, crPos); clientStr.Remove(0, crPos + 1); + if (cmd.IsWhiteSpace) + continue; + /*String outStr = scope String(); outStr.AppendF("CMD: {0}", cmd); QueueOutput(outStr);*/ @@ -254,6 +257,13 @@ namespace IDE case ":TestFinish": testsFinished = true; default: + if ((cmdParts.Count < 5) || (cmdParts[0].StartsWith(":"))) + { + QueueOutputLine("ERROR: Failed communicate with test target '{0}'", curProjectInfo.mTestExePath); + TestFailed(); + return; + } + Debug.Assert(cmdParts[0][0] != ':'); let attribs = cmdParts[1]; @@ -347,11 +357,12 @@ namespace IDE } else if (exitCode != 0) { - if (exitCode != 0) - { - QueueOutputLine("ERROR: Test process exited with error code: {0}", exitCode); - TestFailed(); - } + QueueOutputLine("ERROR: Test process exited with error code: {0}", exitCode); + TestFailed(); + } + else if (testInstance.mTestEntries.IsEmpty) + { + QueueOutputLine("WARNING: No test methods defined. Consider adding a [Test] attribute to a static method in a project whose build type is set to 'Test'."); } } diff --git a/IDE/src/ui/ErrorsPanel.bf b/IDE/src/ui/ErrorsPanel.bf index eaf81793..3d20b149 100644 --- a/IDE/src/ui/ErrorsPanel.bf +++ b/IDE/src/ui/ErrorsPanel.bf @@ -51,7 +51,8 @@ namespace IDE.ui public bool mNeedsResolveAll; public bool mErrorsDirty; public Monitor mMonitor = new .() ~ delete _; - public List mErrorList = new .() ~ DeleteContainerAndItems!(_); + public Dictionary> mParseErrors = new .() ~ delete _; + public List mResolveErrors = new .() ~ DeleteContainerAndItems!(_); public int mDirtyTicks; public int mErrorCount; @@ -98,6 +99,11 @@ namespace IDE.ui AddWidget(mDockingFrame); } + public ~this() + { + ClearParserErrors(null); + } + public override void Serialize(StructuredData data) { base.Serialize(data); @@ -122,12 +128,23 @@ namespace IDE.ui { using (mMonitor.Enter()) { - mErrorCount = 0; - mWarningCount = 0; - int32 errorCount = passInstance.GetErrorCount(); - ClearAndDeleteItems(mErrorList); - mErrorList.Capacity = mErrorList.Count; + if (passKind != .Parse) + { + if (!mResolveErrors.IsEmpty) + mErrorsDirty = true; + + for (let error in mResolveErrors) + { + if (error.mIsWarning) + mWarningCount--; + else + mErrorCount--; + } + + ClearAndDeleteItems(mResolveErrors); + mResolveErrors.Capacity = mResolveErrors.Count; + } for (int32 errorIdx = 0; errorIdx < errorCount; errorIdx++) { @@ -148,16 +165,61 @@ namespace IDE.ui bfError.mMoreInfo.Add(moreInfo); } - mErrorList.Add(bfError); - } + if (passKind == .Parse) + { + bool added = mParseErrors.TryAdd(bfError.mFilePath, var keyPtr, var valuePtr); + if (added) + { + *keyPtr = new .(bfError.mFilePath); + *valuePtr = new .(); + } + (*valuePtr).Add(bfError); + } + else + mResolveErrors.Add(bfError); - mErrorsDirty = true; + mErrorsDirty = true; + } } } - public void ClearParserErrors(StringView filePath) + public void ClearParserErrors(String filePath) { + using (mMonitor.Enter()) + { + void DeleteErrorList(List list) + { + for (let error in list) + { + if (error.mIsWarning) + mWarningCount--; + else + mErrorCount--; + delete error; + } + delete list; + } + if (filePath == null) + { + for (var kv in mParseErrors) + { + delete kv.key; + DeleteErrorList(kv.value); + mErrorsDirty = true; + } + mParseErrors.Clear(); + } + else + { + if (mParseErrors.GetAndRemove(filePath) case .Ok((let key, let list))) + { + delete key; + DeleteErrorList(list); + mErrorsDirty = true; + } + } + } } void ProcessErrors() @@ -168,7 +230,8 @@ namespace IDE.ui { let root = mErrorLV.GetRoot(); - for (let error in mErrorList) + int idx = 0; + void HandleError(BfPassInstance.BfError error) { ErrorsListViewItem item; @@ -181,7 +244,6 @@ namespace IDE.ui item.Label = str; } - int idx = @error.Index; if (idx >= root.GetChildCount()) { item = (.)root.CreateChildItem(); @@ -225,9 +287,28 @@ namespace IDE.ui if (changed) item.Focused = false; + + idx++; } - while (root.GetChildCount() > mErrorList.Count) + if (!mParseErrors.IsEmpty) + { + List paths = scope .(); + for (var path in mParseErrors.Keys) + paths.Add(path); + paths.Sort(); + + for (var path in paths) + { + for (var error in mParseErrors[path]) + HandleError(error); + } + } + + for (let error in mResolveErrors) + HandleError(error); + + while (root.GetChildCount() > idx) root.RemoveChildItemAt(root.GetChildCount() - 1); mErrorsDirty = false; @@ -277,7 +358,7 @@ namespace IDE.ui bool foundFocused = false; let root = mErrorLV.GetRoot(); - if (root.mChildItems == null) + if (root.GetChildCount() == 0) return; for (let lvItem in root.mChildItems) { diff --git a/IDE/src/ui/NavigationBar.bf b/IDE/src/ui/NavigationBar.bf index 72361375..b0a39660 100644 --- a/IDE/src/ui/NavigationBar.bf +++ b/IDE/src/ui/NavigationBar.bf @@ -195,7 +195,7 @@ namespace IDE.ui if (mShowingDropdown) return null; mShowingDropdown = true; - defer(scope) { mShowingDropdown = false; } + defer { mShowingDropdown = false; } /*var stopWatch = scope Stopwatch(); stopWatch.Start();*/ diff --git a/IDE/src/ui/Panel.bf b/IDE/src/ui/Panel.bf index a3009610..cd5d2016 100644 --- a/IDE/src/ui/Panel.bf +++ b/IDE/src/ui/Panel.bf @@ -97,6 +97,10 @@ namespace IDE.ui { panel = gApp.mImmediatePanel; } + else if (type == "ErrorsPanel") + { + panel = gApp.mErrorsPanel; + } else if (type == "FindResultsPanel") { panel = gApp.mFindResultsPanel; diff --git a/IDE/src/ui/ProjectPanel.bf b/IDE/src/ui/ProjectPanel.bf index 52cf713d..8fe44bc7 100644 --- a/IDE/src/ui/ProjectPanel.bf +++ b/IDE/src/ui/ProjectPanel.bf @@ -868,7 +868,7 @@ namespace IDE.ui String dir = scope String(fileDialog.InitialDirectory); List alreadyHadFileList = scope List(); - defer(scope) ClearAndDeleteItems(alreadyHadFileList); + defer ClearAndDeleteItems(alreadyHadFileList); for (String fileNameIn in fileDialog.FileNames) { diff --git a/IDE/src/ui/SourceViewPanel.bf b/IDE/src/ui/SourceViewPanel.bf index 41098d98..dbe1fec0 100644 --- a/IDE/src/ui/SourceViewPanel.bf +++ b/IDE/src/ui/SourceViewPanel.bf @@ -1653,6 +1653,9 @@ namespace IDE.ui if (gApp.mDbgDelayedAutocomplete) Thread.Sleep(250); + if ((resolveType == .Classify) || (resolveType == .ClassifyFullRefresh)) + gApp.mErrorsPanel.SetNeedsResolveAll(); + /*if (resolveType == .Autocomplete) { Thread.Sleep(250); @@ -1818,6 +1821,13 @@ namespace IDE.ui resolvePassData.SetDocumentationRequest(resolveParams.mDocumentationName); parser.Parse(passInstance, !mIsBeefSource); parser.Reduce(passInstance); + + if ((mIsBeefSource) && + ((resolveType == .Classify) || (resolveType == .ClassifyFullRefresh))) + { + gApp.mErrorsPanel.ClearParserErrors(mFilePath); + gApp.mErrorsPanel.ProcessPassInstance(passInstance, .Parse); + } if (isInterrupt) { @@ -2511,13 +2521,16 @@ namespace IDE.ui if (trackedElement.mSnapToLineStart) { int32 lineLeft = trackedElementView.mTextPosition.mIndex; - repeat - { - if (!((char8)editContent.mData.mText[lineLeft].mChar).IsWhiteSpace) - startContentIdx = lineLeft; - lineLeft--; - } - while ((lineLeft > 0) && (editContent.mData.mText[lineLeft].mChar != '\n')); + if (lineLeft < editContent.mData.mTextLength) + { + repeat + { + if (!((char8)editContent.mData.mText[lineLeft].mChar).IsWhiteSpace) + startContentIdx = lineLeft; + lineLeft--; + } + while ((lineLeft > 0) && (editContent.mData.mText[lineLeft].mChar != '\n')); + } if (startContentIdx == -1) { @@ -4926,7 +4939,7 @@ namespace IDE.ui { for (var moreInfo in bestError.mMoreInfo) { - showMouseoverString.AppendF("\n@{0}\t{1}\t{2}", moreInfo.mFileName, moreInfo.mSrcStart, moreInfo.mError); + showMouseoverString.AppendF("\n@{0}\t{1}\t{2}", moreInfo.mFilePath, moreInfo.mSrcStart, moreInfo.mError); } } } diff --git a/IDE/src/ui/StatusBar.bf b/IDE/src/ui/StatusBar.bf index 7494bc78..120f40b0 100644 --- a/IDE/src/ui/StatusBar.bf +++ b/IDE/src/ui/StatusBar.bf @@ -365,9 +365,21 @@ namespace IDE.ui else mStatusBoxUpdateCnt = -1; + /// + { + if (gApp.mErrorsPanel.mErrorCount > 0) + { + g.Draw(DarkTheme.sDarkTheme.GetImage(.CodeError), GS!(6), 0); + } + else if (gApp.mErrorsPanel.mWarningCount > 0) + { + g.Draw(DarkTheme.sDarkTheme.GetImage(.CodeWarning), GS!(6), 0); + } + } + if (gApp.mSettings.mEnableDevMode) { - g.DrawString(StackStringFormat!("FPS: {0}", gApp.mLastFPS), GS!(4), 0); + g.DrawString(StackStringFormat!("FPS: {0}", gApp.mLastFPS), GS!(32), 0); String resolveStr = scope String(); let bfResolveCompiler = gApp.mBfResolveCompiler; @@ -418,5 +430,16 @@ namespace IDE.ui g.DrawString(resolveStr, GS!(100), 0); } } + + public override void MouseDown(float x, float y, int32 btn, int32 btnCount) + { + base.MouseDown(x, y, btn, btnCount); + + if (Rect(GS!(6), 0, GS!(20), mHeight).Contains(x, y)) + { + gApp.mErrorsPanel.ShowErrorNext(); + return; + } + } } } diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index 41706047..450aa122 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -3482,6 +3482,22 @@ void BfCompiler::ProcessAutocompleteTempType() BF_ASSERT(mResolvePassData->mAutoComplete->mDefMethod == NULL); if (autoComplete->mResolveType == BfResolveType_GetNavigationData) { + for (auto node : mResolvePassData->mParser->mSidechannelRootNode->mChildArr) + { + if (auto preprocNode = BfNodeDynCast(node)) + { + if (preprocNode->mCommand->Equals("region")) + { + if (!autoCompleteResultString.empty()) + autoCompleteResultString += "\n"; + autoCompleteResultString += "#"; + preprocNode->mArgument->ToString(autoCompleteResultString); + mContext->mScratchModule->UpdateSrcPos(preprocNode, (BfSrcPosFlags)(BfSrcPosFlag_NoSetDebugLoc | BfSrcPosFlag_Force)); + autoCompleteResultString += StrFormat("\tregion\t%d\t%d", module->mCurFilePosition.mCurLine, module->mCurFilePosition.mCurColumn); + } + } + } + for (auto tempTypeDef : mResolvePassData->mAutoCompleteTempTypes) { String typeName = tempTypeDef->ToString(); diff --git a/IDEHelper/Compiler/BfDefBuilder.cpp b/IDEHelper/Compiler/BfDefBuilder.cpp index b10c26ad..67c26803 100644 --- a/IDEHelper/Compiler/BfDefBuilder.cpp +++ b/IDEHelper/Compiler/BfDefBuilder.cpp @@ -195,7 +195,7 @@ void BfDefBuilder::ParseGenericParams(BfGenericParamsDeclaration* genericParamsD { if (genericParams[checkParamsIdx]->mName == name) { - mPassInstance->Fail("Duplicate generic param name", genericParamNode); + Fail("Duplicate generic param name", genericParamNode); } } @@ -256,7 +256,7 @@ void BfDefBuilder::ParseGenericParams(BfGenericParamsDeclaration* genericParamsD { if (externConstraintDefs == NULL) { - mPassInstance->Fail("Cannot find generic parameter in constraint", genericConstraint->mTypeRef); + Fail("Cannot find generic parameter in constraint", genericConstraint->mTypeRef); if (genericParams.IsEmpty()) continue; @@ -307,9 +307,9 @@ void BfDefBuilder::ParseGenericParams(BfGenericParamsDeclaration* genericParamsD prevFlagName = "struct*"; if (prevFlagName == name) - mPassInstance->Fail(StrFormat("Cannot specify '%s' twice", prevFlagName.c_str()), constraintNode); + Fail(StrFormat("Cannot specify '%s' twice", prevFlagName.c_str()), constraintNode); else - mPassInstance->Fail(StrFormat("Cannot specify both '%s' and '%s'", prevFlagName.c_str(), name.c_str()), constraintNode); + Fail(StrFormat("Cannot specify both '%s' and '%s'", prevFlagName.c_str(), name.c_str()), constraintNode); return; } @@ -347,7 +347,7 @@ void BfDefBuilder::ParseGenericParams(BfGenericParamsDeclaration* genericParamsD auto constraintType = BfNodeDynCast(constraintNode); if (constraintType == NULL) { - mPassInstance->Fail("Invalid constraint", constraintNode); + Fail("Invalid constraint", constraintNode); return; } } @@ -360,7 +360,7 @@ void BfDefBuilder::ParseGenericParams(BfGenericParamsDeclaration* genericParamsD } else { - mPassInstance->Fail("Type assignment must be the first constraint", genericConstraint->mColonToken); + Fail("Type assignment must be the first constraint", genericConstraint->mColonToken); } } @@ -453,22 +453,22 @@ BfMethodDef* BfDefBuilder::CreateMethodDef(BfMethodDeclaration* methodDeclaratio if (mCurTypeDef->mTypeCode == BfTypeCode_Interface) { if ((methodDef->mIsConcrete) && (!mCurTypeDef->mIsConcrete)) - mPassInstance->Fail("Only interfaces declared as 'concrete' can be declare methods as 'concrete'. Consider adding 'concrete' to the interface declaration.", methodDeclaration->mVirtualSpecifier); + Fail("Only interfaces declared as 'concrete' can be declare methods as 'concrete'. Consider adding 'concrete' to the interface declaration.", methodDeclaration->mVirtualSpecifier); //if (!methodDef->mIsConcrete) - //mPassInstance->Fail(StrFormat("Interfaces methods cannot be declared as '%s'", methodDeclaration->mVirtualSpecifier->ToString().c_str()), methodDeclaration->mVirtualSpecifier); + //Fail(StrFormat("Interfaces methods cannot be declared as '%s'", methodDeclaration->mVirtualSpecifier->ToString().c_str()), methodDeclaration->mVirtualSpecifier); } else { if (methodDef->mIsConcrete) - mPassInstance->Fail("Only interfaces methods can be declared as 'concrete'", methodDeclaration->mVirtualSpecifier); + Fail("Only interfaces methods can be declared as 'concrete'", methodDeclaration->mVirtualSpecifier); } if (methodDef->mIsAbstract) { if ((!mCurTypeDef->mIsAbstract) && (mCurTypeDef->mTypeCode != BfTypeCode_Interface)) - mPassInstance->Fail("Method is abstract but it is contained in non-abstract class", methodDeclaration); + Fail("Method is abstract but it is contained in non-abstract class", methodDeclaration); if (methodDeclaration->mBody != NULL) - mPassInstance->Fail("Abstract method cannot declare a body", methodDeclaration); + Fail("Abstract method cannot declare a body", methodDeclaration); } } else @@ -513,7 +513,7 @@ BfMethodDef* BfDefBuilder::CreateMethodDef(BfMethodDeclaration* methodDeclaratio methodDef->mMethodType = BfMethodType_Operator; /*if (propertyDecl->mStaticSpecifier == NULL) { - mPassInstance->Fail("Operators must be declared as static", methodDeclaration); + Fail("Operators must be declared as static", methodDeclaration); }*/ String declError; @@ -531,7 +531,7 @@ BfMethodDef* BfDefBuilder::CreateMethodDef(BfMethodDeclaration* methodDeclaratio } if (!declError.empty()) { - mPassInstance->Fail(StrFormat("Operator must be declared %s", declError.c_str()), operatorDecl->mOperatorToken); + Fail(StrFormat("Operator must be declared %s", declError.c_str()), operatorDecl->mOperatorToken); } } else if ((mCurTypeDef->mIsDelegate) || (mCurTypeDef->mIsFunction)) @@ -560,7 +560,7 @@ BfMethodDef* BfDefBuilder::CreateMethodDef(BfMethodDeclaration* methodDeclaratio methodDef->mName = methodDeclaration->mNameNode->ToString(); methodDef->mMethodType = BfMethodType_Mixin; /*if (!methodDef->mIsStatic) - mPassInstance->Fail("Mixin must be declared static", methodDeclaration->mMixinSpecifier);*/ + Fail("Mixin must be declared static", methodDeclaration->mMixinSpecifier);*/ } else { @@ -612,7 +612,7 @@ BfMethodDef* BfDefBuilder::CreateMethodDef(BfMethodDeclaration* methodDeclaratio { methodDef->mParams[paramIdx - 1]->mParamKind = BfParamKind_Normal; hadParams = false; - mPassInstance->Fail("Params parameter must be the last parameter", methodDef->mParams[paramIdx - 1]->mParamDeclaration); + Fail("Params parameter must be the last parameter", methodDef->mParams[paramIdx - 1]->mParamDeclaration); } if (paramDef->mParamDeclaration->mInitializer != NULL) @@ -620,7 +620,7 @@ BfMethodDef* BfDefBuilder::CreateMethodDef(BfMethodDeclaration* methodDeclaratio else if (hasDefault) { if (!didDefaultsError) - mPassInstance->Fail("Optional parameters must appear after all required parameters", methodDef->mParams[paramIdx - 1]->mParamDeclaration); + Fail("Optional parameters must appear after all required parameters", methodDef->mParams[paramIdx - 1]->mParamDeclaration); didDefaultsError = true; } } @@ -632,6 +632,14 @@ BfMethodDef* BfDefBuilder::CreateMethodDef(BfMethodDeclaration* methodDeclaratio return methodDef; } +BfError* BfDefBuilder::Fail(const StringImpl& errorStr, BfAstNode* refNode) +{ + auto error = mPassInstance->Fail(errorStr, refNode); + if (error != NULL) + error->mProject = mCurSource->mProject; + return error; +} + void BfDefBuilder::Visit(BfMethodDeclaration* methodDeclaration) { if (mCurTypeDef == NULL) @@ -742,7 +750,7 @@ void BfDefBuilder::ParseAttributes(BfAttributeDirective* attributes, BfMethodDef { if (methodDef->mParams.size() != 2) { - mPassInstance->Fail("Commutable attributes can only be applied to methods with two arguments", attributes->mAttributeTypeRef); + Fail("Commutable attributes can only be applied to methods with two arguments", attributes->mAttributeTypeRef); } else { @@ -790,7 +798,7 @@ void BfDefBuilder::Visit(BfPropertyDeclaration* propertyDeclaration) if (propertyDeclaration->mConstSpecifier != NULL) { - mPassInstance->Fail("Const properties are not allowed", propertyDeclaration->mConstSpecifier); + Fail("Const properties are not allowed", propertyDeclaration->mConstSpecifier); } HashNode(*mSignatureHashCtx, propertyDeclaration, propertyDeclaration->mDefinitionBlock); @@ -871,7 +879,7 @@ void BfDefBuilder::Visit(BfPropertyDeclaration* propertyDeclaration) { BfProtection newProtection = GetProtection(methodDeclaration->mProtectionSpecifier); if (newProtection > methodDef->mProtection) - mPassInstance->Fail(StrFormat("the accessibility modifier of the 'get' accessor must be more restrictive than the property or indexer '%s'", propertyDef->mName.c_str()), + Fail(StrFormat("the accessibility modifier of the 'get' accessor must be more restrictive than the property or indexer '%s'", propertyDef->mName.c_str()), methodDeclaration->mProtectionSpecifier); methodDef->mProtection = newProtection; } @@ -997,7 +1005,7 @@ void BfDefBuilder::Visit(BfFieldDeclaration* fieldDeclaration) // This check is a bit of a hack to determine the difference between a "MemberType mMember" and a proper case entry of "mMember(TupleType)" if (!isEnumEntryDecl) { - mPassInstance->Fail("Non-static field declarations are not allowed in enums", fieldDeclaration); + Fail("Non-static field declarations are not allowed in enums", fieldDeclaration); } } @@ -1231,7 +1239,7 @@ void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration) mCurTypeDef->mName = mSystem->GetAtom(typeDeclaration->mNameNode->ToString()); if (mCurTypeDef->mName->mIsSystemType) { - mPassInstance->Fail(StrFormat("Type name '%s' is reserved", typeDeclaration->mNameNode->ToString().c_str()), typeDeclaration->mNameNode); + Fail(StrFormat("Type name '%s' is reserved", typeDeclaration->mNameNode->ToString().c_str()), typeDeclaration->mNameNode); } } @@ -1245,7 +1253,7 @@ void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration) if ((outerTypeDef == NULL) && (typeDeclaration->mProtectionSpecifier->GetToken() != BfToken_Public)) { //CS1527 - mPassInstance->Fail("Elements defined in a namespace cannot be explicitly declared as private, protected, or protected internal", typeDeclaration->mProtectionSpecifier); + Fail("Elements defined in a namespace cannot be explicitly declared as private, protected, or protected internal", typeDeclaration->mProtectionSpecifier); } else { @@ -1677,13 +1685,13 @@ void BfDefBuilder::FinishTypeDef(bool wantsToString) { if (hasStaticCtor) { - mPassInstance->Fail("Only one static constructor is allowed", method->mMethodDeclaration); + Fail("Only one static constructor is allowed", method->mMethodDeclaration); method->mIsStatic = false; } if (method->mParams.size() != 0) { - mPassInstance->Fail("Static constructor cannot declare parameters", method->mMethodDeclaration); + Fail("Static constructor cannot declare parameters", method->mMethodDeclaration); method->mIsStatic = false; } @@ -1740,7 +1748,7 @@ void BfDefBuilder::FinishTypeDef(bool wantsToString) { if (hasStaticDtor) { - mPassInstance->Fail("Only one static constructor is allowed", method->mMethodDeclaration); + Fail("Only one static constructor is allowed", method->mMethodDeclaration); method->mIsStatic = false; } @@ -1750,14 +1758,14 @@ void BfDefBuilder::FinishTypeDef(bool wantsToString) { if (hasDtor) { - mPassInstance->Fail("Only one destructor is allowed", method->mMethodDeclaration); + Fail("Only one destructor is allowed", method->mMethodDeclaration); method->mIsStatic = false; } hasDtor = true; } if (method->mParams.size() != 0) - mPassInstance->Fail("Destructors cannot declare parameters", method->GetMethodDeclaration()->mParams[0]); + Fail("Destructors cannot declare parameters", method->GetMethodDeclaration()->mParams[0]); } else if (method->mMethodType == BfMethodType_Normal) { diff --git a/IDEHelper/Compiler/BfDefBuilder.h b/IDEHelper/Compiler/BfDefBuilder.h index f9756c89..acd6c8f0 100644 --- a/IDEHelper/Compiler/BfDefBuilder.h +++ b/IDEHelper/Compiler/BfDefBuilder.h @@ -41,6 +41,7 @@ public: void ParseAttributes(BfAttributeDirective* attributes, BfMethodDef* methodDef); void ParseAttributes(BfAttributeDirective* attributes, BfTypeDef* typeDef); BfMethodDef* CreateMethodDef(BfMethodDeclaration* methodDecl, BfMethodDef* outerMethodDef = NULL); + BfError* Fail(const StringImpl& errorStr, BfAstNode* refNode); public: BfDefBuilder(BfSystem* bfSystem); diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 62b5112b..60b2619c 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -2839,7 +2839,7 @@ BfTypedValue BfExprEvaluator::LookupIdentifier(BfAstNode* refNode, const StringI varSkipCount--; } - if (varDecl->mNotCaptured) + if ((varDecl != NULL) && (varDecl->mNotCaptured)) { mModule->Fail("Local variable is not captured", refNode); } diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 8941211b..c4b90b81 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -2610,6 +2610,7 @@ BfError* BfModule::Fail(const StringImpl& error, BfAstNode* refNode, bool isPers } if (bfError != NULL) { + bfError->mProject = mProject; bfError->mIsPersistent = isPersistent; bfError->mIsWhileSpecializing = isWhileSpecializing; @@ -2629,7 +2630,10 @@ BfError* BfModule::FailAfter(const StringImpl& error, BfAstNode* refNode) refNode = BfNodeToNonTemporary(refNode); mHadBuildError = true; - return mCompiler->mPassInstance->FailAfter(error, refNode); + BfError* bfError = mCompiler->mPassInstance->FailAfter(error, refNode); + if (bfError != NULL) + bfError->mProject = mProject; + return bfError; } BfError* BfModule::Warn(int warningNum, const StringImpl& warning, BfAstNode* refNode, bool isPersistent) @@ -2692,6 +2696,7 @@ BfError* BfModule::Warn(int warningNum, const StringImpl& warning, BfAstNode* re BfError* bfError = mCompiler->mPassInstance->WarnAt(warningNum, warning, refNode->GetSourceData(), refNode->GetSrcStart(), refNode->GetSrcLength()); if (bfError != NULL) { + bfError->mProject = mProject; AddFailType(mCurTypeInstance); mHadBuildWarning = true; diff --git a/IDEHelper/Compiler/BfReducer.cpp b/IDEHelper/Compiler/BfReducer.cpp index a7bb710f..c839e36f 100644 --- a/IDEHelper/Compiler/BfReducer.cpp +++ b/IDEHelper/Compiler/BfReducer.cpp @@ -197,15 +197,18 @@ BfAstNode* BfReducer::Fail(const StringImpl& errorMsg, BfAstNode* refNode) mStmtHasError = true; if (mPassInstance->HasLastFailedAt(refNode)) // No duplicate failures return NULL; - mPassInstance->Fail(errorMsg, refNode); + auto error = mPassInstance->Fail(errorMsg, refNode); + if (error != NULL) + error->mProject = mSource->mProject; return NULL; } BfAstNode* BfReducer::FailAfter(const StringImpl& errorMsg, BfAstNode* prevNode) { mStmtHasError = true; - mPassInstance->FailAfter(errorMsg, prevNode); - + auto error = mPassInstance->FailAfter(errorMsg, prevNode); + if (error != NULL) + error->mProject = mSource->mProject; return NULL; } @@ -4053,11 +4056,11 @@ BfAstNode* BfReducer::DoCreateStatement(BfAstNode* node, CreateStmtFlags createS if ((unaryOperatorExpr->mOp == BfUnaryOp_Ref) || (unaryOperatorExpr->mOp == BfUnaryOp_Mut) || (unaryOperatorExpr->mOp == BfUnaryOp_Out)) { if (unaryOperatorExpr->mOp == BfUnaryOp_Ref) - mPassInstance->Fail("Cannot use 'ref' in this context", unaryOperatorExpr); + Fail("Cannot use 'ref' in this context", unaryOperatorExpr); else if (unaryOperatorExpr->mOp == BfUnaryOp_Mut) - mPassInstance->Fail("Cannot use 'mut' in this context", unaryOperatorExpr); + Fail("Cannot use 'mut' in this context", unaryOperatorExpr); else - mPassInstance->Fail("Cannot use 'out' in this context", unaryOperatorExpr); + Fail("Cannot use 'out' in this context", unaryOperatorExpr); return NULL; } } @@ -4246,7 +4249,7 @@ BfAstNode* BfReducer::CreateStatement(BfAstNode* node, CreateStmtFlags createStm auto nextNode = mVisitorPos.GetNext(); if (nextNode != NULL) { - mPassInstance->FailAfter("Semicolon expected", expr); + FailAfter("Semicolon expected", expr); } return expr; @@ -4295,7 +4298,9 @@ BfAstNode* BfReducer::CreateStatement(BfAstNode* node, CreateStmtFlags createStm if (((createStmtFlags & CreateStmtFlags_AllowUnterminatedExpression) != 0) && (origStmtNode->IsA()) && (nextNode == NULL)) return stmt; - mPassInstance->FailAfterAt("Semicolon expected", node->GetSourceData(), stmt->GetSrcEnd() - 1); + auto error = mPassInstance->FailAfterAt("Semicolon expected", node->GetSourceData(), stmt->GetSrcEnd() - 1); + if (error != NULL) + error->mProject = mSource->mProject; mPrevStmtHadError = true; return stmt; } @@ -4881,7 +4886,7 @@ BfTypeReference* BfReducer::DoCreateTypeRef(BfAstNode* firstNode, CreateTypeRefF if ((!doAddType) && (isBoundName)) { - mPassInstance->FailAfter("Expected type", genericInstance); + FailAfter("Expected type", genericInstance); } if ((doAddType) && (!isUnboundName)) { @@ -5539,7 +5544,7 @@ BfAstNode* BfReducer::ReadTypeMember(BfTokenNode* tokenNode, int depth) innerType->mAttributes = attributes; return innerType; } - mPassInstance->Fail("Invalid target for attributes", memberNode); + Fail("Invalid target for attributes", memberNode); return memberNode; } @@ -8595,9 +8600,9 @@ BfTokenNode* BfReducer::ParseMethodParams(BfAstNode* node, SizedArrayImpl(node)) - mPassInstance->Fail("Unexpected token", node); + Fail("Unexpected token", node); else - mPassInstance->Fail("Unexpected identifier", node); + Fail("Unexpected identifier", node); AddErrorNode(node); } diff --git a/IDEHelper/Compiler/BfStmtEvaluator.cpp b/IDEHelper/Compiler/BfStmtEvaluator.cpp index 9516abd7..f8687a55 100644 --- a/IDEHelper/Compiler/BfStmtEvaluator.cpp +++ b/IDEHelper/Compiler/BfStmtEvaluator.cpp @@ -5568,7 +5568,7 @@ void BfModule::Visit(BfForEachStatement* forEachStmt) autoComplete->CheckTypeRef(forEachStmt->mVariableTypeRef, false); varType = ResolveTypeRef(forEachStmt->mVariableTypeRef, BfPopulateType_Data, BfResolveTypeRefFlag_AllowRef); } - + if (varType == NULL) varType = mContext->mBfObjectType; bool isArray = target.mType->IsArray(); @@ -5979,6 +5979,9 @@ void BfModule::Visit(BfForEachStatement* forEachStmt) scopeData.mIsLoop = true; + if ((autoComplete != NULL) && (forEachStmt->mVariableTypeRef != NULL)) + autoComplete->CheckVarResolution(forEachStmt->mVariableTypeRef, varType); + if (isArray || isSizedArray) mBfIRBuilder->CreateStore(GetConstValue(0), itr.mValue); diff --git a/IDEHelper/Compiler/BfSystem.cpp b/IDEHelper/Compiler/BfSystem.cpp index 02fb9188..8a26c602 100644 --- a/IDEHelper/Compiler/BfSystem.cpp +++ b/IDEHelper/Compiler/BfSystem.cpp @@ -1391,17 +1391,21 @@ BfError* BfPassInstance::Fail(const StringImpl& error) return mErrors.back(); } -BfError* BfPassInstance::Fail(const StringImpl& error, BfAstNode* refNode) +BfError* BfPassInstance::Fail(const StringImpl& errorStr, BfAstNode* refNode) { BP_ZONE("BfPassInstance::Fail"); + BfError* error = NULL; + mFailedIdx++; if ((refNode == NULL) || (refNode->IsTemporary())) - return Fail(error); + error = Fail(errorStr); else if (refNode->IsA()) - return FailAt(error, refNode->GetSourceData(), refNode->GetSrcStart(), 1); + error = FailAt(errorStr, refNode->GetSourceData(), refNode->GetSrcStart(), 1); else - return FailAt(error, refNode->GetSourceData(), refNode->GetSrcStart(), refNode->GetSrcLength()); + error = FailAt(errorStr, refNode->GetSourceData(), refNode->GetSrcStart(), refNode->GetSrcLength()); + + return error; } BfError* BfPassInstance::FailAfter(const StringImpl& error, BfAstNode* refNode) @@ -1504,7 +1508,7 @@ BfError* BfPassInstance::WarnAt(int warningNumber, const StringImpl& warning, Bf if ((int)mErrors.size() > 1) errorStart += StrFormat("(%d)", mErrors.size()); if (warningNumber > 0) - errorStart += StrFormat(": CS%04d", warningNumber); + errorStart += StrFormat(": BF%04d", warningNumber); MessageAt(":warn", errorStart + ": " + warning, bfParser, srcIdx); } return errorVal; @@ -3334,7 +3338,8 @@ BF_EXPORT int BF_CALLTYPE BfPassInstance_GetErrorCount(BfPassInstance* bfPassIns return (int)bfPassInstance->mErrors.size(); } -BF_EXPORT const char* BF_CALLTYPE BfPassInstance_GetErrorData(BfPassInstance* bfPassInstance, int errorIdx, bool& outIsWarning, bool& outIsAfter, bool& outIsDeferred, bool& outIsWhileSpecializing, bool& outIsPersistent, int& outSrcStart, int& outSrcEnd, int& outMoreInfoCount) +BF_EXPORT const char* BF_CALLTYPE BfPassInstance_GetErrorData(BfPassInstance* bfPassInstance, int errorIdx, int& outCode, bool& outIsWarning, bool& outIsAfter, bool& outIsDeferred, bool& outIsWhileSpecializing, bool& outIsPersistent, + char*& projectName, char*& fileName, int& outSrcStart, int& outSrcEnd, int* outLine, int* outColumn, int& outMoreInfoCount) { BfError* bfError = bfPassInstance->mErrors[errorIdx]; outIsWarning = bfError->mIsWarning; @@ -3342,13 +3347,33 @@ BF_EXPORT const char* BF_CALLTYPE BfPassInstance_GetErrorData(BfPassInstance* bf outIsDeferred = bfError->mIsDeferred; outIsWhileSpecializing = bfError->mIsWhileSpecializing; outIsPersistent = bfError->mIsPersistent; + outCode = bfError->mWarningNumber; + if (bfError->mProject != NULL) + projectName = (char*)bfError->mProject->mName.c_str(); + if (bfError->mSource != NULL) + { + String* srcFileName; + if (bfPassInstance->mSourceFileNameMap.TryGetValue(bfError->mSource, &srcFileName)) + { + fileName = (char*)srcFileName->c_str(); + } + + if (outLine != NULL) + { + auto parserData = bfError->mSource->ToParserData(); + if (parserData != NULL) + { + parserData->GetLineCharAtIdx(bfError->mSrcStart, *outLine, *outColumn); + } + } + } outSrcStart = bfError->mSrcStart; outSrcEnd = bfError->mSrcEnd; outMoreInfoCount = (int)bfError->mMoreInfo.size(); return bfError->mError.c_str(); } -BF_EXPORT const char* BfPassInstance_Error_GetMoreInfoData(BfPassInstance* bfPassInstance, int errorIdx, int moreInfoIdx, char*& fileName, int& srcStart, int& srcEnd) +BF_EXPORT const char* BfPassInstance_Error_GetMoreInfoData(BfPassInstance* bfPassInstance, int errorIdx, int moreInfoIdx, char*& fileName, int& srcStart, int& srcEnd, int* outLine, int* outColumn) { BfError* rootError = bfPassInstance->mErrors[errorIdx]; BfMoreInfo* moreInfo = rootError->mMoreInfo[moreInfoIdx]; diff --git a/IDEHelper/Compiler/BfSystem.h b/IDEHelper/Compiler/BfSystem.h index 253bf114..c0aea511 100644 --- a/IDEHelper/Compiler/BfSystem.h +++ b/IDEHelper/Compiler/BfSystem.h @@ -1114,17 +1114,19 @@ public: bool mIsPersistent; bool mIsWhileSpecializing; bool mIgnore; + BfProject* mProject; String mError; int mWarningNumber; Array mMoreInfo; public: BfError() - { + { mIsAfter = false; mIsPersistent = false; mIsWhileSpecializing = false; mIgnore = false; + mProject = NULL; mWarningNumber = 0; }